[
  {
    "path": ".github/workflows/deploy.yml",
    "content": "name: Deploy to GitHub Pages\n\nenv:\n  PROJECT_PATH: DemoCenter/DemoCenter.Web/DemoCenter.Web.csproj\n  OUTPUT_PATH: DemoCenter/DemoCenter.Web/bin/Release_WASM/net9.0/publish/wwwroot\non:\n  workflow_dispatch:\n\njobs:\n  deploy-to-github-pages:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n\n      - name: Setup .NET 9\n        uses: actions/setup-dotnet@v4\n        with:\n          dotnet-version: 9.0.x\n\n      - name: Install wasm-tools\n        run: dotnet workload install wasm-tools-net9 wasm-tools-net8\n\n      - name: Publish .NET Project\n        run: dotnet publish $PROJECT_PATH -f net9.0 -c Release_WASM --nologo -p:PublishTrimmed=false\n\n      - name: Change base-tag in index.html\n        run: sed -i 's#<base href=\"/\" />#<base href=\"/controls-demo/\" />#g' $OUTPUT_PATH/index.html\n\n      - name: Add .nojekyll file\n        run: touch $OUTPUT_PATH/.nojekyll\n\n      - name: Commit wwwroot to GitHub Pages\n        uses: JamesIves/github-pages-deploy-action@v4.5.0\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          branch: gh-pages\n          folder: ${{ env.OUTPUT_PATH }}\n          single-commit: true"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish Demo\n\non:\n  workflow_dispatch:\n    inputs:\n      platform:\n        description: 'Platform to publish'\n        required: true\n        default: 'all'\n        type: choice\n        options:\n          - 'windows'\n          - 'linux'\n          - 'linux-rpi'\n          - 'osx-arm64'\n          - 'osx-x64'\n          - 'all'\n\njobs:\n  windows:\n    if: ${{ github.event.inputs.platform == 'windows' || github.event.inputs.platform == 'all' }}\n    runs-on: windows-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish win-x64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r win-x64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/win64\n\n      - name: Zip win-x64\n        run: |\n          $files = Get-ChildItem -Path ./publish/win64/* -Recurse -Exclude *.pdb\n          Compress-Archive -Path $files.FullName -DestinationPath ./upload/EMX.Demo.Desktop.win-x64.zip\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4.3.1\n        with:\n          name: windows\n          path: ./upload\n\n  linux:\n    if: ${{ github.event.inputs.platform == 'linux' || github.event.inputs.platform == 'all' }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish linux-x64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r linux-x64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/linux64\n\n      - name: Publish linux-x64 with files\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r linux-x64 -c Release -o ./publish/linux64Files\n\n      - name: Rename app\n        run: mv ./publish/linux64/DemoCenter.Desktop ./publish/linux64/DemoCenter.App\n\n      - name: Copy library\n        run: mv ./publish/linux64Files/libassimp.so ./publish/linux64/libassimp.so\n\n      - name: Zip linux-x64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.linux-x64.zip ./publish/linux64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4.3.1\n        with:\n          name: linux\n          path: ./upload\n\n  linux-rpi:\n    if: ${{ github.event.inputs.platform == 'linux-rpi' || github.event.inputs.platform == 'all' }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish linux-arm64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r linux-arm64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/linuxArm64\n      - name: Rename app\n        run: mv ./publish/linuxArm64/DemoCenter.Desktop ./publish/linuxArm64/DemoCenter.App\n\n      - name: Zip linux-x64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.linux-arm64.zip ./publish/linuxArm64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4.3.1\n        with:\n          name: linux-rpi\n          path: ./upload\n\n  osx-x64:\n    if: ${{ github.event.inputs.platform == 'osx-x64' || github.event.inputs.platform == 'all' }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish linux-arm64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r osx-x64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/osx-x64\n\n      - name: Zip osx-x64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.osx-x64.zip ./publish/osx-x64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4.3.1\n        with:\n          name: osx-x64\n          path: ./upload\n\n  osx-arm64:\n    if: ${{ github.event.inputs.platform == 'osx-arm64' || github.event.inputs.platform == 'all' }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish osx-arm64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r osx-arm64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/osx-arm64\n\n      - name: Zip osx-arm64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.osx-arm64.zip ./publish/osx-arm64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4.3.1\n        with:\n          name: osx-arm64\n          path: ./upload"
  },
  {
    "path": ".github/workflows/release-tag.yml",
    "content": "name: Release Tag\n\non:\n  push:\n    tags:\n      - \"v[0-9]+.[0-9]+.[0-9]+\"\n  workflow_dispatch:\n\njobs:\n  windows:\n    runs-on: windows-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish win-x64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r win-x64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/win64\n\n      - name: Zip win-x64\n        run: |\n          $files = Get-ChildItem -Path ./publish/win64/* -Recurse -Exclude *.pdb\n          Compress-Archive -Path $files.FullName -DestinationPath ./upload/EMX.Demo.Desktop.win-x64.zip\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: windows\n          path: ./upload\n\n  linux:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish linux-x64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r linux-x64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/linux64\n\n      - name: Publish linux-x64 with files\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r linux-x64 -c Release -o ./publish/linux64Files\n\n      - name: Rename app\n        run: mv ./publish/linux64/DemoCenter.Desktop ./publish/linux64/DemoCenter.App\n\n      - name: Copy library\n        run: mv ./publish/linux64Files/libassimp.so ./publish/linux64/libassimp.so\n\n      - name: Zip linux-x64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.linux-x64.zip ./publish/linux64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: linux\n          path: ./upload\n\n  linux-rpi:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish linux-arm64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r linux-arm64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/linuxArm64\n      - name: Rename app\n        run: mv ./publish/linuxArm64/DemoCenter.Desktop ./publish/linuxArm64/DemoCenter.App\n\n      - name: Zip linux-x64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.linux-arm64.zip ./publish/linuxArm64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4.3.1\n        with:\n          name: linux-rpi\n          path: ./upload\n\n  linux-orangepi:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish linux-arm\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r linux-arm -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/linuxArm\n      - name: Rename app\n        run: mv ./publish/linuxArm/DemoCenter.Desktop ./publish/linuxArm/DemoCenter.App\n\n      - name: Zip linux-arm\n        run: zip -j -r ./upload/EMX.Demo.Desktop.linux-arm.zip ./publish/linuxArm -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4.3.1\n        with:\n          name: linux-orangepi\n          path: ./upload\n\n\n  osx-x64:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish linux-arm64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r osx-x64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/osx-x64\n\n      - name: Zip osx-x64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.osx-x64.zip ./publish/osx-x64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: osx-x64\n          path: ./upload\n\n  osx-arm64:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Make upload directory\n        run: mkdir upload\n\n      - name: Publish osx-arm64\n        run: dotnet publish ./DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj -f net9.0 -r osx-arm64 -c Release --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/osx-arm64\n\n      - name: Zip osx-arm64\n        run: zip -j -r ./upload/EMX.Demo.Desktop.osx-arm64.zip ./publish/osx-arm64 -x \"*.pdb\"\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: osx-arm64\n          path: ./upload\n\n\n  draft-release:\n    needs: [ windows, linux, linux-rpi, osx-x64, osx-arm64, linux-orangepi ]\n    runs-on: ubuntu-latest\n    steps:\n      - name: Download windows Artifacts\n        uses: actions/download-artifact@v4\n        with:\n          name: windows\n\n      - name: Download linux Artifacts\n        uses: actions/download-artifact@v4\n        with:\n          name: linux\n\n      - name: Download linux-rpi Artifacts\n        uses: actions/download-artifact@v4\n        with:\n          name: linux-rpi\n\n      - name: Download linux-orangepi Artifacts\n        uses: actions/download-artifact@v4\n        with:\n          name: linux-orangepi\n\n      - name: Release\n        uses: softprops/action-gh-release@v2\n        if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch'\n        with:\n          generate_release_notes: true\n          draft: true\n          files: |\n            *.zip\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Test\n\non:\n  push:\n    branches: [ \"main\", \"action/publish\" ]\n  pull_request:\n    branches: [ \"main\" ]\n  workflow_dispatch:\n\njobs:\n  windows:\n    runs-on: windows-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n      - name: EMXDemo Unit Test\n        run: dotnet test ./Tests/DemoCenter.Desktop.UI.Tests/DemoCenter.Desktop.UI.Tests.csproj -f net9.0 \n\n  ubuntu:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.1.1\n      - name: EMXDemo Unit Test\n        run: dotnet test ./Tests/DemoCenter.Desktop.UI.Tests/DemoCenter.Desktop.UI.Tests.csproj -f net9.0\n"
  },
  {
    "path": ".gitignore",
    "content": "\n#Ignore thumbnails created by Windows\nThumbs.db\n#Ignore files built by Visual Studio\n*.obj\n*.exe\n*.pdb\n*.user\n*.aps\n*.pch\n*.vspscc\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.cache\n*.ilk\n*.log\n[Bb]in\n[Dd]ebug*/\n*.lib\n*.sbr\nobj/\n.cr/\n[Rr]elease*/\n_ReSharper*/\n[Tt]est[Rr]esult*\n.vs/\n#Nuget packages folder\n.idea\n"
  },
  {
    "path": "DemoCenter/DemoCenter/App.axaml",
    "content": "<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"using:DemoCenter\"\n             x:Class=\"DemoCenter.App\"\n             xmlns:theme=\"clr-namespace:Eremex.AvaloniaUI.Themes.DeltaDesign;assembly=Eremex.Avalonia.Themes.DeltaDesign\"\n             xmlns:theme3D=\"clr-namespace:Eremex.AvaloniaUI.Themes.Controls3D;assembly=Eremex.Avalonia.Controls3D\"\n             RequestedThemeVariant=\"Light\">\n    <Application.DataTemplates>\n        <local:ViewLocator/>\n    </Application.DataTemplates>\n    <Application.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceInclude Source=\"/Resources/Colors.Light.axaml\"/>\n                <ResourceInclude Source=\"/Resources/Colors.Dark.axaml\"/>\n                <ResourceInclude Source=\"/Resources/SharedResources.axaml\"/>\n                <ResourceInclude Source=\"/Resources/SearchPanel.axaml\"/>\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Application.Resources>\n    <Application.Styles>\n        <theme:DeltaDesignTheme/>\n        <theme3D:Controls3DTheme />\n        <StyleInclude Source=\"avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml\" />\n        <StyleInclude Source=\"/Resources/SharedStyles.axaml\"/>\n    </Application.Styles>\n</Application>"
  },
  {
    "path": "DemoCenter/DemoCenter/App.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System.Globalization;\nusing System.Reflection;\nusing DemoCenter.ViewModels;\nusing DemoCenter.Views;\nusing DemoCenter.ProductsData;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter;\n\npublic class App : Application\n{\n    static string[] embeddedResources;\n\n    public static bool IsWebApp { get; private set; }\n    public static VersionInfo Version { get; }\n    public static string[] EmbeddedResources => embeddedResources ??= Assembly.GetAssembly(typeof(App)).GetManifestResourceNames();\n\n    static App()\n    {\n        SetCultureInfo();\n        Version = new VersionInfo(Assembly.GetAssembly(typeof(MxWindow)));\n    }\n    void SetPaletteStyle(IStyle oldStyle, IStyle newStyle)\n    {\n        if (oldStyle != null && newStyle != null && !Styles.Contains(newStyle))\n        {\n            if (Styles.Contains(oldStyle))\n                Styles[Styles.IndexOf(oldStyle)] = newStyle;\n            else\n                Styles.Add(newStyle);\n        }\n    }\n    static void SetCultureInfo()\n    {\n        var cultureInfo = CultureInfo.GetCultureInfo(\"en-US\");\n        Thread.CurrentThread.CurrentCulture = cultureInfo;\n        Thread.CurrentThread.CurrentUICulture = cultureInfo;\n    }\n    public override void Initialize()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n    public override void OnFrameworkInitializationCompleted()\n    {\n        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n        {\n            desktop.MainWindow = new MainWindow\n            {\n                DataContext = new MainViewModel(RequestedThemeVariant)\n            };\n        }\n        else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)\n        {\n            IsWebApp = true;\n            singleViewPlatform.MainView = new MainView\n            {\n                DataContext = new MainViewModel(RequestedThemeVariant)\n            };\n        }\n        \n        base.OnFrameworkInitializationCompleted();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n[assembly: InternalsVisibleTo(\"DemoCenter.Desktop.UI.Tests\")]"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoCenter.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n    <Configurations>Debug;Release;Release_WASM</Configurations>\n  </PropertyGroup>\n  \n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\**\" />\n    <AvaloniaResource Include=\"DemoData\\csv\\**\" />\n    <AvaloniaXaml Remove=\"Views\\Tools\\Templates\\svgXamlExample.axaml\" />\n    <Compile Remove=\"Views\\Tools\\Templates\\svgCodeExample.cs\" />\n    <AvaloniaResource Include=\"DemoData\\HouseImages\\House-3-Level.jpg\" />\n    <AvaloniaResource Include=\"DemoData\\HouseImages\\House-4-Level.jpg\" />\n    <AvaloniaResource Include=\"DemoData\\HouseImages\\House-5-Level.jpg\" />\n    <AvaloniaResource Include=\"DemoData\\HouseImages\\House-6-Level.jpg\" />\n    <AvaloniaResource Include=\"DemoData\\HouseImages\\House-7-Level.jpg\" />\n    <AvaloniaResource Include=\"DemoData\\HouseImages\\House-Vip.jpg\" />\n    <EmbeddedResource Include=\"Resources\\Highlighters\\Axaml-Highlight-Dark.xshd\" />\n    <EmbeddedResource Include=\"Resources\\Highlighters\\Axaml-Highlight-Light.xshd\" />\n    <EmbeddedResource Include=\"Resources\\Highlighters\\CSharp-Highlight-Dark.xshd\" />\n    <EmbeddedResource Include=\"Resources\\Highlighters\\CSharp-Highlight-Light.xshd\" />\n    <Resource Include=\"Views\\Tools\\Templates\\svgCodeExample.cs\" />\n    <Resource Include=\"Views\\Tools\\Templates\\svgXamlExample.axaml\" />\n    <None Remove=\"DemoData\\csv\\stockProducts.csv\" />\n    <None Remove=\"Resources\\Axaml-Highlight-Dark.xshd\" />\n    <None Remove=\"Resources\\Axaml-Highlight-Light.xshd\" />\n    <None Remove=\"Resources\\CSharp-Highlight-Dark.xshd\" />\n    <None Remove=\"Resources\\CSharp-Highlight-Light.xshd\" />\n    <None Remove=\"Resources\\Svg\\Ring.svg\" />\n    <AvaloniaResource Include=\"Resources\\Svg\\Ring.svg\" />\n    <Compile Update=\"Resources.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianCandlestickAggregationView.axaml.cs\">\n      <DependentUpon>CartesianCandlestickAggregationView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\CommonControls\\MessageBoxPageView.axaml.cs\">\n      <DependentUpon>MessageBoxPageView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridExportView.axaml.cs\">\n      <DependentUpon>DataGridExportView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridExportView.axaml.cs\">\n      <DependentUpon>DataGridExportPageView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\Graphics3DControl\\Graphics3DControlOverviewView.axaml.cs\">\n      <DependentUpon>Graphics3DControlOverviewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Graphics3DControl\\Graphics3DControlSimpleMaterialsView.axaml.cs\">\n      <DependentUpon>Graphics3DControlSimpleMaterialView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Graphics3DControl\\Graphics3DControlTexturedMaterialsView.axaml.cs\">\n      <DependentUpon>Graphics3DControlTexturedMaterialsView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Graphics3DControl\\Graphics3DControlLinesView.axaml.cs\">\n      <DependentUpon>Graphics3DControlLinesView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Graphics3DControl\\Graphics3DControlPointsView.axaml.cs\">\n      <DependentUpon>Graphics3DControlPointsView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Graphics3DControl\\Graphics3DControlTransformationView.axaml.cs\">\n      <DependentUpon>Graphics3DControlTransformationView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Graphics3DControl\\Graphics3DControlSkyboxView.axaml.cs\">\n      <DependentUpon>Graphics3DControlSkyboxView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\PolarEmptyPointsView.axaml.cs\">\n      <DependentUpon>PolarEmptyPointsView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianStackedAreaSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianStackedAreaSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianFullStackedAreaSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianFullStackedAreaSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n    \n  <ItemGroup>\n    <PackageReference Include=\"StirlingLabs.assimp.native.linux-x64\" />\n    <PackageReference Include=\"StirlingLabs.assimp.native.osx\" />\n    <PackageReference Include=\"StirlingLabs.assimp.native.win-x64\" />\n    <PackageReference Include=\"Avalonia\" />\n    <PackageReference Include=\"Avalonia.Fonts.Inter\" />\n    <PackageReference Include=\"Avalonia.ReactiveUI\" />\n    <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->\n    <PackageReference Condition=\"'$(Configuration)' == 'Debug'\" Include=\"Avalonia.Diagnostics\" />\n\n    <PackageReference Include=\"CommunityToolkit.Mvvm\" Version=\"$(CommunityToolkitMvvmVersion)\" />\n    <PackageReference Include=\"Svg.Controls.Skia.Avalonia\" />\n    <PackageReference Include=\"Eremex.Avalonia.Controls3D\" />\n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"$(NewtonsoftJsonVersion)\" />\n    <PackageReference Include=\"SkiaSharp\" />\n    <PackageReference Include=\"System.Resources.Extensions\" Version=\"$(SystemResourcesExtensionsVersion)\" />\n    <PackageReference Include=\"Avalonia.AvaloniaEdit\" />\n    <PackageReference Include=\"AvaloniaEdit.TextMate\" />\n    <PackageReference Include=\"TextMateSharp.Grammars\" />\n    <PackageReference Include=\"Eremex.Avalonia.Controls\" />\n    <PackageReference Include=\"Eremex.Avalonia.Themes.DeltaDesign\" />\n\t<PackageReference Include=\"Eremex.Drawing\" />\n\t<PackageReference Include=\"Eremex.Drawing.Skia\" />\n\t<PackageReference Include=\"Eremex.DocumentProcessing\" />\n\n   <PackageReference Include=\"AssimpNetter\">\n\t  <ExcludeAssets>native</ExcludeAssets>\n   </PackageReference>\n  </ItemGroup>\n    \n  <ItemGroup>\n    <AvaloniaXaml Update=\"Views\\DataGrid\\DataGridMultipleSelectionPageView.axaml\">\n      <SubType>Designer</SubType>\n    </AvaloniaXaml>\n  </ItemGroup>\n    \n  <ItemGroup>\n    <Compile Update=\"Views\\Charts\\CartesianChartLogarithmicScalePageView.axaml.cs\">\n      <DependentUpon>CartesianChartLogarithmicScalePageView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridDragDropPageView.axaml.cs\">\n      <DependentUpon>DataGridDragDropPageView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridMultipleSelectionPageView.axaml.cs\">\n      <SubType>Code</SubType>\n      <DependentUpon>DataGridMultipleSelectionPageView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridLiveDataPageView.axaml.cs\">\n      <DependentUpon>DataGridLiveDataPageView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridFilteringView.axaml.cs\">\n      <DependentUpon>DataGridFilteringView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridValidationView.axaml.cs\">\n      <DependentUpon>DataGridValidationView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\DataGrid\\DataGridRowAutoHeightView.axaml.cs\">\n      <DependentUpon>DataGridRowAutoHeightView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\TreeList\\TreeListColumnBandsView.axaml.cs\">\n      <DependentUpon>TreeListColumnBandsView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\TreeList\\TreeListExportView.axaml.cs\">\n      <DependentUpon>TreeListExportView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\TreeList\\TreeListMultipleSelectionPageView.axaml.cs\">\n      <DependentUpon>TreeListMultipleSelectionPageView.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianPointSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianPointSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianLineSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianLineSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianAreaSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianAreaSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianScatterLineSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianScatterLineSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianStepLineSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianStepLineSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianStepAreaSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianStepAreaSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianRangeAreaSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianRangeAreaSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianSideBySideBarSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianSideBySideBarSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\CartesianSideBySideRangeBarSeriesViewView.axaml.cs\">\n      <DependentUpon>CartesianSideBySideRangeBarSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\PolarStripsAndConstantLinesView.axaml.cs\">\n      <DependentUpon>PolarStripsAndConstantLinesView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\PolarPointSeriesViewView.axaml.cs\">\n      <DependentUpon>PolarPointSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\PolarLineSeriesViewView.axaml.cs\">\n      <DependentUpon>PolarLineSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\PolarAreaSeriesViewView.axaml.cs\">\n      <DependentUpon>PolarAreaSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\PolarScatterLineSeriesViewView.axaml.cs\">\n      <DependentUpon>PolarScatterLineSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\PolarRangeAreaSeriesViewView.axaml.cs\">\n      <DependentUpon>PolarRangeAreaSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\SmithPointSeriesViewView.axaml.cs\">\n      <DependentUpon>SmithPointSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Views\\Charts\\SmithLineSeriesViewView.axaml.cs\">\n      <DependentUpon>SmithLineSeriesViewView.axaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Update=\"Resources\\SvgIconsBrowserViewResources.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>SvgIconsBrowserViewResources.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n    \n  <ItemGroup>\n    <Folder Include=\"Resources\\Graphics3D\\Skyboxes\\\" />\n    <Folder Include=\"Resources\\Graphics3D\\Textures\\\" />\n  </ItemGroup>\n    \n  <ItemGroup>\n    <EmbeddedResource Update=\"Resources.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <Target Name=\"SourceCode\" BeforeTargets=\"PreBuildEvent\">\n    <ItemGroup>\n      <EmbeddedResource Include=\"Views\\**\" />\n      <EmbeddedResource Include=\"ViewModels\\**\" />\n      <EmbeddedResource Include=\"Resources\\Png\\**\" />\n    </ItemGroup>\n\n    <ItemGroup Condition=\"'$(Configuration)' != 'Release_WASM'\">\n      <EmbeddedResource Include=\"Resources\\Graphics3D\\**\" />\n    </ItemGroup>\n\n  </Target>\n    \n</Project>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/ApparelProducts.cs",
    "content": "﻿namespace DemoCenter.DemoData\n{\n    public class ApparelProduct\n    {\n        public string Name { get; set; }\n        public string Brand { get; set; }\n        public string Category { get; set; }\n        public string SubCategory { get; set; }\n        public string Style { get; set; }\n        public string Size { get; set; }\n        public string Color { get; set; }\n        public decimal Price { get; set; }\n        public int Stock { get; set; }\n        public DateTime ReleaseDate { get; set; }\n        public bool IsNewArrival { get; set; }\n        public bool IsBestSeller { get; set; }\n    }\n\n    public class ApparelProducts\n    {\n        private static readonly string[] ClothingBrands = { \"Urban Wear\", \"Style Vista\", \"Thread Nation\", \"Cotton Bloom\", \"Denim Haven\", \"Silk Route\", \"Linen Legend\", \"Vogue Venture\" };\n\n        private static readonly string[] FootwearBrands = { \"Sole Superior\", \"Prestige Steps\", \"Elite Treads\", \"Urban Stride\", \"Lux Walk\", \"Aristo Feet\", \"Prime Pace\", \"Noble Heels\" };\n\n        private static readonly string[] ClothingCategories = { \"Men's T-Shirts\", \"Women's Dresses\", \"Jeans\", \"Jackets\", \"Sweaters\", \"Shirts\", \"Skirts\", \"Shorts\", \"Activewear\", \"Underwear\" };\n\n        private static readonly string[] FootwearCategories = { \"Sneakers\", \"Boots\", \"Sandals\", \"Loafers\", \"High Heels\", \"Athletic Shoes\", \"Oxfords\", \"Slip-ons\", \"Flip Flops\", \"Espadrilles\" };\n\n        private static readonly string[] Styles = { \"Casual\", \"Sport\", \"Formal\", \"Business\", \"Street\", \"Vintage\", \"Minimalist\", \"Grunge\" };\n\n        private static readonly string[] Colors = { \"Black\", \"White\", \"Navy\", \"Charcoal\", \"Beige\", \"Khaki\", \"Burgundy\", \"Olive\", \"Denim Blue\", \"Cream\", \"Camel\", \"Rust\", \"Terracotta\", \"Moss Green\", \"Blush Pink\", \"Lavender\", \"Mustard\", \"Teal\", \"Coral\", \"Eggplant\" };\n\n        private static readonly string[] ProductNameTemplates = { \"{0} {1}\", \"{0} {1} {2}\", \"{1} by {0}\", \"{0} - {1}\" };\n\n        private static readonly string[] ProductNameModifiers = { \"Classic\", \"Modern\", \"Essential\", \"Pro\", \"Basic\", \"Standard\", \"Premium\", \"Lite\", \"Air\", \"Comfort\" };\n\n        public static IList<ApparelProduct> GenerateData(int count)\n        {\n            var random = new Random();\n            var products = new List<ApparelProduct>();\n            var startDate = DateTime.Now.AddYears(-1);\n\n            for (int i = 0; i < count; i++)\n            {\n                bool isClothing = random.Next(2) == 0;\n                var brand = isClothing ? ClothingBrands[random.Next(ClothingBrands.Length)] : FootwearBrands[random.Next(FootwearBrands.Length)];\n\n                var category = isClothing ? \"Clothing\" : \"Footwear\";\n                var subCategory = isClothing ? ClothingCategories[random.Next(ClothingCategories.Length)] : FootwearCategories[random.Next(FootwearCategories.Length)];\n\n                var isNewArrival = random.Next(10) == 0;\n                var isBestSeller = random.Next(5) == 0;\n\n                var product = new ApparelProduct\n                {\n                    Name = GenerateProductName(brand, subCategory, i),\n                    Brand = brand,\n                    Category = category,\n                    SubCategory = subCategory,\n                    Style = Styles[random.Next(Styles.Length)],\n                    Color = Colors[random.Next(Colors.Length)],\n                    Size = GenerateSize(category, subCategory),\n                    Price = (decimal)Math.Round(15 + random.NextDouble() * 200, 2),\n                    Stock = random.Next(0, 500),\n                    ReleaseDate = isNewArrival ? DateTime.Now.AddDays(-random.Next(30)) : startDate.AddDays(random.Next(365)),\n                    IsNewArrival = isNewArrival,\n                    IsBestSeller = isBestSeller,\n                };\n\n                products.Add(product);\n            }\n\n            return products;\n\n            string GenerateSize(string category, string subCategory)\n            {\n                if (category == \"Clothing\")\n                {\n                    return subCategory switch\n                    {\n                        \"Men's T-Shirts\" or \"Shirts\" => new[] { \"S\", \"M\", \"L\", \"XL\", \"XXL\" }[random.Next(5)],\n                        \"Women's Dresses\" or \"Skirts\" => new[] { \"XS\", \"S\", \"M\", \"L\", \"XL\" }[random.Next(5)],\n                        \"Jeans\" => $\"{random.Next(26, 36)}W/{random.Next(30, 34)}L\",\n                        _ => \"One Size\"\n                    };\n                }\n                else\n                {\n                    return subCategory switch\n                    {\n                        \"High Heels\" => (35 + random.Next(6)).ToString(),\n                        \"Boots\" => (36 + random.Next(7)).ToString(),\n                        _ => (38 + random.Next(8)).ToString()\n                    };\n                }\n            }\n\n            string GenerateProductName(string brand, string subCategory, int index)\n            {\n                string template = ProductNameTemplates[random.Next(ProductNameTemplates.Length)];\n                string modifier = ProductNameModifiers[random.Next(ProductNameModifiers.Length)];\n\n                return string.Format(template, brand, subCategory, modifier);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/CsvClasses/CarInfo.cs",
    "content": "using Avalonia.Media;\r\nusing Avalonia.Media.Imaging;\r\nusing Avalonia.Platform;\r\n\r\nnamespace DemoCenter.DemoData;\r\n\r\npublic class CarInfo\r\n{\r\n    private IImage image;\r\n    \r\n    public int Id { get; init; }\r\n    public string Trademark { get; init; }\r\n    public decimal HP { get; init; }\r\n    public decimal Liter { get; init; }\r\n    public decimal Cyl { get; init; }\r\n    public decimal TransmissionSpeedCount { get; init; }\r\n    public string TransmissionType { get; init; }\r\n    public decimal MPG { get; init; }\r\n    public string Description { get; init; }\r\n    public decimal Price { get; init; }\r\n    public string Currency { get; init; }\r\n    public bool IsInStock { get; init; }\r\n    public string ImageName { get; init; }\r\n\r\n    public IImage Image\r\n    {\r\n        get\r\n        {\r\n            if (image == null)\r\n            {\r\n                if (!string.IsNullOrEmpty(ImageName))\r\n                {\r\n                    var s = AssetLoader.Open(new Uri($\"avares://DemoCenter/DemoData/csv/CarImages/{ImageName}\", UriKind.RelativeOrAbsolute));\r\n                    image = new Bitmap(s);\r\n                }\r\n            }\r\n\r\n            return image;\r\n        }\r\n    }\r\n\r\n    public CarInfo() { }\r\n\r\n    public CarInfo(string trademark, CarInfo carInfo)\r\n    {\r\n        Trademark = trademark;\r\n        HP = carInfo.HP;\r\n        Liter = carInfo.Liter;\r\n        Cyl = carInfo.Cyl;\r\n        TransmissionSpeedCount = carInfo.TransmissionSpeedCount;\r\n        TransmissionType = carInfo.TransmissionType;\r\n        MPG = carInfo.MPG;\r\n        Description = carInfo.Description.Replace(carInfo.Trademark, Trademark);\r\n        Price = carInfo.Price;\r\n        Currency = carInfo.Currency;\r\n        IsInStock = carInfo.IsInStock;\r\n        ImageName = carInfo.ImageName;\r\n    }\r\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/CsvClasses/CsvClasses.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Text;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace DemoCenter.DemoData\n{\n    public class MechInfo\n    {\n        public string Name {  get; init; }\n        public double Weight { get; init; }\n        public List<string> Weapons { get; init; }\n\n        public MechInfo(string name, int weight, List<string> weapons) \n        {\n            Name = name;\n            Weight = weight;\n            Weapons = weapons;\n        }\n    }\n\n    public class SpaceLaunchInfo\n    {\n        public DateTime Date { get; init; }\n        public string MissionName { get; init; }\n        public string LaunchSite { get; init; }\n\n        public SpaceLaunchInfo(DateTime date, string missionName, string launchSite)\n        {\n            Date = date;\n            MissionName = missionName;\n            LaunchSite = launchSite;\n        }\n    }\n\n    public class YachtInfo\n    {\n        public string Name { get; init; }\n        public double Length { get; init; }\n        public int NumberOfCabins { get; init; }\n        public double MaxSpeed { get; init; }\n        public decimal CruisingRange { get; init; }\n        public decimal Price { get; init; }\n        public int LaunchingYear { get; init; }\n        public string Builder { get; init; }\n        public string Designer { get; init; }\n        public string Flag { get; init; }\n        public string Location { get; init; }\n        public YachtWebInfo Details { get; init; }\n\n        public YachtInfo(string name, double length, int numberOfCabins, double maxSpeed, decimal cruisingRange, \n            decimal price, int launchingYear, string builder, string designer, string flag, string location)\n        {\n            Name = name;\n            Length = length;\n            NumberOfCabins = numberOfCabins;\n            MaxSpeed = maxSpeed;\n            CruisingRange = cruisingRange;\n            Price = price;\n            LaunchingYear = launchingYear;\n            Builder = builder;\n            Designer = designer;\n            Flag = flag;\n            Location = location.Replace(\"''\", \", \");\n            Details = new YachtWebInfo(Name, Location, $\"https://www.google.com/search?q=yacht+{Name.Replace(\" \", \"+\")}\");\n        }\n    }\n\n    public class YachtWebInfo\n    {\n        public string Header { get; init; }\n        public string Link { get; init; }\n\n        public YachtWebInfo(string name, string location, string link)\n        {\n            Header = $\"{name}, {location}\";\n            Link = link;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/CsvClasses/CsvColumnData.cs",
    "content": "﻿using System.Globalization;\n\nnamespace DemoCenter.DemoData;\n\npublic abstract class CsvColumn\n{\n    public string Header { get; }\n\n    public CsvColumn(string header)\n    {\n        Header = header;\n    }\n    public abstract void AddValue(string value);\n}\n\npublic abstract class CsvColumn<T> : CsvColumn\n{\n    public List<T> Data { get; } = new();\n\n    protected CsvColumn(string header) : base(header)\n    {\n    }\n}\n\npublic class CsvDoubleColumn : CsvColumn<double>\n{\n    public CsvDoubleColumn(string header) : base(header)\n    {\n    }\n    public override void AddValue(string value) => Data.Add(double.Parse(value.Trim(), CultureInfo.InvariantCulture));\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/CsvClasses/StockInfo.cs",
    "content": "﻿namespace DemoCenter.DemoData;\n\npublic class StockInfo\n{\n    public DateTime Date { get; }\n    public double Close { get; }\n    public double Open { get; }\n    public double High { get; }\n    public double Low { get; }\n    public double Volume { get; }\n\n    public StockInfo(DateTime date, double close, double open, double high, double low, double volume)\n    {\n        Date = date;\n        Close = close;\n        Open = open;\n        High = high;\n        Low = low;\n        Volume = volume;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/CsvClasses/StockProduct.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.DemoData.CsvClasses\n{\n    public class StockProduct\n    {\n        public int Id { get; set; }\n       \n        public string Name { get; set; }\n\n        public string Category { get; set; }\n\n        public string Color { get; set; }\n\n        public string Size { get; set; }\n\n        public decimal Cost { get; set; }\n\n        public int Quantity { get; set; }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/CsvSources.cs",
    "content": "﻿using Avalonia.Platform;\nusing System.Globalization;\nusing System.Text.RegularExpressions;\nusing Microsoft.VisualBasic.FileIO;\nusing DemoCenter.DemoData.CsvClasses;\n\nnamespace DemoCenter.DemoData\n{\n    public static class CsvSources\n    {\n        static List<CarInfo> cars;\n        public static List<CarInfo> Cars\n        {\n            get\n            {\n                cars ??= GetCars();\n                return cars;\n            }\n        }\n\n        static List<MechInfo> mechs;\n        public static List<MechInfo> Mechs\n        {\n            get\n            {\n                mechs ??= GetMechs();\n                return mechs;\n            }\n        }\n\n        static List<SpaceLaunchInfo> launches;\n        public static List<SpaceLaunchInfo> Launches\n        {\n            get\n            {\n                launches ??= GetLaunches();\n                return launches;\n            }\n        }\n\n        static List<string> yachtNames;\n        public static List<string> YachtNames\n        {\n            get\n            {\n                yachtNames ??= GetYachtNames();\n                return yachtNames;\n            }\n        }\n\n        static List<YachtInfo> yachts;\n        public static List<YachtInfo> Yachts\n        {\n            get\n            {\n                yachts ??= GetYachts();\n                return yachts;\n            }\n        }\n\n        static List<StockProduct> stockProducts;\n        public static List<StockProduct> StockProducts\n        {\n            get\n            {\n                stockProducts ??= GetStockProducts();\n                return stockProducts;\n            }\n        }\n\n        static List<CsvDoubleColumn> logarithmic;\n        public static List<CsvDoubleColumn> Logarithmic => logarithmic ??= GetLogarithmic();\n\n        static List<StockInfo> stock;\n        public static List<StockInfo> Stock => stock ??= GetStock();\n       \n        static List<CarInfo> GetCars()\n        {\n            var culture = new CultureInfo(\"en-US\");\n            \n            return GetInfo<CarInfo>(GetUriString(\"cars\"), GetCarInfo);\n\n            CarInfo GetCarInfo(string[] values)\n            {\n                return new CarInfo\n                {\n                    Id = int.Parse(values[0], culture),\n                    Trademark = values[1],\n                    HP = decimal.Parse(values[2], culture),\n                    Liter = decimal.Parse(values[3], culture),\n                    Cyl = decimal.Parse(values[4], culture),\n                    TransmissionSpeedCount = decimal.Parse(values[5]),\n                    TransmissionType = values[6],\n                    MPG = decimal.Parse(values[7], culture),\n                    Description = values[8],\n                    Price = decimal.Parse(values[9], NumberStyles.Currency, culture),\n                    Currency = culture.NumberFormat.CurrencySymbol,\n                    IsInStock = bool.Parse(values[10]),\n                    ImageName = values[11]\n                };\n            }\n        }\n        static List<MechInfo> GetMechs()\n        {\n            var regex = new Regex(@\"\\d{1,}\");\n            return GetInfo<MechInfo>(GetUriString(\"mechs\"), \n                values => new MechInfo(values[0], int.Parse(regex.Match(values[1]).Value), new List<string>() { values[2], values[3], values[4] }));\n        }\n        static List<SpaceLaunchInfo> GetLaunches()\n        {\n            var provider = CultureInfo.InvariantCulture;\n            return GetInfo<SpaceLaunchInfo>(GetUriString(\"spacexlaunches\"),\n                values => \n                { \n                    var launchDate = DateTime.ParseExact(values[0] + \",\" + values[1], \"MMMM d, yyyy\", provider);\n                    return new SpaceLaunchInfo(launchDate, values[2].TrimStart(), values[3].TrimStart()); \n                });\n        }\n        static List<string> GetYachtNames() => GetInfo<string>(GetUriString(\"yachtNames\"), values => values[0]);\n        static List<YachtInfo> GetYachts()\n        {\n            var provider = CultureInfo.InvariantCulture;\n            return GetInfo<YachtInfo>(GetUriString(\"yachts\"),\n                values =>\n                {\n                    var price = 1000000m* decimal.Parse(values[5]) + 1000m * decimal.Parse(values[6]) + decimal.Parse(values[7]);\n                    return new YachtInfo(values[0], double.Parse(values[1]), int.Parse(values[2]), double.Parse(values[3]), decimal.Parse(values[4]), price, int.Parse(values[8]), values[9], values[10], values[11], values[12]);\n                });\n        }\n        static List<CsvDoubleColumn> GetLogarithmic() => GetColumnInfo<CsvDoubleColumn>(GetUriString(\"logarithmic\"));\n        static List<StockInfo> GetStock() => GetInfo(GetUriString(\"Bitcoin Historical Data\"),\n            values =>\n            {\n                var date = DateTime.Parse(values[0], CultureInfo.InvariantCulture);\n                var close = double.Parse(values[1], CultureInfo.InvariantCulture);\n                var open = double.Parse(values[2], CultureInfo.InvariantCulture);\n                var high = double.Parse(values[3], CultureInfo.InvariantCulture);\n                var low = double.Parse(values[4], CultureInfo.InvariantCulture);\n                var volume = double.Parse(values[5].Substring(0, values[5].Length - 1), CultureInfo.InvariantCulture) * 1000;\n                return new StockInfo(date, close, open, high, low, volume);\n            });\n\n        static List<T> GetInfo<T>(string uriString, Func<string[], T> getInfo)\n        {\n            var result = new List<T>();\n            var uri = new Uri(uriString);\n\n            if (!AssetLoader.Exists(uri))\n                return result;\n\n            using (var reader = new StreamReader(AssetLoader.Open(uri)))\n            {\n                reader.ReadLine();\n\n                using (var parser = new TextFieldParser(reader))\n                {\n                    parser.HasFieldsEnclosedInQuotes = true;\n                    parser.Delimiters = new[] { \",\" };\n                    while (!parser.EndOfData)\n                    {\n                        string[] values = parser.ReadFields();\n                        result.Add(getInfo(values));\n                    }\n                }\n            }\n\n            return result;\n        }\n        static List<T> GetColumnInfo<T>(string uriString) where T : CsvColumn\n        {\n            const char separator = ',';\n            \n            var result = new List<T>();\n            var uri = new Uri(uriString);\n\n            if (!AssetLoader.Exists(uri))\n                return result;\n\n            using (var reader = new StreamReader(AssetLoader.Open(uri)))\n            {\n                string[] headers = reader.ReadLine()!.Split(separator);\n                foreach (string header in headers)\n                    result.Add((T)Activator.CreateInstance(typeof(T), header.Trim()));\n\n                using (var parser = new TextFieldParser(reader))\n                {\n                    parser.HasFieldsEnclosedInQuotes = false;\n                    parser.Delimiters = new[] { separator.ToString() };\n                    while (!parser.EndOfData)\n                    {\n                        string[] values = parser.ReadFields();\n                        if (values != null)\n                        {\n                            for(int i = 0; i < result.Count; i++)\n                                result[i].AddValue(values[i]);\n                        }\n                    }\n                }\n            }\n\n            return result;\n        }\n\n        static List<StockProduct> GetStockProducts()\n        {\n            return GetInfo<StockProduct>(GetUriString(\"stockProducts\"), GetStockProduct);\n\n            StockProduct GetStockProduct(string[] values)\n            {\n                return new StockProduct()\n                {\n                    Id = int.Parse(values[0]),\n                    Name = values[1],\n                    Color = values[2],\n                    Size = values[3],\n                    Category = values[4],\n                    Cost = decimal.Parse(values[5]),\n                    Quantity = int.Parse(values[6]),\n                };\n            }\n        }\n\n        static string GetUriString(string path) => $\"avares://DemoCenter/DemoData/csv/{path}.csv\";\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/ElementsSources.cs",
    "content": "﻿using Avalonia.Media;\nusing DemoCenter.Helpers;\nusing static System.Net.Mime.MediaTypeNames;\n\nnamespace DemoCenter.DemoData\n{\n    public class ElementInfo\n    {\n        public string Name { get; init; }\n        public ElementCategory Category { get; init; }\n        public IImage Icon { get; init; }\n\n        public ElementInfo(string name, ElementCategory category, IImage icon)\n        {\n            Name = name;\n            Category = category;\n            Icon = icon;\n        }\n    }\n\n    public enum ElementCategory\n    {\n        Active,\n        Passive,\n        IndependentSource,\n        ControlledSource,\n        Multipole\n    }\n\n    public static class ElementsSources\n    {\n        static List<ElementInfo> elements;\n        public static List<ElementInfo> Elements\n        {\n            get\n            {\n                elements ??= GetElements();\n                return elements;\n            }\n        }\n\n        static List<ElementInfo> GetElements()\n        {\n            return new List<ElementInfo>()\n            {\n                new ElementInfo(\"Arsenide-gallium transistor\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___arsenid_gallievyj_polevoj_tranzistor), //\"Group=Models, Icon=aktivnye komponenty - arsenid-gallievyj polevoj tranzistor\"),\n                new ElementInfo(\"N-Type bypolar transistor with base\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___bipoljarnyj_tranzistor_n_tipa_s_podlozhkoj),\n                new ElementInfo(\"N-Type bypolar transistor\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___bipoljarnyj_tranzistor_n_tipa),\n                new ElementInfo(\"P-Type bypolar transistor with base\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___bipoljarnyj_tranzistor_p_tipa_s_podlozhkoj),\n                new ElementInfo(\"P-Type bypolar transistor\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___bipoljarnyj_tranzistor_p_tipa),\n\n                new ElementInfo(\"MOS transistor (DN type)\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___mop_tranzistor_DN_tipa),\n                new ElementInfo(\"MOS transistor (DP type)\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___mop_tranzistor_DP_tipa),\n                new ElementInfo(\"MOS transistor (N type)\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___mop_tranzistor_N_tipa),\n                new ElementInfo(\"MOS transistor (P type)\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___mop_tranzistor_P_tipa),\n\n                new ElementInfo(\"Operational amplifier\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___operacionnyj_usilitel),\n                new ElementInfo(\"Field-effect transistor (N type)\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___polevoj_tranzistor_n_tipa),\n                new ElementInfo(\"Field-effect transistor (P type)\", ElementCategory.Active, Eremex.AvaloniaUI.Icons.Models.Aktivnye_komponenty___polevoj_tranzistor_p_tipa),\n\n                new ElementInfo(\"Functional voltage source\", ElementCategory.IndependentSource, Eremex.AvaloniaUI.Icons.Models.Funkcionalnye_istochniki___funkcionalnyj_istochnik_naprjazhenija),\n                new ElementInfo(\"Functional current source\", ElementCategory.IndependentSource, Eremex.AvaloniaUI.Icons.Models.Funkcionalnye_istochniki___funkcionalnyj_istochnik_toka),\n\n                new ElementInfo(\"Four-pole\", ElementCategory.Multipole, Eremex.AvaloniaUI.Icons.Models.Mnogopolosniki___chetyrehpolosnik),\n                new ElementInfo(\"Two-pole\", ElementCategory.Multipole, Eremex.AvaloniaUI.Icons.Models.Mnogopolosniki___dvuhpolosnik),\n                new ElementInfo(\"Six-pole\", ElementCategory.Multipole, Eremex.AvaloniaUI.Icons.Models.Mnogopolosniki___shestipolosnik),\n                new ElementInfo(\"Eight-pole\", ElementCategory.Multipole,Eremex.AvaloniaUI.Icons.Models.Mnogopolosniki___vosmipolosnik),\n\n                new ElementInfo(\"Battery\", ElementCategory.IndependentSource, Eremex.AvaloniaUI.Icons.Models.Nezavisimye_istochniki___batareja),\n                new ElementInfo(\"Voltage source\", ElementCategory.IndependentSource, Eremex.AvaloniaUI.Icons.Models.Nezavisimye_istochniki___istochnik_naprjazhenija),\n                new ElementInfo(\"Current source\", ElementCategory.IndependentSource, Eremex.AvaloniaUI.Icons.Models.Nezavisimye_istochniki___istochnik_toka),\n\n                new ElementInfo(\"Diod\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___diod),\n                new ElementInfo(\"Long line\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___dlinnaja_linija),\n                new ElementInfo(\"Transformator\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___dvuhobmotochnyj_transformator),\n                new ElementInfo(\"Inductor\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___induktivnost),\n                new ElementInfo(\"Capacitor\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___kondensator),\n                new ElementInfo(\"Voltage-controlled switch\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___perekljuchatel_upravljaemyj_naprjazheniem),\n                new ElementInfo(\"Current-controlled switch\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___perekljuchatel_upravljaemyj_tokom),\n                new ElementInfo(\"Resistor\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___rezistor),\n                new ElementInfo(\"Variable resistor\", ElementCategory.Passive, Eremex.AvaloniaUI.Icons.Models.Passivnye_elementy___rezistor_potenciometr),\n\n                new ElementInfo(\"Voltage-controlled voltage source\", ElementCategory.ControlledSource, Eremex.AvaloniaUI.Icons.Models.Upravljaemye_istochniki___istochnik_naprjazhenija_upravljaemyj_naprjazheniem),\n                new ElementInfo(\"Current-controlled voltage source\", ElementCategory.ControlledSource, Eremex.AvaloniaUI.Icons.Models.Upravljaemye_istochniki___istochnik_naprjazhenija_upravljaemyj_tokom),\n                new ElementInfo(\"Voltage-controlled current source\", ElementCategory.ControlledSource, Eremex.AvaloniaUI.Icons.Models.Upravljaemye_istochniki___istochnik_toka_upravljaemyj_naprjazheniem),\n                new ElementInfo(\"Current-controlled current source\", ElementCategory.ControlledSource, Eremex.AvaloniaUI.Icons.Models.Upravljaemye_istochniki___istochnik_toka_upravljaemyj_tokom),\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/EmployeesData.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel.DataAnnotations;\nusing System.Dynamic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace DemoCenter.DemoData\n{\n    public static class EmployeesData\n    {\n        public const string PhoneRegex = @\"^(\\+\\d{1,2}\\s?)?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$\";\n\n        static List<string> employeeNames = new List<string>()\n        {\n            \"Angelica Grace\", \"Janet Francis\", \"Lance Phillips\", \"Herbert Gilmore\", \"Jose Horn\",\n            \"Alfred McFarland\", \"Gwen Chandler\", \"Julia Case\", \"Thomas Howell\", \"Liz McGill\",\n            \"Pat Dudley\", \"Jodi Funk\", \"Taylor Monroe\", \"Vicki Stevenson\", \"Roman Bridges\",\n            \"Bradley Maloney\", \"Craig MacDonald\", \"Cora Cameron\", \"Katherine Tyler\", \"Rachel Shah\",\n            \"Earl Lee\", \"Merle Williamson\", \"Gene Morse\", \"Steven Dodd\", \"Julius Peck\",\n            \"Trevor Chaney\", \"Lon Schneider\", \"Julio Hammond\", \"Rosario Kirby\", \"Janice Perry\", \"Lana Carey\", \n            \"Terrell Wells\", \"Herbert Hardy\", \"Thomas Downs\", \"Audrey Shields\", \"Davis Buchanan\", \"Cassie Barron\",\n            \"Kirsten Huff\", \"Gregg Wood\", \"Lily Alvarado\", \"Cruz Johns\", \"Michele Clark\", \"Jasper Ward\"\n        };\n\n        public static List<string> EmployeeNames => employeeNames;\n\n        static List<string> cities = new List<string>()\n        {\n            \"New York\", \"Los Angeles\", \"Chicago\", \"Houston\", \"Phoenix\",\n            \"Philadelphia\", \"San Antonio\", \"San Diego\", \"Dallas\", \"San Jose, Calif\"\n        };\n\n        private static Random random = new Random();\n\n        public static IReadOnlyList<string> Positions { get; } = new List<string>()\n        {\n            \"Accountant\", \"Sales Representative\", \"Manager\", \"Project Manager\", \"Sales Manager\",\n            \"HR Manager\", \"Operations Manager\", \"Account Manager\", \"Electrical Engineer\", \"Customer Service Engineer\",\n            \"Software Engineer\", \"Engineer\", \"Program Manager\", \"Administrative Assistant\", \"Financial Analyst\"\n        };\n\n        public static IList<EmployeeSale> GenerateEmployeeSales()\n        {\n            var sales = new ObservableCollection<EmployeeSale>();\n\n            for (int i = 5; i > 0; i--)\n            {\n                foreach (var name in employeeNames)\n                {\n                    var employee = new EmployeeSale() { Employee = name, Year = DateTime.Now.Year - i + 1 };\n                    employee.Quarter1 = GetQuarterSalePercent();\n                    employee.Quarter2 = GetQuarterSalePercent();\n                    employee.Quarter3 = GetQuarterSalePercent();\n                    employee.Quarter4 = GetQuarterSalePercent();\n                    employee.Total = Math.Round((employee.Quarter1 + employee.Quarter2 + employee.Quarter3 + employee.Quarter4) / 4);\n                    sales.Add(employee);\n                }\n            }\n\n            return sales;\n        }\n\n        private static decimal GetQuarterSale()\n        {\n            return random.Next(90000) + 10000;\n        }\n\n        private static decimal GetQuarterSalePercent()\n        {\n            return Math.Round(GetQuarterSale() / 1000);\n        }\n\n        public static IList<EmployeeInfo> GenerateEmployeeInfo()\n        {\n            var employees = new ObservableCollection<EmployeeInfo>();\n\n            foreach (var employeeName in employeeNames)\n            {\n                var name = employeeName.Split(' ');\n                var employee = new EmployeeInfo() { FirstName = name[0], LastName = name[1] };\n                var age = 20 + random.Next(40);\n                employee.BirthDate = new DateTime(DateTime.Now.Year - age, random.Next(12) + 1, random.Next(28) + 1);\n                employee.HireDate = new DateTime(DateTime.Now.Year - random.Next(20) - 1, random.Next(12) + 1, random.Next(28) + 1);\n                employee.Experience = Math.Max(age - 20 - random.Next(age - 20), DateTime.Now.Year - employee.HireDate.Year);\n                employee.Position = Positions[random.Next(Positions.Count)];\n                employee.EmploymentType = (EmploymentType)random.Next(3);\n                employee.Married = random.Next(3) != 0;\n                employee.City = cities[random.Next(cities.Count)];\n                employee.Phone = GetPhoneNumber();\n                employees.Add(employee);\n            }\n\n            return employees;\n        }\n\n        public static IList<EmployeeValidationInfo> GenerateValidationEmployeeInfo()\n        {            \n            Random rnd = new();\n\n            var employees = GenerateEmployeeInfo();\n\n            GetRandomEmployee(rnd, employees).FirstName = string.Empty;\n            GetRandomEmployee(rnd, employees).LastName = string.Empty;\n            GetRandomEmployee(rnd, employees).FirstName = string.Empty;\n            GetRandomEmployee(rnd, employees).LastName = string.Empty;\n            GetRandomEmployee(rnd, employees).City = string.Empty;\n            GetRandomEmployee(rnd, employees).City = string.Empty;\n            GetRandomEmployee(rnd, employees).City = string.Empty;\n            GetRandomEmployee(rnd, employees).Phone = \"123 456\";\n            GetRandomEmployee(rnd, employees).Phone = \"(2994)345-235\";\n            GetRandomEmployee(rnd, employees).Phone = \"(574)786\";\n            GetRandomEmployee(rnd, employees).BirthDate = DateTime.Now.AddDays(10);\n            GetRandomEmployee(rnd, employees).HireDate = DateTime.Now.AddDays(4);\n            \n            var employee = GetRandomEmployee(rnd, employees);\n            employee.HireDate = employee.BirthDate - TimeSpan.FromDays(10);\n            employee.Experience = 0;\n\n            return employees.Select(x => new EmployeeValidationInfo(x)).ToList();\n\n            EmployeeInfo GetRandomEmployee(Random rnd, IList<EmployeeInfo> employees)\n            {\n                return employees[rnd.Next(20)];\n            }\n        }\n\n        private static string GetPhoneNumber()\n        {\n            var stringBuilder = new StringBuilder();\n            for (int i = 0; i < 10; i++)\n            {\n                stringBuilder.Append(random.Next(10));\n            }\n            var phone = stringBuilder.ToString();\n            return $\"({phone.Substring(0, 3)}) {phone.Substring(3, 3)}-{phone.Substring(6, 4)}\";\n        }\n\n        public static IList GenerateComplexEmployeeSales()\n        {\n            var sales = new ObservableCollection<object>();\n            foreach (var name in employeeNames.Order())\n            {\n                IDictionary<string, object> employeeSale = new ExpandoObject();\n                employeeSale[\"Employee\"] = name;\n                decimal total = 0;\n                for (int i = 1; i < 4; i++)\n                {\n                    var year = DateTime.Now.Year - i;\n                    decimal yearTotal = 0;\n                    for (int j = 0; j < 12; j++)\n                    {   \n                        var sale = GetQuarterSale();\n                        yearTotal += sale;\n                        var monthName = CultureInfo.InvariantCulture.DateTimeFormat.GetAbbreviatedMonthName(j + 1);\n                        var propertyName = $\"{year}/Q{j / 3 + 1}/{monthName}\";\n                        employeeSale[propertyName] = sale;\n                    }\n                    employeeSale[$\"{year}/Total\"] = yearTotal;\n                    total += yearTotal;\n                }\n                employeeSale[\"Total\"] = total;\n                sales.Add(employeeSale);\n            }\n\n            return sales;\n        }\n    }\n\n    public class EmployeeSale\n    {\n        public string Employee { get; set; }\n\n        public int Year { get; set; }\n\n        public decimal Quarter1 { get; set; }\n\n        public decimal Quarter2 { get; set; }\n\n        public decimal Quarter3 { get; set; }\n\n        public decimal Quarter4 { get; set; }\n\n        public decimal Total { get; set; }\n    }\n\n    public class EmployeeInfo\n    {\n        public string FirstName { get; set; }\n\n        public string LastName { get; set; }\n\n        public DateTime BirthDate { get; set; }\n\n        public DateTime HireDate { get; set; }\n\n        public int Experience { get; set; }\n\n        public string Position { get; set; }\n\n        public EmploymentType EmploymentType { get; set; }\n\n        public bool Married { get; set; }\n\n        public string City { get; set; }\n\n        public string Phone { get; set; }\n    }\n\n    public class EmployeeValidationInfo\n    {\n        static readonly DateTime MinDate = new DateTime(1900, 1, 1);\n\n        public EmployeeValidationInfo(EmployeeInfo employee)\n        {\n            FirstName = employee.FirstName;\n            LastName = employee.LastName;\n            BirthDate = employee.BirthDate;\n            HireDate = employee.HireDate;\n            Experience = employee.Experience;   \n            City = employee.City;\n            Phone = employee.Phone;  \n        }\n\n        [Required]\n        public string FirstName { get; set; }\n\n        [Required]\n        public string LastName { get; set; }\n\n        [CustomValidation(typeof(EmployeeValidationInfo), nameof(ValidateDate))]\n        public DateTime BirthDate { get; set; }\n\n        [CustomValidation(typeof(EmployeeValidationInfo), nameof(ValidateDate))]\n        public DateTime HireDate { get; set; }\n\n        [Required]\n        public int Experience { get; set; }\n\n        [Required]\n        public string City { get; set; }\n\n        [RegularExpression(EmployeesData.PhoneRegex, ErrorMessage = \"The phone number is not valid\")]\n        public string Phone { get; set; }\n\n        public static ValidationResult ValidateDate(DateTime date)\n        {\n            if(date > DateTime.Today)\n                return new ValidationResult(\"The date cannot be in the future.\");\n            if (date < MinDate)\n                return new ValidationResult($\"The date cannot be less than {MinDate:d}\");\n            return ValidationResult.Success; \n        } \n    }\n\n    public enum EmploymentType\n    {\n        [Display(Name = \"Full Time\")]\n        FullTime,\n        [Display(Name = \"Part Time\")]\n        PartTime,\n        Contract\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/Enums.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.DemoData\n{\n    public enum GraphicPosition\n    {\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/Dimension.svg\")]\n        [Display(Description = \"Set Graphics to Dimension\")]\n        Dimension,\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/Maximum.svg\")]\n        [Display(Description = \"Set Graphics to Maximum\")]\n        Maximum,\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/Minimum.svg\")]\n        [Display(Description = \"Set Graphics to Minimum\")]\n        Minimum,\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/Point.svg\")]\n        [Display(Description = \"Set Graphics to Next Point\")]\n        NextPoint,\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/Peak.svg\")]\n        [Display(Description = \"Set Graphics to Peak\")]\n        Peak,\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/Recess.svg\")]\n        [Display(Description = \"Set Graphics to Recess\")]\n        Recess,\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/X.svg\")]\n        [Display(Description = \"Set Graphics to X\")]\n        X,\n        [Image($\"avares://Eremex.Avalonia.Icons/Graphics/Y.svg\")]\n        [Display(Description = \"Set Graphics to Y\")]\n        Y\n    }\n    public enum GraphicView\n    {\n        [Image($\"avares://Eremex.Avalonia.Icons/3D/View Back.svg\")]\n        [Display(Description = \"Back View\")]\n        Back,\n        [Image($\"avares://Eremex.Avalonia.Icons/3D/View Front.svg\")]\n        [Display(Description = \"Front View\")]\n        Front,\n        [Image($\"avares://Eremex.Avalonia.Icons/3D/View Top.svg\")]\n        [Display(Description = \"Top View\")]\n        Top,\n        [Image($\"avares://Eremex.Avalonia.Icons/3D/View Bottom.svg\")]\n        [Display(Description = \"Bottom View\")]\n        Bottom\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/InfrastructureData.cs",
    "content": "﻿using System.Collections.ObjectModel;\n\nnamespace DemoCenter.DemoData\n{\n    public enum AssetType\n    {\n        DataCenter,\n        ServerRack,\n        VirtualizationHost,\n        DatabaseServer,\n        WebServer,\n        StorageSystem,\n        NetworkDevice,\n        SecurityAppliance\n    }\n\n    public enum AssetStatus\n    {\n        Operational,\n        Maintenance,\n        Degraded,\n        Offline,\n        Decommissioned,\n        Critical,\n        Warning\n    }\n\n    public class InfrastructureItem\n    {\n        public string Name { get; set; }\n        public AssetType AssetType { get; set; }\n\n        public DateTime? LastMaintenance { get; set; }\n        public bool IsOperational => Status == AssetStatus.Operational || Status == AssetStatus.Warning || Status == AssetStatus.Critical;\n        public AssetStatus Status { get; set; }\n\n        public float Utilization { get; set; }\n        public decimal MaintenanceCost { get; set; }\n        public decimal PowerConsumption { get; set; }\n\n        public ObservableCollection<InfrastructureItem> Children { get; } = new();\n\n        public bool HasChildren => Children.Count > 0;\n    }\n\n    public class InfrastructureData\n    {\n        private static readonly AssetType[] serverTypes = { AssetType.VirtualizationHost, AssetType.DatabaseServer, AssetType.WebServer, AssetType.StorageSystem, AssetType.NetworkDevice, AssetType.SecurityAppliance  };\n\n        private static readonly string[] DataCenterNames = { \"Quantum Data Center\", \"Aether Data Center\", \"Stellar Data Center\", \"Nova Data Center\", \"Infinity Data Center\" };\n\n        private static readonly string[] ServerNames = {  \"HyperCore\", \"VMHost\", \"CloudNode\", \"VirtualEngine\", \"Orchestrator\", \"DataForge\", \"QueryMaster\", \"StorageBrain\", \"ArchiveKeeper\", \"InfoStream\",\n                                                          \"WebFlux\", \"SiteStream\", \"PageServer\", \"APIGateway\", \"ContentHub\",\"AppEngine\", \"ServiceNode\", \"RuntimeCore\", \"MicroHost\", \"WorkflowUnit\",\n                                                          \"StoragePod\", \"DataVault\", \"FileArray\", \"DiskCluster\", \"ArchiveBank\",\"NetSwitch\", \"DataRouter\", \"TrafficHub\", \"PacketFlow\", \"ConnectionPoint\",\n                                                          \"Firewall\", \"SecurityShield\", \"ThreatGuard\", \"AccessControl\", \"CyberDefense\",\"ComputeNode\", \"ServerUnit\", \"ProcessingCore\", \"ExecutionEngine\", \"TaskHandler\" };\n                                                           \n    \n        public static List<InfrastructureItem> GenerateData()\n        {\n            var items = new List<InfrastructureItem>();\n\n            var random = new Random(40);\n\n            for (int i = 1; i <= 5; i++)\n            {\n                var dataCenter = CreateDataCenter(random, i);\n\n                for (int j = 1; j <= random.Next(8, 13); j++)\n                {\n                    var serverRack = CreateServerRack(random, j);\n\n                    for (int k = 1; k <= random.Next(6, 11); k++)\n                    {\n                        var serverComponent = CreateServer(random, k);\n\n                        serverRack.Children.Add(serverComponent);\n                    }\n\n                    dataCenter.Children.Add(serverRack);\n                }\n\n                items.Add(dataCenter);\n            }\n            return items;\n        }\n\n        private static InfrastructureItem CreateDataCenter(Random random, int index)\n        {\n            return new InfrastructureItem()\n            {\n                Name = DataCenterNames[index - 1],\n                AssetType = AssetType.DataCenter,\n                LastMaintenance = DateTime.Now.AddMonths(-random.Next(1, 6)),\n                Status = GetRandomStatus(random, 0.8),\n                Utilization = random.Next(60, 95) / 100f,\n                MaintenanceCost = random.Next(50000, 200000),\n                PowerConsumption = random.Next(200, 500),\n            };\n        }\n\n        private static InfrastructureItem CreateServerRack(Random random, int index)\n        {\n            return new InfrastructureItem\n            {\n                Name = $\"Rack {index:00}\",\n                AssetType = AssetType.ServerRack,\n                LastMaintenance = DateTime.Now.AddMonths(-random.Next(1, 12)),\n                Status = GetRandomStatus(random, 0.7),\n                Utilization = random.Next(70, 98) / 100f,\n                MaintenanceCost = random.Next(5000, 15000),\n                PowerConsumption = random.Next(5, 15),\n            };\n        }\n\n        private static InfrastructureItem CreateServer(Random random, int index)\n        {\n            var serverType = serverTypes[random.Next(serverTypes.Length)];\n\n            var server = new InfrastructureItem\n            {\n                Name = GetServerName(random, serverType),\n                AssetType = serverType,\n                LastMaintenance = DateTime.Now.AddMonths(-random.Next(1, 18)),\n                Status = GetRandomStatus(random, 0.6),\n                Utilization = random.Next(30, 95) / 100f,\n                MaintenanceCost = GetServerMaintenanceCost(random, serverType),\n                PowerConsumption = Math.Round((decimal)random.NextDouble() * 2 + 0.5m, 1)\n            };\n\n            return server;\n        }\n\n        private static AssetStatus GetRandomStatus(Random random, double operationalChance)\n        {\n            var rand = random.NextDouble();\n            if (rand < operationalChance * 0.7) return AssetStatus.Operational;\n            if (rand < operationalChance * 0.8) return AssetStatus.Warning;\n            if (rand < operationalChance * 0.9) return AssetStatus.Maintenance;\n            if (rand < operationalChance) return AssetStatus.Degraded;\n            return AssetStatus.Offline;\n        }\n\n        private static string GetServerName(Random random, AssetType type)\n        {\n            return ServerNames[(int)type * 5 + random.Next(5)] + \" Server\";\n        }\n\n        private static decimal GetServerMaintenanceCost(Random random, AssetType type)\n        {\n            return random.Next(20000, 80000) * (decimal)(random.NextDouble() * 0.15);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/OrderData.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.ComponentModel.DataAnnotations;\nusing System.Text;\n\nnamespace DemoCenter.DemoData\n{\n    public class OrderData\n    {\n        public static IList<OrderData> GenerateData(int count)\n        {\n            var random = new Random();\n            var data = new List<OrderData>(count);\n            for (int i = 0; i < count; i++)\n            {\n                data.Add(new OrderData()\n                {\n                    OrderId = i,\n                    Manager = EmployeesData.EmployeeNames[random.Next(EmployeesData.EmployeeNames.Count)],\n                    Count = random.Next(1000),\n                    Price = random.Next(1000),\n                    Date = DateTime.Today.AddDays(random.Next(200) - 100)\n                });\n            }\n            return data;\n        }\n\n        public int OrderId { get; private set; }\n\n        public string Manager { get; set; }\n\n        public int Count { get; set; }\n\n        public decimal Price { get; set; }\n\n        public decimal TotalPrice => Count * Price;\n\n        public DateTime Date { get; set; }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/ProjectTasksData.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel.DataAnnotations;\n\nnamespace DemoCenter.DemoData\n{\n    public enum TaskStatus\n    {\n        [Display(Name = \"Not Started\")]\n        NotStarted,\n        [Display(Name = \"In Progress\")]\n        InProgress,\n        [Display(Name = \"Completed\")]\n        Completed\n    }\n\n    public partial class ProjectTask : ObservableObject\n    {\n        public ProjectTask(ProjectTask parent, string description, TaskStatus status, int estimateTime, int timeSpent, string assignee, DateTime dueDate)\n        {\n            Tasks = new();\n            Parent = parent;\n            this.description = description;\n            this.status = status;\n            this.estimateTime = estimateTime;\n            this.timeSpent = timeSpent;\n            this.assignee = assignee;\n            this.dueDate = dueDate;\n        }\n\n        public ProjectTask Parent { get; }\n\n        [ObservableProperty]\n        private bool highPriority;\n\n        [ObservableProperty]\n        private string description;\n\n        [ObservableProperty]\n        private TaskStatus status;\n\n        [ObservableProperty]\n        private string assignee;\n\n        [ObservableProperty]\n        private int estimateTime;\n\n        [ObservableProperty]\n        private int timeSpent;\n\n        [ObservableProperty]\n        private int progress;\n\n        [ObservableProperty]\n        private DateTime dueDate;\n\n        public List<ProjectTask> Tasks { get; }\n\n        public bool HasTasks => Tasks.Count > 0;\n\n        partial void OnStatusChanged(TaskStatus value) => Parent?.UpdateStatus();\n\n        partial void OnEstimateTimeChanged(int value) => Parent?.UpdateEstimateTime();\n\n        partial void OnTimeSpentChanged(int value) => Parent?.UpdateTimeSpent();\n\n        private void UpdateStatus()\n        {\n            Status = Tasks.All(t => t.Status == TaskStatus.Completed) ? TaskStatus.Completed : Tasks.All(t => t.Status == TaskStatus.NotStarted) ? TaskStatus.NotStarted : TaskStatus.InProgress;\n        }\n\n        private void UpdateEstimateTime() => EstimateTime = Tasks.Sum(t => t.EstimateTime);  \n\n        private void UpdateTimeSpent() => TimeSpent = Tasks.Sum(t => t.TimeSpent);\n\n        private void UpdateProgress() => Progress = Tasks.Sum(t => t.Progress) / Tasks.Count;\n\n        internal void Update()\n        {\n            UpdateStatus();\n            UpdateEstimateTime();\n            UpdateTimeSpent();\n            UpdateProgress();\n        }\n    }\n\n    public class ProjectTasksGenerator\n    {\n        private static readonly Random random = new();\n\n        public static List<ProjectTask> Generate()\n        {\n            List<ProjectTask> tasks = new();\n\n            CreateProject(tasks, \"'Trade Central' Web Site\", 0, WebSiteTaskNames, new DateTime(2023, 11, 16));\n            CreateProject(tasks, \"'World Wonders' Mobile App\", WebSiteTaskNames.Length + 1, MobileAppTaskNames, new DateTime(2023, 11, 10));\n            CreateProject(tasks, \"'Six Sigma' Mobile App\", WebSiteTaskNames.Length + 1, MobileAppTaskNames, new DateTime(2023, 10, 20));\n            CreateProject(tasks, \"'Profit First' Web Site\", 0, WebSiteTaskNames,new DateTime(2023, 12, 11));\n\n            return tasks;\n        }\n\n        private static void CreateProject(List<ProjectTask> items, string description, int assigneeIndex, string[] taskNames, DateTime dueDate)\n        {\n            var project = new ProjectTask(null, description, TaskStatus.InProgress, 0, 0, AssigneeNames[assigneeIndex], dueDate);                        \n            GenerateProjectTasks(project, assigneeIndex + 1, taskNames);\n            items.Add(project);\n        }\n\n        private static void GenerateProjectTasks(ProjectTask project, int assigneeIndex, string[] taskNames)\n        {\n            int completedCount = taskNames.Length / 3, inProgressAndCompletedCount = completedCount + taskNames.Length / 2;\n\n            for (int i = 0; i < taskNames.Length; i++)\n            {\n                var status = i <= completedCount ? TaskStatus.Completed : (i <= inProgressAndCompletedCount ? TaskStatus.InProgress : TaskStatus.NotStarted);\n                var dueDate = project.DueDate - new TimeSpan((taskNames.Length - i) * 5, i, i, 0);\n                var estimate = random.Next(10, 70);\n                var timeSpent = status == TaskStatus.Completed ? random.Next(estimate - 5, estimate + 5) : random.Next(10, estimate);\n\n                var task = new ProjectTask(project, taskNames[i], status, estimate, timeSpent, AssigneeNames[assigneeIndex + i], dueDate);\n                task.Progress = status == TaskStatus.Completed ? 100 : (status == TaskStatus.InProgress ? random.Next(10, 80) : 0);\n                task.HighPriority = random.Next(1, taskNames.Length) == i;\n\n                project.Tasks.Add(task);\n            }\n\n            project.Update();\n        }\n\n        private static readonly string[] WebSiteTaskNames = new[]\n        {\n           \"Market research\", \"Define objectives and requirements\", \"Domain name registration\",\n           \"Select a hosting provider\", \"Create a sitemap\", \"Wireframing and mockups\",\n           \"Design UI/UX\", \"Front-end development\", \"Back-end development\",\n           \"Content creation\", \"SEO (Search Engine Optimization)\", \"Mobile responsiveness\",\n           \"Testing and quality assurance\", \"Security Assessment\", \"Launch and post-launch activities\"\n        };\n\n        private static readonly string[] MobileAppTaskNames = new[]\n        {\n           \"Market research\", \"Define objectives and requirements\",\n           \"Wireframing and mockups\", \"Design UI/UX\", \"Front-end development\",\n           \"Back-end development\", \"API Integration\", \"Deployment\",\n           \"Testing and quality assurance\", \"Security Assessment\", \"Launch and post-launch activities\",\n        };\n\n        private static readonly string[] AssigneeNames = new[]\n        {\n            \"Ben Elliott\", \"Nelson Blackburn\", \"Clifford Hines\", \"Kaitlin Watts\", \"Lana Burnett\",\n            \"Stanley Dorsey\", \"Tony Huffman\", \"Lisa Marquez\", \"Tim Robinson\", \"Jodie Bradley\",\n            \"Casey Mccarthy\", \"Ralph Livingston\", \"Scott Reed\", \"Sarah Evans\", \"Jeremy Pearson\", \"Mattie Fowler\",\n            \"Kylie Phillips\", \"Stefan Garrison\", \"Daniel Harvey\", \"Krish Joyce\", \"Kaitlyn Thomas\", \"Dan Berry\",\n            \"John Oneal\", \"Nikolas Andrews\", \"Lisa Chan\", \"Molly Byrd\", \"Oliver Welsh\", \"Dillan Tanner\"\n        };\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/SalesData.cs",
    "content": "﻿using System;\n\nnamespace DemoCenter.DemoData\n{\n    public class SalesData\n    {\n        static List<string> cityNames = new List<string>()\n        {\n            \"New York\", \"Los Angeles\", \"Chicago\", \"Houston\", \n            \"Phoenix\", \"Philadelphia\", \"San Francisco\", \"Las Vegas\"\n        };\n\n        public string Name { get; set; }\n\n        public decimal Q1Absolute { get; set; }\n\n        public decimal Q1Fraction { get; set; }\n\n        public decimal Q2Absolute { get; set; }\n\n        public decimal Q2Fraction { get; set; }\n\n        public decimal Q3Absolute { get; set; }\n\n        public decimal Q3Fraction { get; set; }\n\n        public decimal Q4Absolute { get; set; }\n\n        public decimal Q4Fraction { get; set; }\n\n        public decimal Total { get; set; }\n\n        public List<SalesData> Children { get; set; }\n\n        public static IList<SalesData> GenerateData()\n        {   \n            var data = new List<SalesData>();\n            var employeeNames = EmployeesData.EmployeeNames.ToList();\n            int employeesCount = employeeNames.Count / cityNames.Count;\n            foreach (var cityName in cityNames)\n            {\n                var citySale = new SalesData() { Name = cityName, Children = new List<SalesData>() };\n                for (int i = 0; i < employeesCount; i++)\n                {   \n                    int employeeIndex = Random.Shared.Next(employeeNames.Count);\n                    var employeeSale = new SalesData() { Name = employeeNames[employeeIndex] };\n                    employeeNames.RemoveAt(employeeIndex);\n                    employeeSale.Q1Absolute = GetAbsoluteQuarterSale();\n                    employeeSale.Q1Fraction = GetEmployeeFractionQuarterSale(employeeSale.Q1Absolute);\n                    employeeSale.Q2Absolute = GetAbsoluteQuarterSale();\n                    employeeSale.Q2Fraction = GetEmployeeFractionQuarterSale(employeeSale.Q2Absolute);\n                    employeeSale.Q3Absolute = GetAbsoluteQuarterSale();\n                    employeeSale.Q3Fraction = GetEmployeeFractionQuarterSale(employeeSale.Q3Absolute);\n                    employeeSale.Q4Absolute = GetAbsoluteQuarterSale();\n                    employeeSale.Q4Fraction = GetEmployeeFractionQuarterSale(employeeSale.Q4Absolute);\n                    employeeSale.Total = employeeSale.Q1Absolute + employeeSale.Q2Absolute + employeeSale.Q3Absolute + employeeSale.Q4Absolute;\n\n                    citySale.Children.Add(employeeSale);\n                    citySale.Q1Absolute += employeeSale.Q1Absolute;\n                    citySale.Q1Fraction += GetCityFractionQuarterSale(employeeSale.Q1Absolute, employeesCount);\n                    citySale.Q2Absolute += employeeSale.Q2Absolute;\n                    citySale.Q2Fraction += GetCityFractionQuarterSale(employeeSale.Q2Absolute, employeesCount);\n                    citySale.Q3Absolute += employeeSale.Q3Absolute;\n                    citySale.Q3Fraction += GetCityFractionQuarterSale(employeeSale.Q3Absolute, employeesCount);\n                    citySale.Q4Absolute += employeeSale.Q4Absolute;\n                    citySale.Q4Fraction += GetCityFractionQuarterSale(employeeSale.Q4Absolute, employeesCount);\n                    citySale.Total += employeeSale.Total;\n                }\n                data.Add(citySale);\n            }\n            return data;\n        }\n\n        static decimal GetAbsoluteQuarterSale()\n        {\n            return (decimal)Math.Round(Random.Shared.NextDouble() * 10000, 2);\n        }\n\n        static decimal GetEmployeeFractionQuarterSale(decimal employeeSale)\n        {\n            return (decimal)Math.Round(employeeSale / 100);\n        }\n\n        static decimal GetCityFractionQuarterSale(decimal employeeSale, int employeesCount)\n        {\n            return Math.Round(employeeSale / 100m / employeesCount);\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/Bitcoin Historical Data.csv",
    "content": "﻿\"Date\",\"Price\",\"Open\",\"High\",\"Low\",\"Vol.\",\"Change %\"\n\"11/13/2024\",\"92,553.2\",\"87,971.2\",\"93,226.6\",\"86,168.4\",\"242.94K\",\"5.24%\"\n\"11/12/2024\",\"87,941.3\",\"88,665.0\",\"89,929.6\",\"85,122.2\",\"288.68K\",\"-0.82%\"\n\"11/11/2024\",\"88,664.1\",\"80,389.0\",\"89,519.0\",\"80,231.8\",\"254.04K\",\"10.29%\"\n\"11/10/2024\",\"80,388.5\",\"76,681.4\",\"81,373.5\",\"76,520.5\",\"193.83K\",\"4.81%\"\n\"11/09/2024\",\"76,700.3\",\"76,506.1\",\"76,904.0\",\"75,732.5\",\"72.97K\",\"0.24%\"\n\"11/08/2024\",\"76,517.3\",\"75,869.8\",\"77,188.5\",\"75,599.0\",\"155.17K\",\"0.85%\"\n\"11/07/2024\",\"75,868.6\",\"75,585.5\",\"76,837.8\",\"74,448.2\",\"184.16K\",\"0.37%\"\n\"11/06/2024\",\"75,586.3\",\"69,374.1\",\"76,401.4\",\"69,323.0\",\"357.28K\",\"8.96%\"\n\"11/05/2024\",\"69,373.7\",\"67,848.3\",\"70,495.6\",\"67,473.6\",\"108.95K\",\"2.25%\"\n\"11/04/2024\",\"67,848.8\",\"68,770.3\",\"69,483.4\",\"66,834.0\",\"101.31K\",\"-1.34%\"\n\"11/03/2024\",\"68,769.6\",\"69,334.8\",\"69,383.6\",\"67,514.2\",\"83.16K\",\"-0.80%\"\n\"11/02/2024\",\"69,325.8\",\"69,499.3\",\"69,896.9\",\"69,029.0\",\"38.72K\",\"-0.26%\"\n\"11/01/2024\",\"69,507.2\",\"70,278.7\",\"71,598.4\",\"68,846.0\",\"130.46K\",\"-1.10%\"\n\"10/31/2024\",\"70,281.8\",\"72,343.7\",\"72,685.7\",\"69,674.5\",\"111.29K\",\"-2.86%\"\n\"10/30/2024\",\"72,347.8\",\"72,732.5\",\"72,907.4\",\"71,460.0\",\"99.05K\",\"-0.53%\"\n\"10/29/2024\",\"72,730.4\",\"69,957.2\",\"73,569.4\",\"69,753.2\",\"168.60K\",\"3.97%\"\n\"10/28/2024\",\"69,954.1\",\"68,011.9\",\"70,203.4\",\"67,610.0\",\"103.97K\",\"2.87%\"\n\"10/27/2024\",\"68,004.6\",\"67,084.7\",\"68,308.0\",\"66,924.6\",\"33.58K\",\"1.37%\"\n\"10/26/2024\",\"67,086.8\",\"66,694.5\",\"67,408.4\",\"66,443.8\",\"42.05K\",\"0.58%\"\n\"10/25/2024\",\"66,696.8\",\"68,191.9\",\"68,756.8\",\"65,644.2\",\"110.51K\",\"-2.19%\"\n\"10/24/2024\",\"68,191.5\",\"66,659.2\",\"68,831.8\",\"66,510.6\",\"82.78K\",\"2.29%\"\n\"10/23/2024\",\"66,663.7\",\"67,428.6\",\"67,441.1\",\"65,246.7\",\"84.99K\",\"-1.13%\"\n\"10/22/2024\",\"67,427.3\",\"67,370.8\",\"67,815.3\",\"66,609.4\",\"86.76K\",\"0.08%\"\n\"10/21/2024\",\"67,371.3\",\"69,030.5\",\"69,490.8\",\"66,845.5\",\"109.28K\",\"-2.40%\"\n\"10/20/2024\",\"69,030.5\",\"68,373.3\",\"69,386.4\",\"67,443.9\",\"44.92K\",\"0.96%\"\n\"10/19/2024\",\"68,372.0\",\"68,426.4\",\"68,688.8\",\"68,025.5\",\"33.29K\",\"-0.07%\"\n\"10/18/2024\",\"68,423.1\",\"67,416.5\",\"68,990.3\",\"67,190.9\",\"99.20K\",\"1.49%\"\n\"10/17/2024\",\"67,418.4\",\"67,618.1\",\"67,933.5\",\"66,677.3\",\"84.68K\",\"-0.30%\"\n\"10/16/2024\",\"67,617.9\",\"67,075.1\",\"68,389.4\",\"66,766.6\",\"98.30K\",\"0.81%\"\n\"10/15/2024\",\"67,077.5\",\"66,084.1\",\"67,821.9\",\"64,850.6\",\"136.72K\",\"1.51%\"\n\"10/14/2024\",\"66,081.7\",\"62,870.7\",\"66,476.6\",\"62,463.7\",\"122.09K\",\"5.11%\"\n\"10/13/2024\",\"62,870.9\",\"63,205.4\",\"63,284.6\",\"62,054.2\",\"42.26K\",\"-0.53%\"\n\"10/12/2024\",\"63,205.1\",\"62,506.6\",\"63,463.1\",\"62,486.1\",\"40.91K\",\"1.13%\"\n\"10/11/2024\",\"62,499.4\",\"60,317.5\",\"63,385.1\",\"60,080.6\",\"86.38K\",\"3.62%\"\n\"10/10/2024\",\"60,316.2\",\"60,628.9\",\"61,304.6\",\"59,075.7\",\"83.86K\",\"-0.52%\"\n\"10/09/2024\",\"60,628.8\",\"62,157.0\",\"62,537.0\",\"60,355.5\",\"68.79K\",\"-2.46%\"\n\"10/08/2024\",\"62,157.0\",\"62,226.9\",\"63,196.6\",\"61,883.2\",\"63.75K\",\"-0.14%\"\n\"10/07/2024\",\"62,245.6\",\"62,819.8\",\"64,449.3\",\"62,175.8\",\"86.27K\",\"-0.91%\"\n\"10/06/2024\",\"62,819.4\",\"62,062.0\",\"62,934.5\",\"61,495.4\",\"31.72K\",\"1.22%\"\n\"10/05/2024\",\"62,061.4\",\"62,085.5\",\"62,366.8\",\"61,705.7\",\"30.15K\",\"-0.03%\"\n\"10/04/2024\",\"62,081.0\",\"60,751.4\",\"62,471.7\",\"60,469.3\",\"72.71K\",\"2.19%\"\n\"10/03/2024\",\"60,751.2\",\"60,642.0\",\"61,468.9\",\"59,904.4\",\"82.43K\",\"0.17%\"\n\"10/02/2024\",\"60,645.7\",\"60,834.2\",\"62,339.8\",\"60,002.7\",\"98.94K\",\"-0.31%\"\n\"10/01/2024\",\"60,835.5\",\"63,329.9\",\"64,125.3\",\"60,195.9\",\"134.93K\",\"-3.95%\"\n\"09/30/2024\",\"63,339.2\",\"65,607.0\",\"65,607.0\",\"62,901.1\",\"101.70K\",\"-3.46%\"\n\"09/29/2024\",\"65,607.1\",\"65,862.8\",\"66,065.7\",\"65,436.8\",\"32.60K\",\"-0.39%\"\n\"09/28/2024\",\"65,866.5\",\"65,775.6\",\"66,232.5\",\"65,438.1\",\"35.00K\",\"0.14%\"\n\"09/27/2024\",\"65,776.3\",\"65,168.8\",\"66,440.7\",\"64,839.2\",\"80.55K\",\"0.92%\"\n\"09/26/2024\",\"65,175.7\",\"63,157.2\",\"65,770.9\",\"62,693.3\",\"96.06K\",\"3.20%\"\n\"09/25/2024\",\"63,156.5\",\"64,262.9\",\"64,788.4\",\"62,952.8\",\"62.72K\",\"-1.71%\"\n\"09/24/2024\",\"64,256.8\",\"63,335.9\",\"64,664.1\",\"62,740.8\",\"76.71K\",\"1.46%\"\n\"09/23/2024\",\"63,331.8\",\"63,575.4\",\"64,723.4\",\"62,650.0\",\"75.66K\",\"-0.38%\"\n\"09/22/2024\",\"63,572.7\",\"63,351.2\",\"63,998.2\",\"62,394.6\",\"48.86K\",\"0.35%\"\n\"09/21/2024\",\"63,348.1\",\"63,201.2\",\"63,526.3\",\"62,778.6\",\"33.20K\",\"0.23%\"\n\"09/20/2024\",\"63,201.2\",\"62,942.4\",\"64,085.1\",\"62,367.1\",\"90.65K\",\"0.42%\"\n\"09/19/2024\",\"62,938.6\",\"61,754.8\",\"63,849.6\",\"61,596.5\",\"120.17K\",\"1.91%\"\n\"09/18/2024\",\"61,757.6\",\"60,308.5\",\"61,757.6\",\"59,210.7\",\"105.57K\",\"2.40%\"\n\"09/17/2024\",\"60,309.1\",\"58,213.1\",\"61,309.0\",\"57,630.2\",\"106.30K\",\"3.60%\"\n\"09/16/2024\",\"58,213.1\",\"59,126.2\",\"59,204.3\",\"57,527.8\",\"87.60K\",\"-1.56%\"\n\"09/15/2024\",\"59,138.5\",\"59,995.6\",\"60,377.6\",\"58,717.9\",\"47.01K\",\"-1.43%\"\n\"09/14/2024\",\"59,995.4\",\"60,514.8\",\"60,609.4\",\"59,494.3\",\"44.47K\",\"-0.85%\"\n\"09/13/2024\",\"60,511.6\",\"58,134.4\",\"60,625.4\",\"57,656.8\",\"102.12K\",\"4.09%\"\n\"09/12/2024\",\"58,134.5\",\"57,335.5\",\"58,484.1\",\"57,329.6\",\"98.42K\",\"1.39%\"\n\"09/11/2024\",\"57,338.7\",\"57,638.0\",\"57,975.9\",\"55,576.6\",\"102.15K\",\"-0.51%\"\n\"09/10/2024\",\"57,635.0\",\"57,045.6\",\"58,019.9\",\"56,415.3\",\"77.65K\",\"1.03%\"\n\"09/09/2024\",\"57,049.6\",\"54,868.0\",\"57,956.7\",\"54,595.4\",\"105.33K\",\"3.99%\"\n\"09/08/2024\",\"54,861.3\",\"54,161.4\",\"55,292.7\",\"53,642.4\",\"51.99K\",\"1.30%\"\n\"09/07/2024\",\"54,156.5\",\"53,965.0\",\"54,819.2\",\"53,754.3\",\"58.11K\",\"0.35%\"\n\"09/06/2024\",\"53,966.8\",\"56,179.7\",\"56,969.1\",\"52,644.6\",\"155.84K\",\"-3.94%\"\n\"09/05/2024\",\"56,183.2\",\"57,970.7\",\"58,318.9\",\"55,744.6\",\"90.36K\",\"-3.09%\"\n\"09/04/2024\",\"57,973.4\",\"57,490.4\",\"58,508.8\",\"55,732.1\",\"108.44K\",\"0.86%\"\n\"09/03/2024\",\"57,479.8\",\"59,133.7\",\"59,799.7\",\"57,436.9\",\"74.77K\",\"-2.80%\"\n\"09/02/2024\",\"59,134.0\",\"57,309.0\",\"59,416.6\",\"57,185.8\",\"73.18K\",\"3.17%\"\n\"09/01/2024\",\"57,315.7\",\"58,975.7\",\"59,058.7\",\"57,232.4\",\"63.95K\",\"-2.82%\"\n\"08/31/2024\",\"58,978.6\",\"59,120.4\",\"59,447.0\",\"58,761.1\",\"30.86K\",\"-0.24%\"\n\"08/30/2024\",\"59,119.7\",\"59,371.7\",\"59,817.6\",\"57,874.7\",\"87.31K\",\"-0.43%\"\n\"08/29/2024\",\"59,373.5\",\"59,027.3\",\"61,150.6\",\"58,807.1\",\"87.19K\",\"0.61%\"\n\"08/28/2024\",\"59,016.0\",\"59,425.6\",\"60,198.4\",\"57,912.1\",\"109.47K\",\"-0.73%\"\n\"08/27/2024\",\"59,450.9\",\"62,832.2\",\"63,201.4\",\"58,187.3\",\"108.53K\",\"-5.40%\"\n\"08/26/2024\",\"62,846.2\",\"64,240.7\",\"64,472.5\",\"62,841.1\",\"68.89K\",\"-2.22%\"\n\"08/25/2024\",\"64,273.2\",\"64,160.7\",\"64,939.2\",\"63,796.6\",\"41.61K\",\"0.18%\"\n\"08/24/2024\",\"64,159.3\",\"64,061.7\",\"64,458.9\",\"63,579.5\",\"54.14K\",\"0.17%\"\n\"08/23/2024\",\"64,053.1\",\"60,374.7\",\"64,830.1\",\"60,354.4\",\"125.50K\",\"6.10%\"\n\"08/22/2024\",\"60,372.2\",\"61,158.3\",\"61,399.7\",\"59,815.8\",\"74.39K\",\"-1.29%\"\n\"08/21/2024\",\"61,158.1\",\"59,010.0\",\"61,812.0\",\"58,831.1\",\"91.31K\",\"3.65%\"\n\"08/20/2024\",\"59,005.8\",\"59,470.3\",\"61,331.6\",\"58,612.0\",\"69.77K\",\"-0.78%\"\n\"08/19/2024\",\"59,470.9\",\"58,445.8\",\"59,598.5\",\"57,872.0\",\"49.19K\",\"1.75%\"\n\"08/18/2024\",\"58,446.3\",\"59,485.4\",\"60,216.3\",\"58,436.1\",\"30.82K\",\"-1.74%\"\n\"08/17/2024\",\"59,483.1\",\"58,877.8\",\"59,659.5\",\"58,825.5\",\"18.51K\",\"1.03%\"\n\"08/16/2024\",\"58,877.2\",\"57,545.1\",\"59,817.3\",\"57,129.1\",\"64.01K\",\"2.33%\"\n\"08/15/2024\",\"57,534.6\",\"58,710.1\",\"59,831.4\",\"56,275.7\",\"81.47K\",\"-2.00%\"\n\"08/14/2024\",\"58,707.8\",\"60,594.6\",\"61,543.0\",\"58,491.2\",\"64.79K\",\"-3.11%\"\n\"08/13/2024\",\"60,595.2\",\"59,350.2\",\"61,537.0\",\"58,492.4\",\"62.92K\",\"2.10%\"\n\"08/12/2024\",\"59,350.0\",\"58,711.7\",\"60,606.2\",\"57,689.0\",\"79.31K\",\"1.08%\"\n\"08/11/2024\",\"58,713.3\",\"60,929.8\",\"61,677.3\",\"58,388.7\",\"41.06K\",\"-3.64%\"\n\"08/10/2024\",\"60,931.7\",\"60,844.5\",\"61,344.5\",\"60,264.2\",\"22.91K\",\"0.13%\"\n\"08/09/2024\",\"60,850.6\",\"61,697.8\",\"61,712.3\",\"59,570.2\",\"69.55K\",\"-1.38%\"\n\"08/08/2024\",\"61,699.7\",\"55,112.8\",\"62,563.5\",\"54,786.9\",\"109.77K\",\"11.94%\"\n\"08/07/2024\",\"55,120.9\",\"56,049.9\",\"57,669.6\",\"54,598.5\",\"94.52K\",\"-1.67%\"\n\"08/06/2024\",\"56,057.8\",\"54,010.8\",\"57,025.6\",\"53,998.2\",\"113.89K\",\"3.85%\"\n\"08/05/2024\",\"53,979.0\",\"58,142.9\",\"58,291.4\",\"49,486.9\",\"333.46K\",\"-7.16%\"\n\"08/04/2024\",\"58,141.8\",\"60,700.2\",\"61,086.5\",\"57,346.9\",\"72.71K\",\"-4.21%\"\n\"08/03/2024\",\"60,696.7\",\"61,480.8\",\"62,184.2\",\"59,914.6\",\"65.74K\",\"-1.27%\"\n\"08/02/2024\",\"61,478.7\",\"65,351.8\",\"65,567.1\",\"61,242.3\",\"93.89K\",\"-5.96%\"\n\"08/01/2024\",\"65,372.9\",\"64,625.7\",\"65,587.9\",\"62,303.9\",\"84.20K\",\"1.16%\"\n\"07/31/2024\",\"64,626.0\",\"66,185.4\",\"66,825.6\",\"64,538.3\",\"51.52K\",\"-2.36%\"\n\"07/30/2024\",\"66,184.9\",\"66,796.1\",\"66,998.3\",\"65,328.7\",\"54.43K\",\"-0.92%\"\n\"07/29/2024\",\"66,798.7\",\"68,256.3\",\"70,000.2\",\"66,544.5\",\"85.67K\",\"-2.14%\"\n\"07/28/2024\",\"68,256.3\",\"67,888.9\",\"68,291.9\",\"67,067.8\",\"26.17K\",\"0.61%\"\n\"07/27/2024\",\"67,843.1\",\"67,910.8\",\"69,387.6\",\"66,776.8\",\"67.99K\",\"-0.10%\"\n\"07/26/2024\",\"67,908.6\",\"65,799.7\",\"68,205.0\",\"65,764.3\",\"59.13K\",\"3.21%\"\n\"07/25/2024\",\"65,799.3\",\"65,363.9\",\"66,088.6\",\"63,500.9\",\"77.46K\",\"0.66%\"\n\"07/24/2024\",\"65,370.5\",\"65,936.8\",\"67,072.1\",\"65,155.2\",\"52.47K\",\"-0.86%\"\n\"07/23/2024\",\"65,937.8\",\"67,550.4\",\"67,750.2\",\"65,512.9\",\"69.58K\",\"-2.39%\"\n\"07/22/2024\",\"67,553.6\",\"68,158.4\",\"68,468.9\",\"66,601.8\",\"54.88K\",\"-0.89%\"\n\"07/21/2024\",\"68,158.7\",\"67,147.8\",\"68,352.9\",\"65,825.6\",\"47.19K\",\"1.50%\"\n\"07/20/2024\",\"67,148.5\",\"66,677.0\",\"67,586.4\",\"66,257.4\",\"32.94K\",\"0.71%\"\n\"07/19/2024\",\"66,677.4\",\"63,981.2\",\"67,390.4\",\"63,326.1\",\"82.87K\",\"4.22%\"\n\"07/18/2024\",\"63,980.5\",\"64,090.4\",\"65,102.0\",\"63,253.5\",\"51.27K\",\"-0.17%\"\n\"07/17/2024\",\"64,089.2\",\"65,052.8\",\"66,051.5\",\"63,897.5\",\"66.11K\",\"-1.48%\"\n\"07/16/2024\",\"65,049.7\",\"64,749.2\",\"65,319.5\",\"62,430.8\",\"93.63K\",\"0.41%\"\n\"07/15/2024\",\"64,782.4\",\"60,794.7\",\"64,869.5\",\"60,678.8\",\"96.02K\",\"6.56%\"\n\"07/14/2024\",\"60,794.9\",\"59,207.9\",\"61,326.9\",\"59,207.9\",\"47.48K\",\"2.68%\"\n\"07/13/2024\",\"59,209.8\",\"57,897.4\",\"59,826.5\",\"57,770.6\",\"34.28K\",\"2.29%\"\n\"07/12/2024\",\"57,885.1\",\"57,338.3\",\"58,520.9\",\"56,575.7\",\"56.84K\",\"0.96%\"\n\"07/11/2024\",\"57,337.3\",\"57,745.9\",\"59,404.4\",\"57,095.0\",\"66.40K\",\"-0.71%\"\n\"07/10/2024\",\"57,746.7\",\"58,040.2\",\"59,393.8\",\"57,185.3\",\"59.60K\",\"-0.50%\"\n\"07/09/2024\",\"58,039.4\",\"56,721.3\",\"58,234.0\",\"56,306.3\",\"64.25K\",\"2.32%\"\n\"07/08/2024\",\"56,724.7\",\"55,850.2\",\"58,115.8\",\"54,320.0\",\"102.91K\",\"1.55%\"\n\"07/07/2024\",\"55,861.1\",\"58,240.2\",\"58,394.6\",\"55,756.3\",\"41.12K\",\"-4.12%\"\n\"07/06/2024\",\"58,259.2\",\"56,640.0\",\"58,462.0\",\"56,026.8\",\"46.91K\",\"2.86%\"\n\"07/05/2024\",\"56,641.8\",\"57,025.7\",\"57,471.1\",\"53,883.4\",\"175.51K\",\"-0.67%\"\n\"07/04/2024\",\"57,026.3\",\"60,201.4\",\"60,463.0\",\"56,812.7\",\"116.38K\",\"-5.27%\"\n\"07/03/2024\",\"60,199.3\",\"62,104.9\",\"62,263.6\",\"59,466.6\",\"73.34K\",\"-3.07%\"\n\"07/02/2024\",\"62,103.3\",\"62,888.3\",\"63,257.0\",\"61,797.6\",\"46.52K\",\"-1.25%\"\n\"07/01/2024\",\"62,890.1\",\"62,768.8\",\"63,842.1\",\"62,558.0\",\"59.94K\",\"0.22%\"\n\"06/30/2024\",\"62,754.3\",\"60,973.1\",\"63,006.6\",\"60,703.7\",\"37.21K\",\"2.92%\"\n\"06/29/2024\",\"60,973.4\",\"60,403.7\",\"61,192.8\",\"60,382.8\",\"26.56K\",\"0.94%\"\n\"06/28/2024\",\"60,403.3\",\"61,684.6\",\"62,175.4\",\"60,081.9\",\"58.95K\",\"-2.08%\"\n\"06/27/2024\",\"61,685.3\",\"60,848.3\",\"62,351.2\",\"60,629.4\",\"48.79K\",\"1.37%\"\n\"06/26/2024\",\"60,849.4\",\"61,809.9\",\"62,469.4\",\"60,715.1\",\"54.95K\",\"-1.55%\"\n\"06/25/2024\",\"61,809.4\",\"60,292.0\",\"62,266.0\",\"60,262.2\",\"77.28K\",\"2.52%\"\n\"06/24/2024\",\"60,292.7\",\"63,201.6\",\"63,357.1\",\"58,589.9\",\"120.60K\",\"-4.59%\"\n\"06/23/2024\",\"63,196.2\",\"64,261.0\",\"64,518.9\",\"63,195.3\",\"19.94K\",\"-1.66%\"\n\"06/22/2024\",\"64,261.0\",\"64,131.9\",\"64,523.9\",\"63,944.0\",\"17.55K\",\"0.21%\"\n\"06/21/2024\",\"64,128.5\",\"64,854.3\",\"65,054.9\",\"63,427.9\",\"60.86K\",\"-1.12%\"\n\"06/20/2024\",\"64,854.3\",\"64,982.1\",\"66,474.2\",\"64,566.7\",\"56.24K\",\"-0.19%\"\n\"06/19/2024\",\"64,980.9\",\"65,159.8\",\"65,706.4\",\"64,705.6\",\"42.96K\",\"-0.27%\"\n\"06/18/2024\",\"65,159.9\",\"66,495.7\",\"66,571.2\",\"64,098.4\",\"93.72K\",\"-2.01%\"\n\"06/17/2024\",\"66,498.8\",\"66,672.9\",\"67,253.8\",\"65,115.4\",\"66.09K\",\"-0.26%\"\n\"06/16/2024\",\"66,674.7\",\"66,223.0\",\"66,951.4\",\"66,038.1\",\"20.74K\",\"0.68%\"\n\"06/15/2024\",\"66,223.0\",\"66,034.1\",\"66,446.4\",\"65,895.1\",\"24.05K\",\"0.29%\"\n\"06/14/2024\",\"66,034.8\",\"66,775.2\",\"67,347.7\",\"65,076.5\",\"65.18K\",\"-1.11%\"\n\"06/13/2024\",\"66,773.1\",\"68,260.6\",\"68,384.6\",\"66,324.3\",\"66.36K\",\"-2.18%\"\n\"06/12/2024\",\"68,260.1\",\"67,320.9\",\"69,990.8\",\"66,911.5\",\"85.55K\",\"1.40%\"\n\"06/11/2024\",\"67,319.8\",\"69,537.9\",\"69,573.3\",\"66,197.8\",\"96.70K\",\"-3.19%\"\n\"06/10/2024\",\"69,538.2\",\"69,650.2\",\"70,152.5\",\"69,259.9\",\"39.12K\",\"-0.16%\"\n\"06/09/2024\",\"69,650.6\",\"69,310.5\",\"69,847.8\",\"69,136.7\",\"20.99K\",\"0.49%\"\n\"06/08/2024\",\"69,310.1\",\"69,347.0\",\"69,572.1\",\"69,222.4\",\"23.03K\",\"-0.05%\"\n\"06/07/2024\",\"69,347.9\",\"70,793.4\",\"71,956.5\",\"68,620.7\",\"82.62K\",\"-2.04%\"\n\"06/06/2024\",\"70,791.5\",\"71,083.6\",\"71,616.1\",\"70,178.7\",\"49.79K\",\"-0.41%\"\n\"06/05/2024\",\"71,083.7\",\"70,550.9\",\"71,744.4\",\"70,397.1\",\"67.06K\",\"0.76%\"\n\"06/04/2024\",\"70,549.2\",\"68,808.0\",\"71,034.2\",\"68,564.3\",\"75.69K\",\"2.53%\"\n\"06/03/2024\",\"68,807.8\",\"67,763.3\",\"70,131.0\",\"67,616.8\",\"69.42K\",\"1.53%\"\n\"06/02/2024\",\"67,773.5\",\"67,760.8\",\"68,447.5\",\"67,330.6\",\"30.63K\",\"0.02%\"\n\"06/01/2024\",\"67,760.8\",\"67,533.9\",\"67,861.0\",\"67,449.6\",\"19.01K\",\"0.34%\"\n\"05/31/2024\",\"67,530.1\",\"68,352.3\",\"69,018.2\",\"66,676.8\",\"61.51K\",\"-1.21%\"\n\"05/30/2024\",\"68,354.7\",\"67,631.3\",\"69,504.7\",\"67,138.4\",\"66.84K\",\"1.06%\"\n\"05/29/2024\",\"67,635.8\",\"68,366.2\",\"68,897.6\",\"67,143.2\",\"52.13K\",\"-1.07%\"\n\"05/28/2024\",\"68,366.0\",\"69,428.3\",\"69,560.7\",\"67,299.9\",\"71.39K\",\"-1.53%\"\n\"05/27/2024\",\"69,428.7\",\"68,514.6\",\"70,638.3\",\"68,275.2\",\"49.07K\",\"1.33%\"\n\"05/26/2024\",\"68,514.8\",\"69,287.2\",\"69,494.0\",\"68,294.5\",\"24.58K\",\"-1.11%\"\n\"05/25/2024\",\"69,284.4\",\"68,548.2\",\"69,558.8\",\"68,516.1\",\"25.17K\",\"1.07%\"\n\"05/24/2024\",\"68,547.6\",\"67,971.1\",\"69,212.0\",\"66,685.8\",\"63.28K\",\"0.84%\"\n\"05/23/2024\",\"67,975.7\",\"69,166.3\",\"70,041.0\",\"66,578.1\",\"89.45K\",\"-1.71%\"\n\"05/22/2024\",\"69,155.4\",\"70,141.0\",\"70,593.4\",\"69,024.3\",\"65.08K\",\"-1.40%\"\n\"05/21/2024\",\"70,139.9\",\"71,430.5\",\"71,872.0\",\"69,181.7\",\"108.56K\",\"-1.80%\"\n\"05/20/2024\",\"71,422.7\",\"66,278.3\",\"71,482.8\",\"66,076.5\",\"112.66K\",\"7.76%\"\n\"05/19/2024\",\"66,279.1\",\"66,919.0\",\"67,662.5\",\"65,937.3\",\"36.19K\",\"-0.95%\"\n\"05/18/2024\",\"66,917.5\",\"67,036.6\",\"67,361.4\",\"66,636.1\",\"29.68K\",\"-0.18%\"\n\"05/17/2024\",\"67,036.8\",\"65,231.1\",\"67,420.7\",\"65,121.7\",\"63.09K\",\"2.77%\"\n\"05/16/2024\",\"65,231.0\",\"66,219.6\",\"66,643.9\",\"64,623.3\",\"72.55K\",\"-1.50%\"\n\"05/15/2024\",\"66,225.1\",\"61,569.4\",\"66,417.1\",\"61,357.5\",\"106.05K\",\"7.56%\"\n\"05/14/2024\",\"61,569.4\",\"62,936.8\",\"63,102.6\",\"61,156.9\",\"68.84K\",\"-2.17%\"\n\"05/13/2024\",\"62,937.2\",\"61,480.5\",\"63,443.2\",\"60,779.0\",\"70.55K\",\"2.37%\"\n\"05/12/2024\",\"61,480.0\",\"60,826.6\",\"61,847.7\",\"60,647.1\",\"27.40K\",\"1.07%\"\n\"05/11/2024\",\"60,826.6\",\"60,796.8\",\"61,487.5\",\"60,499.3\",\"27.50K\",\"0.05%\"\n\"05/10/2024\",\"60,796.9\",\"63,074.3\",\"63,454.3\",\"60,251.8\",\"79.33K\",\"-3.61%\"\n\"05/09/2024\",\"63,075.0\",\"61,207.3\",\"63,413.3\",\"60,671.4\",\"64.22K\",\"3.05%\"\n\"05/08/2024\",\"61,207.5\",\"62,304.9\",\"62,997.4\",\"60,894.2\",\"56.47K\",\"-1.78%\"\n\"05/07/2024\",\"62,317.7\",\"63,163.1\",\"64,361.0\",\"62,294.1\",\"59.74K\",\"-1.34%\"\n\"05/06/2024\",\"63,163.1\",\"64,005.8\",\"65,448.8\",\"62,730.7\",\"77.68K\",\"-1.32%\"\n\"05/05/2024\",\"64,006.4\",\"63,897.7\",\"64,587.2\",\"62,923.9\",\"40.51K\",\"0.18%\"\n\"05/04/2024\",\"63,888.3\",\"62,887.1\",\"64,466.0\",\"62,599.1\",\"53.03K\",\"1.61%\"\n\"05/03/2024\",\"62,877.5\",\"59,104.3\",\"63,298.4\",\"58,830.8\",\"100.46K\",\"6.35%\"\n\"05/02/2024\",\"59,121.3\",\"58,334.9\",\"59,548.0\",\"56,989.8\",\"98.06K\",\"1.35%\"\n\"05/01/2024\",\"58,331.2\",\"60,665.0\",\"60,827.5\",\"56,643.5\",\"171.55K\",\"-3.85%\"\n\"04/30/2024\",\"60,666.6\",\"63,852.4\",\"64,700.2\",\"59,228.7\",\"121.04K\",\"-5.00%\"\n\"04/29/2024\",\"63,860.1\",\"63,113.7\",\"64,193.1\",\"61,837.2\",\"67.26K\",\"1.19%\"\n\"04/28/2024\",\"63,109.7\",\"63,457.9\",\"64,346.1\",\"62,827.8\",\"36.65K\",\"-0.55%\"\n\"04/27/2024\",\"63,456.8\",\"63,765.8\",\"63,916.7\",\"62,507.7\",\"45.34K\",\"-0.49%\"\n\"04/26/2024\",\"63,766.4\",\"64,497.1\",\"64,771.3\",\"63,354.9\",\"61.60K\",\"-1.13%\"\n\"04/25/2024\",\"64,497.1\",\"64,287.1\",\"65,247.5\",\"62,889.2\",\"80.77K\",\"0.33%\"\n\"04/24/2024\",\"64,285.7\",\"66,414.9\",\"67,060.5\",\"63,606.9\",\"77.83K\",\"-3.21%\"\n\"04/23/2024\",\"66,415.0\",\"66,829.5\",\"67,180.0\",\"65,848.3\",\"52.42K\",\"-0.62%\"\n\"04/22/2024\",\"66,829.3\",\"64,940.1\",\"67,208.0\",\"64,527.5\",\"72.30K\",\"2.91%\"\n\"04/21/2024\",\"64,940.2\",\"64,942.1\",\"65,680.6\",\"64,267.5\",\"42.02K\",\"-0.03%\"\n\"04/20/2024\",\"64,961.1\",\"63,817.6\",\"65,375.6\",\"63,131.7\",\"49.33K\",\"1.82%\"\n\"04/19/2024\",\"63,799.1\",\"63,480.5\",\"65,441.2\",\"59,693.3\",\"150.34K\",\"0.50%\"\n\"04/18/2024\",\"63,481.4\",\"61,278.9\",\"64,092.4\",\"60,822.3\",\"97.38K\",\"3.59%\"\n\"04/17/2024\",\"61,278.9\",\"63,802.3\",\"64,451.5\",\"59,820.8\",\"118.92K\",\"-3.96%\"\n\"04/16/2024\",\"63,805.3\",\"63,416.1\",\"64,274.4\",\"61,715.6\",\"114.96K\",\"0.62%\"\n\"04/15/2024\",\"63,411.9\",\"65,696.6\",\"66,805.1\",\"62,379.5\",\"118.79K\",\"-3.48%\"\n\"04/14/2024\",\"65,697.4\",\"63,909.5\",\"65,758.2\",\"62,174.7\",\"134.40K\",\"2.89%\"\n\"04/13/2024\",\"63,849.9\",\"67,137.4\",\"67,921.0\",\"61,065.5\",\"149.48K\",\"-4.92%\"\n\"04/12/2024\",\"67,151.9\",\"70,014.9\",\"71,226.9\",\"65,829.3\",\"131.84K\",\"-4.08%\"\n\"04/11/2024\",\"70,011.6\",\"70,620.4\",\"71,249.2\",\"69,586.1\",\"72.51K\",\"-0.86%\"\n\"04/10/2024\",\"70,622.1\",\"69,147.8\",\"71,086.9\",\"67,570.0\",\"97.71K\",\"2.13%\"\n\"04/09/2024\",\"69,148.0\",\"71,627.3\",\"71,737.2\",\"68,264.6\",\"93.69K\",\"-3.47%\"\n\"04/08/2024\",\"71,630.1\",\"69,358.0\",\"72,710.8\",\"69,110.5\",\"105.78K\",\"3.27%\"\n\"04/07/2024\",\"69,360.4\",\"68,897.3\",\"70,285.8\",\"68,849.4\",\"46.99K\",\"0.68%\"\n\"04/06/2024\",\"68,890.6\",\"67,830.5\",\"69,632.0\",\"67,467.2\",\"41.48K\",\"1.56%\"\n\"04/05/2024\",\"67,830.6\",\"68,498.7\",\"68,692.2\",\"66,023.3\",\"88.97K\",\"-0.97%\"\n\"04/04/2024\",\"68,496.5\",\"65,968.4\",\"69,238.8\",\"65,096.3\",\"100.30K\",\"3.84%\"\n\"04/03/2024\",\"65,963.0\",\"65,443.6\",\"66,844.8\",\"64,559.0\",\"88.46K\",\"0.80%\"\n\"04/02/2024\",\"65,439.2\",\"69,662.7\",\"69,673.0\",\"64,628.4\",\"152.87K\",\"-6.07%\"\n\"04/01/2024\",\"69,664.4\",\"71,329.3\",\"71,329.3\",\"68,175.9\",\"94.05K\",\"-2.34%\"\n\"03/31/2024\",\"71,332.0\",\"69,608.5\",\"71,367.5\",\"69,576.6\",\"42.45K\",\"2.47%\"\n\"03/30/2024\",\"69,611.5\",\"69,872.3\",\"70,321.2\",\"69,564.9\",\"29.87K\",\"-0.37%\"\n\"03/29/2024\",\"69,871.7\",\"70,766.7\",\"70,907.0\",\"69,090.9\",\"58.99K\",\"-1.26%\"\n\"03/28/2024\",\"70,762.1\",\"69,449.4\",\"71,542.5\",\"68,956.9\",\"72.49K\",\"1.90%\"\n\"03/27/2024\",\"69,442.4\",\"69,999.2\",\"71,670.8\",\"68,428.6\",\"112.88K\",\"-0.80%\"\n\"03/26/2024\",\"69,999.3\",\"69,896.3\",\"71,490.7\",\"69,366.4\",\"90.98K\",\"0.15%\"\n\"03/25/2024\",\"69,892.0\",\"67,216.4\",\"71,118.8\",\"66,395.0\",\"124.72K\",\"3.99%\"\n\"03/24/2024\",\"67,211.9\",\"64,036.5\",\"67,587.8\",\"63,812.9\",\"65.59K\",\"4.96%\"\n\"03/23/2024\",\"64,037.8\",\"63,785.6\",\"65,972.4\",\"63,074.9\",\"35.11K\",\"0.40%\"\n\"03/22/2024\",\"63,785.5\",\"65,501.5\",\"66,633.3\",\"62,328.3\",\"72.43K\",\"-2.62%\"\n\"03/21/2024\",\"65,503.8\",\"67,860.0\",\"68,161.7\",\"64,616.1\",\"75.26K\",\"-3.46%\"\n\"03/20/2024\",\"67,854.0\",\"62,046.8\",\"68,029.5\",\"60,850.9\",\"133.53K\",\"9.35%\"\n\"03/19/2024\",\"62,050.0\",\"67,594.1\",\"68,099.6\",\"61,560.6\",\"148.08K\",\"-8.20%\"\n\"03/18/2024\",\"67,594.1\",\"68,389.7\",\"68,920.1\",\"66,601.4\",\"78.07K\",\"-1.17%\"\n\"03/17/2024\",\"68,391.2\",\"65,314.2\",\"68,857.7\",\"64,605.5\",\"66.07K\",\"4.71%\"\n\"03/16/2024\",\"65,314.2\",\"69,456.5\",\"70,037.0\",\"64,971.0\",\"75.82K\",\"-5.97%\"\n\"03/15/2024\",\"69,463.7\",\"71,387.1\",\"72,398.1\",\"65,765.6\",\"148.59K\",\"-2.69%\"\n\"03/14/2024\",\"71,387.5\",\"73,066.7\",\"73,740.9\",\"68,717.2\",\"109.43K\",\"-2.30%\"\n\"03/13/2024\",\"73,066.3\",\"71,461.9\",\"73,623.5\",\"71,338.4\",\"77.18K\",\"2.23%\"\n\"03/12/2024\",\"71,470.2\",\"72,099.1\",\"72,916.7\",\"68,845.6\",\"105.09K\",\"-0.87%\"\n\"03/11/2024\",\"72,099.1\",\"68,964.7\",\"72,771.5\",\"67,452.8\",\"114.72K\",\"4.54%\"\n\"03/10/2024\",\"68,964.8\",\"68,360.7\",\"69,905.3\",\"68,165.0\",\"53.49K\",\"0.88%\"\n\"03/09/2024\",\"68,366.5\",\"68,178.5\",\"68,576.9\",\"67,923.9\",\"30.71K\",\"0.29%\"\n\"03/08/2024\",\"68,172.0\",\"66,854.4\",\"69,904.0\",\"66,170.7\",\"112.67K\",\"1.97%\"\n\"03/07/2024\",\"66,855.3\",\"66,074.6\",\"67,985.5\",\"65,602.6\",\"77.47K\",\"1.17%\"\n\"03/06/2024\",\"66,080.4\",\"63,794.7\",\"67,604.9\",\"62,848.7\",\"117.91K\",\"3.59%\"\n\"03/05/2024\",\"63,792.6\",\"68,273.1\",\"69,063.1\",\"60,138.2\",\"207.60K\",\"-6.56%\"\n\"03/04/2024\",\"68,270.1\",\"63,135.8\",\"68,495.1\",\"62,746.8\",\"130.86K\",\"8.13%\"\n\"03/03/2024\",\"63,135.8\",\"61,955.6\",\"63,227.3\",\"61,399.4\",\"38.01K\",\"1.84%\"\n\"03/02/2024\",\"61,994.5\",\"62,397.7\",\"62,446.3\",\"61,621.9\",\"33.80K\",\"-0.65%\"\n\"03/01/2024\",\"62,397.7\",\"61,157.3\",\"63,147.3\",\"60,790.9\",\"74.96K\",\"2.01%\"\n\"02/29/2024\",\"61,169.3\",\"62,467.1\",\"63,653.4\",\"60,512.5\",\"119.29K\",\"-2.08%\"\n\"02/28/2024\",\"62,467.6\",\"57,048.7\",\"63,915.3\",\"56,704.9\",\"173.64K\",\"9.48%\"\n\"02/27/2024\",\"57,056.2\",\"54,491.1\",\"57,555.2\",\"54,464.0\",\"100.48K\",\"4.70%\"\n\"02/26/2024\",\"54,495.1\",\"51,722.7\",\"54,899.1\",\"50,925.2\",\"78.05K\",\"5.36%\"\n\"02/25/2024\",\"51,722.7\",\"51,572.1\",\"51,952.0\",\"51,299.0\",\"23.61K\",\"0.29%\"\n\"02/24/2024\",\"51,571.6\",\"50,739.6\",\"51,689.9\",\"50,592.0\",\"20.99K\",\"1.64%\"\n\"02/23/2024\",\"50,740.5\",\"51,320.6\",\"51,532.5\",\"50,537.6\",\"43.27K\",\"-1.13%\"\n\"02/22/2024\",\"51,320.4\",\"51,850.2\",\"52,015.8\",\"50,947.3\",\"50.27K\",\"-1.04%\"\n\"02/21/2024\",\"51,858.2\",\"52,263.5\",\"52,367.3\",\"50,676.9\",\"59.02K\",\"-0.78%\"\n\"02/20/2024\",\"52,263.5\",\"51,783.1\",\"52,936.8\",\"50,801.8\",\"68.10K\",\"0.93%\"\n\"02/19/2024\",\"51,783.6\",\"52,119.6\",\"52,484.8\",\"51,694.2\",\"36.73K\",\"-0.64%\"\n\"02/18/2024\",\"52,117.5\",\"51,646.0\",\"52,350.3\",\"51,199.6\",\"26.89K\",\"0.91%\"\n\"02/17/2024\",\"51,646.0\",\"52,134.2\",\"52,175.5\",\"50,652.3\",\"32.45K\",\"-0.94%\"\n\"02/16/2024\",\"52,134.2\",\"51,901.4\",\"52,556.7\",\"51,612.6\",\"52.86K\",\"0.45%\"\n\"02/15/2024\",\"51,901.3\",\"51,805.2\",\"52,819.4\",\"51,327.5\",\"74.72K\",\"0.23%\"\n\"02/14/2024\",\"51,782.4\",\"49,708.6\",\"52,010.7\",\"49,263.8\",\"80.35K\",\"4.16%\"\n\"02/13/2024\",\"49,716.0\",\"49,941.0\",\"50,326.6\",\"48,398.3\",\"78.51K\",\"-0.45%\"\n\"02/12/2024\",\"49,941.3\",\"48,280.2\",\"50,277.3\",\"47,729.9\",\"81.85K\",\"3.45%\"\n\"02/11/2024\",\"48,277.3\",\"47,759.3\",\"48,531.6\",\"47,590.2\",\"36.50K\",\"1.09%\"\n\"02/10/2024\",\"47,758.2\",\"47,128.0\",\"48,149.0\",\"46,875.0\",\"31.20K\",\"1.34%\"\n\"02/09/2024\",\"47,127.5\",\"45,293.3\",\"48,118.8\",\"45,254.2\",\"98.11K\",\"4.05%\"\n\"02/08/2024\",\"45,293.3\",\"44,346.2\",\"45,579.2\",\"44,336.4\",\"66.38K\",\"2.15%\"\n\"02/07/2024\",\"44,339.8\",\"43,088.4\",\"44,367.9\",\"42,783.5\",\"48.57K\",\"2.91%\"\n\"02/06/2024\",\"43,087.7\",\"42,697.6\",\"43,375.5\",\"42,566.8\",\"33.32K\",\"0.91%\"\n\"02/05/2024\",\"42,697.2\",\"42,581.4\",\"43,532.2\",\"42,272.5\",\"39.26K\",\"0.27%\"\n\"02/04/2024\",\"42,581.4\",\"43,006.2\",\"43,113.2\",\"42,379.4\",\"20.33K\",\"-0.99%\"\n\"02/03/2024\",\"43,005.7\",\"43,194.7\",\"43,370.4\",\"42,882.0\",\"14.57K\",\"-0.44%\"\n\"02/02/2024\",\"43,194.7\",\"43,083.7\",\"43,459.3\",\"42,596.3\",\"42.65K\",\"0.26%\"\n\"02/01/2024\",\"43,081.4\",\"42,580.1\",\"43,263.1\",\"41,890.5\",\"47.69K\",\"1.18%\"\n\"01/31/2024\",\"42,580.5\",\"42,946.2\",\"43,739.7\",\"42,315.4\",\"56.48K\",\"-0.85%\"\n\"01/30/2024\",\"42,946.2\",\"43,303.3\",\"43,817.9\",\"42,702.9\",\"55.13K\",\"-0.82%\"\n\"01/29/2024\",\"43,299.8\",\"42,031.4\",\"43,305.6\",\"41,824.7\",\"45.23K\",\"3.02%\"\n\"01/28/2024\",\"42,030.7\",\"42,121.3\",\"42,817.1\",\"41,649.0\",\"32.53K\",\"-0.21%\"\n\"01/27/2024\",\"42,120.9\",\"41,811.5\",\"42,191.8\",\"41,413.0\",\"20.46K\",\"0.74%\"\n\"01/26/2024\",\"41,811.3\",\"39,942.0\",\"42,214.8\",\"39,831.2\",\"69.47K\",\"4.70%\"\n\"01/25/2024\",\"39,935.7\",\"40,085.1\",\"40,285.8\",\"39,546.3\",\"46.30K\",\"-0.37%\"\n\"01/24/2024\",\"40,086.0\",\"39,891.3\",\"40,535.2\",\"39,510.0\",\"58.64K\",\"0.49%\"\n\"01/23/2024\",\"39,888.8\",\"39,555.0\",\"40,159.4\",\"38,546.9\",\"82.67K\",\"0.84%\"\n\"01/22/2024\",\"39,556.4\",\"41,581.7\",\"41,684.9\",\"39,468.4\",\"85.10K\",\"-4.87%\"\n\"01/21/2024\",\"41,583.2\",\"41,695.4\",\"41,878.0\",\"41,504.5\",\"16.11K\",\"-0.27%\"\n\"01/20/2024\",\"41,695.4\",\"41,647.6\",\"41,858.0\",\"41,449.5\",\"22.27K\",\"0.11%\"\n\"01/19/2024\",\"41,648.0\",\"41,293.8\",\"42,164.6\",\"40,305.4\",\"72.64K\",\"0.86%\"\n\"01/18/2024\",\"41,292.7\",\"42,763.5\",\"42,908.0\",\"40,682.6\",\"70.35K\",\"-3.45%\"\n\"01/17/2024\",\"42,768.7\",\"43,139.1\",\"43,192.3\",\"42,211.8\",\"50.44K\",\"-0.87%\"\n\"01/16/2024\",\"43,145.5\",\"42,515.2\",\"43,563.7\",\"42,093.1\",\"63.93K\",\"1.49%\"\n\"01/15/2024\",\"42,510.7\",\"41,747.6\",\"43,348.9\",\"41,719.2\",\"52.08K\",\"1.83%\"\n\"01/14/2024\",\"41,746.1\",\"42,851.3\",\"43,069.4\",\"41,739.6\",\"37.14K\",\"-2.58%\"\n\"01/13/2024\",\"42,851.3\",\"42,836.7\",\"43,248.6\",\"42,443.3\",\"48.18K\",\"0.04%\"\n\"01/12/2024\",\"42,835.9\",\"46,348.1\",\"46,503.2\",\"41,857.9\",\"136.92K\",\"-7.58%\"\n\"01/11/2024\",\"46,348.2\",\"46,629.3\",\"48,923.7\",\"45,651.8\",\"131.04K\",\"-0.60%\"\n\"01/10/2024\",\"46,629.3\",\"46,112.0\",\"47,654.3\",\"44,403.6\",\"131.48K\",\"1.08%\"\n\"01/09/2024\",\"46,129.0\",\"46,959.2\",\"47,880.1\",\"45,333.9\",\"100.09K\",\"-1.77%\"\n\"01/08/2024\",\"46,962.2\",\"43,934.2\",\"47,196.7\",\"43,251.0\",\"103.09K\",\"6.91%\"\n\"01/07/2024\",\"43,927.3\",\"43,973.5\",\"44,481.2\",\"43,627.9\",\"29.53K\",\"-0.09%\"\n\"01/06/2024\",\"43,967.9\",\"44,156.6\",\"44,203.2\",\"43,424.0\",\"24.26K\",\"-0.43%\"\n\"01/05/2024\",\"44,156.9\",\"44,163.0\",\"44,312.1\",\"42,629.0\",\"68.07K\",\"0.00%\"\n\"01/04/2024\",\"44,157.0\",\"42,836.1\",\"44,744.5\",\"42,632.8\",\"68.05K\",\"3.08%\"\n\"01/03/2024\",\"42,836.1\",\"44,943.7\",\"45,492.7\",\"40,888.3\",\"117.65K\",\"-4.69%\"\n\"01/02/2024\",\"44,943.7\",\"44,182.9\",\"45,885.4\",\"44,166.0\",\"97.84K\",\"1.72%\"\n\"01/01/2024\",\"44,183.4\",\"42,272.5\",\"44,187.0\",\"42,196.7\",\"36.30K\",\"4.52%\"\n\"12/31/2023\",\"42,272.5\",\"42,141.6\",\"42,878.8\",\"41,971.4\",\"35.58K\",\"0.32%\"\n\"12/30/2023\",\"42,136.7\",\"42,074.7\",\"42,592.2\",\"41,527.3\",\"35.18K\",\"0.15%\"\n\"12/29/2023\",\"42,072.4\",\"42,581.1\",\"43,108.0\",\"41,459.0\",\"60.98K\",\"-1.19%\"\n\"12/28/2023\",\"42,581.1\",\"43,446.5\",\"43,782.6\",\"42,309.3\",\"49.84K\",\"-1.99%\"\n\"12/27/2023\",\"43,446.5\",\"42,514.3\",\"43,676.7\",\"42,115.3\",\"50.10K\",\"2.20%\"\n\"12/26/2023\",\"42,513.3\",\"43,579.9\",\"43,594.9\",\"41,796.6\",\"56.03K\",\"-2.44%\"\n\"12/25/2023\",\"43,578.5\",\"42,982.0\",\"43,792.7\",\"42,745.3\",\"32.67K\",\"1.39%\"\n\"12/24/2023\",\"42,981.5\",\"43,710.4\",\"43,935.7\",\"42,748.5\",\"30.86K\",\"-1.67%\"\n\"12/23/2023\",\"43,710.4\",\"43,968.9\",\"43,994.6\",\"43,325.7\",\"21.29K\",\"-0.59%\"\n\"12/22/2023\",\"43,968.9\",\"43,865.9\",\"44,394.6\",\"43,419.3\",\"44.50K\",\"0.23%\"\n\"12/21/2023\",\"43,865.9\",\"43,660.3\",\"44,241.8\",\"43,310.2\",\"48.96K\",\"0.47%\"\n\"12/20/2023\",\"43,662.8\",\"42,259.5\",\"44,278.7\",\"42,217.2\",\"70.19K\",\"3.32%\"\n\"12/19/2023\",\"42,259.3\",\"42,659.7\",\"43,473.3\",\"41,842.7\",\"55.29K\",\"-0.94%\"\n\"12/18/2023\",\"42,659.7\",\"41,369.1\",\"42,728.0\",\"40,554.0\",\"61.58K\",\"3.12%\"\n\"12/17/2023\",\"41,368.7\",\"42,271.7\",\"42,413.2\",\"41,276.9\",\"35.46K\",\"-2.14%\"\n\"12/16/2023\",\"42,271.7\",\"41,929.0\",\"42,690.3\",\"41,698.2\",\"30.11K\",\"0.82%\"\n\"12/15/2023\",\"41,929.0\",\"43,025.2\",\"43,080.7\",\"41,697.9\",\"45.28K\",\"-2.55%\"\n\"12/14/2023\",\"43,025.9\",\"42,886.3\",\"43,392.7\",\"41,591.2\",\"59.15K\",\"0.33%\"\n\"12/13/2023\",\"42,884.5\",\"41,487.0\",\"43,417.5\",\"40,649.3\",\"63.11K\",\"3.37%\"\n\"12/12/2023\",\"41,487.0\",\"41,256.1\",\"42,070.9\",\"40,691.5\",\"57.04K\",\"0.56%\"\n\"12/11/2023\",\"41,256.1\",\"43,791.0\",\"43,806.3\",\"40,277.1\",\"105.19K\",\"-5.79%\"\n\"12/10/2023\",\"43,791.0\",\"43,716.6\",\"44,045.4\",\"43,576.8\",\"23.81K\",\"0.17%\"\n\"12/09/2023\",\"43,718.4\",\"44,175.5\",\"44,361.2\",\"43,617.4\",\"31.67K\",\"-1.03%\"\n\"12/08/2023\",\"44,175.5\",\"43,288.3\",\"44,697.6\",\"43,108.4\",\"58.44K\",\"2.05%\"\n\"12/07/2023\",\"43,289.7\",\"43,774.4\",\"44,046.4\",\"42,860.5\",\"63.09K\",\"-1.11%\"\n\"12/06/2023\",\"43,776.3\",\"44,076.2\",\"44,283.7\",\"43,466.7\",\"72.52K\",\"-0.68%\"\n\"12/05/2023\",\"44,076.2\",\"41,989.6\",\"44,424.1\",\"41,424.9\",\"96.84K\",\"4.97%\"\n\"12/04/2023\",\"41,987.8\",\"39,968.6\",\"42,394.4\",\"39,968.6\",\"104.21K\",\"5.05%\"\n\"12/03/2023\",\"39,970.2\",\"39,456.8\",\"40,178.9\",\"39,280.3\",\"35.27K\",\"1.30%\"\n\"12/02/2023\",\"39,458.4\",\"38,688.2\",\"39,673.4\",\"38,646.5\",\"37.09K\",\"1.99%\"\n\"12/01/2023\",\"38,688.2\",\"37,712.9\",\"38,950.8\",\"37,618.3\",\"62.50K\",\"2.59%\"\n\"11/30/2023\",\"37,712.9\",\"37,857.6\",\"38,144.4\",\"37,509.2\",\"33.53K\",\"-0.38%\"\n\"11/29/2023\",\"37,855.5\",\"37,823.3\",\"38,362.9\",\"37,607.6\",\"49.34K\",\"0.09%\"\n\"11/28/2023\",\"37,823.3\",\"37,244.3\",\"38,379.4\",\"36,881.1\",\"57.50K\",\"1.54%\"\n\"11/27/2023\",\"37,248.6\",\"37,451.8\",\"37,563.3\",\"36,751.5\",\"45.24K\",\"-0.54%\"\n\"11/26/2023\",\"37,451.8\",\"37,786.4\",\"37,819.1\",\"37,166.3\",\"29.20K\",\"-0.89%\"\n\"11/25/2023\",\"37,787.0\",\"37,718.6\",\"37,887.4\",\"37,599.9\",\"16.09K\",\"0.18%\"\n\"11/24/2023\",\"37,717.3\",\"37,295.0\",\"38,400.8\",\"37,257.4\",\"65.83K\",\"1.14%\"\n\"11/23/2023\",\"37,293.1\",\"37,410.8\",\"37,642.5\",\"36,915.3\",\"32.35K\",\"-0.31%\"\n\"11/22/2023\",\"37,410.8\",\"35,797.5\",\"37,862.5\",\"35,695.6\",\"64.81K\",\"4.46%\"\n\"11/21/2023\",\"35,813.6\",\"37,452.7\",\"37,631.2\",\"35,799.2\",\"71.07K\",\"-4.38%\"\n\"11/20/2023\",\"37,454.1\",\"37,356.6\",\"37,735.6\",\"36,857.6\",\"51.80K\",\"0.27%\"\n\"11/19/2023\",\"37,354.2\",\"36,568.6\",\"37,504.6\",\"36,393.3\",\"26.14K\",\"2.15%\"\n\"11/18/2023\",\"36,568.6\",\"36,617.5\",\"36,845.2\",\"36,220.6\",\"20.88K\",\"-0.07%\"\n\"11/17/2023\",\"36,595.4\",\"36,161.8\",\"36,690.6\",\"35,875.2\",\"51.37K\",\"1.20%\"\n\"11/16/2023\",\"36,161.2\",\"37,873.9\",\"37,907.6\",\"35,561.6\",\"66.92K\",\"-4.52%\"\n\"11/15/2023\",\"37,874.9\",\"35,549.3\",\"37,954.1\",\"35,379.6\",\"75.51K\",\"6.54%\"\n\"11/14/2023\",\"35,549.3\",\"36,478.3\",\"36,744.5\",\"34,984.3\",\"63.56K\",\"-2.55%\"\n\"11/13/2023\",\"36,478.3\",\"37,067.8\",\"37,404.6\",\"36,358.4\",\"44.55K\",\"-1.58%\""
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/CarImages/convert.bat",
    "content": "for /f %%f in ('dir /b *.png') do \"C:\\Program Files\\ImageMagick-7.1.1-Q16\\magick.exe\" convert -quality 75 -colors 16 %%f %%f"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/cars.csv",
    "content": "ID,Trademark,HP,Liter,Cyl,Transmission speed count,Transmission type,MPG,Description,Price,IsInStock,PictureName\r\n1,MarsRoverX,300,3,6,5,Automatic,20,\"The MarsRoverX is a powerful off-road vehicle designed for exploring the rugged terrains of Mars. With its 300 horsepower engine and 3.0-liter cylinder capacity, it can easily traverse the harsh Martian landscape. The automatic transmission allows for smooth gear shifts, while achieving a fuel efficiency of 20 MPG. This Martian car is perfect for scientific missions and exploration.\",\"$50,000 \",True,MarsRoverX.png \r\n2,RedPlanetCruiser,250,2.5,4,6,Manual,25,\"The RedPlanetCruiser is a sleek and stylish car built for high-speed travel on the Martian highways. It boasts a 250 horsepower engine with a 2.5-liter cylinder capacity, providing a thrilling driving experience. The manual transmission offers full control over gear shifts, making it ideal for Martians who enjoy a more hands-on driving experience. With a fuel efficiency of 25 MPG, this car combines performance and efficiency.\",\"$45,000 \",True,RedPlanetCruiser.png \r\n3,InterstellarExplorer,400,4,8,7,Automatic,18,\"The InterstellarExplorer is a futuristic Martian car designed for long-distance space travel. Its powerful 400 horsepower engine and 4.0-liter cylinder capacity ensure smooth acceleration even in zero-gravity environments. The automatic transmission with seven-speed options allows for effortless gear changes. With a fuel efficiency of 18 MPG, this car can cover vast distances on minimal fuel consumption. Perfect for interplanetary adventurers seeking new frontiers.\",\"$60,000 \",False,InterstellarExplorer.png \r\n4,MarsOffroader,200,2,4,5,Manual,22,\"The MarsOffroader is a rugged off-road vehicle built to conquer the challenging Martian terrain. It features a 200 horsepower engine with a 2.0-liter cylinder capacity, making it capable of tackling steep inclines and rocky surfaces. The manual transmission enables precise control over gear shifts, ensuring optimal performance in any off-road situation. With a fuel efficiency of 22 MPG, this car is a reliable companion for Martian explorers.\",\"$35,000 \",True,MarsOffroader.png\r\n5,AlienSpeedster,500,5,10,8,Automatic,15,\"The AlienSpeedster is a high-performance sports car designed for Martians who crave adrenaline-fueled adventures. Its massive 500 horsepower engine and 5.0-liter cylinder capacity deliver unmatched acceleration and top speeds. The automatic transmission with eight-speed options guarantees lightning-fast gear changes. While fuel efficiency may not be its primary focus, the AlienSpeedster still manages a respectable 15 MPG. This car is a symbol of Martian luxury and speed.\",\"$80,000 \",True,AlienSpeedster.png \r\n6,MarsCruiser,350,3.5,6,6,Automatic,19,\"The MarsCruiser is a versatile car that combines comfort, power, and style. With a 350 horsepower engine and a 3.5-liter cylinder capacity, it offers a smooth driving experience on Martian roads. The automatic transmission with six-speed options ensures effortless gear shifts. With a fuel efficiency of 19 MPG, this car strikes the perfect balance between performance and economy. Ideal for everyday commuting or weekend getaways on Mars.\",\"$55,000 \",True,MarsCruiser.png\r\n7,CyberRover,450,4.5,8,7,Automatic,17,\"The CyberRover is an advanced Martian car equipped with cutting-edge technology. Its 450 horsepower engine and 4.5-liter cylinder capacity provide impressive power and performance. The automatic transmission with seven-speed options ensures seamless gear changes. With a fuel efficiency of 17 MPG, this car combines power with efficiency. Packed with futuristic features and sleek design, the CyberRover is a must-have for tech-savvy Martians.\",\"$70,000 \",True,CyberRover.png \r\n8,MarsUtilityTruck,300,3,6,6,Manual,21,\"The MarsUtilityTruck is a versatile vehicle designed for various tasks on the Martian surface. Its 300 horsepower engine and 3.0-liter cylinder capacity offer sufficient power for hauling heavy loads or towing equipment. The manual transmission allows for precise gear shifts, ensuring optimal performance in different scenarios. With a fuel efficiency of 21 MPG, this truck is both practical and efficient for Martian work environments.\",\"$40,000 \",False,MarsUtilityTruck.png \r\n9,RedDustBuggy,150,1.5,4,4,Automatic,24,\"The RedDustBuggy is a compact and agile car built for navigating the dusty Martian landscapes. Its 150 horsepower engine and 1.5-liter cylinder capacity provide ample power for zipping through narrow trails. The automatic transmission with four-speed options ensures effortless gear changes. With a fuel efficiency of 24 MPG, this car is perfect for Martian adventurers looking to explore the planet's hidden wonders.\",\"$30,000 \",True,RedDustBuggy.png \r\n10,SpaceHopper,250,2.5,4,5,Manual,23,\"The SpaceHopper is a compact and nimble car designed for easy maneuverability in cramped Martian environments. Its 250 horsepower engine and 2.5-liter cylinder capacity offer sufficient power for urban commutes or interplanetary travel. The manual transmission provides full control over gear shifts, making it ideal for Martians who enjoy an engaging driving experience. With a fuel efficiency of 23 MPG, this car is practical and efficient for everyday use on Mars.\",\"$35,000 \",True,SpaceHopper.png \r\n11,MartianSprinter,400,4,8,6,Automatic,16,\"The MartianSprinter is a high-performance car built for Martians who crave speed and luxury. Its powerful 400 horsepower engine and 4.0-liter cylinder capacity deliver exhilarating acceleration and top speeds. The automatic transmission with six-speed options ensures smooth gear changes. With a fuel efficiency of 16 MPG, this car combines performance with style. Perfect for Martians who want to make a statement on the Martian highways.\",\"$65,000 \",True,MartianSprinter.png \r\n12,AstroTrailblazer,200,2,4,5,Automatic,20,\"The AstroTrailblazer is an all-terrain vehicle designed for exploring the uncharted regions of Mars. Its 200 horsepower engine and 2.0-liter cylinder capacity provide sufficient power for off-road adventures. The automatic transmission with five-speed options allows for seamless gear changes. With a fuel efficiency of 20 MPG, this car is a reliable companion for Martian explorers seeking new horizons.\",\"$38,000 \",True,AstroTrailblazer.png \r\n13,MarsInterceptor,550,5.5,10,8,Automatic,14,\"The MarsInterceptor is a futuristic sports car that pushes the boundaries of Martian engineering. Its massive 550 horsepower engine and 5.5-liter cylinder capacity offer unmatched power and performance. The automatic transmission with eight-speed options guarantees lightning-fast gear changes. While fuel efficiency may not be its top priority, the MarsInterceptor still manages a respectable 14 MPG. This car is the epitome of Martian luxury and speed.\",\"$90,000 \",True,MarsInterceptor.png \r\n14,RedPlanetRacer,300,3,6,6,Automatic,18,\"The RedPlanetRacer is a sleek and aerodynamic car built for high-speed racing on the Martian tracks. Its 300 horsepower engine and 3.0-liter cylinder capacity deliver adrenaline-fueled performance. The automatic transmission with six-speed options ensures smooth gear changes, allowing for optimal acceleration. With a fuel efficiency of 18 MPG, this car strikes the perfect balance between speed and efficiency. Perfect for Martians with a need for speed.\",\"$50,000 \",False,RedPlanetRacer.png \r\n15,MarsAdventureVan,180,1.8,4,4,Automatic,26,\"The MarsAdventureVan is a versatile vehicle designed for Martian explorers who value comfort and practicality. Its 180 horsepower engine and 1.8-liter cylinder capacity provide sufficient power for long journeys. The automatic transmission with four-speed options ensures effortless gear shifts. With a fuel efficiency of 26 MPG, this van offers both comfort and efficiency for extended adventures on Mars.\",\"$42,000 \",False,MarsAdventureVan.png \r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/logarithmic.csv",
    "content": "Frequency, Left Avg, Test 1, Test 2, Test 3, Test 4, Test 5, Target Response\n9.857, 101.33361020408161, 106.22230079608876, 106.01714852573393, 107.14047973658974, 92.45929500276931, 94.82882695922633, 95\n10, 101.48741020408161, 106.34070079608877, 106.14614852573392, 107.26407973658975, 92.68669500276935, 94.99942695922631, 95\n10.145, 101.68665020408162, 106.4939007960888, 106.3143485257339, 107.42247973658975, 92.97829500276931, 95.22422695922633, 95\n10.293, 101.92321020408161, 106.67790079608876, 106.51734852573391, 107.60787973658974, 93.31789500276933, 95.49502695922634, 95\n10.443, 102.1703702040816, 106.87010079608878, 106.7313485257339, 107.79627973658974, 93.6678950027693, 95.78622695922634, 95\n10.595, 102.42065020408162, 107.0695007960888, 106.95194852573393, 107.98267973658973, 94.00949500276933, 96.08962695922635, 95\n10.749, 102.65881020408162, 107.2645007960888, 107.1669485257339, 108.15467973658976, 94.31809500276934, 96.38982695922631, 95\n10.905, 102.88501020408162, 107.4565007960888, 107.37534852573391, 108.31347973658974, 94.59389500276934, 96.6858269592263, 95\n11.064, 103.09913020408162, 107.64550079608877, 107.57574852573391, 108.45967973658973, 94.83769500276931, 96.97702695922636, 95\n11.225, 103.29897020408161, 107.8281007960888, 107.7643485257339, 108.59127973658975, 95.0514950027693, 97.25962695922631, 95\n11.388, 103.48489020408162, 108.00210079608878, 107.93874852573391, 108.70867973658973, 95.24189500276931, 97.53302695922635, 95\n11.554, 103.65813020408159, 108.16470079608878, 108.09894852573389, 108.81267973658971, 95.41769500276929, 97.79662695922629, 95\n11.722, 103.81845020408161, 108.3125007960888, 108.2413485257339, 108.90247973658974, 95.58769500276931, 98.04822695922634, 95\n11.892, 103.96777020408163, 108.44290079608881, 108.36634852573393, 108.97867973658977, 95.76329500276934, 98.28762695922633, 95\n12.065, 104.10617020408162, 108.5521007960888, 108.4727485257339, 109.04107973658974, 95.95089500276931, 98.51402695922634, 95\n12.241, 104.23629020408161, 108.64050079608877, 108.56134852573392, 109.09167973658971, 96.15849500276933, 98.72942695922633, 95\n12.419, 104.3588902040816, 108.70710079608877, 108.6337485257339, 109.13107973658974, 96.3870950027693, 98.93542695922635, 95\n12.599, 104.47489020408163, 108.75310079608882, 108.69154852573392, 109.16147973658973, 96.63469500276933, 99.13362695922633, 95\n12.782, 104.58577020408158, 108.78190079608875, 108.73774852573392, 109.1856797365897, 96.8956950027693, 99.3278269592263, 95\n12.968, 104.68981020408164, 108.79450079608883, 108.77234852573393, 109.20307973658974, 97.16009500276932, 99.51902695922634, 95\n13.157, 104.78969020408161, 108.79730079608875, 108.8003485257339, 109.21667973658974, 97.42189500276932, 99.71222695922633, 95\n13.348, 104.88493020408161, 108.79330079608879, 108.82214852573388, 109.22727973658972, 97.67389500276933, 99.90802695922635, 95\n13.543, 104.9773302040816, 108.78770079608877, 108.84094852573388, 109.23547973658971, 97.91309500276931, 100.10942695922633, 95\n13.74, 105.06641020408162, 108.78210079608881, 108.85634852573394, 109.24007973658975, 98.13769500276932, 100.31582695922636, 95\n13.939, 105.1533702040816, 108.77870079608876, 108.86834852573388, 109.24047973658973, 98.35169500276932, 100.52762695922634, 95\n14.142, 105.23805020408163, 108.77710079608882, 108.8759485257339, 109.23587973658975, 98.55909500276933, 100.74222695922636, 95\n14.348, 105.31933020408162, 108.7747007960888, 108.8775485257339, 109.22247973658973, 98.76509500276934, 100.95682695922632, 95\n14.557, 105.39785020408162, 108.77010079608876, 108.8723485257339, 109.20127973658974, 98.97549500276934, 101.17002695922635, 95\n14.768, 105.47221020408162, 108.75970079608881, 108.85834852573389, 109.17027973658973, 99.19329500276935, 101.37942695922631, 95\n14.983, 105.54173020408162, 108.74070079608875, 108.8355485257339, 109.13007973658974, 99.4180950027693, 101.58422695922634, 95\n15.201, 105.60493020408163, 108.7115007960888, 108.80354852573389, 109.08087973658975, 99.6456950027693, 101.78302695922635, 95\n15.422, 105.66005020408161, 108.67010079608879, 108.7621485257339, 109.02307973658971, 99.86889500276932, 101.97602695922633, 95\n15.646, 105.70841020408162, 108.6189007960888, 108.71374852573389, 108.96027973658973, 100.0824950027693, 102.16662695922635, 95\n15.874, 105.74865020408163, 108.55790079608882, 108.65794852573389, 108.89247973658975, 100.28029500276934, 102.35462695922634, 95\n16.105, 105.78249020408161, 108.49010079608878, 108.59634852573389, 108.82147973658972, 100.46269500276931, 102.54182695922636, 95\n16.339, 105.81185020408164, 108.41770079608882, 108.52934852573391, 108.74887973658976, 100.63389500276931, 102.72942695922633, 95\n16.577, 105.83901020408162, 108.34130079608879, 108.45834852573391, 108.67607973658973, 100.80209500276932, 102.91722695922631, 95\n16.818, 105.8660502040816, 108.26250079608879, 108.3825485257339, 108.6016797365897, 100.97789500276936, 103.10562695922631, 95\n17.063, 105.89453020408162, 108.18030079608879, 108.30174852573388, 108.52747973658974, 101.16909500276934, 103.29402695922631, 95\n17.311, 105.9248502040816, 108.09390079608876, 108.2165485257339, 108.45167973658972, 101.3800950027693, 103.48202695922636, 95\n17.563, 105.9560502040816, 108.00190079608878, 108.12614852573391, 108.37447973658972, 101.60889500276933, 103.66882695922631, 95\n17.818, 105.98637020408162, 107.90470079608879, 108.03094852573393, 108.29387973658974, 101.8478950027693, 103.85442695922633, 95\n18.077, 106.01285020408162, 107.80190079608879, 107.9307485257339, 108.20867973658973, 102.08509500276934, 104.03782695922634, 95\n18.34, 106.03349020408162, 107.69550079608878, 107.82574852573394, 108.11747973658971, 102.31089500276933, 104.21782695922634, 95\n18.607, 106.0470102040816, 107.58750079608878, 107.71614852573389, 108.01907973658975, 102.51809500276933, 104.39422695922634, 95\n18.877, 106.0530902040816, 107.48010079608879, 107.60234852573392, 107.91267973658974, 102.70589500276931, 104.56442695922631, 95\n19.152, 106.05361020408164, 107.37550079608879, 107.48614852573392, 107.79767973658976, 102.88069500276931, 104.72802695922634, 95\n19.431, 106.05061020408161, 107.27450079608879, 107.36834852573394, 107.67587973658972, 103.05069500276933, 104.88362695922633, 95\n19.713, 106.04641020408162, 107.17750079608881, 107.25074852573393, 107.54827973658975, 103.2242950027693, 105.03122695922634, 95\n20, 106.04229020408161, 107.08070079608878, 107.13534852573393, 107.41747973658973, 103.40629500276931, 105.17162695922634, 95\n20.291, 106.03885020408161, 106.98230079608878, 107.02254852573391, 107.28687973658974, 103.59589500276927, 105.3066269592263, 94.999\n20.586, 106.03277020408161, 106.87510079608877, 106.91114852573388, 107.15687973658974, 103.7860950027693, 105.43462695922632, 94.995\n20.885, 106.02309020408161, 106.75510079608881, 106.80074852573392, 107.02927973658976, 103.97269500276929, 105.55762695922633, 94.99\n21.189, 106.00829020408165, 106.61990079608881, 106.68974852573393, 106.90427973658976, 104.15209500276933, 105.67542695922634, 94.98\n21.497, 105.9857702040816, 106.4673007960888, 106.57434852573392, 106.77927973658974, 104.3246950027693, 105.78322695922633, 94.97\n21.81, 105.95965020408161, 106.30590079608882, 106.45554852573392, 106.65567973658972, 104.49809500276936, 105.88302695922633, 94.96\n22.127, 105.93025020408163, 106.14190079608878, 106.33214852573391, 106.53027973658976, 104.67609500276936, 105.97082695922632, 94.95\n22.449, 105.90061020408162, 105.98650079608878, 106.2053485257339, 106.40347973658972, 104.86029500276932, 106.04742695922631, 94.94\n22.776, 105.87085020408162, 105.84590079608881, 106.07614852573388, 106.2750797365897, 105.04529500276931, 106.11182695922633, 94.93\n23.107, 105.84165020408163, 105.72450079608882, 105.94674852573394, 106.14767973658977, 105.22109500276935, 106.16822695922633, 94.92\n23.443, 105.80857020408162, 105.6165007960888, 105.8169485257339, 106.02067973658974, 105.37289500276931, 106.2158269592263, 94.91\n23.784, 105.7705302040816, 105.51590079608876, 105.6891485257339, 105.89647973658974, 105.4940950027693, 106.25702695922631, 94.9\n24.13, 105.72509020408162, 105.41390079608881, 105.5635485257339, 105.77527973658975, 105.58269500276931, 106.29002695922635, 94.899\n24.481, 105.6738102040816, 105.30630079608879, 105.44114852573391, 105.65687973658974, 105.6498950027693, 106.3148269592263, 94.898\n24.837, 105.61905020408162, 105.19290079608876, 105.32214852573392, 105.54147973658974, 105.71009500276935, 106.32862695922631, 94.897\n25.198, 105.56605020408165, 105.07930079608883, 105.20794852573391, 105.43027973658977, 105.78009500276931, 106.33262695922633, 94.896\n25.565, 105.5154902040816, 104.96930079608879, 105.09654852573394, 105.32207973658973, 105.86489500276932, 106.3246269592263, 94.895\n25.937, 105.46941020408163, 104.8673007960888, 104.98854852573392, 105.21807973658976, 105.9642950027693, 106.3088269592263, 94.894\n26.314, 105.4277302040816, 104.77490079608877, 104.88554852573391, 105.12107973658975, 106.06909500276929, 106.28802695922631, 94.893\n26.697, 105.38749020408162, 104.69050079608878, 104.78754852573392, 105.02947973658972, 106.16649500276931, 106.26342695922632, 94.892\n27.085, 105.34821020408162, 104.6127007960888, 104.69674852573394, 104.94567973658977, 106.24809500276933, 106.23782695922631, 94.891\n27.479, 105.30909020408163, 104.54130079608878, 104.61414852573391, 104.86787973658976, 106.31109500276933, 106.21102695922634, 94.887\n27.879, 105.26929020408161, 104.47430079608883, 104.5383485257339, 104.79467973658974, 106.35769500276929, 106.18142695922633, 94.882\n28.284, 105.23121020408162, 104.41470079608878, 104.4717485257339, 104.72647973658975, 106.39329500276934, 106.1498269592263, 94.875\n28.696, 105.19341020408163, 104.3605007960888, 104.41214852573391, 104.66067973658973, 106.41909500276934, 106.11462695922633, 94.868\n29.113, 105.15809020408165, 104.31370079608882, 104.36054852573392, 104.59907973658974, 106.43829500276934, 106.07882695922632, 94.86\n29.537, 105.1246502040816, 104.27230079608879, 104.3161485257339, 104.5422797365897, 106.44929500276933, 106.04322695922633, 94.849\n29.966, 105.09341020408162, 104.23650079608878, 104.2775485257339, 104.49207973658976, 106.4520950027693, 106.00882695922634, 94.834\n30.402, 105.06657020408161, 104.20750079608881, 104.2455485257339, 104.45227973658974, 106.44989500276931, 105.9776269592263, 94.816\n30.844, 105.04421020408162, 104.18530079608882, 104.2195485257339, 104.42127973658975, 106.44549500276935, 105.94942695922632, 94.795\n31.293, 105.02769020408161, 104.17110079608877, 104.20034852573393, 104.40067973658974, 106.4416950027693, 105.92462695922633, 94.774\n31.748, 105.01773020408162, 104.16550079608879, 104.1889485257339, 104.39007973658974, 106.4404950027693, 105.90362695922633, 94.752\n32.21, 105.01545020408162, 104.16870079608879, 104.18574852573391, 104.39067973658976, 106.44209500276929, 105.8900269592263, 94.728\n32.678, 105.01777020408163, 104.1767007960888, 104.18834852573391, 104.39947973658974, 106.44229500276933, 105.88202695922632, 94.705\n33.154, 105.02673020408164, 104.19190079608882, 104.19994852573393, 104.41807973658976, 106.44169500276934, 105.88202695922632, 94.682\n33.636, 105.04081020408162, 104.21230079608881, 104.21934852573389, 104.44387973658971, 106.43929500276931, 105.88922695922633, 94.658\n34.125, 105.06165020408162, 104.24090079608881, 104.2475485257339, 104.47747973658973, 106.43929500276933, 105.90302695922635, 94.63\n34.621, 105.0901302040816, 104.27710079608879, 104.28394852573392, 104.51947973658973, 106.4460950027693, 105.92402695922634, 94.595\n35.125, 105.1257302040816, 104.32050079608878, 104.3271485257339, 104.56687973658974, 106.4622950027693, 105.95182695922632, 94.553\n35.636, 105.1700102040816, 104.37230079608884, 104.3789485257339, 104.62007973658976, 106.49049500276931, 105.9882269592263, 94.509\n36.154, 105.2218102040816, 104.43090079608884, 104.43874852573389, 104.67747973658975, 106.52929500276927, 106.0326269592263, 94.47\n36.68, 105.28061020408163, 104.49690079608882, 104.50494852573394, 104.74047973658978, 106.5758950027693, 106.08482695922635, 94.437\n37.214, 105.34529020408164, 104.56890079608883, 104.5759485257339, 104.80927973658973, 106.62749500276931, 106.14482695922635, 94.413\n37.755, 105.41401020408162, 104.64450079608879, 104.65054852573392, 104.88367973658974, 106.68089500276933, 106.21042695922633, 94.404\n38.304, 105.48661020408163, 104.72390079608883, 104.73034852573389, 104.96327973658975, 106.7358950027693, 106.27962695922633, 94.397\n38.861, 105.56297020408161, 104.80850079608878, 104.81534852573394, 105.04767973658973, 106.7930950027693, 106.3502269592263, 94.392\n39.427, 105.64165020408161, 104.8965007960888, 104.9023485257339, 105.13647973658972, 106.85249500276929, 106.4204269592263, 94.392\n40, 105.7224102040816, 104.9879007960888, 104.98994852573391, 105.22907973658972, 106.91509500276929, 106.49002695922631, 94.393\n40.582, 105.80353020408161, 105.08050079608878, 105.07794852573389, 105.32207973658973, 106.97829500276933, 106.55882695922631, 94.397\n41.172, 105.88453020408163, 105.17330079608882, 105.1663485257339, 105.41567973658974, 107.04049500276932, 106.62682695922632, 94.403\n41.771, 105.9648902040816, 105.26670079608878, 105.25474852573392, 105.5108797365897, 107.09989500276929, 106.69222695922632, 94.41\n42.379, 106.04353020408162, 105.3585007960888, 105.34174852573389, 105.60687973658975, 107.1556950027693, 106.7548269592263, 94.414\n42.995, 106.12025020408161, 105.44850079608882, 105.42674852573391, 105.7026797365897, 107.20849500276934, 106.81482695922632, 94.418\n43.62, 106.19281020408161, 105.53370079608881, 105.50894852573391, 105.79427973658973, 107.25749500276932, 106.86962695922632, 94.416\n44.255, 106.26117020408162, 105.61490079608878, 105.58914852573393, 105.88107973658977, 107.30369500276932, 106.91702695922636, 94.404\n44.898, 106.32517020408162, 105.69210079608882, 105.66514852573391, 105.96307973658972, 107.34769500276934, 106.95782695922631, 94.384\n45.552, 106.38441020408163, 105.76550079608879, 105.73514852573393, 106.03967973658973, 107.38889500276932, 106.9928269592263, 94.361\n46.214, 106.43685020408161, 105.83110079608878, 105.79774852573394, 106.10907973658973, 107.42449500276933, 107.02182695922633, 94.336\n46.886, 106.48149020408161, 105.88730079608882, 105.85274852573389, 106.16987973658976, 107.45289500276931, 107.04462695922632, 94.307\n47.568, 106.5180102040816, 105.93430079608882, 105.89934852573387, 106.22247973658972, 107.4740950027693, 107.05982695922631, 94.277\n48.26, 106.54629020408163, 105.9737007960888, 105.93634852573392, 106.26627973658977, 107.48729500276933, 107.06782695922637, 94.25\n48.962, 106.56661020408164, 106.00530079608882, 105.96474852573391, 106.30187973658977, 107.49249500276932, 107.06862695922632, 94.223\n49.674, 106.5758502040816, 106.02510079608878, 105.98254852573392, 106.32507973658973, 107.48689500276929, 107.05962695922629, 94.196\n50.397, 106.57625020408162, 106.03510079608883, 105.9923485257339, 106.33907973658974, 107.47309500276928, 107.04162695922632, 94.172\n51.13, 106.56713020408161, 106.03610079608882, 105.99254852573392, 106.34327973658972, 107.44989500276932, 107.01382695922632, 94.146\n51.874, 106.54861020408161, 106.02770079608878, 105.9821485257339, 106.33827973658974, 107.4178950027693, 106.97702695922631, 94.12\n52.628, 106.52169020408162, 106.00970079608882, 105.96294852573394, 106.3244797365897, 107.37749500276934, 106.93382695922628, 94.092\n53.394, 106.48501020408162, 105.98110079608881, 105.93434852573392, 106.30007973658977, 107.3274950027693, 106.88202695922632, 94.062\n54.17, 106.44093020408161, 105.94410079608882, 105.89874852573392, 106.26747973658975, 107.26929500276928, 106.82502695922629, 94.025\n54.958, 106.38949020408162, 105.89990079608879, 105.85554852573392, 106.22687973658972, 107.20289500276931, 106.76222695922633, 93.98\n55.758, 106.33125020408161, 105.84950079608879, 105.80574852573389, 106.17827973658973, 107.1280950027693, 106.69462695922633, 93.931\n56.569, 106.26649020408163, 105.79150079608883, 105.75114852573392, 106.12227973658972, 107.04569500276932, 106.62182695922633, 93.879\n57.391, 106.19577020408163, 105.7271007960888, 105.69054852573394, 106.05967973658973, 106.95629500276932, 106.54522695922635, 93.832\n58.226, 106.12017020408163, 105.65830079608884, 105.62454852573393, 105.99127973658975, 106.8618950027693, 106.46482695922631, 93.79\n59.073, 106.03833020408163, 105.58330079608879, 105.55234852573392, 105.91627973658976, 106.76129500276932, 106.37842695922632, 93.752\n59.932, 105.95273020408163, 105.50390079608883, 105.4765485257339, 105.83667973658973, 106.65709500276932, 106.28942695922632, 93.718\n60.804, 105.86309020408162, 105.4197007960888, 105.39574852573391, 105.75327973658973, 106.54949500276932, 106.19722695922631, 93.684\n61.688, 105.77093020408161, 105.33230079608877, 105.3115485257339, 105.66787973658974, 106.4402950027693, 106.10262695922633, 93.649\n62.586, 105.6752902040816, 105.2411007960888, 105.22354852573392, 105.57807973658973, 106.32889500276929, 106.0048269592263, 93.615\n63.496, 105.57885020408162, 105.14890079608877, 105.1345485257339, 105.48647973658974, 106.21849500276933, 105.90582695922633, 93.589\n64.42, 105.4819702040816, 105.05650079608881, 105.04414852573393, 105.3940797365897, 106.10889500276932, 105.80622695922631, 93.569\n65.357, 105.3858102040816, 104.96390079608878, 104.95394852573392, 105.30267973658971, 106.0012950027693, 105.70722695922632, 93.546\n66.307, 105.28901020408162, 104.87090079608882, 104.86194852573388, 105.20927973658974, 105.89489500276935, 105.60802695922632, 93.52\n67.272, 105.19497020408161, 104.7809007960888, 104.77274852573392, 105.11807973658973, 105.79249500276931, 105.51062695922631, 93.501\n68.25, 105.10125020408161, 104.69210079608881, 104.6839485257339, 105.02667973658974, 105.68969500276931, 105.41382695922628, 93.482\n69.243, 105.00985020408162, 104.60530079608881, 104.5969485257339, 104.93787973658971, 105.58949500276933, 105.31962695922635, 93.462\n70.25, 104.91941020408163, 104.5189007960888, 104.50974852573391, 104.85107973658974, 105.4904950027693, 105.22682695922633, 93.429\n71.272, 104.83181020408162, 104.4351007960888, 104.42594852573392, 104.76667973658972, 105.39389500276933, 105.13742695922632, 93.398\n72.309, 104.74729020408161, 104.35430079608876, 104.34634852573389, 104.68447973658972, 105.30009500276931, 105.05122695922633, 93.363\n73.36, 104.6647702040816, 104.2761007960888, 104.26794852573389, 104.60447973658972, 105.20809500276934, 104.96722695922634, 93.325\n74.427, 104.5844502040816, 104.1995007960888, 104.1917485257339, 104.52727973658973, 105.11789500276929, 104.88582695922629, 93.286\n75.51, 104.50741020408164, 104.12590079608881, 104.1193485257339, 104.45307973658976, 105.03149500276933, 104.80722695922628, 93.246\n76.608, 104.4336102040816, 104.05590079608879, 104.05034852573391, 104.38167973658975, 104.94809500276932, 104.73202695922632, 93.206\n77.723, 104.36197020408163, 103.98870079608878, 103.98414852573393, 104.31127973658974, 104.86689500276935, 104.6588269592263, 93.165\n78.853, 104.29317020408162, 103.92470079608877, 103.91894852573391, 104.24487973658974, 104.78889500276934, 104.58842695922631, 93.118\n80, 104.22661020408161, 103.86230079608879, 103.8549485257339, 104.18147973658975, 104.71389500276933, 104.52042695922631, 93.064\n81.164, 104.1611702040816, 103.80130079608878, 103.79014852573388, 104.11907973658975, 104.64109500276933, 104.45422695922633, 93.008\n82.344, 104.0979302040816, 103.74270079608883, 103.72814852573387, 104.05827973658972, 104.57029500276931, 104.39022695922631, 92.95\n83.542, 104.03701020408161, 103.68630079608882, 103.66754852573389, 104.00047973658975, 104.50209500276931, 104.32862695922633, 92.892\n84.757, 103.97717020408163, 103.6309007960888, 103.60694852573393, 103.94447973658977, 104.43549500276931, 104.2680269592263, 92.832\n85.99, 103.9193302040816, 103.57690079608878, 103.54974852573392, 103.89007973658971, 104.37069500276934, 104.2092269592263, 92.765\n87.241, 103.86337020408162, 103.5245007960888, 103.4961485257339, 103.83667973658976, 104.3076950027693, 104.15182695922633, 92.686\n88.51, 103.8087302040816, 103.47390079608878, 103.4453485257339, 103.78427973658974, 104.24529500276928, 104.09482695922632, 92.588\n89.797, 103.75565020408162, 103.42530079608883, 103.39714852573394, 103.73267973658974, 104.18429500276932, 104.0388269592263, 92.49\n91.103, 103.70277020408162, 103.37570079608882, 103.34974852573392, 103.68247973658971, 104.12349500276933, 103.98242695922629, 92.388\n92.428, 103.65137020408163, 103.32710079608879, 103.30334852573392, 103.63427973658975, 104.06429500276934, 103.92782695922631, 92.289\n93.773, 103.59853020408161, 103.2777007960888, 103.25554852573393, 103.58407973658973, 104.00369500276932, 103.87162695922632, 92.188\n95.137, 103.54709020408163, 103.22970079608878, 103.20874852573392, 103.53527973658974, 103.94469500276934, 103.81702695922634, 92.089\n96.52, 103.4941702040816, 103.18050079608881, 103.15994852573388, 103.48627973658972, 103.88409500276933, 103.76002695922631, 91.991\n97.924, 103.44205020408162, 103.13150079608882, 103.11114852573387, 103.43867973658975, 103.82469500276933, 103.70422695922635, 91.892\n99.349, 103.38857020408163, 103.08150079608882, 103.0611485257339, 103.38947973658975, 103.76349500276936, 103.64722695922632, 91.806\n100.794, 103.33585020408161, 103.03290079608878, 103.01254852573389, 103.34087973658974, 103.70289500276932, 103.59002695922631, 91.733\n102.26, 103.2834102040816, 102.98510079608882, 102.9633485257339, 103.29287973658974, 103.6428950027693, 103.53282695922631, 91.662\n103.747, 103.2287302040816, 102.9349007960888, 102.91154852573389, 103.24267973658972, 103.58109500276929, 103.47342695922633, 91.59\n105.256, 103.1715702040816, 102.88170079608878, 102.8575485257339, 103.19027973658973, 103.5166950027693, 103.41162695922631, 91.515\n106.787, 103.1130502040816, 102.8279007960888, 102.80174852573388, 103.13627973658977, 103.45109500276932, 103.3482269592263, 91.44\n108.34, 103.05165020408162, 102.77110079608882, 102.74434852573391, 103.07907973658975, 103.38189500276933, 103.28182695922634, 91.364\n109.916, 102.98765020408162, 102.71290079608877, 102.68414852573392, 103.01907973658976, 103.31009500276929, 103.2120269592263, 91.288\n111.515, 102.91981020408161, 102.6503007960888, 102.62074852573392, 102.95527973658974, 103.23409500276932, 103.13862695922631, 91.216\n113.137, 102.84777020408163, 102.58330079608879, 102.55314852573395, 102.88787973658972, 103.15329500276931, 103.06122695922633, 91.146\n114.783, 102.7716902040816, 102.51290079608877, 102.48154852573391, 102.81607973658971, 103.06849500276932, 102.9794269592263, 91.078\n116.452, 102.6910502040816, 102.43770079608878, 102.40574852573393, 102.73927973658972, 102.97969500276928, 102.89282695922633, 91.006\n118.146, 102.60561020408161, 102.35790079608877, 102.32474852573391, 102.65867973658972, 102.88589500276932, 102.80082695922631, 90.923\n119.865, 102.51369020408163, 102.2719007960888, 102.2365485257339, 102.57167973658974, 102.78589500276934, 102.70242695922633, 90.836\n121.608, 102.41721020408161, 102.1819007960888, 102.14374852573391, 102.47987973658974, 102.6810950027693, 102.59942695922632, 90.736\n123.377, 102.31485020408164, 102.08670079608882, 102.04434852573391, 102.38207973658973, 102.57129500276935, 102.48982695922632, 90.635\n125.171, 102.20625020408161, 101.98430079608879, 101.93974852573392, 102.27827973658974, 102.4546950027693, 102.37422695922633, 90.535\n126.992, 102.0896902040816, 101.8727007960888, 101.82874852573389, 102.16667973658971, 102.32969500276931, 102.25062695922634, 90.432\n128.839, 101.96589020408163, 101.75250079608884, 101.7111485257339, 102.04827973658976, 102.1972950027693, 102.12022695922633, 90.331\n130.713, 101.83425020408163, 101.62370079608883, 101.5859485257339, 101.92267973658974, 102.05669500276935, 101.98222695922632, 90.235\n132.615, 101.69461020408161, 101.48610079608882, 101.45334852573392, 101.78907973658973, 101.90789500276931, 101.83662695922631, 90.144\n134.543, 101.54781020408163, 101.34210079608879, 101.31294852573392, 101.64787973658976, 101.75169500276932, 101.68442695922634, 90.059\n136.5, 101.39209020408161, 101.19010079608877, 101.1633485257339, 101.49747973658977, 101.58649500276933, 101.52302695922636, 89.976\n138.486, 101.22953020408161, 101.03230079608879, 101.00634852573391, 101.33947973658972, 101.41469500276928, 101.35482695922632, 89.905\n140.5, 101.05881020408161, 100.8667007960888, 100.84074852573391, 101.17327973658973, 101.23529500276933, 101.17802695922632, 89.849\n142.544, 100.88009020408161, 100.69210079608882, 100.66674852573391, 100.99907973658972, 101.04889500276931, 100.99362695922633, 89.8\n144.617, 100.6926102040816, 100.50830079608879, 100.4845485257339, 100.81527973658974, 100.85429500276932, 100.80062695922628, 89.744\n146.721, 100.49773020408163, 100.31670079608884, 100.29474852573392, 100.62347973658973, 100.65289500276933, 100.60082695922631, 89.676\n148.855, 100.29409020408161, 100.11630079608881, 100.09594852573389, 100.42247973658974, 100.44289500276932, 100.39282695922634, 89.61\n151.02, 100.08189020408162, 99.90710079608881, 99.8877485257339, 100.21287973658973, 100.22469500276931, 100.17702695922635, 89.548\n153.217, 99.85993020408162, 99.68790079608878, 99.66894852573391, 99.99407973658974, 99.99669500276933, 99.9520269592263, 89.487\n155.445, 99.6298502040816, 99.46070079608877, 99.44234852573389, 99.76727973658974, 99.7604950027693, 99.71842695922636, 89.428\n157.706, 99.3919702040816, 99.22570079608877, 99.20814852573389, 99.53307973658974, 99.51609500276933, 99.47682695922632, 89.373\n160, 99.1454102040816, 98.98130079608877, 98.96534852573392, 99.29067973658972, 99.26349500276929, 99.22622695922634, 89.322\n162.327, 98.89069020408161, 98.72850079608882, 98.71434852573388, 99.0400797365897, 99.0028950027693, 98.96762695922631, 89.273\n164.688, 98.6272502040816, 98.46650079608881, 98.45374852573391, 98.78047973658971, 98.73509500276933, 98.70042695922632, 89.224\n167.084, 98.35705020408162, 98.1977007960888, 98.18714852573389, 98.51227973658975, 98.46109500276931, 98.42702695922635, 89.18\n169.514, 98.07993020408162, 97.92270079608878, 97.9139485257339, 98.23607973658972, 98.18089500276935, 98.14602695922633, 89.14\n171.98, 97.79641020408164, 97.6409007960888, 97.63334852573391, 97.95427973658974, 97.89489500276935, 97.85862695922634, 89.104\n174.481, 97.50849020408164, 97.35370079608884, 97.34734852573393, 97.66907973658974, 97.6048950027693, 97.56742695922634, 89.067\n177.019, 97.21661020408162, 97.0631007960888, 97.0567485257339, 97.37967973658974, 97.31169500276934, 97.2718269592263, 89.028\n179.594, 96.92153020408162, 96.76950079608883, 96.76374852573389, 97.08667973658979, 97.01509500276933, 96.97262695922632, 88.997\n182.206, 96.6243302040816, 96.47390079608877, 96.46914852573391, 96.79087973658972, 96.71649500276934, 96.67122695922632, 88.972\n184.856, 96.3254902040816, 96.1759007960888, 96.1717485257339, 96.49407973658973, 96.4164950027693, 96.36922695922632, 88.949\n187.545, 96.0270102040816, 95.8781007960888, 95.8737485257339, 96.19807973658973, 96.11729500276931, 96.06782695922632, 88.92\n190.273, 95.73185020408161, 95.58390079608878, 95.57974852573389, 95.90367973658977, 95.8216950027693, 95.7702269592263, 88.89\n193.041, 95.4410902040816, 95.29470079608878, 95.2903485257339, 95.61307973658974, 95.53009500276933, 95.47722695922631, 88.863\n195.849, 95.1592102040816, 95.0149007960888, 95.01014852573388, 95.33167973658973, 95.2470950027693, 95.19222695922633, 88.836\n198.697, 94.88737020408162, 94.74530079608878, 94.73974852573393, 95.06167973658974, 94.97349500276933, 94.91662695922635, 88.815\n201.587, 94.6282102040816, 94.48950079608878, 94.48314852573392, 94.80487973658973, 94.7118950027693, 94.65162695922632, 88.796\n204.52, 94.38485020408162, 94.25130079608881, 94.2439485257339, 94.56387973658975, 94.4658950027693, 94.39922695922634, 88.779\n207.494, 94.15685020408162, 94.02810079608884, 94.0207485257339, 94.33927973658976, 94.2352950027693, 94.16082695922631, 88.771\n210.512, 93.9440902040816, 93.8193007960888, 93.81214852573389, 94.13247973658976, 94.0204950027693, 93.93602695922631, 88.762\n213.574, 93.74609020408163, 93.62410079608881, 93.61794852573391, 93.94087973658975, 93.82149500276935, 93.72602695922632, 88.753\n216.681, 93.56469020408163, 93.44410079608878, 93.43974852573393, 93.76547973658975, 93.64049500276934, 93.53362695922632, 88.754\n219.833, 93.39893020408162, 93.27870079608881, 93.2763485257339, 93.60547973658977, 93.47529500276933, 93.35882695922636, 88.762\n223.03, 93.24869020408161, 93.1279007960888, 93.12674852573394, 93.46047973658975, 93.32689500276933, 93.20142695922632, 88.771\n226.274, 93.11405020408162, 92.99170079608882, 92.9919485257339, 93.33027973658974, 93.19429500276931, 93.06202695922633, 88.79\n229.565, 92.99705020408162, 92.87330079608878, 92.8747485257339, 93.21687973658976, 93.07809500276935, 92.94222695922633, 88.813\n232.905, 92.89613020408163, 92.77170079608878, 92.77394852573393, 93.11827973658974, 92.97729500276931, 92.83942695922632, 88.838\n236.292, 92.81181020408162, 92.68710079608881, 92.69034852573391, 93.03587973658973, 92.89209500276932, 92.75362695922631, 88.869\n239.729, 92.7438102040816, 92.6189007960888, 92.6225485257339, 92.97047973658972, 92.82289500276933, 92.68422695922631, 88.906\n243.216, 92.69169020408161, 92.56790079608878, 92.57134852573391, 92.92047973658971, 92.76869500276932, 92.6300269592263, 88.941\n246.754, 92.65393020408162, 92.53170079608881, 92.53474852573387, 92.88507973658972, 92.72829500276933, 92.58982695922631, 88.967\n250.343, 92.63077020408161, 92.51070079608878, 92.51394852573394, 92.86467973658974, 92.70109500276932, 92.56342695922633, 88.988\n253.984, 92.62097020408164, 92.50370079608882, 92.50694852573395, 92.85807973658976, 92.6870950027693, 92.54902695922635, 89.004\n257.678, 92.62181020408163, 92.50750079608882, 92.51094852573392, 92.86227973658971, 92.6824950027693, 92.54582695922635, 89.013\n261.426, 92.63169020408161, 92.52010079608877, 92.52414852573392, 92.8758797365897, 92.68689500276932, 92.55142695922632, 89.02\n265.229, 92.64925020408161, 92.5405007960888, 92.54574852573391, 92.89687973658972, 92.6986950027693, 92.56442695922637, 89.029\n269.087, 92.67197020408162, 92.5657007960888, 92.57274852573389, 92.92347973658974, 92.71569500276931, 92.58222695922632, 89.046\n273.001, 92.69909020408161, 92.59570079608879, 92.60334852573389, 92.95467973658974, 92.7372950027693, 92.6044269592263, 89.071\n276.972, 92.7289302040816, 92.62870079608878, 92.63574852573392, 92.98867973658976, 92.7620950027693, 92.62942695922631, 89.096\n281, 92.7616902040816, 92.66450079608877, 92.6713485257339, 93.02527973658972, 92.79009500276932, 92.65722695922632, 89.12\n285.088, 92.79489020408163, 92.7005007960888, 92.70834852573391, 93.06187973658974, 92.81809500276931, 92.68562695922633, 89.136\n289.234, 92.82837020408161, 92.73710079608878, 92.7451485257339, 93.09847973658978, 92.84689500276932, 92.71422695922632, 89.153\n293.441, 92.86073020408165, 92.77290079608883, 92.78054852573393, 93.13467973658973, 92.87469500276933, 92.74082695922633, 89.17\n297.709, 92.89265020408163, 92.8083007960888, 92.81534852573394, 93.17007973658976, 92.90289500276928, 92.76662695922634, 89.186\n302.04, 92.92253020408164, 92.84150079608882, 92.84754852573393, 93.20347973658973, 92.92989500276933, 92.79022695922633, 89.201\n306.433, 92.95073020408162, 92.87290079608881, 92.8775485257339, 93.23547973658977, 92.95629500276932, 92.81142695922632, 89.221\n310.89, 92.97869020408162, 92.90330079608881, 92.90614852573387, 93.26687973658971, 92.98349500276933, 92.83362695922631, 89.241\n315.412, 93.00629020408161, 92.93210079608883, 92.93454852573387, 93.29787973658975, 93.01129500276932, 92.8556269592263, 89.252\n320, 93.03389020408162, 92.96070079608879, 92.96334852573389, 93.32807973658976, 93.0390950027693, 92.87822695922631, 89.26\n324.655, 93.06233020408162, 92.98890079608883, 92.9939485257339, 93.35887973658974, 93.06709500276928, 92.90282695922632, 89.268\n329.377, 93.09037020408161, 93.0165007960888, 93.02394852573393, 93.38987973658972, 93.09369500276934, 92.92782695922632, 89.281\n334.168, 93.11949020408161, 93.0455007960888, 93.0557485257339, 93.42227973658972, 93.11989500276935, 92.95402695922634, 89.298\n339.028, 93.14845020408161, 93.0753007960888, 93.08794852573392, 93.45507973658972, 93.14449500276929, 92.9794269592263, 89.316\n343.959, 93.17721020408162, 93.10510079608882, 93.1207485257339, 93.48867973658973, 93.16729500276931, 93.00422695922633, 89.333\n348.962, 93.20569020408162, 93.13670079608879, 93.1533485257339, 93.52287973658976, 93.18789500276931, 93.02762695922631, 89.35\n354.038, 93.2330902040816, 93.16810079608878, 93.1865485257339, 93.55707973658973, 93.20649500276933, 93.04722695922631, 89.37\n359.188, 93.26330573979592, 93.19675793894595, 93.21850254359106, 93.5892493794469, 93.23392714562647, 93.07809169136917, 89.389\n364.412, 93.29858127551019, 93.23069008180306, 93.25528156144821, 93.62779402230402, 93.26690928848359, 93.11223142351201, 89.42\n369.713, 93.34119181122449, 93.27149722466024, 93.29863557930534, 93.67516366516116, 93.30872893134077, 93.15193365565491, 89.45\n375.09, 93.39212234693875, 93.31877936751738, 93.3491145971625, 93.73325830801829, 93.36022357419785, 93.19923588779773, 89.48\n380.546, 93.45342538265305, 93.37431151037454, 93.40928111501962, 93.80240295087548, 93.42430571705502, 93.25682561994061, 89.517\n386.081, 93.52753341836734, 93.43916865323168, 93.48027263287678, 93.88572259373261, 93.50408785991216, 93.32841535208347, 89.553\n391.697, 93.61610395408164, 93.51471329608881, 93.56361415073394, 93.98376723658973, 93.60223250276931, 93.41619258422634, 89.593\n397.394, 93.7204144897959, 93.60065793894596, 93.65758066859105, 94.09863687944689, 93.72285214562645, 93.52234481636917, 89.638\n403.175, 93.84280502551016, 93.70161508180306, 93.7643221864482, 94.23089402230403, 93.86830928848357, 93.64888454851203, 89.688\n409.039, 93.98423056122446, 93.81807222466026, 93.88276370430535, 94.38002616516115, 94.04239143134075, 93.79789928065489, 89.736\n414.989, 94.14673609693875, 93.95382936751737, 94.01423022216248, 94.5483833080183, 94.24643607419792, 93.97080151279773, 89.781\n421.025, 94.33210663265307, 94.11353651037454, 94.16089674001962, 94.73401545087545, 94.48108071705506, 94.17100374494062, 89.826\n427.149, 94.54203466836734, 94.30196865323168, 94.32346325787677, 94.9387975937326, 94.7458628599122, 94.40008097708346, 89.871\n433.362, 94.77596770408162, 94.51887579608884, 94.5021547757339, 95.16045473658976, 95.04102000276932, 94.65733320922631, 89.916\n439.665, 95.0308982397959, 94.75852043894595, 94.69153379359106, 95.39799937944689, 95.36511464562649, 94.94132294136917, 89.957\n446.06, 95.3003387755102, 95.01661508180308, 94.8848128114482, 95.64579402230405, 95.7114092884836, 95.24306267351204, 89.997\n452.548, 95.5101387755102, 95.25161508180307, 95.0528128114482, 95.86379402230403, 95.9454092884836, 95.43706267351203, 90.034\n459.131, 95.7033387755102, 95.48361508180312, 95.1998128114482, 96.06879402230405, 96.15940928848363, 95.60506267351204, 90.069\n465.809, 95.86453877551018, 95.70161508180307, 95.31281281144821, 96.24279402230401, 96.3334092884836, 95.73206267351203, 90.102\n472.584, 95.97733877551019, 95.89361508180308, 95.3758128114482, 96.36979402230402, 96.44440928848358, 95.80306267351203, 90.131\n479.458, 96.02573877551019, 96.04861508180309, 95.37581281144818, 96.42879402230403, 96.47140928848361, 95.80406267351205, 90.157\n486.432, 95.9955387755102, 96.14861508180307, 95.30181281144819, 96.40479402230405, 96.39840928848359, 95.72406267351202, 90.179\n493.507, 95.8773387755102, 96.17961508180309, 95.14381281144819, 96.28679402230404, 96.2184092884836, 95.55806267351204, 90.204\n500.686, 95.66933877551018, 96.12961508180308, 94.9018128114482, 96.07279402230401, 95.93640928848362, 95.30606267351203, 90.23\n507.968, 95.37793877551019, 95.9956150818031, 94.5818128114482, 95.76979402230404, 95.56540928848361, 94.97706267351205, 90.258\n515.357, 95.0185387755102, 95.78461508180311, 94.20181281144818, 95.39179402230403, 95.12540928848364, 94.58906267351205, 90.29\n522.853, 94.61093877551019, 95.50961508180309, 93.78481281144822, 94.95679402230404, 94.64040928848364, 94.16306267351202, 90.327\n530.458, 94.1769387755102, 95.1866150818031, 93.35681281144821, 94.48779402230403, 94.1344092884836, 93.71906267351204, 90.367\n538.174, 93.73753877551017, 94.83461508180308, 92.93281281144819, 94.01279402230402, 93.62940928848361, 93.27806267351203, 90.404\n546.002, 93.30873877551018, 94.46961508180307, 92.5298128114482, 93.54979402230403, 93.14140928848362, 92.85306267351201, 90.445\n553.943, 92.9015387755102, 94.10661508180307, 92.1568128114482, 93.11079402230403, 92.68140928848364, 92.45206267351203, 90.488\n562.001, 92.52433877551019, 93.75461508180307, 91.8178128114482, 92.70579402230403, 92.2634092884836, 92.08006267351202, 90.535\n570.175, 92.1869387755102, 93.4216150818031, 91.52281281144819, 92.34679402230402, 91.89640928848364, 91.74706267351205, 90.595\n578.469, 91.8969387755102, 93.11861508180311, 91.2828128114482, 92.03779402230404, 91.58540928848362, 91.46006267351203, 90.665\n586.883, 91.66133877551019, 92.85461508180309, 91.10481281144818, 91.78679402230405, 91.3354092884836, 91.22506267351203, 90.737\n595.419, 91.4837387755102, 92.6406150818031, 90.99381281144821, 91.59579402230403, 91.14440928848359, 91.04406267351203, 90.819\n604.08, 91.3637387755102, 92.48161508180311, 90.9458128114482, 91.46379402230403, 91.00840928848362, 90.91906267351203, 90.908\n612.866, 91.29573877551017, 92.37661508180307, 90.94881281144819, 91.38779402230404, 90.9214092884836, 90.84406267351201, 90.986\n621.78, 91.27153877551021, 92.32161508180309, 90.98881281144821, 91.35879402230401, 90.87540928848364, 90.81306267351204, 91.026\n630.824, 91.27953877551018, 92.30861508180308, 91.05381281144818, 91.36279402230403, 90.85740928848364, 90.81506267351202, 91.061\n640, 91.30913877551019, 92.32261508180308, 91.1328128114482, 91.38879402230403, 90.86440928848363, 90.83706267351205, 91.118\n649.309, 91.35393877551019, 92.35161508180312, 91.22081281144818, 91.43079402230401, 90.88940928848359, 90.87706267351203, 91.175\n658.753, 91.4081387755102, 92.38461508180309, 91.31881281144821, 91.48179402230402, 90.92740928848362, 90.92806267351203, 91.233\n668.335, 91.4675387755102, 92.4126150818031, 91.4278128114482, 91.53979402230405, 90.97240928848362, 90.98506267351203, 91.278\n678.056, 91.52893877551021, 92.43161508180309, 91.5488128114482, 91.59979402230404, 91.02140928848364, 91.04306267351204, 91.316\n687.919, 91.5851387755102, 92.43461508180312, 91.6778128114482, 91.65579402230404, 91.0634092884836, 91.09406267351201, 91.349\n697.925, 91.62973877551019, 92.42161508180308, 91.80881281144818, 91.69879402230401, 91.08940928848361, 91.13006267351201, 91.373\n708.077, 91.65753877551019, 92.39561508180311, 91.93781281144818, 91.72279402230403, 91.0914092884836, 91.14006267351205, 91.382\n718.376, 91.66273877551018, 92.35861508180308, 92.05881281144819, 91.71579402230402, 91.06140928848363, 91.11906267351203, 91.38\n728.825, 91.6411387755102, 92.31261508180312, 92.1618128114482, 91.67379402230405, 90.9944092884836, 91.06306267351202, 91.364\n739.426, 91.5923387755102, 92.25461508180307, 92.2388128114482, 91.59779402230403, 90.89440928848363, 90.97606267351203, 91.34\n750.181, 91.51913877551019, 92.17861508180309, 92.28781281144822, 91.49079402230404, 90.7674092884836, 90.87106267351203, 91.313\n761.093, 91.42593877551018, 92.07961508180308, 92.30681281144821, 91.36179402230401, 90.62240928848361, 90.75906267351202, 91.286\n772.163, 91.3211387755102, 91.96461508180309, 92.3008128114482, 91.22079402230403, 90.47040928848364, 90.64906267351202, 91.26\n783.394, 91.21013877551019, 91.84061508180311, 92.27781281144821, 91.07279402230402, 90.3174092884836, 90.54206267351204, 91.231\n794.789, 91.0947387755102, 91.7136150818031, 92.2378128114482, 90.92279402230405, 90.16440928848364, 90.43506267351204, 91.197\n806.349, 90.9739387755102, 91.58661508180312, 92.18281281144822, 90.76879402230402, 90.0134092884836, 90.31806267351202, 91.155\n818.078, 90.8423387755102, 91.45661508180312, 92.1078128114482, 90.60379402230403, 89.8594092884836, 90.18406267351203, 91.1\n829.977, 90.69333877551018, 91.30861508180311, 92.01381281144819, 90.42579402230402, 89.69340928848362, 90.02506267351202, 91.033\n842.05, 90.53373877551019, 91.13761508180309, 91.9158128114482, 90.25179402230401, 89.51940928848362, 89.84406267351201, 90.96\n854.298, 90.38693877551017, 90.97961508180308, 91.82081281144818, 90.10779402230403, 89.35740928848364, 89.66906267351203, 90.883\n866.724, 90.2775387755102, 90.86161508180312, 91.7378128114482, 90.01379402230403, 89.23740928848362, 89.53706267351204, 90.803\n879.33, 90.2187387755102, 90.80161508180308, 91.6718128114482, 89.97879402230404, 89.1764092884836, 89.46506267351205, 90.722\n892.12, 90.21373877551018, 90.8056150818031, 91.62481281144821, 90.00279402230404, 89.1764092884836, 89.45906267351202, 90.647\n905.097, 90.24733877551019, 90.8556150818031, 91.58181281144819, 90.07079402230401, 89.2284092884836, 89.50006267351203, 90.577\n918.262, 90.28913877551018, 90.91561508180308, 91.51781281144821, 90.15179402230402, 89.30640928848362, 89.55406267351202, 90.509\n931.618, 90.3097387755102, 90.94761508180312, 91.4158128114482, 90.20979402230401, 89.3794092884836, 89.59606267351205, 90.444\n945.169, 90.2867387755102, 90.9236150818031, 91.27681281144821, 90.22179402230402, 89.41140928848363, 89.60006267351203, 90.393\n958.917, 90.21693877551019, 90.8386150818031, 91.1248128114482, 90.19079402230402, 89.3874092884836, 89.54306267351204, 90.356\n972.864, 90.1315387755102, 90.7396150818031, 90.9928128114482, 90.14479402230401, 89.32940928848359, 89.45106267351204, 90.341\n987.015, 90.05453877551018, 90.6526150818031, 90.90081281144819, 90.10279402230404, 89.2594092884836, 89.35706267351202, 90.341\n1001.371, 90.00873877551018, 90.59161508180307, 90.88081281144821, 90.08979402230403, 89.1994092884836, 89.28206267351203, 90.343\n1015.937, 90.0165387755102, 90.56361508180312, 90.9598128114482, 90.13379402230403, 89.17040928848361, 89.25506267351203, 90.351\n1030.714, 90.08953877551019, 90.57461508180309, 91.1438128114482, 90.24079402230403, 89.1904092884836, 89.29806267351204, 90.37\n1045.706, 90.2263387755102, 90.63761508180309, 91.3978128114482, 90.39879402230403, 89.27540928848359, 89.42206267351204, 90.395\n1060.916, 90.4091387755102, 90.75661508180309, 91.6758128114482, 90.58379402230403, 89.41240928848362, 89.61706267351204, 90.437\n1076.347, 90.6025387755102, 90.9196150818031, 91.92481281144819, 90.75679402230404, 89.5624092884836, 89.84906267351204, 90.502\n1092.003, 90.76813877551021, 91.1016150818031, 92.10481281144818, 90.88879402230403, 89.68740928848364, 90.05806267351203, 90.583\n1107.887, 90.88093877551019, 91.26761508180309, 92.19781281144819, 90.96679402230404, 89.76440928848362, 90.20806267351205, 90.681\n1124.001, 90.93253877551017, 91.38861508180307, 92.22181281144819, 90.98879402230403, 89.78240928848359, 90.28106267351203, 90.794\n1140.35, 90.95533877551019, 91.47361508180309, 92.2448128114482, 90.98879402230402, 89.76640928848362, 90.30306267351203, 90.916\n1156.937, 91.03253877551019, 91.5876150818031, 92.38481281144821, 91.05079402230403, 89.79540928848358, 90.34406267351203, 91.049\n1173.765, 91.2623387755102, 91.81961508180312, 92.7498128114482, 91.26279402230405, 89.9704092884836, 90.50906267351205, 91.191\n1190.838, 91.6813387755102, 92.20161508180311, 93.36281281144821, 91.66079402230403, 90.32940928848362, 90.85206267351205, 91.373\n1208.159, 92.2447387755102, 92.70761508180308, 94.15681281144819, 92.20279402230403, 90.8254092884836, 91.33106267351204, 91.561\n1225.732, 92.85153877551019, 93.2496150818031, 94.99881281144822, 92.79979402230403, 91.35740928848362, 91.85206267351204, 91.731\n1243.561, 93.37873877551019, 93.70961508180308, 95.73681281144822, 93.33779402230401, 91.80840928848359, 92.30106267351205, 91.904\n1261.649, 93.7243387755102, 93.98661508180308, 96.24981281144821, 93.71979402230403, 92.08440928848361, 92.58106267351204, 92.087\n1280, 93.8449387755102, 94.04461508180312, 96.48581281144818, 93.90579402230405, 92.14040928848364, 92.64806267351203, 92.279\n1298.618, 93.76153877551019, 93.91461508180309, 96.47481281144819, 93.90579402230402, 91.9944092884836, 92.51806267351203, 92.482\n1317.507, 93.5521387755102, 93.68361508180307, 96.3118128114482, 93.78079402230405, 91.72240928848363, 92.26206267351203, 92.69\n1336.67, 93.3225387755102, 93.45461508180311, 96.11681281144818, 93.62779402230403, 91.43240928848358, 91.98106267351203, 92.881\n1356.113, 93.1393387755102, 93.28061508180308, 95.96881281144822, 93.50979402230404, 91.1914092884836, 91.74606267351201, 93.042\n1375.838, 93.0209387755102, 93.1736150818031, 95.8938128114482, 93.44279402230403, 91.01940928848363, 91.57506267351202, 93.191\n1395.85, 92.9639387755102, 93.12961508180311, 95.88281281144819, 93.42779402230403, 90.91840928848362, 91.46106267351203, 93.347\n1416.153, 92.96113877551018, 93.14061508180312, 95.91381281144818, 93.46479402230402, 90.88540928848359, 91.40106267351202, 93.488\n1436.751, 93.00113877551021, 93.20061508180311, 95.9628128114482, 93.55179402230405, 90.90740928848362, 91.38306267351203, 93.615\n1457.649, 93.0767387755102, 93.30761508180308, 96.0168128114482, 93.69179402230404, 90.97040928848361, 91.39706267351204, 93.718\n1478.851, 93.18393877551019, 93.45861508180312, 96.07981281144819, 93.87679402230401, 91.06540928848361, 91.43906267351204, 93.789\n1500.362, 93.3207387755102, 93.6466150818031, 96.16181281144819, 94.09679402230404, 91.18440928848364, 91.51406267351203, 93.835\n1522.185, 93.49153877551021, 93.86961508180312, 96.2728128114482, 94.34479402230403, 91.3324092884836, 91.63806267351205, 93.866\n1544.326, 93.7045387755102, 94.1286150818031, 96.41881281144822, 94.61679402230405, 91.53240928848362, 91.82606267351204, 93.891\n1566.789, 93.93213877551018, 94.38661508180309, 96.55581281144822, 94.88279402230401, 91.7854092884836, 92.05006267351203, 93.92\n1589.578, 94.11433877551019, 94.5846150818031, 96.60281281144822, 95.09879402230405, 92.0344092884836, 92.25106267351205, 93.955\n1612.699, 94.2571387755102, 94.73061508180311, 96.55881281144818, 95.26579402230402, 92.27840928848363, 92.45206267351202, 93.996\n1636.156, 94.3641387755102, 94.83261508180308, 96.42881281144818, 95.37879402230402, 92.5224092884836, 92.65806267351203, 94.07300000000001\n1659.955, 94.46033877551021, 94.92161508180311, 96.24581281144822, 95.46079402230404, 92.78840928848359, 92.88506267351204, 94.182\n1684.099, 94.58193877551018, 95.03761508180307, 96.0698128114482, 95.54379402230404, 93.10240928848359, 93.15606267351203, 94.313\n1708.595, 94.76353877551018, 95.21161508180307, 95.9558128114482, 95.65879402230402, 93.49640928848362, 93.49506267351205, 94.449\n1733.447, 95.0177387755102, 95.44861508180311, 95.9248128114482, 95.81979402230404, 93.98140928848359, 93.91406267351205, 94.594\n1758.661, 95.35273877551019, 95.7516150818031, 95.98781281144818, 96.03679402230404, 94.57140928848361, 94.41606267351204, 94.766\n1784.241, 95.7245387755102, 96.05961508180312, 96.08881281144821, 96.27379402230403, 95.23740928848363, 94.96306267351204, 94.962\n1810.193, 96.07413877551019, 96.31761508180307, 96.15581281144819, 96.48779402230403, 95.90740928848362, 95.50206267351203, 95.17\n1836.523, 96.39933877551019, 96.52461508180309, 96.19081281144818, 96.67479402230401, 96.56540928848361, 96.04106267351202, 95.383\n1863.236, 96.7111387755102, 96.70061508180311, 96.20881281144818, 96.83879402230403, 97.2254092884836, 96.58206267351204, 95.593\n1890.337, 97.02573877551019, 96.87061508180311, 96.23481281144818, 96.99779402230403, 97.9004092884836, 97.12506267351203, 95.797\n1917.833, 97.3505387755102, 97.04861508180312, 96.28781281144819, 97.16679402230403, 98.58740928848363, 97.66206267351203, 95.997\n1945.729, 97.6919387755102, 97.24761508180308, 96.38081281144821, 97.35779402230403, 99.28240928848362, 98.19106267351202, 96.199\n1974.03, 98.04933877551021, 97.46461508180312, 96.5208128114482, 97.57279402230401, 99.97040928848361, 98.71806267351204, 96.408\n2002.743, 98.41373877551021, 97.6886150818031, 96.7058128114482, 97.80179402230405, 100.63140928848361, 99.24106267351203, 96.581\n2031.873, 98.77093877551019, 97.91161508180309, 96.9258128114482, 98.02879402230403, 101.23440928848359, 99.75406267351204, 96.722\n2061.428, 99.1077387755102, 98.12661508180308, 97.1688128114482, 98.23879402230405, 101.7514092884836, 100.25306267351202, 96.84\n2091.412, 99.4123387755102, 98.33361508180309, 97.4098128114482, 98.42379402230404, 102.17340928848358, 100.72106267351205, 96.961\n2121.832, 99.6775387755102, 98.52961508180309, 97.6298128114482, 98.57779402230403, 102.50640928848364, 101.14406267351202, 97.099\n2152.695, 99.9025387755102, 98.71361508180307, 97.81481281144819, 98.70479402230403, 102.76040928848361, 101.51906267351204, 97.256\n2184.006, 100.09253877551019, 98.8876150818031, 97.95581281144818, 98.80979402230402, 102.9534092884836, 101.85606267351203, 97.345\n2215.774, 100.25613877551021, 99.05461508180309, 98.0528128114482, 98.90679402230401, 103.10140928848364, 102.16506267351204, 97.43\n2248.003, 100.4033387755102, 99.22061508180307, 98.11581281144821, 98.99879402230404, 103.22340928848364, 102.45806267351203, 97.607\n2280.701, 100.5433387755102, 99.39361508180308, 98.1568128114482, 99.09179402230403, 103.3284092884836, 102.74606267351201, 97.85\n2313.874, 100.68393877551019, 99.5796150818031, 98.19181281144822, 99.18679402230401, 103.4264092884836, 103.03506267351204, 98.109\n2347.53, 100.83113877551018, 99.78461508180308, 98.23281281144821, 99.28779402230401, 103.52140928848362, 103.32906267351203, 98.354\n2381.676, 100.9851387755102, 100.00561508180311, 98.27981281144821, 99.39879402230403, 103.61640928848362, 103.62506267351205, 98.564\n2416.318, 101.14773877551019, 100.2396150818031, 98.32881281144819, 99.52779402230405, 103.7184092884836, 103.92406267351203, 98.735\n2451.464, 101.3199387755102, 100.48761508180309, 98.3778128114482, 99.68479402230403, 103.82740928848364, 104.22206267351203, 98.865\n2487.122, 101.4957387755102, 100.74561508180312, 98.41781281144819, 99.87079402230401, 103.93540928848358, 104.50906267351203, 98.966\n2523.298, 101.66013877551019, 100.99861508180312, 98.4348128114482, 100.08179402230404, 104.0244092884836, 104.76106267351203, 99.036\n2560, 101.79713877551018, 101.23361508180308, 98.4168128114482, 100.30479402230402, 104.0774092884836, 104.95306267351204, 99.149\n2597.236, 101.89673877551017, 101.43761508180307, 98.3668128114482, 100.52679402230402, 104.08440928848358, 105.06806267351203, 99.3\n2635.014, 101.9519387755102, 101.59261508180309, 98.29681281144819, 100.73179402230404, 104.04340928848363, 105.09506267351203, 99.489\n2673.341, 101.94733877551019, 101.67561508180312, 98.1978128114482, 100.89179402230401, 103.9414092884836, 105.03006267351203, 99.684\n2712.226, 101.88813877551019, 101.7016150818031, 98.06781281144818, 101.00179402230403, 103.77940928848359, 104.89006267351205, 99.856\n2751.676, 101.79413877551019, 101.68461508180307, 97.9348128114482, 101.07279402230402, 103.57640928848359, 104.70206267351203, 99.987\n2791.7, 101.66293877551018, 101.62361508180308, 97.79381281144819, 101.09179402230401, 103.33140928848363, 104.47406267351204, 100.061\n2832.306, 101.48953877551018, 101.52561508180307, 97.6298128114482, 101.05279402230403, 103.03540928848363, 104.20406267351203, 100.07300000000001\n2873.503, 101.2659387755102, 101.38961508180311, 97.43181281144818, 100.94379402230403, 102.68340928848362, 103.88106267351203, 100.035\n2915.299, 100.98633877551018, 101.2176150818031, 97.1838128114482, 100.76479402230402, 102.2714092884836, 103.49406267351202, 99.961\n2957.703, 100.6581387755102, 101.02761508180308, 96.8848128114482, 100.53179402230404, 101.80440928848358, 103.04206267351205, 99.849\n3000.724, 100.30233877551021, 100.83761508180314, 96.57181281144821, 100.26479402230405, 101.3014092884836, 102.53606267351205, 99.707\n3044.37, 99.92673877551019, 100.64661508180308, 96.26281281144819, 99.96779402230402, 100.76940928848359, 101.98706267351201, 99.56700000000001\n3088.652, 99.55313877551019, 100.47461508180312, 95.9818128114482, 99.65779402230403, 100.23040928848361, 101.42106267351205, 99.459\n3133.577, 99.2035387755102, 100.3276150818031, 95.76081281144819, 99.35579402230401, 99.70640928848358, 100.86706267351205, 99.388\n3179.156, 98.8689387755102, 100.18361508180311, 95.5868128114482, 99.04579402230402, 99.19740928848358, 100.33106267351204, 99.36\n3225.398, 98.5283387755102, 100.02361508180309, 95.41681281144821, 98.71879402230402, 98.68040928848359, 99.80206267351204, 99.367\n3272.312, 98.1623387755102, 99.83961508180309, 95.20781281144818, 98.36079402230405, 98.13440928848362, 99.26906267351202, 99.397\n3319.909, 97.7685387755102, 99.63561508180307, 94.93981281144819, 97.99179402230403, 97.54940928848363, 98.72606267351203, 99.406\n3368.198, 97.35953877551019, 99.42661508180308, 94.6238128114482, 97.63779402230404, 96.93540928848361, 98.17406267351205, 99.383\n3417.19, 96.96693877551019, 99.2346150818031, 94.30581281144822, 97.33679402230402, 96.3264092884836, 97.63106267351202, 99.343\n3466.894, 96.62873877551019, 99.07461508180309, 94.0498128114482, 97.11779402230404, 95.7764092884836, 97.12506267351203, 99.298\n3517.321, 96.37373877551019, 98.94961508180309, 93.90281281144821, 96.99579402230403, 95.33540928848363, 96.68506267351204, 99.274\n3568.482, 96.2189387755102, 98.85261508180312, 93.88881281144822, 96.96979402230403, 95.04440928848359, 96.33906267351202, 99.284\n3620.387, 96.15913877551021, 98.7656150818031, 93.99481281144821, 97.02179402230405, 94.91440928848363, 96.09906267351204, 99.326\n3673.046, 96.17113877551019, 98.66661508180312, 94.1828128114482, 97.12379402230403, 94.92540928848359, 95.95706267351204, 99.389\n3726.472, 96.2283387755102, 98.53961508180312, 94.4108128114482, 97.24879402230401, 95.04540928848361, 95.89706267351205, 99.447\n3780.675, 96.30573877551019, 98.3726150818031, 94.64981281144819, 97.37279402230402, 95.23840928848361, 95.89506267351203, 99.46000000000001\n3835.666, 96.3881387755102, 98.16761508180309, 94.88281281144822, 97.48379402230401, 95.47440928848363, 95.93206267351204, 99.408\n3891.457, 96.47213877551019, 97.9386150818031, 95.11281281144818, 97.58079402230402, 95.7354092884836, 95.99306267351201, 99.293\n3948.06, 96.55813877551019, 97.70261508180309, 95.34681281144819, 97.66479402230402, 96.00640928848364, 96.07006267351204, 99.123\n4005.486, 96.6475387755102, 97.4786150818031, 95.58881281144821, 97.73679402230403, 96.2794092884836, 96.15406267351202, 98.907\n4063.747, 96.7395387755102, 97.27961508180307, 95.8398128114482, 97.79779402230405, 96.54240928848363, 96.23806267351203, 98.637\n4122.855, 96.8261387755102, 97.1066150818031, 96.08681281144821, 97.84179402230403, 96.7804092884836, 96.31506267351203, 98.328\n4182.824, 96.89233877551018, 96.95361508180308, 96.30681281144818, 97.85579402230401, 96.97140928848363, 96.37406267351203, 98.035\n4243.664, 96.9203387755102, 96.8046150818031, 96.4768128114482, 97.82179402230405, 97.0964092884836, 96.40206267351205, 97.786\n4305.39, 96.89573877551018, 96.64461508180308, 96.5788128114482, 97.72679402230402, 97.14140928848362, 96.38706267351203, 97.589\n4368.013, 96.81013877551018, 96.46061508180308, 96.60381281144821, 97.56279402230403, 97.1024092884836, 96.32106267351203, 97.446\n4431.547, 96.66173877551019, 96.24161508180308, 96.54881281144819, 97.33179402230402, 96.98440928848359, 96.20206267351202, 97.359\n4496.006, 96.45553877551019, 95.98661508180311, 96.42481281144819, 97.03579402230403, 96.79840928848358, 96.03206267351203, 97.336\n4561.401, 96.20493877551019, 95.70361508180308, 96.2458128114482, 96.69279402230403, 96.56440928848359, 95.81806267351202, 97.376\n4627.749, 95.93313877551017, 95.41461508180308, 96.0328128114482, 96.33579402230401, 96.30540928848362, 95.57706267351202, 97.472\n4695.061, 95.66973877551018, 95.1506150818031, 95.8138128114482, 95.99579402230401, 96.0524092884836, 95.33606267351203, 97.615\n4763.352, 95.4477387755102, 94.9466150818031, 95.6148128114482, 95.71079402230403, 95.83640928848361, 95.13006267351203, 97.786\n4832.636, 95.2917387755102, 94.8266150818031, 95.45581281144821, 95.50879402230403, 95.68140928848364, 94.98606267351205, 97.976\n4902.929, 95.2081387755102, 94.79561508180312, 95.34881281144821, 95.39379402230402, 95.5904092884836, 94.91206267351204, 98.15\n4974.244, 95.19533877551021, 94.8486150818031, 95.29781281144821, 95.35779402230403, 95.5634092884836, 94.90906267351204, 98.30799999999999\n5046.596, 95.2441387755102, 94.96961508180307, 95.2988128114482, 95.39279402230402, 95.59040928848363, 94.96906267351203, 98.452\n5120, 95.3407387755102, 95.1406150818031, 95.3478128114482, 95.47179402230404, 95.66340928848365, 95.08006267351203, 98.576\n5194.472, 95.4811387755102, 95.34861508180312, 95.44981281144821, 95.59579402230402, 95.77740928848361, 95.23406267351201, 98.667\n5270.027, 95.6669387755102, 95.59161508180311, 95.6088128114482, 95.76579402230404, 95.93540928848363, 95.43306267351203, 98.713\n5346.682, 95.89713877551019, 95.86461508180311, 95.82081281144819, 95.98279402230405, 96.14240928848359, 95.67506267351202, 98.721\n5424.451, 96.16093877551017, 96.1566150818031, 96.0688128114482, 96.23779402230403, 96.38840928848359, 95.95306267351205, 98.705\n5503.352, 96.4443387755102, 96.4536150818031, 96.3308128114482, 96.51879402230404, 96.66240928848362, 96.25606267351202, 98.682\n5583.4, 96.72213877551022, 96.7286150818031, 96.5768128114482, 96.80079402230405, 96.94240928848362, 96.56206267351203, 98.645\n5664.612, 96.96953877551019, 96.95961508180308, 96.7808128114482, 97.05479402230402, 97.20340928848363, 96.84906267351205, 98.56\n5747.006, 97.1725387755102, 97.13561508180311, 96.9258128114482, 97.26179402230403, 97.43140928848362, 97.10806267351205, 98.403\n5830.598, 97.3287387755102, 97.26061508180311, 97.0098128114482, 97.41279402230404, 97.62340928848363, 97.33706267351204, 98.16499999999999\n5915.406, 97.44913877551019, 97.34561508180309, 97.04881281144822, 97.51479402230402, 97.78740928848362, 97.54906267351203, 97.848\n6001.447, 97.55073877551021, 97.4096150818031, 97.06981281144822, 97.58079402230403, 97.93540928848363, 97.75806267351201, 97.453\n6088.74, 97.6517387755102, 97.4706150818031, 97.09881281144818, 97.62679402230403, 98.08340928848362, 97.97906267351205, 96.995\n6177.303, 97.7625387755102, 97.53861508180307, 97.1528128114482, 97.66479402230405, 98.24140928848362, 98.21506267351202, 96.49\n6267.154, 97.90193877551019, 97.63161508180308, 97.25881281144818, 97.72079402230402, 98.42240928848359, 98.47606267351203, 95.994\n6358.312, 98.08393877551018, 97.76261508180309, 97.4388128114482, 97.81379402230402, 98.63840928848359, 98.76606267351204, 95.544\n6450.796, 98.3191387755102, 97.94361508180307, 97.70881281144821, 97.95879402230403, 98.89640928848362, 99.08806267351204, 95.164\n6544.625, 98.60833877551019, 98.17161508180311, 98.07981281144819, 98.15879402230402, 99.1994092884836, 99.43206267351204, 94.86\n6639.819, 98.94133877551019, 98.44161508180309, 98.55581281144822, 98.40279402230405, 99.53140928848359, 99.77506267351202, 94.615\n6736.397, 99.3043387755102, 98.74261508180312, 99.1378128114482, 98.67579402230403, 99.87540928848362, 100.09006267351204, 94.422\n6834.38, 99.6791387755102, 99.06161508180311, 99.81781281144818, 98.95479402230403, 100.21040928848363, 100.35106267351203, 94.267\n6933.788, 100.0445387755102, 99.3806150818031, 100.57481281144821, 99.21679402230403, 100.51040928848361, 100.54006267351205, 94.15\n7034.643, 100.3773387755102, 99.67661508180308, 101.3738128114482, 99.44179402230401, 100.75140928848359, 100.64306267351202, 94.07300000000001\n7136.964, 100.65773877551018, 99.9316150818031, 102.16681281144821, 99.61579402230402, 100.91740928848361, 100.65706267351203, 94.021\n7240.773, 100.8717387755102, 100.12861508180309, 102.89781281144819, 99.73479402230403, 101.00440928848359, 100.59306267351205, 94.001\n7346.093, 101.01853877551021, 100.2656150818031, 103.5148128114482, 99.80979402230403, 101.02940928848363, 100.47306267351203, 94.021\n7452.944, 101.1097387755102, 100.3476150818031, 103.9848128114482, 99.86179402230403, 101.02240928848363, 100.33206267351204, 94.074\n7561.35, 101.16893877551018, 100.39761508180307, 104.29681281144822, 99.92179402230401, 101.02140928848361, 100.20706267351203, 94.142\n7671.332, 101.22813877551019, 100.44861508180311, 104.46781281144821, 100.02379402230405, 101.06440928848362, 100.13606267351203, 94.214\n7782.914, 101.3297387755102, 100.54461508180309, 104.5428128114482, 100.20879402230402, 101.19340928848361, 100.15906267351203, 94.263\n7896.119, 101.5179387755102, 100.73361508180312, 104.58381281144818, 100.51979402230401, 101.44140928848361, 100.31106267351203, 94.283\n8010.971, 101.8265387755102, 101.0536150818031, 104.6568128114482, 100.98479402230403, 101.8234092884836, 100.61406267351204, 94.362\n8127.493, 102.2745387755102, 101.5286150818031, 104.82081281144819, 101.61679402230403, 102.33840928848362, 101.06806267351205, 94.457\n8245.71, 102.85913877551017, 102.15561508180308, 105.12181281144818, 102.40079402230403, 102.9654092884836, 101.65206267351202, 94.511\n8365.647, 103.5303387755102, 102.8756150818031, 105.57481281144821, 103.26379402230403, 103.63540928848361, 102.30206267351205, 94.506\n8487.328, 104.1719387755102, 103.5446150818031, 106.1398128114482, 104.04979402230404, 104.22940928848362, 102.89606267351203, 94.509\n8610.779, 104.6171387755102, 103.95661508180311, 106.7058128114482, 104.54679402230403, 104.6064092884836, 103.27006267351203, 94.474\n8736.026, 104.6957387755102, 103.90961508180311, 107.11481281144819, 104.54979402230404, 104.64240928848363, 103.26206267351205, 94.396\n8863.094, 104.27873877551019, 103.26361508180312, 107.21081281144819, 103.91079402230403, 104.25640928848364, 102.75206267351203, 94.18299999999999\n8992.011, 103.3131387755102, 101.98061508180311, 106.8858128114482, 102.57179402230403, 103.4264092884836, 101.70106267351204, 93.80799999999999\n9122.803, 101.83853877551019, 100.15361508180308, 106.10681281144821, 100.57979402230401, 102.18840928848363, 100.16406267351203, 93.379\n9255.497, 99.98093877551018, 97.98861508180312, 104.9198128114482, 98.06879402230405, 100.62740928848359, 98.30006267351203, 92.877\n9390.121, 97.92813877551018, 95.75861508180307, 103.42281281144821, 95.24279402230403, 98.86340928848361, 96.35306267351203, 92.222\n9526.704, 95.89513877551022, 93.7296150818031, 101.73281281144821, 92.39279402230403, 97.03140928848364, 94.58906267351205, 91.439\n9665.273, 94.08033877551019, 92.09661508180311, 99.95781281144819, 89.86079402230403, 95.26140928848359, 93.22506267351203, 90.576\n9805.858, 92.61753877551021, 90.9546150818031, 98.15681281144819, 87.92079402230405, 93.68040928848362, 92.37506267351202, 89.717\n9948.487, 91.5757387755102, 90.31761508180313, 96.36381281144821, 86.73879402230403, 92.4104092884836, 92.04806267351205, 88.939\n10093.191, 90.96493877551019, 90.13561508180307, 94.6258128114482, 86.36279402230404, 91.54140928848359, 92.15906267351205, 88.358\n10240, 90.7495387755102, 90.32061508180308, 93.0398128114482, 86.69679402230403, 91.1184092884836, 92.57206267351202, 88.044\n10388.944, 90.86473877551018, 90.77561508180307, 91.7228128114482, 87.55279402230403, 91.1234092884836, 93.14906267351202, 87.931\n10540.055, 91.24513877551018, 91.43161508180307, 90.78181281144819, 88.71979402230403, 91.49940928848363, 93.79306267351203, 88.092\n10693.364, 91.84233877551019, 92.25361508180308, 90.2848128114482, 90.02079402230402, 92.16940928848359, 94.48306267351202, 88.46\n10848.902, 92.6401387755102, 93.23761508180311, 90.2588128114482, 91.39179402230403, 93.06140928848359, 95.25106267351205, 88.962\n11006.703, 93.65713877551019, 94.4046150818031, 90.70181281144819, 92.90379402230401, 94.12440928848359, 96.15106267351204, 89.679\n11166.799, 94.89893877551017, 95.76361508180311, 91.58681281144818, 94.62079402230403, 95.3174092884836, 97.20606267351202, 90.673\n11329.224, 96.3347387755102, 97.2926150818031, 92.87381281144822, 96.53079402230405, 96.59040928848363, 98.38606267351203, 91.911\n11494.011, 97.88153877551017, 98.9306150818031, 94.5038128114482, 98.54979402230401, 97.8304092884836, 99.59306267351204, 93.109\n11661.196, 99.4013387755102, 100.55661508180309, 96.3888128114482, 100.50079402230405, 98.87040928848363, 100.69006267351203, 94.131\n11830.812, 100.73073877551019, 102.00461508180308, 98.37581281144821, 102.16079402230403, 99.57240928848364, 101.54006267351204, 94.92699999999999\n12002.895, 101.7235387755102, 103.10661508180311, 100.24981281144818, 103.34579402230403, 99.87040928848359, 102.04506267351204, 95.44200000000001\n12177.481, 102.2895387755102, 103.7356150818031, 101.7888128114482, 103.95079402230402, 99.7964092884836, 102.17606267351204, 95.734\n12354.606, 102.41853877551019, 103.8376150818031, 102.8398128114482, 103.96879402230401, 99.4774092884836, 101.96906267351203, 95.737\n12534.308, 102.1813387755102, 103.45261508180312, 103.3658128114482, 103.50179402230404, 99.0764092884836, 101.51006267351204, 95.355\n12716.624, 101.70133877551021, 102.70261508180312, 103.44081281144821, 102.71079402230404, 98.73240928848361, 100.92006267351204, 94.74\n12901.592, 101.12633877551019, 101.76261508180309, 103.21381281144821, 101.77179402230405, 98.54840928848361, 100.33506267351203, 93.95\n13089.25, 100.58593877551019, 100.81461508180308, 102.85781281144818, 100.83379402230403, 98.54840928848358, 99.87506267351205, 93.091\n13279.637, 100.14493877551017, 99.9786150818031, 102.48881281144818, 99.95979402230404, 98.67940928848358, 99.61806267351201, 92.181\n13472.794, 99.78753877551021, 99.2626150818031, 102.1088128114482, 99.10679402230404, 98.87540928848362, 99.58406267351204, 91.201\n13668.76, 99.4257387755102, 98.56961508180311, 101.61881281144818, 98.17079402230405, 99.06240928848362, 99.70706267351201, 90.2\n13867.577, 98.91993877551019, 97.71361508180307, 100.8938128114482, 97.00579402230404, 99.13940928848363, 99.84706267351201, 89.261\n14069.285, 98.1019387755102, 96.46061508180308, 99.83181281144822, 95.43179402230403, 98.9774092884836, 99.80806267351203, 88.511\n14273.928, 96.84873877551021, 94.5626150818031, 98.3978128114482, 93.49179402230402, 98.41840928848362, 99.37306267351204, 88.068\n14481.547, 95.2557387755102, 92.3186150818031, 96.6878128114482, 91.68479402230403, 97.26240928848364, 98.32506267351204, 88.045\n14692.186, 93.44533877551021, 90.31061508180312, 94.9338128114482, 90.38479402230402, 95.20540928848362, 96.39206267351204, 88.403\n14905.889, 91.56573877551018, 88.93861508180308, 93.40481281144818, 89.86279402230403, 92.4214092884836, 93.20106267351204, 89.133\n15122.7, 90.1003387755102, 88.5256150818031, 92.31181281144819, 90.22279402230404, 89.63540928848363, 89.80606267351203, 90.117\n15342.664, 89.23473877551021, 89.11761508180312, 91.7698128114482, 91.29679402230404, 87.31440928848359, 86.67506267351204, 91.114\n15565.829, 89.0237387755102, 90.45461508180308, 91.7988128114482, 92.74579402230403, 85.86440928848363, 84.25506267351203, 92.089\n15792.239, 89.39773877551018, 92.14861508180309, 92.33881281144818, 94.25779402230401, 85.35340928848359, 82.89006267351203, 93.086\n16021.942, 90.0937387755102, 93.84661508180311, 93.19381281144818, 95.45979402230402, 85.24540928848363, 82.72306267351205, 94.035\n16254.987, 90.9017387755102, 95.10761508180312, 94.11881281144818, 96.21979402230403, 85.4334092884836, 83.62906267351204, 94.866\n16491.421, 91.8323387755102, 95.99761508180308, 94.9498128114482, 96.79979402230404, 86.04140928848364, 85.37306267351204, 95.54\n16731.294, 92.79813877551021, 96.71461508180309, 95.66281281144822, 97.34679402230404, 86.7054092884836, 87.56106267351205, 96.152\n16974.657, 93.6935387755102, 97.31461508180311, 96.2668128114482, 97.85279402230401, 87.60540928848363, 89.42806267351202, 96.818\n17221.559, 94.62133877551018, 97.76961508180307, 96.7548128114482, 98.25179402230404, 89.04340928848359, 91.28706267351203, 97.266\n17472.052, 95.5077387755102, 98.02461508180309, 97.0868128114482, 98.45679402230402, 90.90340928848363, 93.06706267351203, 97.402\n17726.189, 96.1929387755102, 98.0296150818031, 97.21681281144821, 98.39779402230404, 92.84340928848358, 94.47706267351204, 96.977\n17984.022, 96.56253877551018, 97.77061508180307, 97.13181281144819, 98.08279402230403, 94.54540928848363, 95.28206267351203, 96.436\n18245.606, 96.48993877551018, 97.28261508180312, 96.80781281144819, 97.55579402230403, 95.31640928848363, 95.48706267351203, 95.601\n18510.994, 96.06493877551017, 96.65661508180307, 96.2468128114482, 96.87979402230403, 95.32140928848361, 95.22006267351202, 94.276\n18780.243, 95.40733877551018, 95.9296150818031, 95.5238128114482, 96.12779402230403, 94.8654092884836, 94.59006267351204, 92.197\n19053.408, 94.60373877551021, 95.11761508180312, 94.76481281144821, 95.32679402230401, 94.11340928848362, 93.69606267351203, 89.78\n19330.546, 93.6635387755102, 94.1846150818031, 94.03981281144821, 94.39079402230404, 93.10740928848362, 92.59506267351203, 86.892\n19611.715, 92.52993877551019, 93.03461508180307, 93.28881281144818, 93.17979402230402, 91.83540928848363, 91.31106267351204, 83.226\n19896.974, 91.1273387755102, 91.58461508180308, 92.33781281144822, 91.59779402230403, 90.29140928848359, 89.82506267351205, 79.495\n20186.382, 89.33973877551018, 89.73161508180307, 90.9528128114482, 89.59079402230402, 88.39540928848363, 88.02806267351203, 79.495\n20480, 87.03913877551018, 87.39661508180309, 88.9188128114482, 87.11879402230402, 85.99840928848359, 85.76306267351204, 79.495\n20777.888, 84.0733387755102, 84.45261508180307, 86.0538128114482, 84.16079402230405, 82.88640928848362, 82.81306267351205, 79.495\n21080.11, 80.82813877551017, 81.30361508180307, 82.72381281144818, 81.05879402230401, 79.4784092884836, 79.57606267351203, 79.495\n21386.727, 77.58013877551019, 78.21761508180312, 79.26481281144818, 78.08179402230404, 76.03540928848362, 76.30106267351205, 79.495\n21697.804, 74.69193877551018, 75.53461508180307, 76.09981281144822, 75.51179402230404, 72.94840928848363, 73.36506267351201, 79.495\n"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/mechs.csv",
    "content": "Mech,Weight,Weapons\nAtlas,100 tons,AC/20,LRM-20,Medium Laser\nMad Cat,75 tons,Ultra AC/5,ER PPC,LRM-10\nTimber Wolf,75 tons,ER PPC,Large Laser,SRM-6\nDaishi,100 tons,Gauss Rifle,ER PPC,LRM-15\nHellbringer,65 tons,ER Large Laser,ER Medium Laser,Streak SRM-6\nSummoner,70 tons,ER Large Laser,LRM-20,Medium Pulse Laser\nThor,70 tons,LRM-20,Large Laser,Medium Pulse Laser\nWarhawk,85 tons,Large Pulse Laser,ER PPC,Streak SRM-6\nDire Wolf,100 tons,ER PPC,LRM-20,Medium Pulse Laser\nStormcrow,55 tons,ER Medium Laser,Streak SRM-2,Ultra AC/5\nBlack Hawk,55 tons,ER Large Laser,Streak SRM-6,Ultra AC/5\nRyoken,55 tons,LRM-20,ER Medium Laser,Medium Pulse Laser\nVulture,65 tons,ER PPC,Large Pulse Laser,Streak SRM-6\nMarauder,75 tons,ER Large Laser,LRM-15,Medium Pulse Laser\nNova,35 tons,ER Medium Laser,Streak SRM-2,Ultra AC/5\nCatapult,65 tons,ER PPC,LRM-15,Medium Pulse Laser\nCauldron-Born,60 tons,ER Large Laser,LRM-15,Medium Pulse Laser\nHunchback IIC,50 tons,ER PPC,LRM-10,Medium Pulse Laser\nBushwacker,55 tons,ER Large Laser,Streak SRM-6,Ultra AC/5\nJenner IIC,35 tons,ER Medium Laser,Streak SRM-2,Ultra AC/5"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/spacexlaunches.csv",
    "content": "Launch Date, Mission Name, Launch Site\nJanuary 1, 2022, Starlink 3-10, Cape Canaveral Space Force Station\nJanuary 15, 2022, Transporter-4, Cape Canaveral Space Force Station\nFebruary 5, 2022, Starlink 3-11, Cape Canaveral Space Force Station\nFebruary 20, 2022, Starlink 3-12, Cape Canaveral Space Force Station\nMarch 10, 2022, Starlink 3-13, Cape Canaveral Space Force Station\nMarch 25, 2022, Starlink 3-14, Cape Canaveral Space Force Station\nApril 15, 2022, Starlink 3-15, Cape Canaveral Space Force Station\nApril 30, 2022, Starlink 3-16, Cape Canaveral Space Force Station\nMay 20, 2022, Starlink 3-17, Cape Canaveral Space Force Station\nJune 5, 2022, Starlink 3-18, Cape Canaveral Space Force Station\nJune 25, 2022, Starlink 3-19, Cape Canaveral Space Force Station\nJuly 10, 2022, Starlink 3-20, Cape Canaveral Space Force Station\nJuly 30, 2022, Starlink 3-21, Cape Canaveral Space Force Station\nAugust 15, 2022, Starlink 3-22, Cape Canaveral Space Force Station\nAugust 30, 2022, Starlink 3-23, Cape Canaveral Space Force Station\nSeptember 20, 2022, Starlink 3-24, Cape Canaveral Space Force Station\nOctober 5, 2022, Starlink 3-25, Cape Canaveral Space Force Station\nOctober 25, 2022, Starlink 3-26, Cape Canaveral Space Force Station\nNovember 10, 2022, Starlink 3-27, Cape Canaveral Space Force Station\nNovember 30, 2022, Starlink 3-28, Cape Canaveral Space Force Station\nDecember 15, 2022, Starlink 3-29, Cape Canaveral Space Force Station\nDecember 30, 2022, Starlink 3-30, Cape Canaveral Space Force Station"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/stockProducts.csv",
    "content": "ProductId,Name,Color,Size,Category,Cost,Qnt\n1,T-shirt,Red,M,Clothing,10.00,100\n2,Jeans,Blue,L,Clothing,30.00,50\n3,Jacket,Black,XL,Clothing,50.00,30\n4,Dress,Green,S,Clothing,25.00,40\n5,Skirt,Pink,M,Clothing,20.00,60\n6,Sweater,Gray,L,Clothing,35.00,25\n7,Shorts,Yellow,M,Clothing,15.00,70\n8,Blouse,White,S,Clothing,18.00,80\n9,Coat,Navy,L,Clothing,60.00,20\n10,Hoodie,Black,XL,Clothing,40.00,35\n11,Sneakers,Red,10,Footwear,55.00,45\n12,Boots,Brown,9,Footwear,70.00,25\n13,Sandals,Tan,8,Footwear,25.00,60\n14,Flip Flops,Blue,11,Footwear,15.00,50\n15,Loafers,Black,10,Footwear,65.00,30\n16,Anorak,Olive,M,Clothing,45.00,20\n17,Cardigan,Burgundy,L,Clothing,40.00,30\n18,Jumpsuit,Black,S,Clothing,55.00,15\n19,Tank Top,White,M,Clothing,12.00,85\n20,Leggings,Gray,L,Clothing,25.00,75\n21,Khakis,Beige,34,Clothing,35.00,40\n22,Chinos,Olive,32,Clothing,38.00,25\n23,V-neck T-shirt,Black,S,Clothing,22.00,65\n24,Cargo Pants,Khaki,M,Clothing,28.00,50\n25,Ballet Flats,Pink,8,Footwear,30.00,55\n26,Cowboy Boots,Brown,9,Footwear,80.00,10\n27,Raincoat,Yellow,L,Clothing,55.00,20\n28,Windbreaker,Red,M,Clothing,42.00,30\n29,High-Top Sneakers,White,10,Footwear,65.00,15\n30,Dress Shoes,Black,11,Footwear,75.00,12\n31,Baseball Cap,Gray,One Size,Accessories,15.00,50\n32,Beanie,Black,One Size,Accessories,12.00,45\n33,Scarf,Blue,One Size,Accessories,18.00,40\n34,Belt,Brown,36,Accessories,20.00,60\n35,Sunglasses,Black,One Size,Accessories,25.00,70\n36,Gloves,Red,M,Accessories,15.00,35\n37,Socks,Multicolor,10-12,Accessories,5.00,100\n38,Running Shoes,Neon Green,9,Footwear,70.00,25\n39,Work Boots,Black,10,Footwear,85.00,15\n40,Slippers,Gray,L,Footwear,30.00,40\n41,Tracksuit,Red,M,Clothing,60.00,20\n42,Pajamas,Blue,L,Clothing,30.00,30\n43,Swim Shorts,Black,M,Clothing,25.00,50\n44,Sport Bra,Pink,M,Clothing,20.00,60\n45,Tankini,Blue,M,Clothing,50.00,15\n46,Evening Gown,Red,S,Clothing,100.00,10\n47,Overalls,Denim,L,Clothing,45.00,20\n48,Bow Tie,Black,One Size,Accessories,12.00,50\n49,Cufflinks,Silver,One Size,Accessories,20.00,25\n50,Fedora,Beige,One Size,Accessories,30.00,20\n51,Puffer Jacket,Black,L,Clothing,65.00,15\n52,Sports Bra,Black,M,Clothing,22.00,50\n53,Wind Pants,Red,M,Clothing,38.00,30\n54,Cargo Shorts,Camouflage,L,Clothing,24.00,40\n55,Platform Shoes,Black,8,Footwear,45.00,25\n56,Water Shoes,Blue,9,Footwear,30.00,60\n57,Featherweight Vest,Yellow,M,Clothing,35.00,20\n58,Executive Blazer,Gray,L,Clothing,95.00,10\n59,Slip-On Sneakers,White,10,Footwear,60.00,15\n60,Evening Dress,Blue,M,Clothing,75.00,12\n61,Cycling Jersey,Black,L,Clothing,40.00,30\n62,Hiking Boots,Brown,11,Footwear,90.00,8\n63,Ballet Outfit,Pink,S,Clothing,55.00,20\n64,Running Shorts,Gray,M,Clothing,28.00,50\n65,Kitten Heels,Red,7,Footwear,35.00,30\n66,Dressy Sandals,Gold,8,Footwear,45.00,25\n67,Casual Trousers,Black,L,Clothing,50.00,15\n68,Tight-Fitting Jeans,Dark Blue,32,Clothing,40.00,20\n69,Leisure Shoes,White,9,Footwear,34.00,30\n70,Boxy Crop Top,Coral,S,Clothing,20.00,50"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/yachtNames.csv",
    "content": "Name\nSerenity Seeker\nAquamarine Dream\nOcean Odyssey\nStarlit Voyager\nBlissful Breeze\nMajestic Mariner\nCelestial Seas\nPearl Serenade\nNautical Nirvana\nAzure Horizon\nEnchanted Elegance\nSolstice Splendor\nSerendipity Shores\nNeptune's Haven\nTranquil Tides\nMidnight Mirage\nSeabreeze Symphony\nEnigma Explorer\nHarmony Haven\nRadiant Rhapsody"
  },
  {
    "path": "DemoCenter/DemoCenter/DemoData/csv/yachts.csv",
    "content": "Yacht Name,Length (ft),Number of Cabins,Maximum Speed (knots),Cruising Range (nm),Price (USD),Year of Release,Builder,Designer,Flag,Location\nOcean Dream,180,6,30,4000,25,000,000,2022,Benetti,Design Studio XYZ,USA,Fort Lauderdale''FL\nSea Serenity,220,5,25,3500,45,000,000,2020,Feadship,Design Studio ABC,Monaco,Monaco\nAzure Explorer,295,6,28,3800,120,000,000,2019,Lürssen,Design Studio PQR,Spain,Barcelona\nStarlight,164,5,26,3600,32,000,000,2023,Heesen,Design Studio LMN,France,Antibes\nPacific Queen,206,7,32,4200,65,000,000,2018,Amels,Design Studio RST,Bahamas,Nassau\nHorizon Seeker,171,4,24,3200,28,500,000,2021,Sanlorenzo,Design Studio UVW,USA,Miami''FL"
  },
  {
    "path": "DemoCenter/DemoCenter/Helpers/HeatmapHelper.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\nusing Avalonia;\nusing Avalonia.Media.Imaging;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.Helpers;\n\npublic static class HeatmapHelper\n{\n    static double[,] ConvertToDoubles(byte[] data, PixelSize size)\n    {\n        var result = new double[size.Height, size.Width];\n        var x = 0;\n        var y = size.Height - 1;\n        for (int i = 0; i < data.Length; i++)\n        {\n            if (x == size.Width)\n            {\n                x = 0;\n                y--;\n            }\n            result[y, x] = data[i];\n            x++;\n        }\n        return result;\n    }\n    public static string[] CreateArguments(int size)\n    {\n        var result = new string[size];\n        for (int i = 0; i < size; i++)\n            result[i] = i.ToString();\n        return result;\n    }\n    public static HeatmapDataAdapter GetAdapter(string imageName)\n    {\n        var assembly = Assembly.GetAssembly(typeof(HeatmapHelper));\n        var resourceName = assembly!.GetManifestResourceNames().First(s => s.EndsWith($\"{imageName}.png\"));\n        var stream = assembly.GetManifestResourceStream(resourceName)!;\n        using var bitmap = WriteableBitmap.Decode(stream);\n        var argumentsX = CreateArguments(bitmap.PixelSize.Width);\n        var argumentsY = CreateArguments(bitmap.PixelSize.Height);\n        var data = new byte[bitmap.PixelSize.Width * bitmap.PixelSize.Height];\n        using (var frameBuffer = bitmap.Lock()) \n        { \n            Marshal.Copy(frameBuffer.Address, data, 0, data.Length); \n        }\n        var values = ConvertToDoubles(data, bitmap.PixelSize);\n        return new HeatmapDataAdapter(argumentsX, argumentsY, values);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Helpers/ThemedSyntaxHighlighter.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Xml;\r\nusing Avalonia.Markup.Xaml;\r\nusing AvaloniaEdit.Highlighting;\r\nusing AvaloniaEdit.Highlighting.Xshd;\r\n\r\nnamespace DemoCenter.Helpers; \r\n\r\npublic class ThemedSyntaxHighlighter : MarkupExtension {\r\n    public ThemedSyntaxHighlighter(string highlightName) {\r\n        string themeName = App.Current.GetValue(App.RequestedThemeVariantProperty).ToString();\r\n        string resourceName = $\"DemoCenter.Resources.Highlighters.{highlightName}-{themeName}.xshd\";\r\n        using(var stream = Assembly.GetExecutingAssembly()\r\n                  ?.GetManifestResourceStream(resourceName)) {\r\n            HighlightingDefinition = HighlightingLoader.Load(new XmlTextReader(stream), null);\r\n        }\r\n    }\r\n\r\n    public IHighlightingDefinition HighlightingDefinition { get; set; }\r\n    public override object ProvideValue(IServiceProvider serviceProvider) {\r\n        return this;\r\n    }\r\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/BarsGroupInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class BarsGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                //new PageInfo(name: \"Overview\", title: \"Overview\",\n                //description: \"Bars overview sample description\",\n                //viewModelGetter: () => new BarsOverviewPageViewModel()),\n\n                new PageInfo(name: \"IDE Layout\", title: \"IDE Layout\",\n                    viewModelGetter: () => new IdeLayoutPageViewModel(),\n                    descriptionGetter: () => Resources.TheDockManagerComponentAllowsYouToImplemen, showInWeb: false),\n\n                new PageInfo(name: \"Toolbar & Menu\", title: \"Toolbar & Menu\",\n                viewModelGetter: () => new ToolbarAndMenuPageViewModel(), descriptionGetter: () => Resources.TheToolbarManagerComponentAllowsYouToImple),\n\n                //new PageInfo(name: \"Bar Items\", title: \"Bar Items\",\n                //description : \"\",\n                //viewModelGetter: () => new BarItemsPageViewModel()),\n\n                new PageInfo(name: \"Context Menu\", title: \"Context Menu\",\n                viewModelGetter: () => new ContextMenuPageViewModel(), descriptionGetter: () => Resources.TheToolbarsMenuLibraryContainsAPopupMenuCo),\n            };\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/CartesianChartGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic static class CartesianChartGroupInfo\n{\n    internal static List<PageInfo> Create()\n    {\n        return new List<PageInfo>\n        {\n            new(name: \"Real-Time Data\", title: \"Real-Time Data\",\n                viewModelGetter: () => new CartesianChartRealtimePageViewModel(),\n                descriptionGetter: () => Resources.TheChartControlSupportsInstantDisplayOfRap, introduced: new VersionInfo(1, 0), updated: new VersionInfo(1, 2), showInWeb: false),\n\n            new(name: \"Large Data\", title: \"Large Data\",\n                viewModelGetter: () => new CartesianChartLargeDataPageViewModel(),\n                descriptionGetter: () => Resources.TheChartControlSGraphicsRenderingIsOptimiz, introduced: new VersionInfo(1, 0), updated: new VersionInfo(1, 0), showInWeb: false),\n\n            new(name: \"Multiple Axes\", title: \"Multiple Axes\",\n                viewModelGetter: () => new CartesianChartAxesPageViewModel(),\n                descriptionGetter: () => Resources.CartesianChartMultipleAxes, introduced: new VersionInfo(1, 0), updated: new VersionInfo(1, 3)),\n\n            new(name: \"Logarithmic Scale\", title: \"Logarithmic Scale\",\n                viewModelGetter: () => new CartesianChartLogarithmicScalePageViewModel(),\n                descriptionGetter: () => Resources.ChartControlSupportsLogarithmicScalesForAn, introduced: new VersionInfo(1, 0), updated: new VersionInfo(1, 0)),\n\n            new(name: \"Strips and Constant Lines\", title: \"Strips and Constant Lines\",\n                viewModelGetter: () => new CartesianStripsAndConstantLinesViewModel(),\n                descriptionGetter: () => Resources.ThisDemoShowsConstantLinesAndStripsUsedToH, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Point\", title: \"Point Series View\",\n                viewModelGetter: () => new CartesianPointSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesThePointSeriesViewW, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Lollipop\", title: \"Lollipop Series View\",\n                viewModelGetter: () => new CartesianLollipopSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ChartsLollipop, introduced: new VersionInfo(1, 2)),\n\n            new(name: \"Line\", title: \"Line Series View\",\n                viewModelGetter: () => new CartesianLineSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheLineSeriesViewShownInThisExampleAllowsY, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Area\", title: \"Area Series View\",\n                viewModelGetter: () => new CartesianAreaSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheAreaSeriesViewAllowsYouDisplayFilledAre, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Stacked Area\", title: \"Stacked Area Series View\",\n                viewModelGetter: () => new CartesianStackedAreaSeriesViewViewModel(),\n                descriptionGetter: () => Resources.StackedArea, introduced: new VersionInfo(1, 3)),\n\n            new(name: \"Full Stacked Area\", title: \"Full Stacked Area Series View\",\n                viewModelGetter: () => new CartesianFullStackedAreaSeriesViewViewModel(),\n                descriptionGetter: () => Resources.FullStackedArea, introduced: new VersionInfo(1, 3)),\n\n            new(name: \"Scatter Line\", title: \"Scatter Line Series View\",\n                viewModelGetter: () => new CartesianScatterLineSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheScatterLineSeriesViewIsUsefulWhenYouNee, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Step Line\", title: \"Step Line Series View\",\n                viewModelGetter: () => new CartesianStepLineSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesTheStepLineSeriesVi, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Step Area\", title: \"Step Area Series View\",\n                viewModelGetter: () => new CartesianStepAreaSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheStepAreaSeriesViewConnectsPointsWithHor, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Range Area\", title: \"Range Area Series View\",\n                viewModelGetter: () => new CartesianRangeAreaSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ADataSeriesInThisExampleContainsTwoYValues, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Side-by-Side Bar\", title: \"Side-by-Side Bar Series View\",\n                viewModelGetter: () => new CartesianSideBySideBarSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesTheSideBySideBarSer, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Side-by-Side Range Bar\", title: \"Side-by-Side Range Bar Series View\",\n                viewModelGetter: () => new CartesianSideBySideRangeBarSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ADataSeriesInThisExampleContainsTwoYValues1, introduced: new VersionInfo(1, 0)),\n\n            new(name: \"Candlestick\", title: \"Candlestick Series View\",\n                viewModelGetter: () => new CartesianCandlestickSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheCandlestickSeriesViewAllowsYouToCreateA, introduced: new VersionInfo(1, 1)),\n            \n            new(name: \"Candlestick Aggregation\", title: \"Candlestick Aggregation\",\n                viewModelGetter: () => new CartesianCandlestickAggregationViewModel(),\n                descriptionGetter: () => Resources.InThisDemoTheCandlestickSeriesViewUsesASpe, introduced: new VersionInfo(1, 1)),\n            \n            new(name: \"Empty Points\", title: \"Empty Points\",\n                viewModelGetter: () => new CartesianEmptyPointsViewModel(),\n                descriptionGetter: () => Resources.EmptyPoints, introduced: new VersionInfo(1, 3))\n        };\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/CommonControlsGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class CommonControlsGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                new PageInfo(name: \"TabControl\", title: \"TabControl\",\n                    viewModelGetter: () => new TabControlPageViewModel(), descriptionGetter: () => Resources.EremexTabControlCanOrganizeTheContentsOfAB),\n                \n                new PageInfo(name: \"MessageBox\", title: \"MessageBox\",\n                    viewModelGetter: () => new MessageBoxPageViewModel(),\n                    descriptionGetter: () => Resources.TheMxMessageBoxDialogAllowsYouToDisplayMes,\n                    introduced: new VersionInfo(1, 1), showInWeb: false),\n\n                new PageInfo(name: \"SplitContainerControl\", title: \"SplitContainerControl\",\n                    viewModelGetter: () => new SplitContainerControlPageViewModel(), descriptionGetter: () => Resources.SplitContainerControlAllowsYouToPlaceConte,\n                    updated: new VersionInfo(1,3)),\n            };\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/DataGridGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class DataGridGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                new PageInfo(name: \"Grouping\", title: \"Grouping\", viewModelGetter: () => new DataGridGroupingPageViewModel(), descriptionGetter: () => Resources.TheDataGridSGroupingFeatureMakesItEasyToSu),\n                new PageInfo(name: \"Data Editors\", title: \"Data Editors\", viewModelGetter: () => new DataGridDataEditorsViewModel(), descriptionGetter: () => Resources.YouCanEmbedAnyControlInDataGridCellsToPres),\n                new PageInfo(name: \"Data Validation\", title: \"Data Validation\", viewModelGetter: () => new DataGridValidationViewModel(), descriptionGetter: () => Resources.TheDataValidationMechanismAllowsYouToCheck, introduced: new VersionInfo(1, 0)),\n                new PageInfo(name: \"Filter & Search\", title: \"Filter & Search\", viewModelGetter: () => new DataGridFilteringViewModel(), descriptionGetter: () => Resources.DataGridSupportsBuiltInDataSearchAndFiltra, updated: new VersionInfo(1, 3)),\n                new PageInfo(name: \"Large Data\", title: \"Large Data\", viewModelGetter: () => new DataGridLargeDataViewModel(), descriptionGetter: () => string.Format( Resources.RegardlessOfTheNumberOfColumnsAndRowsInThe), introduced: new VersionInfo(1, 0), updated: new VersionInfo(1, 1)),\n                new PageInfo(name: \"Row Auto Height\", title: \"Row Auto Height\", viewModelGetter: () => new DataGridRowAutoHeightViewModel(), descriptionGetter: () => Resources.DataGridAdaptsRowHeightToFitCellContentsTe, introduced: new VersionInfo(1, 0)),\n                new PageInfo(name: \"Live Data\", title: \"Live Data\", viewModelGetter: () => new DataGridLiveDataPageViewModel(), descriptionGetter: () => Resources.InThisDemoDataGridEmulatesTheWindowsTaskMa, introduced: new VersionInfo(1, 0)),\n                new PageInfo(name: \"Multiple Row Selection\", title: \"Multiple Row Selection\", viewModelGetter: () => new DataGridMultipleSelectionPageViewModel(), descriptionGetter: () => Resources.DataGridSupportsMultipleRowSelectionModeWh, introduced: new VersionInfo(1, 1)),\n                new PageInfo(name: \"Fixed Columns\", title: \"Fixed Columns\", viewModelGetter: () => new DataGridFixedColumnsViewModel(), descriptionGetter: () => Resources.DataGridFixedColumnsDescription, introduced: new VersionInfo(1, 3), showInWeb: true),\n                new PageInfo(name: \"Drag & Drop\", title: \"Drag & Drop\", viewModelGetter: () => new DataGridDragDropPageViewModel(), descriptionGetter: () => string.Format( Resources.DataGridSupportsDragAndDropOperationsWithi, Environment.NewLine + Environment.NewLine, Environment.NewLine + Environment.NewLine), introduced: new VersionInfo(1, 1), showInWeb: false),\n                new PageInfo(name: \"Column Bands\", title: \"Column Bands\", viewModelGetter: () => new DataGridColumnBandsViewModel(), descriptionGetter: () => Resources.DataGridColumnBandsDescription, introduced: new VersionInfo(1, 2), updated: new VersionInfo(1, 3)),\n                new PageInfo(name: \"Export\", title: \"Export\", viewModelGetter: () => new DataGridExportViewModel(), descriptionGetter: () => Resources.DataGridExportDescription, introduced: new VersionInfo(1, 2), showInWeb: true)\n            };\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/DeveloperToolsGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic class DeveloperToolsGroupInfo\n{\n    internal static List<PageInfo> Create()\n    {\n        return new List<PageInfo>()\n        {\n            new PageInfo(name: \"SVG Icons Browser\", title: \"Svg Icons Browser\",\n                viewModelGetter: () => new SvgIconsBrowserViewModel())\n        };\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/EditorsGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing DemoCenter.Views;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class EditorsGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                new PageInfo(name: \"Overview\", title: \"Overview\",\n                viewModelGetter: () => new EditorsOverviewPageViewModel(), descriptionGetter: () => Resources.TheEremexControlsLibraryIncludesMultipleEd),\n\n                new PageInfo(name: \"Text Editing\", title: \"Button & Text Editors\",\n                viewModelGetter: () => new TextEditingPageViewModel(), descriptionGetter: () => Resources.TheEditorsLibraryIncludesTheTextEditorAndB),\n\n                new PageInfo(name: \"Spin Editor\", title: \"Spin Editor\",\n                viewModelGetter: () => new SpinEditorPageViewModel(), descriptionGetter: () => Resources.TheSpinEditorIsANumericValueEditorWithBuil),\n\n                new PageInfo(name: \"ComboBox Editor\", title: \"ComboBox Editor\",\n                viewModelGetter: () => new ComboBoxEditorPageViewModel(), descriptionGetter: () => Resources.TheComboBoxEditorFeaturesADropdownListOfIt),\n\n                new PageInfo(name: \"Segmented Editor\", title: \"Segmented Editor\",\n                viewModelGetter: () => new SegmentedEditorPageViewModel(), descriptionGetter: () => Resources.YouCanUseTheSegmentedEditorToPresentASetOf),\n\n                new PageInfo(name: \"Date Editor\", title: \"Date Editor\",\n                viewModelGetter: () => new DateEditorPageViewModel(), descriptionGetter: () => Resources.TheDateEditorFeaturesADropdownCalendarThat),\n\n                new PageInfo(name: \"Color Editor\", title: \"Color Editor\",\n                viewModelGetter: () => new ColorEditorPageViewModel(), descriptionGetter: () => Resources.TheColorEditorAndPopupColorEditorControlsA),\n\n                new PageInfo(name: \"Hyperlink Editor\", title: \"Hyperlink Editor\",\n                viewModelGetter: () => new HyperlinkEditorPageViewModel(), descriptionGetter: () => Resources.TheHyperlinkEditorDisplaysItsContentAsAHyp, introduced: new VersionInfo(1, 0)),\n\n                new PageInfo(name: \"Enum Source\", title: \"Enum Source\",\n                viewModelGetter: () => new EnumSourcePageViewModel(), descriptionGetter: () => Resources.YouCanCreateComboBoxAndSegmentedEditorsIte),\n                \n                new PageInfo(name: \"Memo Editor\", title: \"Memo Editor\",\n                    viewModelGetter: () => new MemoEditorPageViewModel(), descriptionGetter: () => Resources.UseMemoEditorToDisplayAndEditLargeTextInAP, introduced: new VersionInfo(1, 0)),\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/Graphics3DControlGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic class Graphics3DControlGroupInfo\n{\n    internal static List<PageInfo> Create()\n    {\n        return new List<PageInfo>\n        {\n            new (name: \"Overview\", title: \"Overview\",\n                viewModelGetter: () => new Graphics3DControlOverviewViewModel(),\n                descriptionGetter: () => Resources.Graphics3DControlAllowsYouToVisualizeAndIn, introduced: new VersionInfo(1, 1)),\n            \n            new (name: \"Lines\", title: \"Line\",\n                viewModelGetter: () => new Graphics3DControlLinesViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesAGraphics3DControlT, introduced: new VersionInfo(1, 1)),\n\n            new (name: \"Points\", title: \"Points\",\n                viewModelGetter: () => new Graphics3DControlPointsViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesAGraphics3DControlT1, introduced: new VersionInfo(1, 1), updated: new VersionInfo(1, 2)),\n            \n            new (name: \"Transformations\", title: \"Transformations\",\n                viewModelGetter: () => new Graphics3DControlTransformationViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesDynamicTransformati, introduced: new VersionInfo(1, 1), updated: new VersionInfo(1, 2)),\n\n            new (name: \"STL Model\", title: \"STL Model\",\n                viewModelGetter: () => new Graphics3DControlStlViewModel(),\n                descriptionGetter: () => Resources.STL, introduced: new VersionInfo(1, 1)),\n            \n            new (name: \"Robot Arm\", title: \"Robot Arm\",\n                viewModelGetter: () => new Graphics3DControlRobotArmViewModel(),\n                descriptionGetter: () => Resources.RobotArm, introduced: new VersionInfo(1, 3)),\n\n            new (name: \"Simple Materials\", title: \"Simple Materials\",\n                viewModelGetter: () => new Graphics3DControlSimpleMaterialsViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesAGraphics3DControlD1, introduced: new VersionInfo(1, 1), updated: new VersionInfo(1, 2)),\n            \n            new (name: \"Textured Materials\", title: \"Textured Materials\",\n                viewModelGetter: () => new Graphics3DControlTexturedMaterialsViewModel(),\n                descriptionGetter: () => Resources.InThisExampleAGraphics3DControlDisplaysA3D, introduced: new VersionInfo(1, 1)),\n            \n            new (name: \"Camera\", title: \"Camera\",\n                viewModelGetter: () => new Graphics3DControlCameraViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesTheIsometricAndPers, introduced: new VersionInfo(1, 1)),\n            \n            new (name: \"Skybox\", title: \"Skybox\",\n                viewModelGetter: () => new Graphics3DControlSkyboxViewModel(),\n                descriptionGetter: () => Resources.Skybox, introduced: new VersionInfo(1, 2)),\n\n            new (name: \"Lights\", title: \"Lights\",\n                viewModelGetter: () => new Graphics3DControlLightsViewModel(),\n                descriptionGetter: () => Resources.Lights, introduced: new VersionInfo(1, 2)),\n\n            new (name: \"Highlighting and Selection\", title: \"Highlighting and Selection\",\n                viewModelGetter: () => new Graphics3DControlHighlightingViewModel(),\n                descriptionGetter: () => Resources.HighlightingAndSelection3D, introduced: new VersionInfo(1, 2)),\n        };\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/GroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic class GroupInfo : ProductInfoBase\n{\n    public List<PageInfo> Pages { get; }\n    public override bool HasChildren => Pages.Count > 0;\n    public override VersionInfo Introduced { get; }\n    public override VersionInfo? Updated { get; }\n\n    public GroupInfo(string name, string title, Func<PageViewModelBase> viewModelGetter, Func<string> descriptionGetter, List<PageInfo> pages, bool showInWeb = true)  : base(name, title, viewModelGetter, descriptionGetter, showInWeb)\n    {\n        Pages = pages;\n        Introduced = pages.Min(info => info.Introduced);\n        var maxUpdated = pages.Max(info => info.Updated); \n        var maxIntroduced = pages.Max(info => info.Introduced); \n        Updated = VersionInfo.Max(maxIntroduced, maxUpdated);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/HeatmapGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic static class HeatmapGroupInfo\n{\n    internal static List<PageInfo> Create()\n    {\n        return new List<PageInfo>\n        {\n            new (name: \"Color Providers\", title: \"Color Providers\",\n                viewModelGetter: () => new HeatmapColorProvidersViewModel(),\n                descriptionGetter: () => Resources.AHeatmapRendersA2DimensionalArrayOfValuesA, introduced: new VersionInfo(1, 1)),\n\n            new(name: \"Real-Time Data\", title: \"Real-Time Data\",\n                viewModelGetter: () => new HeatmapRealTimeViewModel(),\n                descriptionGetter: () => Resources.InThisExampleTheHeatmapControlUsesCustomCo, introduced: new VersionInfo(1, 1), updated: new VersionInfo(1, 2), showInWeb: false),\n        };\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/PageInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ProductsData;\n\npublic class PageInfo : ProductInfoBase\n{\n    public override VersionInfo Introduced { get; }\n    public override VersionInfo? Updated { get; }\n    public override bool HasChildren => false;\n\n    public PageInfo(string name, string title, Func<PageViewModelBase> viewModelGetter, Func<string> descriptionGetter = null, VersionInfo? introduced = null, VersionInfo? updated = null, bool showInWeb = true) : base(name, title, viewModelGetter, descriptionGetter, showInWeb)\n    {\n        Updated = updated;\n        Introduced = introduced ?? new VersionInfo(0, 0);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/PolarChartGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic static class PolarChartGroupInfo\n{\n    internal static List<PageInfo> Create()\n    {\n        return new List<PageInfo>\n        {\n            new (name: \"Strips and Constant Lines\", title: \"Strips and Constant Lines\",\n                viewModelGetter: () => new PolarStripsAndConstantLinesViewModel(),\n                descriptionGetter: () => Resources.InAPolarChartEachDataPointIsDeterminedByAn, introduced: new VersionInfo(1, 0)),\n            \n            new (name: \"Point\", title: \"Point Series View\",\n                viewModelGetter: () => new PolarPointSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesThePointSeriesViewW1, introduced: new VersionInfo(1, 0)),\n            \n            new (name: \"Line\", title: \"Line Series View\",\n                viewModelGetter: () => new PolarLineSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheLineSeriesViewShownInThisExampleAllowsY1, introduced: new VersionInfo(1, 0)),\n            \n            new (name: \"Area\", title: \"Area Series View\",\n                viewModelGetter: () => new PolarAreaSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheAreaSeriesViewAllowsYouDisplayFilledAre1, introduced: new VersionInfo(1, 0)),\n            \n            new (name: \"Scatter Line\", title: \"Scatter Line Series View\",\n                viewModelGetter: () => new PolarScatterLineSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheScatterLineSeriesViewIsUsefulWhenYouNee1, introduced: new VersionInfo(1, 0)),\n            \n            new (name: \"Range Area\", title: \"Range Area Series View\",\n                viewModelGetter: () => new PolarRangeAreaSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ADataSeriesInThisExampleContainsTwoYValues2, introduced: new VersionInfo(1, 0)),\n            \n            new(name: \"Empty Points\", title: \"Empty Points\",\n                viewModelGetter: () => new PolarEmptyPointsViewModel(),\n                descriptionGetter: () => Resources.EmptyPoints, introduced: new VersionInfo(1, 3))\n        };\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/ProductInfoBase.cs",
    "content": "﻿using System.Reflection;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic abstract class ProductInfoBase\n{\n    public string Name { get; }\n    public string Title { get; }\n    public Func<string> DescriptionGetter { get; set; }\n\n    public string Description => DescriptionGetter?.Invoke();\n    public Func<PageViewModelBase> ViewModelGetter { get; }\n    public bool ShowInWeb { get; }\n    public bool IsNew => Introduced.Matches(App.Version) && !IsUpdated;\n    public bool IsUpdated => Updated?.Matches(App.Version) is true;\n    public bool IsWebApp => App.IsWebApp;\n    public abstract VersionInfo Introduced { get; }\n    public abstract VersionInfo? Updated { get; }\n    public abstract bool HasChildren { get; }\n    \n    protected ProductInfoBase(string name, string title, Func<PageViewModelBase> viewModelGetter, Func<string> descriptionGetter, bool showInWeb)\n    {\n        Name = name;\n        Title = title;\n        DescriptionGetter = descriptionGetter;\n        ViewModelGetter = viewModelGetter;\n        ShowInWeb = showInWeb;\n    }\n}\n\npublic readonly struct VersionInfo : IComparable<VersionInfo>\n{\n    public static VersionInfo Max(VersionInfo v1, VersionInfo? v2)\n    {\n        if (v2.HasValue)\n        {\n            int compare = v1.CompareTo(v2.Value);\n            if (compare < 0)\n                return v2.Value;\n        }\n        return v1;\n    }\n\n    public int Major { get; } = 0;\n    public int Minor { get; } = 0;\n\n    public VersionInfo(int major, int minor)\n    {\n        Major = major;\n        Minor = minor;\n    }\n    public VersionInfo(Assembly assembly)\n    {\n        if (assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).SingleOrDefault() is AssemblyFileVersionAttribute attribute)\n        {\n            var parts = attribute.Version.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);\n            if (parts.Length > 0 && int.TryParse(parts[0], out var major))\n                Major = major;\n            if (parts.Length > 1 && int.TryParse(parts[1], out var minor))\n                Minor = minor;\n        }\n    }\n    public bool Matches(VersionInfo version) => version.Major == Major && version.Minor == Minor;\n    public int CompareTo(VersionInfo other)\n    {\n        int result = Major.CompareTo(other.Major);\n        return result == 0 ? Minor.CompareTo(other.Minor) : result;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/Products.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic static class Products\n{\n    static List<ProductInfoBase> products;\n\n    static List<ProductInfoBase> CreateProducts() => new()\n    {\n        new GroupInfo(\"Data Grid\", \"Data Grid\", () => new DataGridPageViewModel(), () => \"Data Grid description\", DataGridGroupInfo.Create()),\n        new GroupInfo(\"Tree List\", \"Tree List\", () => new TreeListGroupViewModel(), () => \"Tree List description\", TreeListGroupInfo.Create()),\n        new GroupInfo(\"Ribbon\", \"Ribbon\", () => new RibbonGroupViewModel(), () => \"Ribbon description\", RibbonGroupInfo.Create()),\n        new GroupInfo(\"Graphics3D Control\", \"Graphics3D Control\", () => new Graphics3DControlViewModel(), () => \"Graphics3D Control description\", Graphics3DControlGroupInfo.Create(), false),\n        new GroupInfo(\"Cartesian Chart\", \"Cartesian Chart\", () => new ChartsPageViewModel(), () => \"Cartesian Chart description\", CartesianChartGroupInfo.Create()),\n        new GroupInfo(\"Polar Chart\", \"Polar Chart\", () => new ChartsPageViewModel(), () => \"Polar Chart description\", PolarChartGroupInfo.Create()),\n        new GroupInfo(\"Smith Chart\", \"Smith Chart\", () => new ChartsPageViewModel(), () => \"Smith Chart description\", SmithChartGroupInfo.Create()),\n        new GroupInfo(\"Heatmap\", \"Heatmap\", () => new ChartsPageViewModel(), () => \"Heatmap description\", HeatmapGroupInfo.Create()),\n        new GroupInfo(\"Bars and Docking\", \"Bars and Docking\", () => new BarsGroupViewModel(), () => \"Bars and Docking description\", BarsGroupInfo.Create()),\n        new GroupInfo(\"Editors\", \"Editors\", () => new EditorsGroupViewModel(), () => \"Editors description\", EditorsGroupInfo.Create()),\n        new GroupInfo(\"Property Grid\", \"Property Grid\", () => new PropertyGridGroupViewModel(), () => \"Property Grid description\", PropertyGridGroupInfo.Create()),\n        new GroupInfo(\"Common Controls\", \"Common Controls\", () => new CommonControlsGroupViewModel(), () => \"Common Controls description\", CommonControlsGroupInfo.Create()),\n        new GroupInfo(\"Standard Controls\", \"Standard Controls\", () => new StandardControlsGroupViewModel(), () => \"Standard Controls description\", StandardControlsGroupInfo.Create()),\n        new GroupInfo(\"Samples\", \"Samples\", () => new UseCasesGroupViewModel(), () => \"Use Cases by Industry description\", UseCasesGroupInfo.Create()),\n        new GroupInfo(\"Tools\", \"Tools\", () => new DeveloperToolsGroupViewModel(), () => \"Developer Tools\", DeveloperToolsGroupInfo.Create()),\n    };\n\n    public static List<ProductInfoBase> GetOrCreate() => products ??= CreateProducts();\n    public static void Reset() { products = null; }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/PropertyGridGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class PropertyGridGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                new PageInfo(name: \"Data Editors\", title: \"Data Editors\", viewModelGetter: () => new PropertyGridDataEditorsViewModel(), descriptionGetter: () => Resources.PropertyGridAutomaticallyDetectsTheTypeOfB),\n                new PageInfo(name: \"Tab Items\", title: \"Tab Items\", viewModelGetter: () => new PropertyGridTabItemsViewModel(), descriptionGetter: () => Resources.PropertyGridTabRowsAllowYouToGroupASetOfFi)\n            };\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/RibbonGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class RibbonGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                new PageInfo(name: \"WordPad Example\", title: \"WordPad Example\",\n                    viewModelGetter: () => new WordPadExampleViewModel(),\n                    descriptionGetter: () => string.Format( Resources.RibbonControlAllowsYouToIntegrateMicrosoft, Environment.NewLine + Environment.NewLine, Environment.NewLine+ Environment.NewLine), introduced: new VersionInfo(1, 1), updated: null, showInWeb: false)\n            };\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/SmithChartGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic static class SmithChartGroupInfo\n{\n    internal static List<PageInfo> Create()\n    {\n        return new List<PageInfo>\n        {\n            new (name: \"Point\", title: \"Point Series View\",\n                viewModelGetter: () => new SmithPointSeriesViewViewModel(),\n                descriptionGetter: () => Resources.ThisExampleDemonstratesThePointSeriesViewW2, introduced: new VersionInfo(1, 0)),\n            \n            new (name: \"Scatter Line\", title: \"Scatter Line Series View\",\n                viewModelGetter: () => new SmithLineSeriesViewViewModel(),\n                descriptionGetter: () => Resources.TheScatterLineSeriesViewIsUsefulWhenYouNee2, introduced: new VersionInfo(1, 0))\n        };\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/StandardControlsGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class StandardControlsGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                new PageInfo(name: \"Overview\", title: \"Overview\",\n                viewModelGetter: () => new StandardControlsOverviewPageViewModel()),\n\n                new PageInfo(name: \"Primitives\", title: \"Primitives\",\n                viewModelGetter: () => new PrimitivesPageViewModel()),\n\n                new PageInfo(name: \"ProgressBar\", title: \"ProgressBar\",\n                viewModelGetter: () => new ProgressBarPageViewModel()),\n\n                new PageInfo(name: \"Slider\", title: \"Slider\",\n                viewModelGetter: () => new SliderPageViewModel()),\n            };\n        }\n    }\n\n    \n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/TreeListGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ProductsData\n{\n    public static class TreeListGroupInfo\n    {\n        internal static List<PageInfo> Create()\n        {\n            return new List<PageInfo>()\n            {\n                new PageInfo(name: \"Filter & Search\", title: \"Filter & Search\",\n                viewModelGetter: () => new TreeListFilteringPageViewModel(),\n                descriptionGetter: () => Resources.TheTreeListSAutoFilterRowDisplayedAtTheTop, showInWeb: false, updated: new VersionInfo(1, 3)),\n\n                new PageInfo(name: \"Data Editors\", title: \"Data Editors\",\n                viewModelGetter: () => new TreeListDataEditorsPageViewModel(),\n                descriptionGetter: () => Resources.EremexEditorsAreUsedInTreeListCellsByDefau, showInWeb: false),\n\n                new PageInfo(name: \"Folder Browser\", title: \"Folder Browser\",\n                viewModelGetter: () => new FolderBrowserPageViewModel(), descriptionGetter: () => Resources.YouCanBindTreeListToAHierarchicalDataSourc),\n\n                new PageInfo(name: \"Multiple Node Selection\", title: \"Multiple Node Selection\",\n                viewModelGetter: () => new TreeListMultipleSelectionPageViewModel(), descriptionGetter: () => Resources.TheTreeListAndTreeViewControlsSupportMulti, introduced: new VersionInfo(1, 0)),\n\n                new PageInfo(name: \"Column Bands\", title: \"Column Bands\",\n                viewModelGetter: () => new TreeListColumnBandsViewModel(), descriptionGetter: () => Resources.TreeListColumnBandsDescription, introduced: new VersionInfo(1, 2)),\n\n                new PageInfo(name: \"Export\", title: \"Export\", viewModelGetter: () => new TreeListExportViewModel(), descriptionGetter: () => Resources.TreeListExportDescription, introduced: new VersionInfo(1, 2))\n            };\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ProductsData/UseCasesGroupInfo.cs",
    "content": "﻿using DemoCenter.ViewModels;\n\nnamespace DemoCenter.ProductsData;\n\npublic static class UseCasesGroupInfo\n{\n    internal static List<PageInfo> Create()\n    {\n        return new List<PageInfo>\n        {\n            new (name: \"Mortgage calculator\", title: \"Mortgage Calculator\", descriptionGetter : () => Resources.UseCasesGroupInfo_Desc,\n            viewModelGetter: () => new MortgageCalculatorViewModel(), updated: new VersionInfo(1, 3))\n        };\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/Colors.Dark.axaml",
    "content": "﻿<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    <!-- Add Resources Here -->\r\n    <Color x:Key=\"NamespaceAlias\">#85C46C</Color>\r\n    <Color x:Key=\"Tag\">#C191FF</Color>\r\n    <Color x:Key=\"AttributeName\">#85C46C</Color>\r\n    <Color x:Key=\"Black\">#BDBDBD</Color>\r\n    <Color x:Key=\"Default\">#BDBDBD</Color>\r\n    \r\n    \r\n    <Color x:Key=\"Comment\">#85C46C</Color>\r\n    <Color x:Key=\"String\">#C9A26D</Color>\r\n    <Color x:Key=\"StringInterpolation\">#C9A26D</Color>\r\n    <Color x:Key=\"Char\">#C9A26D</Color>\r\n    <Color x:Key=\"Preprocessor\">#6C95EB</Color>\r\n    <Color x:Key=\"Punctuation\">#BDBDBD</Color>\r\n    <Color x:Key=\"ValueTypeKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"ReferenceTypeKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"MethodCall\">#39CC8F</Color>\r\n    <Color x:Key=\"NumberLiteral\">#248700</Color>\r\n    <Color x:Key=\"ThisOrBaseReference\">#6C95EB</Color>\r\n    <Color x:Key=\"NullOrValueKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"Keywords\">#6C95EB</Color>\r\n    <Color x:Key=\"GotoKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"ContextKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"ExceptionKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"CheckedKeyword\">#6C95EB</Color>\r\n    <Color x:Key=\"UnsafeKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"OperatorKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"ParameterModifiers\">#6C95EB</Color>\r\n    <Color x:Key=\"Modifiers\">#6C95EB</Color>\r\n    <Color x:Key=\"Visibility\">#6C95EB</Color>\r\n    <Color x:Key=\"NamespaceKeywords\">#C191FF</Color>\r\n    <Color x:Key=\"GetSetAddRemove\">#39CC8F</Color>\r\n    <Color x:Key=\"TrueFalse\">#6C95EB</Color>\r\n    <Color x:Key=\"TypeKeywords\">#6C95EB</Color>\r\n    <Color x:Key=\"SemanticKeywords\">#6C95EB</Color>\r\n    \r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/Colors.Light.axaml",
    "content": "﻿<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    \r\n    <Color x:Key=\"NamespaceAlias\">#00855F</Color>\r\n    <Color x:Key=\"Tag\">#6B2FBA</Color>\r\n    <Color x:Key=\"AttributeName\">#00855F</Color>\r\n    <Color x:Key=\"Black\">#000000</Color>\r\n    <Color x:Key=\"Default\">#000000</Color>\r\n    \r\n    <Color x:Key=\"Comment\">#248700</Color>\r\n    <Color x:Key=\"String\">#8C6C41</Color>\r\n    <Color x:Key=\"StringInterpolation\">#8C6C41</Color>\r\n    <Color x:Key=\"Char\">#8C6C41</Color>\r\n    <Color x:Key=\"Preprocessor\">#0F54D6</Color>\r\n    <Color x:Key=\"Punctuation\">#383838</Color>\r\n    <Color x:Key=\"ValueTypeKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"ReferenceTypeKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"MethodCall\">#00855F</Color>\r\n    <Color x:Key=\"NumberLiteral\">#248700</Color>\r\n    <Color x:Key=\"ThisOrBaseReference\">#0F54D6</Color>\r\n    <Color x:Key=\"NullOrValueKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"Keywords\">#0F54D6</Color>\r\n    <Color x:Key=\"GotoKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"ContextKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"ExceptionKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"CheckedKeyword\">#0F54D6</Color>\r\n    <Color x:Key=\"UnsafeKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"OperatorKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"ParameterModifiers\">#0F54D6</Color>\r\n    <Color x:Key=\"Modifiers\">#0F54D6</Color>\r\n    <Color x:Key=\"Visibility\">#0F54D6</Color>\r\n    <Color x:Key=\"NamespaceKeywords\">#6B2FBA</Color>\r\n    <Color x:Key=\"GetSetAddRemove\">#00855F</Color>\r\n    <Color x:Key=\"TrueFalse\">#0F54D6</Color>\r\n    <Color x:Key=\"TypeKeywords\">#0F54D6</Color>\r\n    <Color x:Key=\"SemanticKeywords\">#0F54D6</Color>\r\n    \r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/Highlighters/Axaml-Highlight-Dark.xshd",
    "content": "<SyntaxDefinition name=\"XML\" extensions=\".xml;.xsl;.xslt;.xsd;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.ilproj;.booproj;.build;.xfrm;.targets;.xaml;.xpt;.xft;.map;.wsdl;.disco;.ps1xml;.nuspec\" xmlns=\"http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008\">\r\n\t<Color foreground=\"#85C46C\" name=\"Comment\" exampleText=\"&lt;!-- comment --&gt;\" />\r\n\t<Color foreground=\"#C191FF\" name=\"Tag\" exampleText='&lt;tag attribute=\"value\" /&gt;' />\r\n\t<Color foreground=\"#85C46C\" name=\"AttributeName\" exampleText='&lt;tag attribute=\"value\" /&gt;' />\r\n\t<Color foreground=\"#6C95EB\" name=\"AttributeValue\" exampleText='&lt;tag attribute=\"value\" /&gt;' />\r\n\t<Color foreground=\"#C9A26D\" name=\"Entity\" exampleText=\"index.aspx?a=1&amp;amp;b=2\" />\r\n\t<Color foreground=\"#C9A26D\" name=\"BrokenEntity\" exampleText=\"index.aspx?a=1&amp;b=2\" />\r\n\t<Color foreground=\"#C9A26D\" name=\"String\" exampleText=\"'This is a string'\" />\r\n\t<Color foreground=\"#BDBDBD\" name=\"Black\" exampleText=\"\" />\r\n\t<Color foreground=\"#85C46C\" name=\"NamespaceAlias\" exampleText=\"xmlns:\" />\r\n\t\r\n\t<RuleSet>\r\n    \t<Span color=\"Comment\" multiline=\"true\">\r\n    \t\t<Begin>&lt;!--</Begin>\r\n    \t\t<End>--&gt;</End>\r\n    \t</Span>\r\n    \t<Span color=\"Tag\" multiline=\"true\">\r\n    \t\t<Begin>&lt;</Begin>\r\n    \t\t<End>&gt;</End>\r\n    \t\t<RuleSet>\r\n    \t\t    <Span color=\"String\" multiline=\"true\" spanColorIncludeStart=\"true\" spanColorIncludeEnd=\"true\">\r\n                    <Begin>\"[clr\\-namespace|using]</Begin>\r\n                \t<End>\"</End>\r\n                </Span>\r\n                <Span color=\"Black\" multiline=\"true\" spanColorIncludeStart=\"true\" spanColorIncludeEnd=\"true\">\r\n                    <Begin>\"</Begin>\r\n                    <End>\"</End>\r\n                    <RuleSet>\r\n                        <Span color=\"Tag\" multiline=\"true\" spanColorIncludeStart=\"false\" spanColorIncludeEnd=\"false\">\r\n                            <Begin>{</Begin>\r\n                            <End>}</End>\r\n                            <RuleSet>\r\n                                <Span color=\"String\" multiline=\"true\" spanColorIncludeStart=\"true\" spanColorIncludeEnd=\"true\">\r\n                                    <Begin>'</Begin>\r\n                                    <End>'</End>\r\n                                </Span>\r\n                                <Rule color=\"AttributeName\" multiline=\"true\">[a-zA-Z:\\.]{1,}[,=]</Rule>\r\n                            </RuleSet>\r\n                        </Span>\r\n                        <Rule color=\"String\" multiline=\"true\">clr\\-namespace:.{1,}</Rule>\r\n                        <Rule color=\"String\" multiline=\"true\">using:.{1,}</Rule>\r\n                    </RuleSet>\r\n                </Span>\r\n    \t\t\t<Rule color=\"NamespaceAlias\" multiline=\"true\">xmlns=</Rule>\r\n    \t\t\t<Rule color=\"NamespaceAlias\" multiline=\"true\">xmlns:[a-z0-9A-Z]{1,}</Rule>\r\n    \t\t\t<Rule color=\"NamespaceAlias\" multiline=\"true\">[a-z0-9A-z]{1,}:</Rule>\r\n    \t\t\t<Rule color=\"AttributeName\" multiline=\"true\">\\.[a-z0-9A-Z]{1,}</Rule>\r\n    \t\t\t<Rule color=\"AttributeName\" multiline=\"true\"> [a-z0-9A-Z]{1,}</Rule>\r\n    \t\t\t<Rule color=\"Black\" multiline=\"true\">:|=|/</Rule>\r\n    \t\t</RuleSet>\r\n    \t</Span>\r\n    \t<Import ruleSet=\"EntitySet\"/>\r\n    </RuleSet>\r\n    \t\r\n    <RuleSet name=\"EntitySet\">\r\n    \t<Rule color=\"Entity\">\r\n    \t\t&amp;\r\n    \t\t[\\w\\d\\#]+\r\n    \t\t;\r\n    \t</Rule>\r\n    \r\n    \t<Rule color=\"BrokenEntity\">\r\n    \t\t&amp;\r\n    \t\t[\\w\\d\\#]*\r\n    \t\t#missing ;\r\n    \t</Rule>\r\n    </RuleSet>\r\n</SyntaxDefinition>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/Highlighters/Axaml-Highlight-Light.xshd",
    "content": "<SyntaxDefinition name=\"XML\" extensions=\".xml;.xsl;.xslt;.xsd;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.ilproj;.booproj;.build;.xfrm;.targets;.xaml;.xpt;.xft;.map;.wsdl;.disco;.ps1xml;.nuspec\" xmlns=\"http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008\">\r\n\t<Color foreground=\"#248700\" name=\"Comment\" exampleText=\"&lt;!-- comment --&gt;\" />\r\n\t<Color foreground=\"#6B2FBA\" name=\"Tag\" exampleText='&lt;tag attribute=\"value\" /&gt;' />\r\n\t<Color foreground=\"#0093A1\" name=\"AttributeName\" exampleText='&lt;tag attribute=\"value\" /&gt;' />\r\n\t<Color foreground=\"Blue\" name=\"AttributeValue\" exampleText='&lt;tag attribute=\"value\" /&gt;' />\r\n\t<Color foreground=\"Teal\" name=\"Entity\" exampleText=\"index.aspx?a=1&amp;amp;b=2\" />\r\n\t<Color foreground=\"Olive\" name=\"BrokenEntity\" exampleText=\"index.aspx?a=1&amp;b=2\" />\r\n\t<Color foreground=\"#8C6C41\" name=\"String\" exampleText=\"'This is a string'\" />\r\n\t<Color foreground=\"#000000\" name=\"Black\" exampleText=\"\" />\r\n\t<Color foreground=\"#0093A1\" name=\"NamespaceAlias\" exampleText=\"xmlns:\" />\r\n\t\r\n\t<RuleSet>\r\n\t\t<Span color=\"Comment\" multiline=\"true\">\r\n\t\t\t<Begin>&lt;!--</Begin>\r\n\t\t\t<End>--&gt;</End>\r\n\t\t</Span>\r\n\t\t<Span color=\"Tag\" multiline=\"true\">\r\n\t\t\t<Begin>&lt;</Begin>\r\n\t\t\t<End>&gt;</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t    <Span color=\"String\" multiline=\"true\" spanColorIncludeStart=\"true\" spanColorIncludeEnd=\"true\">\r\n            \t    <Begin>\"[clr\\-namespace|using]</Begin>\r\n            \t\t<End>\"</End>\r\n            \t</Span>\r\n            \t<Span color=\"Black\" multiline=\"true\" spanColorIncludeStart=\"true\" spanColorIncludeEnd=\"true\">\r\n                    <Begin>\"</Begin>\r\n                    <End>\"</End>\r\n                    <RuleSet>\r\n                        <Span color=\"Tag\" multiline=\"true\" spanColorIncludeStart=\"false\" spanColorIncludeEnd=\"false\">\r\n                            <Begin>{</Begin>\r\n                            <End>}</End>\r\n                            <RuleSet>\r\n                                <Span color=\"String\" multiline=\"true\" spanColorIncludeStart=\"true\" spanColorIncludeEnd=\"true\">\r\n                                    <Begin>'</Begin>\r\n                                    <End>'</End>\r\n                                </Span>\r\n                                <Rule color=\"AttributeName\" multiline=\"true\">[a-zA-Z:\\.]{1,}[,=]</Rule>\r\n                            </RuleSet>\r\n                        </Span>\r\n                        <Rule color=\"String\" multiline=\"true\">clr\\-namespace:.{1,}</Rule>\r\n                        <Rule color=\"String\" multiline=\"true\">using:.{1,}</Rule>\r\n                    </RuleSet>\r\n                </Span>\r\n\t\t\t\t<Rule color=\"NamespaceAlias\" multiline=\"true\">xmlns=</Rule>\r\n\t\t\t\t<Rule color=\"NamespaceAlias\" multiline=\"true\">xmlns:[a-z0-9A-Z]{1,}</Rule>\r\n\t\t\t\t<Rule color=\"NamespaceAlias\" multiline=\"true\">[a-z0-9A-z]{1,}:</Rule>\r\n\t\t\t\t<Rule color=\"AttributeName\" multiline=\"true\">\\.[a-z0-9A-Z]{1,}</Rule>\r\n\t\t\t\t<Rule color=\"AttributeName\" multiline=\"true\"> [a-z0-9A-Z]{1,}</Rule>\r\n\t\t\t\t<Rule color=\"Black\" multiline=\"true\">:|=|/</Rule>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t<Import ruleSet=\"EntitySet\"/>\r\n\t</RuleSet>\r\n\t\r\n\t<RuleSet name=\"EntitySet\">\r\n\t\t<Rule color=\"Entity\">\r\n\t\t\t&amp;\r\n\t\t\t[\\w\\d\\#]+\r\n\t\t\t;\r\n\t\t</Rule>\r\n\r\n\t\t<Rule color=\"BrokenEntity\">\r\n\t\t\t&amp;\r\n\t\t\t[\\w\\d\\#]*\r\n\t\t\t#missing ;\r\n\t\t</Rule>\r\n\t</RuleSet>\r\n</SyntaxDefinition>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/Highlighters/CSharp-Highlight-Dark.xshd",
    "content": "<?xml version=\"1.0\"?>\r\n<SyntaxDefinition name=\"C#\" extensions=\".cs\" xmlns=\"http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008\">\r\n\t<!-- The named colors 'Comment' and 'String' are used in SharpDevelop to detect if a line is inside a multiline string/comment -->\r\n\t<Color name=\"Comment\" foreground=\"#85C46C\" exampleText=\"// comment\" />\r\n\t<Color name=\"String\" foreground=\"#C9A26D\" exampleText=\"string text = &quot;Hello, World!&quot;\"/>\r\n\t<Color name=\"StringInterpolation\" foreground=\"#C9A26D\" exampleText=\"string text = $&quot;Hello, {name}!&quot;\"/>\r\n\t<Color name=\"Char\" foreground=\"#C9A26D\" exampleText=\"char linefeed = '\\n';\"/>\r\n\t<Color name=\"Preprocessor\" foreground=\"#6C95EB\" exampleText=\"#region Title\" />\r\n\t<Color name=\"Punctuation\" foreground=\"#BDBDBD\" exampleText=\"a(b.c);\" />\r\n\t<Color name=\"ValueTypeKeywords\"  foreground=\"#6C95EB\" exampleText=\"bool b = true;\" />\r\n\t<Color name=\"ReferenceTypeKeywords\" foreground=\"#6C95EB\" exampleText=\"object o;\" />\r\n\t<Color name=\"MethodCall\" foreground=\"#39CC8F\"  exampleText=\"o.ToString();\"/>\r\n\t<Color name=\"NumberLiteral\" foreground=\"#248700\" exampleText=\"3.1415f\"/>\r\n\t<Color name=\"ThisOrBaseReference\" foreground=\"#6C95EB\"  exampleText=\"this.Do(); base.Do();\"/>\r\n\t<Color name=\"NullOrValueKeywords\" foreground=\"#6C95EB\"  exampleText=\"if (value == null)\"/>\r\n\t<Color name=\"Keywords\"  foreground=\"#6C95EB\" exampleText=\"if (a) {} else {}\"/>\r\n\t<Color name=\"GotoKeywords\" foreground=\"#6C95EB\" exampleText=\"continue; return null;\"/>\r\n\t<Color name=\"ContextKeywords\" foreground=\"#6C95EB\" exampleText=\"var a = from x in y select z;\"/>\r\n\t<Color name=\"ExceptionKeywords\"  foreground=\"#6C95EB\" exampleText=\"try {} catch {} finally {}\"/>\r\n\t<Color name=\"CheckedKeyword\"  foreground=\"#6C95EB\" exampleText=\"checked {}\"/>\r\n\t<Color name=\"UnsafeKeywords\" foreground=\"#6C95EB\" exampleText=\"unsafe { fixed (..) {} }\"/>\r\n\t<Color name=\"OperatorKeywords\"  foreground=\"#6C95EB\" exampleText=\"public static implicit operator...\"/>\r\n\t<Color name=\"ParameterModifiers\"  foreground=\"#6C95EB\" exampleText=\"(ref int a, params int[] b)\"/>\r\n\t<Color name=\"Modifiers\" foreground=\"#6C95EB\" exampleText=\"static readonly int a;\"/>\r\n\t<Color name=\"Visibility\"  foreground=\"#6C95EB\" exampleText=\"public override void ToString();\"/>\r\n\t<Color name=\"NamespaceKeywords\"  foreground=\"#C191FF\" exampleText=\"namespace A.B { using System; }\"/>\r\n\t<Color name=\"GetSetAddRemove\" foreground=\"#39CC8F\" exampleText=\"int Prop { get; set; }\"/>\r\n\t<Color name=\"TrueFalse\"  foreground=\"#6C95EB\" exampleText=\"b = false; a = true;\" />\r\n\t<Color name=\"TypeKeywords\"  foreground=\"#6C95EB\" exampleText=\"if (x is int) { a = x as int; type = typeof(int); size = sizeof(int); c = new object(); }\"/>\r\n\t<Color name=\"SemanticKeywords\"  foreground=\"#6C95EB\" exampleText=\"if (args == null) throw new ArgumentNullException(nameof(args));\" />\r\n\r\n\t<Property name=\"DocCommentMarker\" value=\"///\" />\r\n\t\r\n\t<RuleSet name=\"CommentMarkerSet\">\r\n\t\t<Keywords  foreground=\"Red\">\r\n\t\t\t<Word>TODO</Word>\r\n\t\t\t<Word>FIXME</Word>\r\n\t\t</Keywords>\r\n\t\t<Keywords  foreground=\"#E0E000\">\r\n\t\t\t<Word>HACK</Word>\r\n\t\t\t<Word>UNDONE</Word>\r\n\t\t</Keywords>\r\n\t</RuleSet>\r\n\t\r\n\t<!-- This is the main ruleset. -->\r\n\t<RuleSet>\r\n\t\t<Span color=\"Preprocessor\">\r\n\t\t\t<Begin>\\#</Begin>\r\n\t\t\t<RuleSet name=\"PreprocessorSet\">\r\n\t\t\t\t<Span> <!-- preprocessor directives that allows comments -->\r\n\t\t\t\t\t<Begin >\r\n\t\t\t\t\t\t(define|undef|if|elif|else|endif|line)\\b\r\n\t\t\t\t\t</Begin>\r\n\t\t\t\t\t<RuleSet>\r\n\t\t\t\t\t\t<Span color=\"Comment\" ruleSet=\"CommentMarkerSet\">\r\n\t\t\t\t\t\t\t<Begin>//</Begin>\r\n\t\t\t\t\t\t</Span>\r\n\t\t\t\t\t</RuleSet>\r\n\t\t\t\t</Span>\r\n\t\t\t\t<Span> <!-- preprocessor directives that don't allow comments -->\r\n\t\t\t\t\t<Begin >\r\n\t\t\t\t\t\t(region|endregion|error|warning|pragma)\\b\r\n\t\t\t\t\t</Begin>\r\n\t\t\t\t</Span>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<!--\r\n\t\t<Span color=\"Comment\">\r\n\t\t\t<Begin color=\"XmlDoc/DocComment\">///(?!/)</Begin>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<Import ruleSet=\"XmlDoc/DocCommentSet\"/>\r\n\t\t\t\t<Import ruleSet=\"CommentMarkerSet\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t-->\r\n\t\t\r\n\t\t<Span color=\"Comment\" ruleSet=\"CommentMarkerSet\">\r\n\t\t\t<Begin>//</Begin>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"Comment\" ruleSet=\"CommentMarkerSet\" multiline=\"true\">\r\n\t\t\t<Begin>/\\*</Begin>\r\n\t\t\t<End>\\*/</End>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"String\">\r\n\t\t\t<Begin>\"</Begin>\r\n\t\t\t<End>\"</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin=\"\\\\\" end=\".\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"Char\">\r\n\t\t\t<Begin>'</Begin>\r\n\t\t\t<End>'</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin=\"\\\\\" end=\".\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"String\" multiline=\"true\">\r\n\t\t\t<Begin>@\"</Begin>\r\n\t\t\t<End>\"</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin='\"\"' end=\"\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"String\">\r\n\t\t\t<Begin>\\$\"</Begin>\r\n\t\t\t<End>\"</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin=\"\\\\\" end=\".\"/>\r\n\t\t\t\t<Span begin=\"\\{\\{\" end=\"\"/>\r\n\t\t\t\t<!-- string interpolation -->\r\n\t\t\t\t<Span begin=\"{\" end=\"}\" color=\"StringInterpolation\" ruleSet=\"\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<!-- don't highlight \"@int\" as keyword -->\r\n\t\t<Rule>\r\n\t\t\t@[\\w\\d_]+\r\n\t\t</Rule>\r\n\t\t\r\n\t\t<Keywords color=\"ThisOrBaseReference\">\r\n\t\t\t<Word>this</Word>\r\n\t\t\t<Word>base</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"TypeKeywords\">\r\n\t\t\t<Word>as</Word>\r\n\t\t\t<Word>is</Word>\r\n\t\t\t<Word>new</Word>\r\n\t\t\t<Word>sizeof</Word>\r\n\t\t\t<Word>typeof</Word>\r\n\t\t\t<Word>stackalloc</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"TrueFalse\">\r\n\t\t\t<Word>true</Word>\r\n\t\t\t<Word>false</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"Keywords\">\r\n\t\t\t<Word>else</Word>\r\n\t\t\t<Word>if</Word>\r\n\t\t\t<Word>switch</Word>\r\n\t\t\t<Word>case</Word>\r\n\t\t\t<Word>default</Word>\r\n\t\t\t<Word>do</Word>\r\n\t\t\t<Word>for</Word>\r\n\t\t\t<Word>foreach</Word>\r\n\t\t\t<Word>in</Word>\r\n\t\t\t<Word>while</Word>\r\n\t\t\t<Word>lock</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"GotoKeywords\">\r\n\t\t\t<Word>break</Word>\r\n\t\t\t<Word>continue</Word>\r\n\t\t\t<Word>goto</Word>\r\n\t\t\t<Word>return</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ContextKeywords\">\r\n\t\t\t<Word>yield</Word>\r\n\t\t\t<Word>partial</Word>\r\n\t\t\t<Word>global</Word>\r\n\t\t\t<Word>where</Word>\r\n\t\t\t<Word>select</Word>\r\n\t\t\t<Word>group</Word>\r\n\t\t\t<Word>by</Word>\r\n\t\t\t<Word>into</Word>\r\n\t\t\t<Word>from</Word>\r\n\t\t\t<Word>ascending</Word>\r\n\t\t\t<Word>descending</Word>\r\n\t\t\t<Word>orderby</Word>\r\n\t\t\t<Word>let</Word>\r\n\t\t\t<Word>join</Word>\r\n\t\t\t<Word>on</Word>\r\n\t\t\t<Word>equals</Word>\r\n\t\t\t<Word>var</Word>\r\n\t\t\t<Word>dynamic</Word>\r\n\t\t\t<Word>await</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ExceptionKeywords\">\r\n\t\t\t<Word>try</Word>\r\n\t\t\t<Word>throw</Word>\r\n\t\t\t<Word>catch</Word>\r\n\t\t\t<Word>finally</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"CheckedKeyword\">\r\n\t\t\t<Word>checked</Word>\r\n\t\t\t<Word>unchecked</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"UnsafeKeywords\">\r\n\t\t\t<Word>fixed</Word>\r\n\t\t\t<Word>unsafe</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ValueTypeKeywords\">\r\n\t\t\t<Word>bool</Word>\r\n\t\t\t<Word>byte</Word>\r\n\t\t\t<Word>char</Word>\r\n\t\t\t<Word>decimal</Word>\r\n\t\t\t<Word>double</Word>\r\n\t\t\t<Word>enum</Word>\r\n\t\t\t<Word>float</Word>\r\n\t\t\t<Word>int</Word>\r\n\t\t\t<Word>long</Word>\r\n\t\t\t<Word>sbyte</Word>\r\n\t\t\t<Word>short</Word>\r\n\t\t\t<Word>struct</Word>\r\n\t\t\t<Word>uint</Word>\r\n\t\t\t<Word>ushort</Word>\r\n\t\t\t<Word>ulong</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ReferenceTypeKeywords\">\r\n\t\t\t<Word>class</Word>\r\n\t\t\t<Word>interface</Word>\r\n\t\t\t<Word>delegate</Word>\r\n\t\t\t<Word>object</Word>\r\n\t\t\t<Word>string</Word>\r\n\t\t\t<Word>void</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"OperatorKeywords\">\r\n\t\t\t<Word>explicit</Word>\r\n\t\t\t<Word>implicit</Word>\r\n\t\t\t<Word>operator</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ParameterModifiers\">\r\n\t\t\t<Word>params</Word>\r\n\t\t\t<Word>ref</Word>\r\n\t\t\t<Word>out</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"Modifiers\">\r\n\t\t\t<Word>abstract</Word>\r\n\t\t\t<Word>const</Word>\r\n\t\t\t<Word>event</Word>\r\n\t\t\t<Word>extern</Word>\r\n\t\t\t<Word>override</Word>\r\n\t\t\t<Word>readonly</Word>\r\n\t\t\t<Word>sealed</Word>\r\n\t\t\t<Word>static</Word>\r\n\t\t\t<Word>virtual</Word>\r\n\t\t\t<Word>volatile</Word>\r\n\t\t\t<Word>async</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"Visibility\">\r\n\t\t\t<Word>public</Word>\r\n\t\t\t<Word>protected</Word>\r\n\t\t\t<Word>private</Word>\r\n\t\t\t<Word>internal</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"NamespaceKeywords\">\r\n\t\t\t<Word>namespace</Word>\r\n\t\t\t<Word>using</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"GetSetAddRemove\">\r\n\t\t\t<Word>get</Word>\r\n\t\t\t<Word>set</Word>\r\n\t\t\t<Word>add</Word>\r\n\t\t\t<Word>remove</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"NullOrValueKeywords\">\r\n\t\t\t<Word>null</Word>\r\n\t\t\t<Word>value</Word>\r\n\t\t</Keywords>\r\n\r\n\t\t<Keywords color=\"SemanticKeywords\">\r\n\t\t\t<Word>nameof</Word>\r\n\t\t</Keywords>\r\n\r\n\t\t<!-- Mark previous rule-->\r\n\t\t<Rule color=\"MethodCall\">\r\n\t\t\\b\r\n\t\t[\\d\\w_]+  # an identifier\r\n\t\t(?=\\s*\\() # followed by (\r\n\t\t</Rule>\r\n\t\t\r\n\t\t<!-- Digits -->\r\n\t\t<Rule color=\"NumberLiteral\">\r\n\t\t\t\\b0[xX][0-9a-fA-F]+  # hex number\r\n\t\t|\t\r\n\t\t\t(\t\\b\\d+(\\.[0-9]+)?   #number with optional floating point\r\n\t\t\t|\t\\.[0-9]+           #or just starting with floating point\r\n\t\t\t)\r\n\t\t\t([eE][+-]?[0-9]+)? # optional exponent\r\n\t\t</Rule>\r\n\t\t\r\n\t\t<Rule color=\"Punctuation\">\r\n\t\t\t[?,.;()\\[\\]{}+\\-/%*&lt;&gt;^+~!|&amp;]+\r\n\t\t</Rule>\r\n\t</RuleSet>\r\n</SyntaxDefinition>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/Highlighters/CSharp-Highlight-Light.xshd",
    "content": "<?xml version=\"1.0\"?>\r\n<SyntaxDefinition name=\"C#\" extensions=\".cs\" xmlns=\"http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008\">\r\n\t<!-- The named colors 'Comment' and 'String' are used in SharpDevelop to detect if a line is inside a multiline string/comment -->\r\n\t<Color name=\"Comment\" foreground=\"#248700\" exampleText=\"// comment\" />\r\n\t<Color name=\"String\" foreground=\"#8C6C41\" exampleText=\"string text = &quot;Hello, World!&quot;\"/>\r\n\t<Color name=\"StringInterpolation\" foreground=\"#8C6C41\" exampleText=\"string text = $&quot;Hello, {name}!&quot;\"/>\r\n\t<Color name=\"Char\" foreground=\"#8C6C41\" exampleText=\"char linefeed = '\\n';\"/>\r\n\t<Color name=\"Preprocessor\" foreground=\"#0F54D6\" exampleText=\"#region Title\" />\r\n\t<Color name=\"Punctuation\" foreground=\"#383838\" exampleText=\"a(b.c);\" />\r\n\t<Color name=\"ValueTypeKeywords\"  foreground=\"#0F54D6\" exampleText=\"bool b = true;\" />\r\n\t<Color name=\"ReferenceTypeKeywords\" foreground=\"#0F54D6\" exampleText=\"object o;\" />\r\n\t<Color name=\"MethodCall\" foreground=\"#00855F\"  exampleText=\"o.ToString();\"/>\r\n\t<Color name=\"NumberLiteral\" foreground=\"#248700\" exampleText=\"3.1415f\"/>\r\n\t<Color name=\"ThisOrBaseReference\" foreground=\"#0F54D6\"  exampleText=\"this.Do(); base.Do();\"/>\r\n\t<Color name=\"NullOrValueKeywords\" foreground=\"#0F54D6\"  exampleText=\"if (value == null)\"/>\r\n\t<Color name=\"Keywords\"  foreground=\"#0F54D6\" exampleText=\"if (a) {} else {}\"/>\r\n\t<Color name=\"GotoKeywords\" foreground=\"#0F54D6\" exampleText=\"continue; return null;\"/>\r\n\t<Color name=\"ContextKeywords\" foreground=\"#0F54D6\" exampleText=\"var a = from x in y select z;\"/>\r\n\t<Color name=\"ExceptionKeywords\"  foreground=\"#0F54D6\" exampleText=\"try {} catch {} finally {}\"/>\r\n\t<Color name=\"CheckedKeyword\"  foreground=\"#0F54D6\" exampleText=\"checked {}\"/>\r\n\t<Color name=\"UnsafeKeywords\" foreground=\"#0F54D6\" exampleText=\"unsafe { fixed (..) {} }\"/>\r\n\t<Color name=\"OperatorKeywords\"  foreground=\"#0F54D6\" exampleText=\"public static implicit operator...\"/>\r\n\t<Color name=\"ParameterModifiers\"  foreground=\"#0F54D6\" exampleText=\"(ref int a, params int[] b)\"/>\r\n\t<Color name=\"Modifiers\" foreground=\"#0F54D6\" exampleText=\"static readonly int a;\"/>\r\n\t<Color name=\"Visibility\"  foreground=\"#0F54D6\" exampleText=\"public override void ToString();\"/>\r\n\t<Color name=\"NamespaceKeywords\"  foreground=\"#6B2FBA\" exampleText=\"namespace A.B { using System; }\"/>\r\n\t<Color name=\"GetSetAddRemove\" foreground=\"#00855F\" exampleText=\"int Prop { get; set; }\"/>\r\n\t<Color name=\"TrueFalse\"  foreground=\"#0F54D6\" exampleText=\"b = false; a = true;\" />\r\n\t<Color name=\"TypeKeywords\"  foreground=\"#0F54D6\" exampleText=\"if (x is int) { a = x as int; type = typeof(int); size = sizeof(int); c = new object(); }\"/>\r\n\t<Color name=\"SemanticKeywords\"  foreground=\"#0F54D6\" exampleText=\"if (args == null) throw new ArgumentNullException(nameof(args));\" />\r\n\r\n\t<Property name=\"DocCommentMarker\" value=\"///\" />\r\n\t\r\n\t<RuleSet name=\"CommentMarkerSet\">\r\n\t\t<Keywords  foreground=\"Red\">\r\n\t\t\t<Word>TODO</Word>\r\n\t\t\t<Word>FIXME</Word>\r\n\t\t</Keywords>\r\n\t\t<Keywords  foreground=\"#E0E000\">\r\n\t\t\t<Word>HACK</Word>\r\n\t\t\t<Word>UNDONE</Word>\r\n\t\t</Keywords>\r\n\t</RuleSet>\r\n\t\r\n\t<!-- This is the main ruleset. -->\r\n\t<RuleSet>\r\n\t\t<Span color=\"Preprocessor\">\r\n\t\t\t<Begin>\\#</Begin>\r\n\t\t\t<RuleSet name=\"PreprocessorSet\">\r\n\t\t\t\t<Span> <!-- preprocessor directives that allows comments -->\r\n\t\t\t\t\t<Begin >\r\n\t\t\t\t\t\t(define|undef|if|elif|else|endif|line)\\b\r\n\t\t\t\t\t</Begin>\r\n\t\t\t\t\t<RuleSet>\r\n\t\t\t\t\t\t<Span color=\"Comment\" ruleSet=\"CommentMarkerSet\">\r\n\t\t\t\t\t\t\t<Begin>//</Begin>\r\n\t\t\t\t\t\t</Span>\r\n\t\t\t\t\t</RuleSet>\r\n\t\t\t\t</Span>\r\n\t\t\t\t<Span> <!-- preprocessor directives that don't allow comments -->\r\n\t\t\t\t\t<Begin >\r\n\t\t\t\t\t\t(region|endregion|error|warning|pragma)\\b\r\n\t\t\t\t\t</Begin>\r\n\t\t\t\t</Span>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<!--\r\n\t\t<Span color=\"Comment\">\r\n\t\t\t<Begin color=\"XmlDoc/DocComment\">///(?!/)</Begin>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<Import ruleSet=\"XmlDoc/DocCommentSet\"/>\r\n\t\t\t\t<Import ruleSet=\"CommentMarkerSet\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t-->\r\n\t\t\r\n\t\t<Span color=\"Comment\" ruleSet=\"CommentMarkerSet\">\r\n\t\t\t<Begin>//</Begin>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"Comment\" ruleSet=\"CommentMarkerSet\" multiline=\"true\">\r\n\t\t\t<Begin>/\\*</Begin>\r\n\t\t\t<End>\\*/</End>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"String\">\r\n\t\t\t<Begin>\"</Begin>\r\n\t\t\t<End>\"</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin=\"\\\\\" end=\".\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"Char\">\r\n\t\t\t<Begin>'</Begin>\r\n\t\t\t<End>'</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin=\"\\\\\" end=\".\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"String\" multiline=\"true\">\r\n\t\t\t<Begin>@\"</Begin>\r\n\t\t\t<End>\"</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin='\"\"' end=\"\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<Span color=\"String\">\r\n\t\t\t<Begin>\\$\"</Begin>\r\n\t\t\t<End>\"</End>\r\n\t\t\t<RuleSet>\r\n\t\t\t\t<!-- span for escape sequences -->\r\n\t\t\t\t<Span begin=\"\\\\\" end=\".\"/>\r\n\t\t\t\t<Span begin=\"\\{\\{\" end=\"\"/>\r\n\t\t\t\t<!-- string interpolation -->\r\n\t\t\t\t<Span begin=\"{\" end=\"}\" color=\"StringInterpolation\" ruleSet=\"\"/>\r\n\t\t\t</RuleSet>\r\n\t\t</Span>\r\n\t\t\r\n\t\t<!-- don't highlight \"@int\" as keyword -->\r\n\t\t<Rule>\r\n\t\t\t@[\\w\\d_]+\r\n\t\t</Rule>\r\n\t\t\r\n\t\t<Keywords color=\"ThisOrBaseReference\">\r\n\t\t\t<Word>this</Word>\r\n\t\t\t<Word>base</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"TypeKeywords\">\r\n\t\t\t<Word>as</Word>\r\n\t\t\t<Word>is</Word>\r\n\t\t\t<Word>new</Word>\r\n\t\t\t<Word>sizeof</Word>\r\n\t\t\t<Word>typeof</Word>\r\n\t\t\t<Word>stackalloc</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"TrueFalse\">\r\n\t\t\t<Word>true</Word>\r\n\t\t\t<Word>false</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"Keywords\">\r\n\t\t\t<Word>else</Word>\r\n\t\t\t<Word>if</Word>\r\n\t\t\t<Word>switch</Word>\r\n\t\t\t<Word>case</Word>\r\n\t\t\t<Word>default</Word>\r\n\t\t\t<Word>do</Word>\r\n\t\t\t<Word>for</Word>\r\n\t\t\t<Word>foreach</Word>\r\n\t\t\t<Word>in</Word>\r\n\t\t\t<Word>while</Word>\r\n\t\t\t<Word>lock</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"GotoKeywords\">\r\n\t\t\t<Word>break</Word>\r\n\t\t\t<Word>continue</Word>\r\n\t\t\t<Word>goto</Word>\r\n\t\t\t<Word>return</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ContextKeywords\">\r\n\t\t\t<Word>yield</Word>\r\n\t\t\t<Word>partial</Word>\r\n\t\t\t<Word>global</Word>\r\n\t\t\t<Word>where</Word>\r\n\t\t\t<Word>select</Word>\r\n\t\t\t<Word>group</Word>\r\n\t\t\t<Word>by</Word>\r\n\t\t\t<Word>into</Word>\r\n\t\t\t<Word>from</Word>\r\n\t\t\t<Word>ascending</Word>\r\n\t\t\t<Word>descending</Word>\r\n\t\t\t<Word>orderby</Word>\r\n\t\t\t<Word>let</Word>\r\n\t\t\t<Word>join</Word>\r\n\t\t\t<Word>on</Word>\r\n\t\t\t<Word>equals</Word>\r\n\t\t\t<Word>var</Word>\r\n\t\t\t<Word>dynamic</Word>\r\n\t\t\t<Word>await</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ExceptionKeywords\">\r\n\t\t\t<Word>try</Word>\r\n\t\t\t<Word>throw</Word>\r\n\t\t\t<Word>catch</Word>\r\n\t\t\t<Word>finally</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"CheckedKeyword\">\r\n\t\t\t<Word>checked</Word>\r\n\t\t\t<Word>unchecked</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"UnsafeKeywords\">\r\n\t\t\t<Word>fixed</Word>\r\n\t\t\t<Word>unsafe</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ValueTypeKeywords\">\r\n\t\t\t<Word>bool</Word>\r\n\t\t\t<Word>byte</Word>\r\n\t\t\t<Word>char</Word>\r\n\t\t\t<Word>decimal</Word>\r\n\t\t\t<Word>double</Word>\r\n\t\t\t<Word>enum</Word>\r\n\t\t\t<Word>float</Word>\r\n\t\t\t<Word>int</Word>\r\n\t\t\t<Word>long</Word>\r\n\t\t\t<Word>sbyte</Word>\r\n\t\t\t<Word>short</Word>\r\n\t\t\t<Word>struct</Word>\r\n\t\t\t<Word>uint</Word>\r\n\t\t\t<Word>ushort</Word>\r\n\t\t\t<Word>ulong</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ReferenceTypeKeywords\">\r\n\t\t\t<Word>class</Word>\r\n\t\t\t<Word>interface</Word>\r\n\t\t\t<Word>delegate</Word>\r\n\t\t\t<Word>object</Word>\r\n\t\t\t<Word>string</Word>\r\n\t\t\t<Word>void</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"OperatorKeywords\">\r\n\t\t\t<Word>explicit</Word>\r\n\t\t\t<Word>implicit</Word>\r\n\t\t\t<Word>operator</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"ParameterModifiers\">\r\n\t\t\t<Word>params</Word>\r\n\t\t\t<Word>ref</Word>\r\n\t\t\t<Word>out</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"Modifiers\">\r\n\t\t\t<Word>abstract</Word>\r\n\t\t\t<Word>const</Word>\r\n\t\t\t<Word>event</Word>\r\n\t\t\t<Word>extern</Word>\r\n\t\t\t<Word>override</Word>\r\n\t\t\t<Word>readonly</Word>\r\n\t\t\t<Word>sealed</Word>\r\n\t\t\t<Word>static</Word>\r\n\t\t\t<Word>virtual</Word>\r\n\t\t\t<Word>volatile</Word>\r\n\t\t\t<Word>async</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"Visibility\">\r\n\t\t\t<Word>public</Word>\r\n\t\t\t<Word>protected</Word>\r\n\t\t\t<Word>private</Word>\r\n\t\t\t<Word>internal</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"NamespaceKeywords\">\r\n\t\t\t<Word>namespace</Word>\r\n\t\t\t<Word>using</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"GetSetAddRemove\">\r\n\t\t\t<Word>get</Word>\r\n\t\t\t<Word>set</Word>\r\n\t\t\t<Word>add</Word>\r\n\t\t\t<Word>remove</Word>\r\n\t\t</Keywords>\r\n\t\t\r\n\t\t<Keywords color=\"NullOrValueKeywords\">\r\n\t\t\t<Word>null</Word>\r\n\t\t\t<Word>value</Word>\r\n\t\t</Keywords>\r\n\r\n\t\t<Keywords color=\"SemanticKeywords\">\r\n\t\t\t<Word>nameof</Word>\r\n\t\t</Keywords>\r\n\r\n\t\t<!-- Mark previous rule-->\r\n\t\t<Rule color=\"MethodCall\">\r\n\t\t\\b\r\n\t\t[\\d\\w_]+  # an identifier\r\n\t\t(?=\\s*\\() # followed by (\r\n\t\t</Rule>\r\n\t\t\r\n\t\t<!-- Digits -->\r\n\t\t<Rule color=\"NumberLiteral\">\r\n\t\t\t\\b0[xX][0-9a-fA-F]+  # hex number\r\n\t\t|\t\r\n\t\t\t(\t\\b\\d+(\\.[0-9]+)?   #number with optional floating point\r\n\t\t\t|\t\\.[0-9]+           #or just starting with floating point\r\n\t\t\t)\r\n\t\t\t([eE][+-]?[0-9]+)? # optional exponent\r\n\t\t</Rule>\r\n\t\t\r\n\t\t<Rule color=\"Punctuation\">\r\n\t\t\t[?,.;()\\[\\]{}+\\-/%*&lt;&gt;^+~!|&amp;]+\r\n\t\t</Rule>\r\n\t</RuleSet>\r\n</SyntaxDefinition>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/SearchPanel.axaml",
    "content": "﻿<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:search=\"clr-namespace:AvaloniaEdit.Search;assembly=AvaloniaEdit\"\n                    x:ClassModifier=\"internal\">\n    \n    <ControlTheme x:Key=\"{x:Type search:SearchPanel}\" TargetType=\"search:SearchPanel\">\n        <Setter Property=\"Template\">\n            <ControlTemplate>\n                <StackPanel Name=\"PART_MessageView\" IsVisible=\"False\"/>\n            </ControlTemplate>\n        </Setter>\n    </ControlTheme>\n</ResourceDictionary>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/SharedResources.axaml",
    "content": "﻿<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n\t<Thickness x:Key=\"windowPadding\">16</Thickness>\n\t<Thickness x:Key=\"topGroupMargin\">0,8,0,0</Thickness>\n\t<Thickness x:Key=\"bottomGroupMargin\">0,0,0,8</Thickness>\n\t<Thickness x:Key=\"topControlMargin\">0,4,0,0</Thickness>\n\t<Thickness x:Key=\"leftControlMargin\">4,0,0,0</Thickness>\n\t<Thickness x:Key=\"leftGroupMargin\">8,0,0,0</Thickness>\n\t<Thickness x:Key=\"layoutItemMargin\">6 0</Thickness>\n\t<Thickness x:Key=\"leftRightGroupMargin\">8,0,8,0</Thickness>\n\n    <CornerRadius x:Key=\"wizardControlCornerRadius\">4</CornerRadius>\n    <Thickness x:Key=\"wizardControl_SelectorHeaderPadding\">3,6,3,6</Thickness>\n    <Thickness x:Key=\"wizardControlPanelsPadding\">8,8,8,8</Thickness>\n    <Thickness x:Key=\"wizardControlSettingsMargin\">8,0,8,8</Thickness>\n\t\n\t<Thickness x:Key=\"firstVerticalStackItemMargin\">0,4,0,4</Thickness>\n\t<Thickness x:Key=\"firstVerticalStackTopItemMargin\">0,0,0,4</Thickness>\n\t<Thickness x:Key=\"firstVerticalStackBottomItemMargin\">0,4,0,0</Thickness>\n\t<Thickness x:Key=\"verticalStackItemMargin\">8,4,0,4</Thickness>\n\t<Thickness x:Key=\"verticalStackTopItemMargin\">8,0,0,4</Thickness>\n\t<Thickness x:Key=\"verticalStackBottomItemMargin\">8,4,0,0</Thickness>\n</ResourceDictionary>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/SharedStyles.axaml",
    "content": "﻿<Styles xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:ae=\"clr-namespace:AvaloniaEdit.Editing;assembly=AvaloniaEdit\"\n        xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n        xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n        xmlns:charts=\"clr-namespace:Eremex.AvaloniaUI.Charts;assembly=Eremex.Avalonia.Charts\"\n        xmlns:mx3d=\"clr-namespace:Eremex.AvaloniaUI.Controls3D;assembly=Eremex.Avalonia.Controls3D\"\n        xmlns:mxti=\"clr-namespace:Eremex.AvaloniaUI.Controls.Bars.Internal;assembly=Eremex.Avalonia.Controls\">\n\n  <!-- Add Styles Here -->\n  <Style Selector=\"Label.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"Label.PropertyLabel\">\n      <Setter Property=\"Margin\" Value=\"0,12,0,0\"/>\n      <Setter Property=\"Padding\" Value=\"0\"/>\n      <Setter Property=\"Grid.ColumnSpan\" Value=\"2\"/>\n   </Style>\n    <Style Selector=\"Label.TopPropertyLabel\">\n        <Setter Property=\"Margin\" Value=\"0,8,0,0\"/>\n        <Setter Property=\"Padding\" Value=\"0\"/>\n        <Setter Property=\"Grid.ColumnSpan\" Value=\"2\"/>\n    </Style>\n    <Style Selector=\"ContentControl.ContentViewer\">\n        <Setter Property=\"Margin\" Value=\"0,8,0,0\"/>\n        <Setter Property=\"Padding\" Value=\"8,0,8,0\"/>\n        <Setter Property=\"MinHeight\" Value=\"{StaticResource EditorMinHeight}\"/>\n        <Setter Property=\"CornerRadius\" Value=\"{StaticResource EditorCornerRadius}\"/>\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource Outline/Neutral/Transparent/Medium}\"/>\n        <Setter Property=\"BorderThickness\" Value=\"1\"/>\n    </Style>\n   <Style Selector=\"mxe|TextEditor.PropertyEditor, mxe|ComboBoxEditor.PropertyEditor, mxe|DateEditor.PropertyEditor, mxe|SpinEditor.PropertyEditor\">\n       <Setter Property=\"Margin\" Value=\"0,4,0,0\"/>\n       <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n   </Style>\n    <Style Selector=\"mxe|CheckEditor.PropertyEditor\">\n        <Setter Property=\"Margin\" Value=\"0,8,0,0\"/>\n        <Setter Property=\"MinHeight\" Value=\"20\"/>\n        <Setter Property=\"Grid.ColumnSpan\" Value=\"2\"/>\n    </Style>\n    <Style Selector=\"RadioButton.PropertyEditor\">\n        <Setter Property=\"Margin\" Value=\"0,8,0,0\"/>\n        <Setter Property=\"MinHeight\" Value=\"20\"/>\n        <Setter Property=\"Grid.ColumnSpan\" Value=\"2\"/>\n    </Style>\n    <Style Selector=\"mxtl|TreeListControl.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n  </Style>\n  <Style Selector=\"mxtl|TreeViewControl.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\" />\n  </Style>\n  <Style Selector=\"mxe|ComboBoxEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|PopupColorEditor.LayoutItem\">\n\t  <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n\t  <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|CheckEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"CheckBox.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"Image.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n  </Style>\n  <Style Selector=\"RadioButton.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|TextEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|ButtonEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|SpinEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|DateEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|SegmentedEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"mxe|HyperlinkEditor.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n  </Style>\n  <Style Selector=\"Label.Caption\">\n    <Setter Property=\"FontWeight\" Value=\"Bold\"/>\n  </Style>\n  <Style Selector=\"Button.LayoutItem\">\n    <Setter Property=\"Margin\" Value=\"6,8,6,8\"/>\n    <Setter Property=\"MinWidth\" Value=\"100\"></Setter>\n  </Style>\n  <Style Selector=\"Button.LayoutItemFirst\">\n    <Setter Property=\"Margin\" Value=\"6,8,6,8\"/>\n    <Setter Property=\"MinWidth\" Value=\"100\"></Setter>\n  </Style>\n  <Style Selector=\"Button.LayoutItemMiddle\">\n    <Setter Property=\"Margin\" Value=\"0,8,6,8\"/>\n    <Setter Property=\"MinWidth\" Value=\"100\"></Setter>\n  </Style>\n  <Style Selector=\"Button.LayoutItemLast\">\n    <Setter Property=\"Margin\" Value=\"0,8,0,8\"/>\n    <Setter Property=\"MinWidth\" Value=\"100\"></Setter>\n  </Style>\n  \n  <Style Selector=\":is(Panel).LayoutGroup > :is(Control)\">\n\t  <Setter Property=\"Margin\" Value=\"6,8,0,8\"/>\n  </Style>\n  <Style Selector=\":is(Panel).LayoutGroup > :is(Control):nth-last-child(1)\">\n\t  <Setter Property=\"Margin\" Value=\"6,8,6,8\"/>\n  </Style>\n  \n  <Style Selector=\":is(Panel).LayoutGroup.Vertical > :is(Control)\">\n\t  <Setter Property=\"Margin\" Value=\"6,8,6,0\"/>\n  </Style>\n  <Style Selector=\":is(Panel).LayoutGroup.Vertical > :is(Control):nth-last-child(1)\">\n\t  <Setter Property=\"Margin\" Value=\"6,8,6,8\"/>\n  </Style>\n  \n  <Style Selector=\":is(Panel).LayoutGroup > :is(Panel).LayoutGroup\">\n\t  <Setter Property=\"Margin\" Value=\"0\"/>\n  </Style>\n  \n  <Style Selector=\"Button.LayoutItemNarrow\">\n    <Setter Property=\"Margin\" Value=\"6,0,6,0\"/>\n  </Style>\n  <Style Selector=\"Grid.LayoutControl\">\n    <Setter Property=\"Margin\" Value=\"12\"/>\n  </Style>\n  <Style Selector=\"StackPanel.LayoutControl\">\n     <Setter Property=\"Margin\" Value=\"12\"/>\n  </Style>\n  <Style Selector=\"Button.IconButton\">\n        <Setter Property=\"MinHeight\" Value=\"28\"></Setter>\n        <Setter Property=\"MinWidth\" Value=\"28\"></Setter>\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\"></Setter>\n        <Setter Property=\"HorizontalAlignment\" Value=\"Center\"></Setter>\n        <Setter Property=\"Padding\" Value=\"8\"></Setter>\n    </Style>\n    \n\n    <Style Selector=\"Button.Link\">\n        <Setter Property=\"Background\" Value=\"Transparent\"></Setter>\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\n    </Style>\n    \n    <Style Selector=\"Button.Link:pointerover\">\n        <Setter Property=\"Background\" Value=\"Transparent\"></Setter>\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\n    </Style>\n    \n    <Style Selector=\"Button.Link:pointerover TextBlock\">\n        <Setter Property=\"TextDecorations\" Value=\"Underline\"></Setter>\n    </Style>\n\n\n    <Style Selector=\"Window.DialogWindow\">\n        <Setter Property=\"Padding\" Value=\"{DynamicResource windowPadding}\"></Setter>\n    </Style>\n\n    <Style Selector=\"mxe|TextEditor.Hyperlink\">\n          <Setter Property=\"Foreground\" Value=\"{DynamicResource Icons/Outline/Blue}\"/>\n          <Setter Property=\"ReadOnly\" Value=\"True\"/>\n          <Setter Property=\"Template\">\n              <ControlTemplate>\n                  <TextBlock Cursor=\"Hand\"\n                             Text=\"{TemplateBinding EditorValue}\"\n                             VerticalAlignment=\"Center\"\n                             TextDecorations=\"Underline\"        \n                             Name=\"PART_RealEditorPresenter\"\n                             TextTrimming=\"CharacterEllipsis\"/>\n              </ControlTemplate>\n          </Setter>\n    </Style>\n    <Style Selector=\"mxe|TextEditor.Hyperlink:activeMode\">\n          <Setter Property=\"Foreground\" Value=\"{DynamicResource Icons/Outline/Blue}\"/>\n          <Setter Property=\"ReadOnly\" Value=\"True\"/>\n          <Setter Property=\"Template\">\n              <ControlTemplate>\n                  <TextBlock Cursor=\"Hand\"\n                             VerticalAlignment=\"Center\"\n                             TextDecorations=\"Underline\"\n                             Text=\"{TemplateBinding EditorValue}\"\n                             Name=\"PART_RealEditorPresenter\"\n                             TextTrimming=\"CharacterEllipsis\"/>\n              </ControlTemplate>\n          </Setter>\n    </Style>\n  \n  <Style Selector=\"Border.SimpleBorder\">\n      <Setter Property=\"BorderThickness\" Value=\"1\"/>\n      <Setter Property=\"BorderBrush\" Value=\"{DynamicResource Outline/Neutral/Transparent/Light}\"/>\n      <Setter Property=\"Margin\" Value=\"6\"/>\n  </Style>\n\n    <Style Selector=\"ae|TextArea\">\n        <Setter Property=\"SelectionBrush\" Value=\"{DynamicResource Fill/Accent/Highlighting/Text}\" />\n    </Style>   \n  \n  <Style Selector=\"Label.EditorHeader\">\n    <Setter Property=\"VerticalAlignment\" Value=\"Bottom\"/>\n    <Setter Property=\"Margin\" Value=\"6,0,6,12\"/>\n  </Style>\n  \n  <Style Selector=\"ContentControl.DemoUserControl\">\n    <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\"/>\n    <Setter Property=\"VerticalAlignment\" Value=\"Stretch\"/>\n    <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\"/>\n    <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\"/>\n    <Setter Property=\"VerticalContentAlignment\" Value=\"Center\"/>\n    <Setter Property=\"Template\">\n      <Setter.Value>\n        <ControlTemplate>\n          <Border Background=\"Transparent\"\n                  BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\"\n                  BorderThickness=\"{TemplateBinding BorderThickness}\">\n                <ContentPresenter Content=\"{TemplateBinding Content}\" \n                                  HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" \n                                  VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"/>\n          </Border>\n        </ControlTemplate>\n      </Setter.Value>\n    </Setter>\n  </Style>\n  \n  <Style Selector=\"mx3d|Graphics3DControl.DemoGraphics3DControl\">\n    <Setter Property=\"Gizmo\">\n      <Template>\n        <mx3d:Gizmo />\n      </Template>\n    </Setter>\n  </Style>\n  \n  <Style Selector=\"charts|CartesianChart.DemoChart\">\n    <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\"/> \n    <Setter Property=\"CornerRadius\" Value=\"0\"/>\n  </Style>\n  \n  <Style Selector=\"charts|PolarChart.DemoChart\">\n    <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\"/> \n    <Setter Property=\"CornerRadius\" Value=\"0\"/>\n  </Style>\n  \n  <Style Selector=\"charts|SmithChart.DemoChart\">\n    <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\"/> \n    <Setter Property=\"CornerRadius\" Value=\"0\"/>\n  </Style>\n\n  <Style Selector=\"charts|Heatmap.DemoChart\">\n    <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\"/> \n    <Setter Property=\"CornerRadius\" Value=\"0\"/>\n  </Style>\n\n  <Style Selector=\"charts|CartesianChart.DemoChartWithNoOptions\">\n    <Setter Property=\"BorderThickness\" Value=\"0\"/> \n    <Setter Property=\"CornerRadius\" Value=\"0\"/>\n  </Style>\n  \n  <Style Selector=\"charts|PolarChart.DemoChartWithNoOptions\">\n    <Setter Property=\"BorderThickness\" Value=\"0\"/> \n    <Setter Property=\"CornerRadius\" Value=\"0\"/>\n  </Style>\n\n  <Style Selector=\"charts|SmithChart.DemoChartWithNoOptions\">\n    <Setter Property=\"BorderThickness\" Value=\"0\"/> \n    <Setter Property=\"CornerRadius\" Value=\"0\"/>\n  </Style>\n\n    <Style Selector=\"mxe|GroupBox.PropertiesGroup\">\n        <Setter Property=\"Padding\" Value=\"8,16,8,0\"/>\n        <Setter Property=\"BorderThickness\" Value=\"0\"/>\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate>\n                    <Border Background=\"{TemplateBinding Background}\"\n                            Padding=\"{TemplateBinding Padding}\"\n                            BorderBrush=\"{TemplateBinding BorderBrush}\"\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\n                            CornerRadius=\"{TemplateBinding CornerRadius}\">\n                            <Grid RowDefinitions=\"Auto, *\">\n                                <Border BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\" BorderThickness=\"0,0,0,1\">\n                                    <ContentPresenter Name=\"PART_HeaderPresenter\"\n                                                      Background=\"Transparent\"\n                                                      BorderBrush=\"Transparent\"\n                                                      BorderThickness=\"0\"\n                                                      CornerRadius=\"{TemplateBinding CornerRadius}\"\n                                                      ContentTemplate=\"{TemplateBinding HeaderTemplate}\"\n                                                      Content=\"{TemplateBinding Header}\"\n                                                      Margin=\"0,0,0,8\"\n                                                      RecognizesAccessKey=\"True\"\n                                                      IsVisible=\"{TemplateBinding ShowHeader}\"\n                                                      TextBlock.Foreground=\"{DynamicResource Text/Neutral/Primary}\"\n                                                      HorizontalAlignment=\"{TemplateBinding HeaderHorizontalAlignment}\"\n                                                      VerticalAlignment=\"{TemplateBinding HeaderVerticalAlignment}\"\n                                                      VerticalContentAlignment=\"{TemplateBinding HeaderVerticalContentAlignment}\"\n                                                      HorizontalContentAlignment=\"{TemplateBinding HeaderHorizontalContentAlignment}\"/>                                    \n                                </Border>\n                                <ContentPresenter Grid.Row=\"1\" Name=\"PART_ContentPresenter\"\n                                                  Margin=\"0\"\n                                                  Content=\"{TemplateBinding Content}\"\n                                                  ContentTemplate=\"{TemplateBinding ContentTemplate}\"\n                                                  VerticalContentAlignment=\"{TemplateBinding VerticalContentAlignment}\"\n                                                  HorizontalContentAlignment=\"{TemplateBinding HorizontalContentAlignment}\"/>\n                            </Grid>\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n        \n        <Style Selector=\"^/template/ContentPresenter#PART_HeaderPresenter\">\n          <Setter Property=\"FontWeight\" Value=\"Bold\"></Setter>\n        </Style>\n    </Style>\n  \n</Styles>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/SvgIconsBrowserViewResources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace DemoCenter.Views.Resources {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class SvgIconsBrowserViewResources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal SvgIconsBrowserViewResources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"DemoCenter.Resources.SvgIconsBrowserViewResources\", typeof(SvgIconsBrowserViewResources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Categories.\n        /// </summary>\n        public static string CategoriesCaption {\n            get {\n                return ResourceManager.GetString(\"CategoriesCaption\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources/SvgIconsBrowserViewResources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<root>\n    <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n        <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n            \n        </xsd:element>\n    </xsd:schema>\n    <resheader name=\"resmimetype\">\n        <value>text/microsoft-resx</value>\n    </resheader>\n    <resheader name=\"version\">\n        <value>1.3</value>\n    </resheader>\n    <resheader name=\"reader\">\n        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n    </resheader>\n    <resheader name=\"writer\">\n        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n    </resheader>\n    <data name=\"CategoriesCaption\" xml:space=\"preserve\">\n        <value>Categories</value>\n    </data>\n</root>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace DemoCenter {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"DemoCenter.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A data series in this example contains two Y-values for each data point. The Range Area view fills the area between these Y-values..\n        /// </summary>\n        public static string ADataSeriesInThisExampleContainsTwoYValues {\n            get {\n                return ResourceManager.GetString(\"ADataSeriesInThisExampleContainsTwoYValues\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A data series in this example contains two Y-values for each data point. The Side-by-side Range Bar view draws rectangular bars between these Y-values..\n        /// </summary>\n        public static string ADataSeriesInThisExampleContainsTwoYValues1 {\n            get {\n                return ResourceManager.GetString(\"ADataSeriesInThisExampleContainsTwoYValues1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A data series in this example contains two Y-values for each data point. The Range Area view fills the area between these Y-values..\n        /// </summary>\n        public static string ADataSeriesInThisExampleContainsTwoYValues2 {\n            get {\n                return ResourceManager.GetString(\"ADataSeriesInThisExampleContainsTwoYValues2\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A heatmap renders a 2-dimensional array of values as a color-encoded matrix. Each data point&apos;s color corresponds to the data point&apos;s value. This example demonstrates the Heatmap control which allows you to create heatmaps from your data. Click a color gradient on the right to apply this color encoding to the heatmap.\n        ///\n        ///Image source: Webb Space Telescope, https://webbtelescope.org/.\n        /// </summary>\n        public static string AHeatmapRendersA2DimensionalArrayOfValuesA {\n            get {\n                return ResourceManager.GetString(\"AHeatmapRendersA2DimensionalArrayOfValuesA\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates multiple axes in the CartesianChart control, along with the options to customize axis layout, position, labels, gridlines, and more.\n        ///• Multiple Axes — The chart control allows you to create multiple X and Y axes and bind each data series to its own axes.\n        ///• Axis Position — You can display specific X or Y axes opposite their default locations: X axes at the top, and Y axes at the right. \n        ///• Swap Axes — With a single property, you can transpose the axes, so the Y axes are displayed  [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string CartesianChartMultipleAxes {\n            get {\n                return ResourceManager.GetString(\"CartesianChartMultipleAxes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Chart Control supports logarithmic scales for any of its numeric axes. Log base 10 is default. You can specify a custom log base to change data scaling..\n        /// </summary>\n        public static string ChartControlSupportsLogarithmicScalesForAn {\n            get {\n                return ResourceManager.GetString(\"ChartControlSupportsLogarithmicScalesForAn\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Lollipop series view is a sleek, space-efficient alternative to traditional bar charts. \n        ///Instead of bulky bars, it uses thin lines topped with markers to visualize data points. You can use default markers or specify custom markers in SVG format. The Orientation setting allows you to specify the direction of the lollipop lines (horizontal or vertical)..\n        /// </summary>\n        public static string ChartsLollipop {\n            get {\n                return ResourceManager.GetString(\"ChartsLollipop\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Data Grid adapts row height to fit cell contents. Text columns can display data in a single or multiple lines. Assign a TextEditor in-place editor (or its descendant) to a column, and enable text wrapping to display text in multiple lines..\n        /// </summary>\n        public static string DataGridAdaptsRowHeightToFitCellContentsTe {\n            get {\n                return ResourceManager.GetString(\"DataGridAdaptsRowHeightToFitCellContentsTe\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Column bands allow you to visually combine columns together by displaying shared headers above them. Both band and column headers can include text, images, or custom content. This demo showcases the following features:\n        /// • Band Generation from a Source — You can populate column bands from a band source defined in a View Model.\n        /// • Hierarchical Bands — The control allows you to create hierarchical bands with an unlimited number of nesting levels.\n        /// • Fixed Columns Support — Bands can work with fixed columns. [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string DataGridColumnBandsDescription {\n            get {\n                return ResourceManager.GetString(\"DataGridColumnBandsDescription\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates the Data Grid control&apos;s export functionality. Data Grid can export data to XLSX (Microsoft Excel) and PDF formats, while preserving data shaping options, including row grouping, sorting, and cell formatting..\n        /// </summary>\n        public static string DataGridExportDescription {\n            get {\n                return ResourceManager.GetString(\"DataGridExportDescription\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to To keep essential data in view during horizontal scrolling, you can fix (pin) columns to the left or right edge. Once fixed, these columns remain stationary while other data scrolls. Enable the built-in &apos;Fixed&apos; column menu to allow users to fix columns at runtime..\n        /// </summary>\n        public static string DataGridFixedColumnsDescription {\n            get {\n                return ResourceManager.GetString(\"DataGridFixedColumnsDescription\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Data Grid offers multiple ways to filter and search for data: \n        /// • Column Filter Menus: Hover over a column header and click the filter button to open a menu. You can apply filters to one or multiple columns simultaneously.\n        /// • Auto Filter Row: This dedicated row at the top allows you to type filter values directly into any column. The grid instantly displays only the records that match your input. \n        /// • Search Panel: Search for text across all columns. The Search Panel can be set to remain visible or ac [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string DataGridSupportsBuiltInDataSearchAndFiltra {\n            get {\n                return ResourceManager.GetString(\"DataGridSupportsBuiltInDataSearchAndFiltra\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Data Grid supports drag-and-drop operations within the control and to external controls (for instance, Tree List or another Data Grid).This example demonstrates drag-and-drop functionality within and between Data Grids. The AllowDragDrop option activates the drag-and-drop feature. {0}The AllowDragDropSortedRows option must be enabled to allow drag-and-drop operations for sorted/grouped Data Grids. When data is sorted or grouped, a drag-and-drop operation modifies values of a dragged row in sort columns. {1} [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string DataGridSupportsDragAndDropOperationsWithi {\n            get {\n                return ResourceManager.GetString(\"DataGridSupportsDragAndDropOperationsWithi\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to DataGrid supports multiple row selection mode, which allows you and your user to select (highlight) multiple rows at one time. Users can select multiple rows with the mouse and keyboard. Click rows while holding the CTRL and/or SHIFT key down for row selection..\n        /// </summary>\n        public static string DataGridSupportsMultipleRowSelectionModeWh {\n            get {\n                return ResourceManager.GetString(\"DataGridSupportsMultipleRowSelectionModeWh\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This demo shows how a chart control handles incomplete datasets with the help of &quot;empty points&quot;. These points allow you to create visible gaps in the series where values are missing. To specify an empty point, set its value to double.NaN, double.PositiveInfinity, or double.NegativeInfinity..\n        /// </summary>\n        public static string EmptyPoints {\n            get {\n                return ResourceManager.GetString(\"EmptyPoints\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Eremex editors are used in Tree List cells by default to display and edit cell values of common data types (Boolean, integer, enumerations, etc.). This demo shows implicitly assigned in-place editors, and demonstrates how you can explicitly specify an editor for a Tree List column..\n        /// </summary>\n        public static string EremexEditorsAreUsedInTreeListCellsByDefau {\n            get {\n                return ResourceManager.GetString(\"EremexEditorsAreUsedInTreeListCellsByDefau\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Eremex Tab Control can organize the contents of a bound item source into a tabbed UI. It supports tab re-ordering, multiple tab layout modes, and built-in buttons to add and close tabs..\n        /// </summary>\n        public static string EremexTabControlCanOrganizeTheContentsOfAB {\n            get {\n                return ResourceManager.GetString(\"EremexTabControlCanOrganizeTheContentsOfAB\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Exporting....\n        /// </summary>\n        public static string ExportProgressMessage {\n            get {\n                return ResourceManager.GetString(\"ExportProgressMessage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Do you want to open the exported file?.\n        /// </summary>\n        public static string ExportProgressPromptMessage {\n            get {\n                return ResourceManager.GetString(\"ExportProgressPromptMessage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Export.\n        /// </summary>\n        public static string ExportProgressTitle {\n            get {\n                return ResourceManager.GetString(\"ExportProgressTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Full Stacked Area series view (100% Stacked Area) shows proportional relationships between all data series. Each series is rendered as a filled area stacked on the previous one, with its thickness representing its percentage contribution to the total. The top line always indicates 100%..\n        /// </summary>\n        public static string FullStackedArea {\n            get {\n                return ResourceManager.GetString(\"FullStackedArea\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Graphics3DControl allows you to visualize and interact with 3D models. Use the Properties pane on the right to customize the control&apos;s basic rendering and behavior settings..\n        /// </summary>\n        public static string Graphics3DControlAllowsYouToVisualizeAndIn {\n            get {\n                return ResourceManager.GetString(\"Graphics3DControlAllowsYouToVisualizeAndIn\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Graphics3DControl supports model and mesh highlighting and selection. Highlighting draws a colored border around models or meshes when you hover over them with the mouse. With the selection feature, a colored border is painted around models or meshes when you click them. Use the HighlightMode and SelectionMode properties to choose whether highlighting/selection applies to models or meshes. The ShowHints property controls hint visibility for models and meshes..\n        /// </summary>\n        public static string HighlightingAndSelection3D {\n            get {\n                return ResourceManager.GetString(\"HighlightingAndSelection3D\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to In a Polar Chart each data point is determined by an angle and a distance. This example demonstrates constant lines and strips used to highlight specific values and value ranges. Angle ranges and distance ranges are set in code of this demo. Left-click within a diagram to create custom constant lines for angles. Right-click to create custom constant lines for distances..\n        /// </summary>\n        public static string InAPolarChartEachDataPointIsDeterminedByAn {\n            get {\n                return ResourceManager.GetString(\"InAPolarChartEachDataPointIsDeterminedByAn\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to In this demo, Data Grid emulates the Windows Task Manager by showing frequently updated fake processes. Data Grid supports automatic data updates if a bound item source implements the INotifyPropertyChanged interface. In this example, change notifications are supported for the underlying business object using the ObservableObject class (implements the INotifyPropertyChanged interface) and ObservableProperty attributes defined in the CommunityToolkit.Mvvm library..\n        /// </summary>\n        public static string InThisDemoDataGridEmulatesTheWindowsTaskMa {\n            get {\n                return ResourceManager.GetString(\"InThisDemoDataGridEmulatesTheWindowsTaskMa\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to In this demo, the Candlestick series view uses a special data adapter (SummaryCandlestickDataAdapter) that accepts raw tick data and builds candlesticks from it.\n        ///Raw ticks are single price values of an asset, taken at specific points in time. The data adapter aggregates the raw prices into candlesticks according to a specified time (measure) unit.\n        ///For instance, data can be aggregated to 1 second, 1 minute, 1 hour, 1 day, 1 week, etc. or to multiples of the selected time unit such as 5 seconds, 15 minutes, [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string InThisDemoTheCandlestickSeriesViewUsesASpe {\n            get {\n                return ResourceManager.GetString(\"InThisDemoTheCandlestickSeriesViewUsesASpe\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to In this example, a Graphics3DControl displays a 3D model with a textured material. Use the Materials pane on the right to choose the texture..\n        /// </summary>\n        public static string InThisExampleAGraphics3DControlDisplaysA3D {\n            get {\n                return ResourceManager.GetString(\"InThisExampleAGraphics3DControlDisplaysA3D\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to In this example the Heatmap control uses custom color encoding to visualize the intensity of a sample signal changing in real time. A chart control at the top displays the amplitude of this signal. The controls update seamlessly as the underlying data changes using a timer..\n        /// </summary>\n        public static string InThisExampleTheHeatmapControlUsesCustomCo {\n            get {\n                return ResourceManager.GetString(\"InThisExampleTheHeatmapControlUsesCustomCo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Graphics3DControl allows you to specify custom light sources for 3D scenes. Supported light types include: Point, Directional, Camera Point, and Camera Directional. Custom lights automatically disable the default light..\n        /// </summary>\n        public static string Lights {\n            get {\n                return ResourceManager.GetString(\"Lights\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Property Grid automatically detects the type of bound fields, and uses appropriate Eremex data editors to display and edit cell values. You can explicitly assign editors to specific fields to override the default behavior and customize editor settings..\n        /// </summary>\n        public static string PropertyGridAutomaticallyDetectsTheTypeOfB {\n            get {\n                return ResourceManager.GetString(\"PropertyGridAutomaticallyDetectsTheTypeOfB\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Property Grid tab rows allow you to group a set of fields into a tabbed UI. Each tab item in a row displays its own set of bound fields..\n        /// </summary>\n        public static string PropertyGridTabRowsAllowYouToGroupASetOfFi {\n            get {\n                return ResourceManager.GetString(\"PropertyGridTabRowsAllowYouToGroupASetOfFi\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Regardless of the number of columns and rows in the control, Data Grid remains responsive as you scroll the control horizontally or vertically, or sort/group its data. The built-in data virtualization mechanism updates only cells within the viewport to maintain high-performance scrolling.\n        /// </summary>\n        public static string RegardlessOfTheNumberOfColumnsAndRowsInThe {\n            get {\n                return ResourceManager.GetString(\"RegardlessOfTheNumberOfColumnsAndRowsInThe\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to RibbonControl allows you to integrate Microsoft Office-inspired navigation menus into your Avalonia UI applications. The control comes with two views: Classic (three item rows) and Simplified (one item row). The dropdown button at the control&apos;s bottom right corner opens a selector between these views. {0}RibbonControl supports multiple item types: large and small buttons, check buttons, sub-menus, in-place editors, inline and dropdown galleries, groups of buttons, and more. You can create as many pages with [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string RibbonControlAllowsYouToIntegrateMicrosoft {\n            get {\n                return ResourceManager.GetString(\"RibbonControlAllowsYouToIntegrateMicrosoft\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This demo showcases a 3D robotic arm loaded from an FBX file. Using the interactive panel on the right, you can manipulate each joint (from the base to the claw) by applying transformations to nested 3D models. Model by Ryan King Art https://sketchfab.com/ryankingart..\n        /// </summary>\n        public static string RobotArm {\n            get {\n                return ResourceManager.GetString(\"RobotArm\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Graphics3DControl supports the skybox feature, which provides a background for 3D scenes. The skybox is a large cube surrounding the entire scene, with six textured faces (front, back, left, right, top, and bottom). These textures are mapped to the cube&apos;s inner sides, creating the illusion of a distant sky, horizon, or backdrop..\n        /// </summary>\n        public static string Skybox {\n            get {\n                return ResourceManager.GetString(\"Skybox\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Split Container Control allows you to place content onto two panels, and separate the panels with a splitter that a user can drag to resize the panels. With the panel collapse feature enabled, the user can click the splitter to collapse and restore a panel..\n        /// </summary>\n        public static string SplitContainerControlAllowsYouToPlaceConte {\n            get {\n                return ResourceManager.GetString(\"SplitContainerControlAllowsYouToPlaceConte\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Stacked Area series view shows absolute relationships between all data series. Each series is rendered as a filled area stacked on the previous one, with its thickness representing its absolute value. The top line shows the cumulative total of all series..\n        /// </summary>\n        public static string StackedArea {\n            get {\n                return ResourceManager.GetString(\"StackedArea\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This demo showcases a 3D model of a circuit board rendered in the Graphics3DControl. The example shows how you can import a complex model from an STL file using the Assimp library. The loaded geometry is used to initialize meshes, vertices and materials in the Graphics3DControl..\n        /// </summary>\n        public static string STL {\n            get {\n                return ResourceManager.GetString(\"STL\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Area series view allows you display filled areas. This view is helpful when you need to visually compare two or more data series..\n        /// </summary>\n        public static string TheAreaSeriesViewAllowsYouDisplayFilledAre {\n            get {\n                return ResourceManager.GetString(\"TheAreaSeriesViewAllowsYouDisplayFilledAre\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Area series view allows you display filled areas between a chart and point Zero. This view is helpful when you need to visually compare two or more data series..\n        /// </summary>\n        public static string TheAreaSeriesViewAllowsYouDisplayFilledAre1 {\n            get {\n                return ResourceManager.GetString(\"TheAreaSeriesViewAllowsYouDisplayFilledAre1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Candlestick series view allows you to create a financial chart that describes price movements of an asset. For each time period, the chart displays a data set that contains Open, Close, High and Low values.\n        ///\n        ///Stock data: https://www.investing.com/.\n        /// </summary>\n        public static string TheCandlestickSeriesViewAllowsYouToCreateA {\n            get {\n                return ResourceManager.GetString(\"TheCandlestickSeriesViewAllowsYouToCreateA\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Chart Control&apos;s graphics rendering is optimized to display large data. The control provides high performance even when series contain millions of points.\n        /// </summary>\n        public static string TheChartControlSGraphicsRenderingIsOptimiz {\n            get {\n                return ResourceManager.GetString(\"TheChartControlSGraphicsRenderingIsOptimiz\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Chart Control supports instant display of rapidly changing real-time data. This example shows how to use a special data adapter to implement a moving viewport..\n        /// </summary>\n        public static string TheChartControlSupportsInstantDisplayOfRap {\n            get {\n                return ResourceManager.GetString(\"TheChartControlSupportsInstantDisplayOfRap\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Color Editor and Popup Color Editor controls allow a user to select a color. The controls support three color palettes: default (customizable in code), standard (fixed colors), and custom (customizable by users). The built-in Color Picker helps the user add custom colors from a color space, or specify color values in the RGB and HSB formats..\n        /// </summary>\n        public static string TheColorEditorAndPopupColorEditorControlsA {\n            get {\n                return ResourceManager.GetString(\"TheColorEditorAndPopupColorEditorControlsA\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The ComboBox Editor features a dropdown list of items from which a user can select one or more items. The editor can display a list of strings, a list of business objects, or enumeration values. In multi-select mode, item check boxes allow the user to select multiple items at a time..\n        /// </summary>\n        public static string TheComboBoxEditorFeaturesADropdownListOfIt {\n            get {\n                return ResourceManager.GetString(\"TheComboBoxEditorFeaturesADropdownListOfIt\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Data Grid&apos;s grouping feature makes it easy to summarize information for users. They can group data by an unlimited number of columns by dragging columns onto the Group Panel..\n        /// </summary>\n        public static string TheDataGridSGroupingFeatureMakesItEasyToSu {\n            get {\n                return ResourceManager.GetString(\"TheDataGridSGroupingFeatureMakesItEasyToSu\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The data validation mechanism allows you to check cell values and show errors in cells that contain invalid data. You can use DataAnnotation attributes and IDataErrorInfo/INotifyDataErrorInfo interface to validate data at the ItemsSource level. Toggle the &apos;Show ItemsSource Errors&apos; checkbox in this demo to see data validation errors from DataAnnotation attributes. Data Grid also allows you to use the ValidateCellValue event to implement custom rules to validate user input..\n        /// </summary>\n        public static string TheDataValidationMechanismAllowsYouToCheck {\n            get {\n                return ResourceManager.GetString(\"TheDataValidationMechanismAllowsYouToCheck\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Date Editor features a dropdown calendar that allows users to select a date. The calendar&apos;s navigation bar enables the user to browse through months and years. DateEditor uses a date-time mask to restrict user input to date-time values only, and to format the edit value according to the specified pattern..\n        /// </summary>\n        public static string TheDateEditorFeaturesADropdownCalendarThat {\n            get {\n                return ResourceManager.GetString(\"TheDateEditorFeaturesADropdownCalendarThat\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Dock Manager component allows you to implement the classic docking UI found in popular IDEs. You can create tool panels that support dock, auto-hide, and float operations. Special Document containers are designed to display the main content of your window. You can create multiple Documents and organize them into a tabbed UI..\n        /// </summary>\n        public static string TheDockManagerComponentAllowsYouToImplemen {\n            get {\n                return ResourceManager.GetString(\"TheDockManagerComponentAllowsYouToImplemen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Editors library includes the Text Editor and Button Editor controls that provide base text editing capabilities: data validation, watermarks (hints displayed when the editor is empty), and multiple options to control text selection and data edit operations. The Button Editor supports an unlimited number of built-in regular and check buttons, which can display text or images at the left or right edge of the edit box..\n        /// </summary>\n        public static string TheEditorsLibraryIncludesTheTextEditorAndB {\n            get {\n                return ResourceManager.GetString(\"TheEditorsLibraryIncludesTheTextEditorAndB\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Eremex Controls library includes multiple editors that provide you with advanced data editing capabilities. The editors allow you to display and edit data of different data types (numeric, Boolean, date-time, enumerations, etc.). They support the data validation mechanism, styling, and embedding in container controls (Data Grid, Tree List, Property Grid, and Toolbars/Menus)..\n        /// </summary>\n        public static string TheEremexControlsLibraryIncludesMultipleEd {\n            get {\n                return ResourceManager.GetString(\"TheEremexControlsLibraryIncludesMultipleEd\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Hyperlink Editor displays its content as a hyperlink. The editor supports manual (default) and automatic hyperlink processing. A dedicated command or event allows you to manually handle hyperlink clicks. Enable automatic hyperlink navigation to allow the editor to automatically execute a link on a click..\n        /// </summary>\n        public static string TheHyperlinkEditorDisplaysItsContentAsAHyp {\n            get {\n                return ResourceManager.GetString(\"TheHyperlinkEditorDisplaysItsContentAsAHyp\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Line series view shown in this example allows you to draw a chart by connecting points with lines..\n        /// </summary>\n        public static string TheLineSeriesViewShownInThisExampleAllowsY {\n            get {\n                return ResourceManager.GetString(\"TheLineSeriesViewShownInThisExampleAllowsY\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Line series view shown in this example allows you to draw a chart by connecting points with lines..\n        /// </summary>\n        public static string TheLineSeriesViewShownInThisExampleAllowsY1 {\n            get {\n                return ResourceManager.GetString(\"TheLineSeriesViewShownInThisExampleAllowsY1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The MxMessageBox dialog allows you to display messages and ask questions to users. The dialog supports the Eremex paint themes, and it looks consistent with other EMX Controls in your project. Use the visual elements on the right to customize and show a sample message box..\n        /// </summary>\n        public static string TheMxMessageBoxDialogAllowsYouToDisplayMes {\n            get {\n                return ResourceManager.GetString(\"TheMxMessageBoxDialogAllowsYouToDisplayMes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Scatter Line series view is useful when you need to connect points in the order in which they appear in the data series..\n        /// </summary>\n        public static string TheScatterLineSeriesViewIsUsefulWhenYouNee {\n            get {\n                return ResourceManager.GetString(\"TheScatterLineSeriesViewIsUsefulWhenYouNee\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Scatter Line series view is useful when you need to connect points in the order in which they appear in the data series..\n        /// </summary>\n        public static string TheScatterLineSeriesViewIsUsefulWhenYouNee1 {\n            get {\n                return ResourceManager.GetString(\"TheScatterLineSeriesViewIsUsefulWhenYouNee1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Scatter Line series view is useful when you need to connect points in the order in which they appear in the data series..\n        /// </summary>\n        public static string TheScatterLineSeriesViewIsUsefulWhenYouNee2 {\n            get {\n                return ResourceManager.GetString(\"TheScatterLineSeriesViewIsUsefulWhenYouNee2\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Spin Editor is a numeric value editor with built-in spin buttons used to increase and decrease a number by a specific value (increment). A user can increment and decrement the number by clicking these buttons, or by pressing the Up and Down Arrows on the keyboard. SpinEditor uses a numeric mask to restrict user input to numeric values only, and to format the edit value according to the specified pattern..\n        /// </summary>\n        public static string TheSpinEditorIsANumericValueEditorWithBuil {\n            get {\n                return ResourceManager.GetString(\"TheSpinEditorIsANumericValueEditorWithBuil\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Step Area series view connects points with horizontal and vertical line segments, and fills the area between the lines and the X-axis with a specified color..\n        /// </summary>\n        public static string TheStepAreaSeriesViewConnectsPointsWithHor {\n            get {\n                return ResourceManager.GetString(\"TheStepAreaSeriesViewConnectsPointsWithHor\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The ToolbarManager component allows you to implement a classic toolbar and menu UI. You can dock toolbars not only at the edges of the window, but also at any specified position. Users can customize the toolbar layout using drag-and-drop operations. They can also display the Customization Window to access all (hidden and visible) toolbar items, and move the items using drag-and-drop operations..\n        /// </summary>\n        public static string TheToolbarManagerComponentAllowsYouToImple {\n            get {\n                return ResourceManager.GetString(\"TheToolbarManagerComponentAllowsYouToImple\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Toolbars &amp; Menu library contains a PopupMenu component that you can use to attach a context menu to any control. Eremex context menu style settings are consistent with all toolbar library components..\n        /// </summary>\n        public static string TheToolbarsMenuLibraryContainsAPopupMenuCo {\n            get {\n                return ResourceManager.GetString(\"TheToolbarsMenuLibraryContainsAPopupMenuCo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The TreeList and TreeView controls support multiple node selection mode, which allows you and your user to select (highlight) multiple nodes at one time. Users can select multiple nodes with the mouse and keyboard. Click nodes while holding the CTRL and/or SHIFT key down for node selection..\n        /// </summary>\n        public static string TheTreeListAndTreeViewControlsSupportMulti {\n            get {\n                return ResourceManager.GetString(\"TheTreeListAndTreeViewControlsSupportMulti\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The Tree List control offers multiple ways to filter and search for data: \n        /// • Column Filter Menus: Hover over a column header and click the filter button to open a menu. You can apply filters to one or multiple columns simultaneously.\n        /// • Auto Filter Row: This dedicated row at the top allows you to type filter values directly into any column. The control instantly displays only the records that match your input.\n        /// • Search Panel: Search for text across all columns. The Search Panel can be set to remain vis [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string TheTreeListSAutoFilterRowDisplayedAtTheTop {\n            get {\n                return ResourceManager.GetString(\"TheTreeListSAutoFilterRowDisplayedAtTheTop\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This demo shows constant lines and strips used to highlight specific values and value ranges in the CartesianChart control.\n        ///Right-click within the diagram to create a custom constant line for the X-axis..\n        /// </summary>\n        public static string ThisDemoShowsConstantLinesAndStripsUsedToH {\n            get {\n                return ResourceManager.GetString(\"ThisDemoShowsConstantLinesAndStripsUsedToH\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates a Graphics3DControl displaying a 3D model with a simple material. Use the Properties pane on the right to customize the material settings..\n        /// </summary>\n        public static string ThisExampleDemonstratesAGraphics3DControlD1 {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesAGraphics3DControlD1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates a Graphics3DControl that renders a 3D model using lines..\n        /// </summary>\n        public static string ThisExampleDemonstratesAGraphics3DControlT {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesAGraphics3DControlT\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates a Graphics3DControl that renders a 3D model using points..\n        /// </summary>\n        public static string ThisExampleDemonstratesAGraphics3DControlT1 {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesAGraphics3DControlT1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates dynamic transformations applied to 3D Models in a Graphics3DControl..\n        /// </summary>\n        public static string ThisExampleDemonstratesDynamicTransformati {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesDynamicTransformati\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates the isometric and perspective cameras supported by Graphics3DControl. Use the Camera pane on the right to choose camera mode and one of predefined camera views..\n        /// </summary>\n        public static string ThisExampleDemonstratesTheIsometricAndPers {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesTheIsometricAndPers\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates the Point series view, which allows you to plot individual points..\n        /// </summary>\n        public static string ThisExampleDemonstratesThePointSeriesViewW {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesThePointSeriesViewW\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates the Point series view, which allows you to plot individual points..\n        /// </summary>\n        public static string ThisExampleDemonstratesThePointSeriesViewW1 {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesThePointSeriesViewW1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates the Point series view, which allows you to plot individual points on the Smith diagram..\n        /// </summary>\n        public static string ThisExampleDemonstratesThePointSeriesViewW2 {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesThePointSeriesViewW2\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates the Side-by-side Bar series view which visualizes data as a set of rectangular bars..\n        /// </summary>\n        public static string ThisExampleDemonstratesTheSideBySideBarSer {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesTheSideBySideBarSer\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This example demonstrates the Step Line series view, which connects points with horizontal and vertical line segments..\n        /// </summary>\n        public static string ThisExampleDemonstratesTheStepLineSeriesVi {\n            get {\n                return ResourceManager.GetString(\"ThisExampleDemonstratesTheStepLineSeriesVi\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Column bands allow you to visually combine columns together by displaying shared headers above them. Both band and column headers can include text, images, or custom content. The control allows you to create hierarchical bands with an unlimited number of nesting levels..\n        /// </summary>\n        public static string TreeListColumnBandsDescription {\n            get {\n                return ResourceManager.GetString(\"TreeListColumnBandsDescription\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to TreeList can export data to XLSX (Microsoft Excel) and PDF formats. The Excel export feature is data-aware — it preserves the control&apos;s data shaping configuration (node hierarchy, data sorting, and value formatting) in the output XLSX document. The PDF rendering engine follows the WYSIWYG concept, which ensures the layout of TreeList elements is accurately reproduced in the output document..\n        /// </summary>\n        public static string TreeListExportDescription {\n            get {\n                return ResourceManager.GetString(\"TreeListExportDescription\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This demo emulates a dynamic mortgage calculator, built with the Data Grid and Cartersian Chart controls. Data Grid presents a detailed payment schedule as a table. The synchronized chart plots this data to show the relationship between principal and interest over the life of the loan..\n        /// </summary>\n        public static string UseCasesGroupInfo_Desc {\n            get {\n                return ResourceManager.GetString(\"UseCasesGroupInfo_Desc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Use MemoEditor to display and edit large text in a popup window, with or without text wrapping enabled. The IsTextEditable property allows you to prevent text editing in the edit box. When the property is false, the edit box can display a special icon that indicates the presence of text in the popup..\n        /// </summary>\n        public static string UseMemoEditorToDisplayAndEditLargeTextInAP {\n            get {\n                return ResourceManager.GetString(\"UseMemoEditorToDisplayAndEditLargeTextInAP\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This demo is only available in Desktop mode. Download the .\n        /// </summary>\n        public static string WASMOnlyText1 {\n            get {\n                return ResourceManager.GetString(\"WASMOnlyText1\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to solution and run the DemoCenter.Desktop project to see this demo..\n        /// </summary>\n        public static string WASMOnlyText2 {\n            get {\n                return ResourceManager.GetString(\"WASMOnlyText2\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You can bind Tree List to a hierarchical data source, which returns child data through a collection property or special data selector. This demo shows how to create a selector that supplies the hierarchical structure of folders on your disk..\n        /// </summary>\n        public static string YouCanBindTreeListToAHierarchicalDataSourc {\n            get {\n                return ResourceManager.GetString(\"YouCanBindTreeListToAHierarchicalDataSourc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You can create ComboBox and Segmented Editors&apos; items from enumeration type values. Dedicated Data Annotation attributes applied to the enumeration values allow you to populate the controls&apos; items with images, display text and tooltips..\n        /// </summary>\n        public static string YouCanCreateComboBoxAndSegmentedEditorsIte {\n            get {\n                return ResourceManager.GetString(\"YouCanCreateComboBoxAndSegmentedEditorsIte\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You can embed any control in Data Grid cells to present and edit cell data in the way you want. This demo demonstrates Eremex in-place editors: DateEditor, SpinEditor, and ComboBoxEditor. Data Grid boasts enhanced performance when you use Eremex editors in cells, particularly for large data sources..\n        /// </summary>\n        public static string YouCanEmbedAnyControlInDataGridCellsToPres {\n            get {\n                return ResourceManager.GetString(\"YouCanEmbedAnyControlInDataGridCellsToPres\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You can use the Segmented Editor to present a set of options as horizontally arranged segments. A user can click one of the segments to select a corresponding option, or CTRL-click on a selected segment to clear the selection. The editor allows you to populate segments from a list of strings, a list of business objects, or an enumeration type..\n        /// </summary>\n        public static string YouCanUseTheSegmentedEditorToPresentASetOf {\n            get {\n                return ResourceManager.GetString(\"YouCanUseTheSegmentedEditorToPresentASetOf\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"EremexTabControlCanOrganizeTheContentsOfAB\" xml:space=\"preserve\">\n    <value>Eremex Tab Control can organize the contents of a bound item source into a tabbed UI. It supports tab re-ordering, multiple tab layout modes, and built-in buttons to add and close tabs.</value>\n  </data>\n  <data name=\"TheMxMessageBoxDialogAllowsYouToDisplayMes\" xml:space=\"preserve\">\n    <value>The MxMessageBox dialog allows you to display messages and ask questions to users. The dialog supports the Eremex paint themes, and it looks consistent with other EMX Controls in your project. Use the visual elements on the right to customize and show a sample message box.</value>\n  </data>\n  <data name=\"SplitContainerControlAllowsYouToPlaceConte\" xml:space=\"preserve\">\n    <value>Split Container Control allows you to place content onto two panels, and separate the panels with a splitter that a user can drag to resize the panels. With the panel collapse feature enabled, the user can click the splitter to collapse and restore a panel.</value>\n  </data>\n  <data name=\"TheDockManagerComponentAllowsYouToImplemen\" xml:space=\"preserve\">\n    <value>The Dock Manager component allows you to implement the classic docking UI found in popular IDEs. You can create tool panels that support dock, auto-hide, and float operations. Special Document containers are designed to display the main content of your window. You can create multiple Documents and organize them into a tabbed UI.</value>\n  </data>\n  <data name=\"TheToolbarManagerComponentAllowsYouToImple\" xml:space=\"preserve\">\n    <value>The ToolbarManager component allows you to implement a classic toolbar and menu UI. You can dock toolbars not only at the edges of the window, but also at any specified position. Users can customize the toolbar layout using drag-and-drop operations. They can also display the Customization Window to access all (hidden and visible) toolbar items, and move the items using drag-and-drop operations.</value>\n  </data>\n  <data name=\"TheToolbarsMenuLibraryContainsAPopupMenuCo\" xml:space=\"preserve\">\n    <value>The Toolbars &amp; Menu library contains a PopupMenu component that you can use to attach a context menu to any control. Eremex context menu style settings are consistent with all toolbar library components.</value>\n  </data>\n  <data name=\"TheChartControlSupportsInstantDisplayOfRap\" xml:space=\"preserve\">\n    <value>The Chart Control supports instant display of rapidly changing real-time data. This example shows how to use a special data adapter to implement a moving viewport.</value>\n  </data>\n  <data name=\"TheChartControlSGraphicsRenderingIsOptimiz\" xml:space=\"preserve\">\n    <value>The Chart Control's graphics rendering is optimized to display large data. The control provides high performance even when series contain millions of points</value>\n  </data>\n  <data name=\"CartesianChartMultipleAxes\" xml:space=\"preserve\">\n    <value>This example demonstrates multiple axes in the CartesianChart control, along with the options to customize axis layout, position, labels, gridlines, and more.\n• Multiple Axes — The chart control allows you to create multiple X and Y axes and bind each data series to its own axes.\n• Axis Position — You can display specific X or Y axes opposite their default locations: X axes at the top, and Y axes at the right. \n• Swap Axes — With a single property, you can transpose the axes, so the Y axes are displayed horizontally and the X axes vertically.\n• Reverse Axis Direction — For individual axes, you can change the order of values from default (left-to-right and bottom-to-top) to reversed (right-to-left and top-to-bottom). \n• Scroll and Zoom Axes — You can click and drag with the mouse or use the mouse wheel over individual axes to scroll and zoom these axes, without affecting other axes.</value>\n  </data>\n  <data name=\"ChartControlSupportsLogarithmicScalesForAn\" xml:space=\"preserve\">\n    <value>Chart Control supports logarithmic scales for any of its numeric axes. Log base 10 is default. You can specify a custom log base to change data scaling.</value>\n  </data>\n  <data name=\"ThisDemoShowsConstantLinesAndStripsUsedToH\" xml:space=\"preserve\">\n    <value>This demo shows constant lines and strips used to highlight specific values and value ranges in the CartesianChart control.\nRight-click within the diagram to create a custom constant line for the X-axis.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW\" xml:space=\"preserve\">\n    <value>This example demonstrates the Point series view, which allows you to plot individual points.</value>\n  </data>\n  <data name=\"TheLineSeriesViewShownInThisExampleAllowsY\" xml:space=\"preserve\">\n    <value>The Line series view shown in this example allows you to draw a chart by connecting points with lines.</value>\n  </data>\n  <data name=\"TheAreaSeriesViewAllowsYouDisplayFilledAre\" xml:space=\"preserve\">\n    <value>The Area series view allows you display filled areas. This view is helpful when you need to visually compare two or more data series.</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee\" xml:space=\"preserve\">\n    <value>The Scatter Line series view is useful when you need to connect points in the order in which they appear in the data series.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheStepLineSeriesVi\" xml:space=\"preserve\">\n    <value>This example demonstrates the Step Line series view, which connects points with horizontal and vertical line segments.</value>\n  </data>\n  <data name=\"TheStepAreaSeriesViewConnectsPointsWithHor\" xml:space=\"preserve\">\n    <value>The Step Area series view connects points with horizontal and vertical line segments, and fills the area between the lines and the X-axis with a specified color.</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues\" xml:space=\"preserve\">\n    <value>A data series in this example contains two Y-values for each data point. The Range Area view fills the area between these Y-values.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheSideBySideBarSer\" xml:space=\"preserve\">\n    <value>This example demonstrates the Side-by-side Bar series view which visualizes data as a set of rectangular bars.</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues1\" xml:space=\"preserve\">\n    <value>A data series in this example contains two Y-values for each data point. The Side-by-side Range Bar view draws rectangular bars between these Y-values.</value>\n  </data>\n  <data name=\"TheCandlestickSeriesViewAllowsYouToCreateA\" xml:space=\"preserve\">\n    <value>The Candlestick series view allows you to create a financial chart that describes price movements of an asset. For each time period, the chart displays a data set that contains Open, Close, High and Low values.\n\nStock data: https://www.investing.com/</value>\n  </data>\n  <data name=\"InThisDemoTheCandlestickSeriesViewUsesASpe\" xml:space=\"preserve\">\n    <value>In this demo, the Candlestick series view uses a special data adapter (SummaryCandlestickDataAdapter) that accepts raw tick data and builds candlesticks from it.\nRaw ticks are single price values of an asset, taken at specific points in time. The data adapter aggregates the raw prices into candlesticks according to a specified time (measure) unit.\nFor instance, data can be aggregated to 1 second, 1 minute, 1 hour, 1 day, 1 week, etc. or to multiples of the selected time unit such as 5 seconds, 15 minutes, 2 days, etc.</value>\n  </data>\n  <data name=\"TheDataGridSGroupingFeatureMakesItEasyToSu\" xml:space=\"preserve\">\n    <value>The Data Grid's grouping feature makes it easy to summarize information for users. They can group data by an unlimited number of columns by dragging columns onto the Group Panel.</value>\n  </data>\n  <data name=\"YouCanEmbedAnyControlInDataGridCellsToPres\" xml:space=\"preserve\">\n    <value>You can embed any control in Data Grid cells to present and edit cell data in the way you want. This demo demonstrates Eremex in-place editors: DateEditor, SpinEditor, and ComboBoxEditor. Data Grid boasts enhanced performance when you use Eremex editors in cells, particularly for large data sources.</value>\n  </data>\n  <data name=\"TheDataValidationMechanismAllowsYouToCheck\" xml:space=\"preserve\">\n    <value>The data validation mechanism allows you to check cell values and show errors in cells that contain invalid data. You can use DataAnnotation attributes and IDataErrorInfo/INotifyDataErrorInfo interface to validate data at the ItemsSource level. Toggle the 'Show ItemsSource Errors' checkbox in this demo to see data validation errors from DataAnnotation attributes. Data Grid also allows you to use the ValidateCellValue event to implement custom rules to validate user input.</value>\n  </data>\n  <data name=\"DataGridSupportsBuiltInDataSearchAndFiltra\" xml:space=\"preserve\">\n    <value>The Data Grid offers multiple ways to filter and search for data: \n • Column Filter Menus: Hover over a column header and click the filter button to open a menu. You can apply filters to one or multiple columns simultaneously.\n • Auto Filter Row: This dedicated row at the top allows you to type filter values directly into any column. The grid instantly displays only the records that match your input. \n • Search Panel: Search for text across all columns. The Search Panel can be set to remain visible or activated with the Ctrl+F shortcut. Matching records are shown, and the text is highlighted within cells. \n • Filtering in Code: For advanced scenarios, you can create custom filter criteria and apply them programmatically using the control's API.</value>\n  </data>\n  <data name=\"RegardlessOfTheNumberOfColumnsAndRowsInThe\" xml:space=\"preserve\">\n    <value>Regardless of the number of columns and rows in the control, Data Grid remains responsive as you scroll the control horizontally or vertically, or sort/group its data. The built-in data virtualization mechanism updates only cells within the viewport to maintain high-performance scrolling</value>\n  </data>\n  <data name=\"DataGridAdaptsRowHeightToFitCellContentsTe\" xml:space=\"preserve\">\n    <value>Data Grid adapts row height to fit cell contents. Text columns can display data in a single or multiple lines. Assign a TextEditor in-place editor (or its descendant) to a column, and enable text wrapping to display text in multiple lines.</value>\n  </data>\n  <data name=\"InThisDemoDataGridEmulatesTheWindowsTaskMa\" xml:space=\"preserve\">\n    <value>In this demo, Data Grid emulates the Windows Task Manager by showing frequently updated fake processes. Data Grid supports automatic data updates if a bound item source implements the INotifyPropertyChanged interface. In this example, change notifications are supported for the underlying business object using the ObservableObject class (implements the INotifyPropertyChanged interface) and ObservableProperty attributes defined in the CommunityToolkit.Mvvm library.</value>\n  </data>\n  <data name=\"DataGridSupportsMultipleRowSelectionModeWh\" xml:space=\"preserve\">\n    <value>DataGrid supports multiple row selection mode, which allows you and your user to select (highlight) multiple rows at one time. Users can select multiple rows with the mouse and keyboard. Click rows while holding the CTRL and/or SHIFT key down for row selection.</value>\n  </data>\n  <data name=\"DataGridFixedColumnsDescription\" xml:space=\"preserve\">\n    <value>To keep essential data in view during horizontal scrolling, you can fix (pin) columns to the left or right edge. Once fixed, these columns remain stationary while other data scrolls. Enable the built-in 'Fixed' column menu to allow users to fix columns at runtime.</value>\n  </data>\n  <data name=\"DataGridSupportsDragAndDropOperationsWithi\" xml:space=\"preserve\">\n    <value>Data Grid supports drag-and-drop operations within the control and to external controls (for instance, Tree List or another Data Grid).This example demonstrates drag-and-drop functionality within and between Data Grids. The AllowDragDrop option activates the drag-and-drop feature. {0}The AllowDragDropSortedRows option must be enabled to allow drag-and-drop operations for sorted/grouped Data Grids. When data is sorted or grouped, a drag-and-drop operation modifies values of a dragged row in sort columns. {1}In this example, the controls are bound to collections that contain the same business objects. This ensures automatic row movement during drag-and-drop operations from the source to the target grid. When you move a row from one grid to another, a corresponding item is moved between item sources of the two grid controls.</value>\n  </data>\n  <data name=\"DataGridColumnBandsDescription\" xml:space=\"preserve\">\n    <value>Column bands allow you to visually combine columns together by displaying shared headers above them. Both band and column headers can include text, images, or custom content. This demo showcases the following features:\n • Band Generation from a Source — You can populate column bands from a band source defined in a View Model.\n • Hierarchical Bands — The control allows you to create hierarchical bands with an unlimited number of nesting levels.\n • Fixed Columns Support — Bands can work with fixed columns. When you pin (fix) a column, both the column and its band remain stationary during horizontal scrolling.</value>\n  </data>\n  <data name=\"TheEremexControlsLibraryIncludesMultipleEd\" xml:space=\"preserve\">\n    <value>The Eremex Controls library includes multiple editors that provide you with advanced data editing capabilities. The editors allow you to display and edit data of different data types (numeric, Boolean, date-time, enumerations, etc.). They support the data validation mechanism, styling, and embedding in container controls (Data Grid, Tree List, Property Grid, and Toolbars/Menus).</value>\n  </data>\n  <data name=\"TheEditorsLibraryIncludesTheTextEditorAndB\" xml:space=\"preserve\">\n    <value>The Editors library includes the Text Editor and Button Editor controls that provide base text editing capabilities: data validation, watermarks (hints displayed when the editor is empty), and multiple options to control text selection and data edit operations. The Button Editor supports an unlimited number of built-in regular and check buttons, which can display text or images at the left or right edge of the edit box.</value>\n  </data>\n  <data name=\"TheSpinEditorIsANumericValueEditorWithBuil\" xml:space=\"preserve\">\n    <value>The Spin Editor is a numeric value editor with built-in spin buttons used to increase and decrease a number by a specific value (increment). A user can increment and decrement the number by clicking these buttons, or by pressing the Up and Down Arrows on the keyboard. SpinEditor uses a numeric mask to restrict user input to numeric values only, and to format the edit value according to the specified pattern.</value>\n  </data>\n  <data name=\"TheComboBoxEditorFeaturesADropdownListOfIt\" xml:space=\"preserve\">\n    <value>The ComboBox Editor features a dropdown list of items from which a user can select one or more items. The editor can display a list of strings, a list of business objects, or enumeration values. In multi-select mode, item check boxes allow the user to select multiple items at a time.</value>\n  </data>\n  <data name=\"YouCanUseTheSegmentedEditorToPresentASetOf\" xml:space=\"preserve\">\n    <value>You can use the Segmented Editor to present a set of options as horizontally arranged segments. A user can click one of the segments to select a corresponding option, or CTRL-click on a selected segment to clear the selection. The editor allows you to populate segments from a list of strings, a list of business objects, or an enumeration type.</value>\n  </data>\n  <data name=\"TheDateEditorFeaturesADropdownCalendarThat\" xml:space=\"preserve\">\n    <value>The Date Editor features a dropdown calendar that allows users to select a date. The calendar's navigation bar enables the user to browse through months and years. DateEditor uses a date-time mask to restrict user input to date-time values only, and to format the edit value according to the specified pattern.</value>\n  </data>\n  <data name=\"TheColorEditorAndPopupColorEditorControlsA\" xml:space=\"preserve\">\n    <value>The Color Editor and Popup Color Editor controls allow a user to select a color. The controls support three color palettes: default (customizable in code), standard (fixed colors), and custom (customizable by users). The built-in Color Picker helps the user add custom colors from a color space, or specify color values in the RGB and HSB formats.</value>\n  </data>\n  <data name=\"TheHyperlinkEditorDisplaysItsContentAsAHyp\" xml:space=\"preserve\">\n    <value>The Hyperlink Editor displays its content as a hyperlink. The editor supports manual (default) and automatic hyperlink processing. A dedicated command or event allows you to manually handle hyperlink clicks. Enable automatic hyperlink navigation to allow the editor to automatically execute a link on a click.</value>\n  </data>\n  <data name=\"YouCanCreateComboBoxAndSegmentedEditorsIte\" xml:space=\"preserve\">\n    <value>You can create ComboBox and Segmented Editors' items from enumeration type values. Dedicated Data Annotation attributes applied to the enumeration values allow you to populate the controls' items with images, display text and tooltips.</value>\n  </data>\n  <data name=\"UseMemoEditorToDisplayAndEditLargeTextInAP\" xml:space=\"preserve\">\n    <value>Use MemoEditor to display and edit large text in a popup window, with or without text wrapping enabled. The IsTextEditable property allows you to prevent text editing in the edit box. When the property is false, the edit box can display a special icon that indicates the presence of text in the popup.</value>\n  </data>\n  <data name=\"Graphics3DControlAllowsYouToVisualizeAndIn\" xml:space=\"preserve\">\n    <value>Graphics3DControl allows you to visualize and interact with 3D models. Use the Properties pane on the right to customize the control's basic rendering and behavior settings.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlT\" xml:space=\"preserve\">\n    <value>This example demonstrates a Graphics3DControl that renders a 3D model using lines.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlT1\" xml:space=\"preserve\">\n    <value>This example demonstrates a Graphics3DControl that renders a 3D model using points.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesDynamicTransformati\" xml:space=\"preserve\">\n    <value>This example demonstrates dynamic transformations applied to 3D Models in a Graphics3DControl.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlD1\" xml:space=\"preserve\">\n    <value>This example demonstrates a Graphics3DControl displaying a 3D model with a simple material. Use the Properties pane on the right to customize the material settings.</value>\n  </data>\n  <data name=\"InThisExampleAGraphics3DControlDisplaysA3D\" xml:space=\"preserve\">\n    <value>In this example, a Graphics3DControl displays a 3D model with a textured material. Use the Materials pane on the right to choose the texture.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheIsometricAndPers\" xml:space=\"preserve\">\n    <value>This example demonstrates the isometric and perspective cameras supported by Graphics3DControl. Use the Camera pane on the right to choose camera mode and one of predefined camera views.</value>\n  </data>\n  <data name=\"AHeatmapRendersA2DimensionalArrayOfValuesA\" xml:space=\"preserve\">\n    <value>A heatmap renders a 2-dimensional array of values as a color-encoded matrix. Each data point's color corresponds to the data point's value. This example demonstrates the Heatmap control which allows you to create heatmaps from your data. Click a color gradient on the right to apply this color encoding to the heatmap.\n\nImage source: Webb Space Telescope, https://webbtelescope.org/</value>\n  </data>\n  <data name=\"InThisExampleTheHeatmapControlUsesCustomCo\" xml:space=\"preserve\">\n    <value>In this example the Heatmap control uses custom color encoding to visualize the intensity of a sample signal changing in real time. A chart control at the top displays the amplitude of this signal. The controls update seamlessly as the underlying data changes using a timer.</value>\n  </data>\n  <data name=\"InAPolarChartEachDataPointIsDeterminedByAn\" xml:space=\"preserve\">\n    <value>In a Polar Chart each data point is determined by an angle and a distance. This example demonstrates constant lines and strips used to highlight specific values and value ranges. Angle ranges and distance ranges are set in code of this demo. Left-click within a diagram to create custom constant lines for angles. Right-click to create custom constant lines for distances.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW1\" xml:space=\"preserve\">\n    <value>This example demonstrates the Point series view, which allows you to plot individual points.</value>\n  </data>\n  <data name=\"TheLineSeriesViewShownInThisExampleAllowsY1\" xml:space=\"preserve\">\n    <value>The Line series view shown in this example allows you to draw a chart by connecting points with lines.</value>\n  </data>\n  <data name=\"TheAreaSeriesViewAllowsYouDisplayFilledAre1\" xml:space=\"preserve\">\n    <value>The Area series view allows you display filled areas between a chart and point Zero. This view is helpful when you need to visually compare two or more data series.</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee1\" xml:space=\"preserve\">\n    <value>The Scatter Line series view is useful when you need to connect points in the order in which they appear in the data series.</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues2\" xml:space=\"preserve\">\n    <value>A data series in this example contains two Y-values for each data point. The Range Area view fills the area between these Y-values.</value>\n  </data>\n  <data name=\"PropertyGridAutomaticallyDetectsTheTypeOfB\" xml:space=\"preserve\">\n    <value>Property Grid automatically detects the type of bound fields, and uses appropriate Eremex data editors to display and edit cell values. You can explicitly assign editors to specific fields to override the default behavior and customize editor settings.</value>\n  </data>\n  <data name=\"PropertyGridTabRowsAllowYouToGroupASetOfFi\" xml:space=\"preserve\">\n    <value>Property Grid tab rows allow you to group a set of fields into a tabbed UI. Each tab item in a row displays its own set of bound fields.</value>\n  </data>\n  <data name=\"RibbonControlAllowsYouToIntegrateMicrosoft\" xml:space=\"preserve\">\n    <value>RibbonControl allows you to integrate Microsoft Office-inspired navigation menus into your Avalonia UI applications. The control comes with two views: Classic (three item rows) and Simplified (one item row). The dropdown button at the control's bottom right corner opens a selector between these views. {0}RibbonControl supports multiple item types: large and small buttons, check buttons, sub-menus, in-place editors, inline and dropdown galleries, groups of buttons, and more. You can create as many pages with items as you need, and place items in the Quick Access Toolbar or the tab header area. {1}Press the ALT key to focus the Ribbon, and then use the keyboard to navigate between Ribbon elements and activate commands.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW2\" xml:space=\"preserve\">\n    <value>This example demonstrates the Point series view, which allows you to plot individual points on the Smith diagram.</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee2\" xml:space=\"preserve\">\n    <value>The Scatter Line series view is useful when you need to connect points in the order in which they appear in the data series.</value>\n  </data>\n  <data name=\"TheTreeListSAutoFilterRowDisplayedAtTheTop\" xml:space=\"preserve\">\n    <value>The Tree List control offers multiple ways to filter and search for data: \n • Column Filter Menus: Hover over a column header and click the filter button to open a menu. You can apply filters to one or multiple columns simultaneously.\n • Auto Filter Row: This dedicated row at the top allows you to type filter values directly into any column. The control instantly displays only the records that match your input.\n • Search Panel: Search for text across all columns. The Search Panel can be set to remain visible or activated with the Ctrl+F shortcut. Matching records are shown, and the text is highlighted within cells.\n • Filtering in Code: For advanced scenarios, you can create custom filter criteria and apply them programmatically using the control's API.</value>\n  </data>\n  <data name=\"EremexEditorsAreUsedInTreeListCellsByDefau\" xml:space=\"preserve\">\n    <value>Eremex editors are used in Tree List cells by default to display and edit cell values of common data types (Boolean, integer, enumerations, etc.). This demo shows implicitly assigned in-place editors, and demonstrates how you can explicitly specify an editor for a Tree List column.</value>\n  </data>\n  <data name=\"YouCanBindTreeListToAHierarchicalDataSourc\" xml:space=\"preserve\">\n    <value>You can bind Tree List to a hierarchical data source, which returns child data through a collection property or special data selector. This demo shows how to create a selector that supplies the hierarchical structure of folders on your disk.</value>\n  </data>\n  <data name=\"TheTreeListAndTreeViewControlsSupportMulti\" xml:space=\"preserve\">\n    <value>The TreeList and TreeView controls support multiple node selection mode, which allows you and your user to select (highlight) multiple nodes at one time. Users can select multiple nodes with the mouse and keyboard. Click nodes while holding the CTRL and/or SHIFT key down for node selection.</value>\n  </data>\n  <data name=\"TreeListColumnBandsDescription\" xml:space=\"preserve\">\n    <value>Column bands allow you to visually combine columns together by displaying shared headers above them. Both band and column headers can include text, images, or custom content. The control allows you to create hierarchical bands with an unlimited number of nesting levels.</value>\n  </data>\n  <data name=\"WASMOnlyText1\" xml:space=\"preserve\">\n    <value>This demo is only available in Desktop mode. Download the </value>\n  </data>\n  <data name=\"WASMOnlyText2\" xml:space=\"preserve\">\n    <value>solution and run the DemoCenter.Desktop project to see this demo.</value>\n  </data>\n  <data name=\"Skybox\" xml:space=\"preserve\">\n    <value>Graphics3DControl supports the skybox feature, which provides a background for 3D scenes. The skybox is a large cube surrounding the entire scene, with six textured faces (front, back, left, right, top, and bottom). These textures are mapped to the cube's inner sides, creating the illusion of a distant sky, horizon, or backdrop.</value>\n  </data>\n  <data name=\"Lights\" xml:space=\"preserve\">\n    <value>Graphics3DControl allows you to specify custom light sources for 3D scenes. Supported light types include: Point, Directional, Camera Point, and Camera Directional. Custom lights automatically disable the default light.</value>\n  </data>\n  <data name=\"HighlightingAndSelection3D\" xml:space=\"preserve\">\n    <value>Graphics3DControl supports model and mesh highlighting and selection. Highlighting draws a colored border around models or meshes when you hover over them with the mouse. With the selection feature, a colored border is painted around models or meshes when you click them. Use the HighlightMode and SelectionMode properties to choose whether highlighting/selection applies to models or meshes. The ShowHints property controls hint visibility for models and meshes.</value>\n  </data>\n  <data name=\"ChartsLollipop\" xml:space=\"preserve\">\n    <value>The Lollipop series view is a sleek, space-efficient alternative to traditional bar charts. \nInstead of bulky bars, it uses thin lines topped with markers to visualize data points. You can use default markers or specify custom markers in SVG format. The Orientation setting allows you to specify the direction of the lollipop lines (horizontal or vertical).</value>\n  </data>\n  <data name=\"DataGridExportDescription\" xml:space=\"preserve\">\n    <value>This example demonstrates the Data Grid control's export functionality. Data Grid can export data to XLSX (Microsoft Excel) and PDF formats, while preserving data shaping options, including row grouping, sorting, and cell formatting.</value>\n  </data>\n  <data name=\"ExportProgressTitle\" xml:space=\"preserve\">\n    <value>Export</value>\n  </data>\n  <data name=\"ExportProgressMessage\" xml:space=\"preserve\">\n    <value>Exporting...</value>\n  </data>\n  <data name=\"ExportProgressPromptMessage\" xml:space=\"preserve\">\n    <value>Do you want to open the exported file?</value>\n  </data>\n  <data name=\"TreeListExportDescription\" xml:space=\"preserve\">\n    <value>TreeList can export data to XLSX (Microsoft Excel) and PDF formats. The Excel export feature is data-aware — it preserves the control's data shaping configuration (node hierarchy, data sorting, and value formatting) in the output XLSX document. The PDF rendering engine follows the WYSIWYG concept, which ensures the layout of TreeList elements is accurately reproduced in the output document.</value>\n  </data>\n  <data name=\"UseCasesGroupInfo_Desc\" xml:space=\"preserve\">\n    <value>This demo emulates a dynamic mortgage calculator, built with the Data Grid and Cartersian Chart controls. Data Grid presents a detailed payment schedule as a table. The synchronized chart plots this data to show the relationship between principal and interest over the life of the loan.</value>\n  </data>\n  <data name=\"EmptyPoints\" xml:space=\"preserve\">\n    <value>This demo shows how a chart control handles incomplete datasets with the help of \"empty points\". These points allow you to create visible gaps in the series where values are missing. To specify an empty point, set its value to double.NaN, double.PositiveInfinity, or double.NegativeInfinity.</value>\n  </data>\n  <data name=\"StackedArea\" xml:space=\"preserve\">\n    <value>The Stacked Area series view shows absolute relationships between all data series. Each series is rendered as a filled area stacked on the previous one, with its thickness representing its absolute value. The top line shows the cumulative total of all series.</value>\n  </data>\n  <data name=\"FullStackedArea\" xml:space=\"preserve\">\n    <value>The Full Stacked Area series view (100% Stacked Area) shows proportional relationships between all data series. Each series is rendered as a filled area stacked on the previous one, with its thickness representing its percentage contribution to the total. The top line always indicates 100%.</value>\n  </data>\n  <data name=\"RobotArm\" xml:space=\"preserve\">\n    <value>This demo showcases a 3D robotic arm loaded from an FBX file. Using the interactive panel on the right, you can manipulate each joint (from the base to the claw) by applying transformations to nested 3D models. Model by Ryan King Art https://sketchfab.com/ryankingart.</value>\n  </data>\n  <data name=\"STL\" xml:space=\"preserve\">\n    <value>This demo showcases a 3D model of a circuit board rendered in the Graphics3DControl. The example shows how you can import a complex model from an STL file using the Assimp library. The loaded geometry is used to initialize meshes, vertices and materials in the Graphics3DControl.</value>\n  </data>\n</root>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources.ru.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"EremexTabControlCanOrganizeTheContentsOfAB\" xml:space=\"preserve\">\n    <value>MXTabControl позволяет организовать содержимое связанного источника элементов в виде интерфейса с вкладками. Он поддерживает возможность перестановки вкладок, различные варианты их отображения, а также встроенные кнопки для добавления и закрытия вкладок.</value>\n  </data>\n  <data name=\"TheMxMessageBoxDialogAllowsYouToDisplayMes\" xml:space=\"preserve\">\n    <value>MxMessageBox — диалоговое окно, которое позволяет показывать сообщения и задавать вопросы пользователям. Оно поддерживает темы оформления Eremex и гармонично сочетается с другими элементами управления EMX в вашем проекте. С помощью элементов управления справа вы можете настроить диалоговое окно и затем показать его.</value>\n  </data>\n  <data name=\"SplitContainerControlAllowsYouToPlaceConte\" xml:space=\"preserve\">\n    <value>Split Container Control состоит из разделенных сплиттером двух панелей, на которых вы можете размещать другие контролы. Пользователь может перетаскивать сплиттер, чтобы изменять размер панелей. Если функция сворачивания панелей активна, можно щелкнуть по сплиттеру, чтобы свернуть или развернуть нужную панель.</value>\n  </data>\n  <data name=\"TheDockManagerComponentAllowsYouToImplemen\" xml:space=\"preserve\">\n    <value>Компонент Dock Manager позволяет реализовать классический интерфейс Докинга, аналогичный тому, что используется в популярных средах разработки (IDE). С его помощью можно создавать панели инструментов, которые можно закреплять, переводить в режим свободного перемещения (плавающий режим) или настроить на автоматическое скрытие. Для отображения основного содержимого окна предусмотрены специальные контейнеры документов. Вы можете добавлять несколько документов и организовывать их в виде интерфейса с вкладками.</value>\n  </data>\n  <data name=\"TheToolbarManagerComponentAllowsYouToImple\" xml:space=\"preserve\">\n    <value>Компонент ToolbarManager позволяет создать классические панели инструментов и меню. Панели инструментов можно закреплять не только по краям, но и в любом месте родительского контейнера. Пользователи могут изменять расположение элементов на панели инструментов с помощью перетаскивания. Также доступно окно настройки, где можно управлять всеми элементами панели инструментов (как скрытыми, так и видимыми) и перемещать их с помощью перетаскивания.</value>\n  </data>\n  <data name=\"TheToolbarsMenuLibraryContainsAPopupMenuCo\" xml:space=\"preserve\">\n    <value>Библиотека Toolbars&amp;Menus содержит компонент PopupMenu, с помощью которого можно добавить контекстное меню к любому элементу управления. Дизайн контекстного меню выполнен в едином стиле и гармонично сочетается с другими компонентами библиотеки EMX Controls.</value>\n  </data>\n  <data name=\"TheChartControlSupportsInstantDisplayOfRap\" xml:space=\"preserve\">\n    <value>Chart Control позволяет мгновенно отображать данные, которые быстро меняются в реальном времени. В данном примере показано, как с помощью специального адаптера данных можно реализовать движущееся окно просмотра.</value>\n  </data>\n  <data name=\"TheChartControlSGraphicsRenderingIsOptimiz\" xml:space=\"preserve\">\n    <value>Механизм отрисовки в элементе управления Chart Control оптимизирован для обработки больших объемов данных. Он обеспечивает высокую производительность и плавное отображение, даже если серии содержат миллионы точек.</value>\n  </data>\n  <data name=\"CartesianChartMultipleAxes\" xml:space=\"preserve\">\n    <value>Этот пример демонстрирует использование нескольких осей в элементе управления CartesianChart, а также возможности настройки макета осей, их положения, меток, линий сетки и других параметров.\n• Несколько осей — Элемент управления CartesianChart позволяет создавать несколько осей X и Y и привязывать каждую серию данных к собственным осям.\n• Положение оси — Вы можете отображать определённые оси X или Y напротив их стандартных расположений: оси X вверху, а оси Y справа.\n• Обмен осей — С помощью одного свойства вы можете транспонировать оси, чтобы оси Y отображались горизонтально, а оси X — вертикально.\n• Обратное направление оси — Для отдельных осей вы можете изменить порядок значений со стандартного (слева направо и снизу вверх) на обратный (справа налево и сверху вниз).\n• Прокрутка и масштабирование осей — Вы можете щёлкнуть и перетащить мышью или использовать колёсико мыши над отдельными осями для прокрутки и масштабирования этих осей, не затрагивая другие оси.</value>\n  </data>\n  <data name=\"ChartControlSupportsLogarithmicScalesForAn\" xml:space=\"preserve\">\n    <value>Элемент управления Chart Control позволяет использовать логарифмические шкалы для любых числовых осей. По умолчанию применяется логарифм по основанию 10. Вы также можете задать собственное основание логарифма, чтобы изменить масштабирование данных.</value>\n  </data>\n  <data name=\"ThisDemoShowsConstantLinesAndStripsUsedToH\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как использовать постоянные линии и полосы для выделения определенных значений и диапазонов в элементе управления CartesianChart. Чтобы добавить постоянную линию для оси X, щелкните правой кнопкой мыши в области диаграммы.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как работает представление данных Point Series View, позволяющее отображать данные в виде точек.</value>\n  </data>\n  <data name=\"TheLineSeriesViewShownInThisExampleAllowsY\" xml:space=\"preserve\">\n    <value>В этом примере демонстрируется представление данных Line Series View, которое позволяет построить график, где точки данных соединены линиями.</value>\n  </data>\n  <data name=\"TheAreaSeriesViewAllowsYouDisplayFilledAre\" xml:space=\"preserve\">\n    <value>Представление данных Area Series View позволяет заполнять области между графиками и осью X. Это представление полезно, когда вам нужно визуально сравнить две или более серии данных.</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee\" xml:space=\"preserve\">\n    <value>Представление данных Scatter Line Series View позволяет соединить точки в том порядке, в котором они расположены в серии данных.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheStepLineSeriesVi\" xml:space=\"preserve\">\n    <value>Этот пример демонстрирует представление данных Step Line Series View, в котором точки соединены горизонтальными и вертикальными отрезками.</value>\n  </data>\n  <data name=\"TheStepAreaSeriesViewConnectsPointsWithHor\" xml:space=\"preserve\">\n    <value>В этом примере демонстрируется представление данных Step Area Series View. Оно позволяет соединить точки горизонтальными и вертикальными отрезками, а также залить области между графиками и осью X определенным цветом.</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues\" xml:space=\"preserve\">\n    <value>Серия данных в этом примере содержит по два значения Y для каждой точки. Представление Range Area используется, чтобы заполнить области между этими значениями Y.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheSideBySideBarSer\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как работает представление данных Side-by-side Bar Series View. С помощью его вы можете отображать данные в виде столбцов, расположенных рядом друг с другом на оси X.</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues1\" xml:space=\"preserve\">\n    <value>В этом примере серия данных содержит по два значения Y для каждой точки. Представление данных Side-by-side Range Bar отображает столбцы, которые строятся между этими значениями Y.</value>\n  </data>\n  <data name=\"TheCandlestickSeriesViewAllowsYouToCreateA\" xml:space=\"preserve\">\n    <value>Представление данных Candlestick Series View позволяет строить финансовые диаграммы, отображающие изменения цен на актив. Для каждого временного интервала диаграмма показывает набор данных, включающий значения Open (открытие), Close (закрытие), High (максимум) и Low (минимум).\n\nДанные акций: https://www.investing.com/</value>\n  </data>\n  <data name=\"InThisDemoTheCandlestickSeriesViewUsesASpe\" xml:space=\"preserve\">\n    <value>В настоящем примере представление данных Candlestick Series View использует специальный адаптер данных (SummaryCandlestickDataAdapter). Этот адаптер принимает сырые тиковые данные — отдельные значения цены актива, зафиксированные в определенные моменты времени, — и преобразует их в свечи. Адаптер агрегирует сырые данные в свечи в соответствии с заданным временным интервалом. Например, данные могут быть сгруппированы в интервалы 1 секунда, 1 минута, 1 час, 1 день, 1 неделя и т.д., а также в кратные интервалы, такие как 5 секунд, 15 минут, 2 дня и т.д.</value>\n  </data>\n  <data name=\"TheDataGridSGroupingFeatureMakesItEasyToSu\" xml:space=\"preserve\">\n    <value>В этом примере показана функция группировки данных в контроле Data Grid. Она позволяет объединять строки по значениям выбранных столбцов. Пользователи могут группировать данные по любому количеству столбцов, перетаскивая их на панель группировки.</value>\n  </data>\n  <data name=\"YouCanEmbedAnyControlInDataGridCellsToPres\" xml:space=\"preserve\">\n    <value>Вы можете добавлять любые UI-контролы в ячейки контрола Data Grid, чтобы отображать и редактировать данные в ячейках так, как вам удобно. Этот пример демонстрирует встраиваемые редакторы Eremex: DateEditor, SpinEditor и ComboBoxEditor. Data Grid обеспечивает высокую производительность при использовании редакторов Eremex, особенно при работе с большими объемами данных.</value>\n  </data>\n  <data name=\"TheDataValidationMechanismAllowsYouToCheck\" xml:space=\"preserve\">\n    <value>Механизм валидации данных позволяет проверять значения ячеек и отображать ошибки в ячейках, содержащих недопустимые данные. Вы можете использовать атрибуты DataAnnotation и интерфейсы IDataErrorInfo/INotifyDataErrorInfo для проверки данных на уровне источника данных (ItemsSource). В этом примере включите флажок 'Show ItemsSource Errors', чтобы увидеть ошибки валидации, основанные на атрибутах DataAnnotation. Data Grid также поддерживает событие ValidateCellValue, которое позволяет реализовать пользовательские правила проверки ввода.</value>\n  </data>\n  <data name=\"DataGridSupportsBuiltInDataSearchAndFiltra\" xml:space=\"preserve\">\n    <value>Data Grid предоставляет несколько способов фильтрации и поиска данных:\n • Фильтры столбцов: Наведите курсор на заголовок столбца и нажмите кнопку фильтра, чтобы открыть меню. Вы можете применять фильтры к одному или нескольким столбцам одновременно.\n • Строка автоматического фильтра: Эта специальная строка вверху позволяет вводить значения фильтра непосредственно в любой столбец. Data Grid отобразит только записи, соответствующие вашему вводу.\n • Панель поиска: Выполняется поиск текста по всем столбцам. Панель поиска можно настроить на постоянное отображение или активировать с помощью сочетания клавиш Ctrl+F. Отобразятся подходящие записи, а текст подсветится внутри ячеек.\n • Фильтрация в коде: Для сложных сценариев вы можете создавать пользовательские условия фильтрации и применять их программно с помощью API элемента управления.</value>\n  </data>\n  <data name=\"RegardlessOfTheNumberOfColumnsAndRowsInThe\" xml:space=\"preserve\">\n    <value>Независимо от количества столбцов и строк, Data Grid сохраняет высокую отзывчивость при горизонтальной и вертикальной прокрутке, а также при сортировке и группировке данных. Встроенный механизм виртуализации данных обновляет только те ячейки, которые находятся в видимой области, что обеспечивает плавную и быструю прокрутку.</value>\n  </data>\n  <data name=\"DataGridAdaptsRowHeightToFitCellContentsTe\" xml:space=\"preserve\">\n    <value>Data Grid может автоматически изменять высоту строк в зависимости от содержимого ячеек. Текстовые столбцы могут отображать данные в одну или несколько строк. Чтобы включить многострочное отображение текста, назначьте столбцу встроенный редактор TextEditor (или его наследника) и активируйте функцию переноса текста.</value>\n  </data>\n  <data name=\"InThisDemoDataGridEmulatesTheWindowsTaskMa\" xml:space=\"preserve\">\n    <value>В этом примере Data Grid имитирует Диспетчер задач Windows, отображая часто обновляемые фиктивные процессы. Data Grid поддерживает автоматическое обновление данных, если связанный источник данных реализует интерфейс INotifyPropertyChanged. В данном примере уведомления об изменениях реализованы для базового бизнес-объекта с использованием класса ObservableObject (который реализует интерфейс INotifyPropertyChanged) и атрибутов ObservableProperty из библиотеки CommunityToolkit.Mvvm.</value>\n  </data>\n  <data name=\"DataGridSupportsMultipleRowSelectionModeWh\" xml:space=\"preserve\">\n    <value>Data Grid поддерживает режим множественного выбора строк, позволяющий выделять несколько строк одновременно. Пользователи могут выбирать строки с помощью мыши и клавиатуры. Для выделения строк щелкните по ним мышью, удерживая клавиши CTRL и/или SHIFT.</value>\n  </data>\n  <data name=\"DataGridFixedColumnsDescription\" xml:space=\"preserve\">\n    <value>Чтобы важные данные были постоянно видны при горизонтальной прокрутке, вы можете зафиксировать (закрепить) колонки к левому или правому краю. После \"фиксации\" эти колонки остаются неподвижными, в то время как другие данные будут скролироваться. Включите встроенное меню «Зафиксировать» для колонок, чтобы пользователи могли закреплять колонки во время работы приложения.</value>\n  </data>\n  <data name=\"DataGridSupportsDragAndDropOperationsWithi\" xml:space=\"preserve\">\n    <value>Data Grid поддерживает операции перетаскивания как внутри себя, так и на внешние контролы (например, Tree List или другой Data Grid). Этот пример демонстрирует функциональность перетаскивания внутри и между контролами Data Grid. Опция AllowDragDrop активирует функцию перетаскивания. {0} Опция AllowDragDropSortedRows должна быть включена, чтобы разрешить перетаскивание в отсортированных или сгруппированных контролах Data Grid. Если данные отсортированы или сгруппированы, операция перетаскивания изменяет значения перетаскиваемой строки в столбцах, используемых для сортировки. {1} В этом примере контролы привязаны к коллекциям, содержащим одинаковые бизнес-объекты. Это позволяет автоматически перемещать строки при перетаскивании из исходного грида в целевой. Когда вы перемещаете строку из одного грида в другой, соответствующий элемент данных перемещается между источниками данных двух гридов.</value>\n  </data>\n  <data name=\"DataGridColumnBandsDescription\" xml:space=\"preserve\">\n    <value>Бэнды (группы колонок) помогают визуально объединить колонки, отображая над ними общие заголовки. Заголовки бэндов и столбцов могут содержать текст, изображения или пользовательский контент. В этом примере демонстрируются следующие возможности:\n • Создание бэндов из источника — Вы можете генерировать бэнды из источника, определенного в модели представления.\n • Иерархические бэнды — Контрол позволяет создавать иерархические бэнды с неограниченным числом уровней вложенности.\n • Поддержка фиксированных колонок — Когда вы закрепляете (фиксируете) колонку, и колонка и её бэнд остаются неподвижными при горизонтальной прокрутке.</value>\n  </data>\n  <data name=\"TheEremexControlsLibraryIncludesMultipleEd\" xml:space=\"preserve\">\n    <value>Библиотека контролов Eremex включает несколько редакторов, которые предлагают расширенные возможности для редактирования данных. Эти редакторы позволяют отображать и изменять данные различных типов, такие как числовые, логические, дата-время, перечисления и другие. Они поддерживают механизм валидации, стилизацию и возможность встраивания в контейнеры, такие как Data Grid, Tree List, Property Grid, Ribbon, а также Toolbars&amp;Menus.</value>\n  </data>\n  <data name=\"TheEditorsLibraryIncludesTheTextEditorAndB\" xml:space=\"preserve\">\n    <value>Библиотека редакторов включает элементы управления Text Editor и Button Editor, которые предоставляют базовые функции для редактирования текста: проверку данных (валидацию), водяные знаки (подсказки, которые отображаются, если редактор пуст), а также различные опции для управления выбором текста и операциями редактирования. Button Editor поддерживает неограниченное количество встроенных кнопок, как обычных, так и переключаемых, которые могут отображать текст или изображение и располагаться справа или слева.</value>\n  </data>\n  <data name=\"TheSpinEditorIsANumericValueEditorWithBuil\" xml:space=\"preserve\">\n    <value>Spin Editor — это редактор числовых значений, оснащенный кнопками вверх и вниз, которые позволяют увеличивать или уменьшать число на заданное значение (инкремент). Пользователь может изменять значение, нажимая эти кнопки или используя клавиши со стрелками вверх и вниз на клавиатуре. Spin Editor использует числовую маску, чтобы ограничить ввод только числовыми значениями и отформатировать редактируемое значение в соответствии с указанным шаблоном.</value>\n  </data>\n  <data name=\"TheComboBoxEditorFeaturesADropdownListOfIt\" xml:space=\"preserve\">\n    <value>Редактор ComboBox Editor предоставляет выпадающий список элементов, из которых пользователь может выбрать один или несколько вариантов. Редактор может отображать список строк, список бизнес-объектов или значения перечисления. В режиме множественного выбора флажки рядом с элементами позволяют пользователю выбирать несколько элементов одновременно.</value>\n  </data>\n  <data name=\"YouCanUseTheSegmentedEditorToPresentASetOf\" xml:space=\"preserve\">\n    <value>Вы можете использовать Segmented Editor для отображения набора опций в виде горизонтально расположенных сегментов. Пользователь может щелкнуть по одному из сегментов, чтобы выбрать соответствующую опцию, или нажать CTRL + щелчок на выбранном сегменте, чтобы снять выделение. Редактор позволяет создавать сегменты из списка строк, списка бизнес-объектов или значений перечисления.</value>\n  </data>\n  <data name=\"TheDateEditorFeaturesADropdownCalendarThat\" xml:space=\"preserve\">\n    <value>Редактор Date Editor предоставляет выпадающий календарь, который позволяет пользователям выбирать дату. Панель навигации календаря дает возможность перемещаться между месяцами и годами. Date Editor использует маску даты и времени, чтобы ограничить ввод пользователя только допустимыми значениями даты и времени, а также отформатировать редактируемое значение в соответствии с заданным шаблоном.</value>\n  </data>\n  <data name=\"TheColorEditorAndPopupColorEditorControlsA\" xml:space=\"preserve\">\n    <value>Элементы управления Color Editor и Popup Color Editor позволяют пользователю выбирать цвет. Они поддерживают три цветовые палитры: по умолчанию (которую можно настроить в коде), стандартную (с фиксированными цветами) и пользовательскую (которую может настраивать сам пользователь). Встроенный Color Picker помогает пользователю добавлять пользовательские цвета из цветового пространства или задавать значения цвета в форматах RGB и HSB.</value>\n  </data>\n  <data name=\"TheHyperlinkEditorDisplaysItsContentAsAHyp\" xml:space=\"preserve\">\n    <value>Редактор Hyperlink Editor отображает содержимое в виде гиперссылки. Он поддерживает ручную (по умолчанию) и автоматическую обработку гиперссылок. Специальная команда или событие позволяет обрабатывать клики по гиперссылкам. Вы можете включить автоматическую навигацию, чтобы редактор автоматически переходил по ссылке при клике.</value>\n  </data>\n  <data name=\"YouCanCreateComboBoxAndSegmentedEditorsIte\" xml:space=\"preserve\">\n    <value>Вы можете создавать элементы для контролов ComboBox и Segmented Editor на основе значений типа перечисления. С помощью специальных атрибутов Data Annotation, примененных к значениям перечисления, можно задать изображения, текст и подсказки для этих элементов.</value>\n  </data>\n  <data name=\"UseMemoEditorToDisplayAndEditLargeTextInAP\" xml:space=\"preserve\">\n    <value>Используйте редактор MemoEditor для отображения и редактирования больших текстов в выпадающем окне, с возможностью включения или отключения переноса текста. Свойство IsTextEditable позволяет запретить редактирование текста в поле ввода. Если свойство установлено в значение false, поле ввода может отображать специальный значок, указывающий на наличие текста в выпадающем окне.</value>\n  </data>\n  <data name=\"Graphics3DControlAllowsYouToVisualizeAndIn\" xml:space=\"preserve\">\n    <value>Graphics3DControl позволяет отображать и взаимодействовать с 3D-моделями. С помощью панели свойств справа вы можете настроить основные параметры рендеринга и поведения контрола.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlT\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как использовать контрол Graphics3DControl для отображения 3D-модели с помощью линий.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlT1\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как использовать контрол Graphics3DControl для отображения 3D-модели с помощью точек.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesDynamicTransformati\" xml:space=\"preserve\">\n    <value>Этот пример демонстрирует динамические преобразования, применяемые к 3D-моделям в элементе управления Graphics3DControl.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlD1\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как отобразить 3D-модель с простым материалом в контроле Graphics3DControl. С помощью панели свойств справа вы можете настроить параметры материала.</value>\n  </data>\n  <data name=\"InThisExampleAGraphics3DControlDisplaysA3D\" xml:space=\"preserve\">\n    <value>Этот пример демонстрирует, как отобразить 3D-модель с текстурированным материалом в контроле Graphics3DControl. С помощью панели материалов справа вы можете выбрать текстуру.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheIsometricAndPers\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как работают изометрические и перспективные камеры в контроле Graphics3DControl. С помощью панели справа вы можете выбрать режим камеры и один из предустановленных видов.</value>\n  </data>\n  <data name=\"AHeatmapRendersA2DimensionalArrayOfValuesA\" xml:space=\"preserve\">\n    <value>Тепловая карта визуализирует двумерный массив значений в виде цветовой матрицы, где цвет каждой точки соответствует ее значению. Этот пример демонстрирует контрол Heatmap, позволяющий создавать тепловые карты на основе ваших данных. Щелкните по цветовому градиенту справа, чтобы применить это цветовое кодирование к тепловой карте.\n\nИсточник изображения: Webb Space Telescope, https://webbtelescope.org/</value>\n  </data>\n  <data name=\"InThisExampleTheHeatmapControlUsesCustomCo\" xml:space=\"preserve\">\n    <value>В этом примере контрол Heatmap применяет пользовательское цветовое кодирование для отображения интенсивности сигнала, который изменяется в реальном времени. График в верхней части окна показывает амплитуду этого сигнала. Элементы управления плавно обновляются по мере изменения данных с использованием таймера.</value>\n  </data>\n  <data name=\"InAPolarChartEachDataPointIsDeterminedByAn\" xml:space=\"preserve\">\n    <value>В полярной диаграмме каждая точка данных определяется углом и расстоянием. Этот пример показывает, как используются постоянные линии и полосы для выделения конкретных значений и диапазонов. Диапазоны углов и расстояний задаются в коде этого примера. Щелкните левой кнопкой мыши внутри диаграммы, чтобы создать пользовательские постоянные линии для углов. Щелкните правой кнопкой мыши, чтобы создать пользовательские постоянные линии для расстояний.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW1\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как работает представление данных Point Series View, позволяющее отображать данные в виде точек.</value>\n  </data>\n  <data name=\"TheLineSeriesViewShownInThisExampleAllowsY1\" xml:space=\"preserve\">\n    <value>В этом примере демонстрируется представление данных Line Series View, которое позволяет построить график, где точки данных соединены линиями.</value>\n  </data>\n  <data name=\"TheAreaSeriesViewAllowsYouDisplayFilledAre1\" xml:space=\"preserve\">\n    <value>Представление данных Area Series View позволяет заполнять области между графиками и осью X. Это представление полезно, когда вам нужно визуально сравнить две или более серии данных.</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee1\" xml:space=\"preserve\">\n    <value>Представление данных Scatter Line Series View позволяет соединить точки в том порядке, в котором они расположены в серии данных.</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues2\" xml:space=\"preserve\">\n    <value>Серия данных в этом примере содержит по два значения Y для каждой точки. Представление Range Area используется, чтобы заполнить области между этими значениями Y.</value>\n  </data>\n  <data name=\"PropertyGridAutomaticallyDetectsTheTypeOfB\" xml:space=\"preserve\">\n    <value>Контрол Property Grid автоматически определяет тип связанных полей и использует соответствующие редакторы Eremex для отображения и редактирования значений ячеек. Вы можете явно назначить редакторы для конкретных полей, чтобы переопределить поведение по умолчанию и настроить параметры редактора.</value>\n  </data>\n  <data name=\"PropertyGridTabRowsAllowYouToGroupASetOfFi\" xml:space=\"preserve\">\n    <value>Строки-вкладки в контроле Property Grid позволяют организовать набор полей в интерфейс с вкладками (Tabbed UI). Каждая вкладка может отображать свой собственный набор полей.</value>\n  </data>\n  <data name=\"RibbonControlAllowsYouToIntegrateMicrosoft\" xml:space=\"preserve\">\n    <value>Контрол RibbonControl позволяет добавлять навигационные меню в стиле Microsoft Office в ваши приложения на Avalonia UI. Элемент управления поддерживает два режима отображения: Классический (три строки элементов) и Упрощенный (одна строка элементов). Нажатие на кнопку в правом нижнем углу контрола открывает список, с помощью которого пользователь может выбрать один из этих двух режимов. {0}RibbonControl поддерживает различные типы элементов: большие и маленькие кнопки, переключаемые кнопки, подменю, встроенные редакторы, встроенные и выпадающие галереи, группы кнопок и многое другое. Вы можете создать любое количество страниц с элементами и разместить элементы на панели быстрого доступа или в области заголовков вкладок. {1}Нажмите клавишу ALT, чтобы перевести фокус на RibbonControl, а затем используйте клавиатуру для навигации между элементами риббона и активации команд.</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW2\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как работает представление данных Point Series View, позволяющее отображать данные в виде точек на диаграмме Смита.</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee2\" xml:space=\"preserve\">\n    <value>Этот пример показывает, как работает представление данных Scatter Line Series View. Оно позволяет соединить точки в том порядке, в котором они расположены в серии данных.</value>\n  </data>\n  <data name=\"TheTreeListSAutoFilterRowDisplayedAtTheTop\" xml:space=\"preserve\">\n    <value>Tree List предоставляет несколько способов фильтрации и поиска данных:\n • Фильтры столбцов: Наведите курсор на заголовок столбца и нажмите кнопку фильтра, чтобы открыть меню. Вы можете применять фильтры к одному или нескольким столбцам одновременно.\n • Строка автоматического фильтра: Эта специальная строка вверху позволяет вводить значения фильтра непосредственно в любой столбец. Tree List отобразит только записи, соответствующие вашему вводу.\n • Панель поиска: Выполняется поиск текста по всем столбцам. Панель поиска можно настроить на постоянное отображение или активировать с помощью сочетания клавиш Ctrl+F. Отобразятся подходящие записи, а текст подсветится внутри ячеек.\n • Фильтрация в коде: Для сложных сценариев вы можете создавать пользовательские условия фильтрации и применять их программно с помощью API элемента управления.</value>\n  </data>\n  <data name=\"EremexEditorsAreUsedInTreeListCellsByDefau\" xml:space=\"preserve\">\n    <value>Редакторы Eremex по умолчанию применяются в ячейках Tree List для отображения и редактирования значений ячеек стандартных типов данных (логические, целые числа, перечисления и т.д.). Этот пример демонстрирует неявно назначенные встроенные редакторы, а также показывает, как можно явно указать редактор для столбца.</value>\n  </data>\n  <data name=\"YouCanBindTreeListToAHierarchicalDataSourc\" xml:space=\"preserve\">\n    <value>Вы можете привязать Tree List к иерархическому источнику данных, который возвращает дочерние элементы через свойство коллекции или специальный селектор. Этот пример демонстрирует, как создать селектор, который предоставляет иерархическую структуру папок на вашем диске.</value>\n  </data>\n  <data name=\"TheTreeListAndTreeViewControlsSupportMulti\" xml:space=\"preserve\">\n    <value>Контролы TreeList и TreeView поддерживают режим множественного выбора строк, позволяющий выделять несколько строк одновременно. Пользователи могут осуществлять множественный выбор с помощью мыши и клавиатуры. Для выбора строк удерживайте клавиши CTRL и/или SHIFT и нажмите на строки кнопкой мыши.</value>\n  </data>\n  <data name=\"TreeListColumnBandsDescription\" xml:space=\"preserve\">\n    <value>Бэнды (группы колонок) помогают визуально объединить колонки, отображая над ними общие заголовки. Заголовки бэндов и столбцов могут содержать текст, изображения или пользовательский контент. Вы можете создавать иерархические бэнды с неограниченным числом уровней вложенности.</value>\n  </data>\n  <data name=\"WASMOnlyText1\" xml:space=\"preserve\">\n    <value>Этот демо модуль доступен только в режиме для ПК. Скачайте приложение</value>\n  </data>\n  <data name=\"WASMOnlyText2\" xml:space=\"preserve\">\n    <value>и запустите проект DemoCenter.Desktop</value>\n  </data>\n  <data name=\"Skybox\" xml:space=\"preserve\">\n    <value>Graphics3DControl поддерживает функцию Skybox, которая обеспечивает фон для 3D-сцен. Skybox представляет собой большой куб, окружающий всю сцену, с шестью текстурированными гранями (передняя, задняя, левая, правая, верхняя и нижняя). Эти текстуры накладываются на внутренние стороны куба, создавая иллюзию далекого неба, горизонта или фона.</value>\n  </data>\n  <data name=\"Lights\" xml:space=\"preserve\">\n    <value>Graphics3DControl позволяет задавать пользовательские источники света для 3D-сцен. Поддерживаемые типы освещения: точечный (Point), направленный (Directional), точечный от камеры (Camera Point) и направленный от камеры (Camera Directional). При использовании пользовательского освещения стандартный источник света автоматически отключается.</value>\n  </data>\n  <data name=\"HighlightingAndSelection3D\" xml:space=\"preserve\">\n    <value>Graphics3DControl поддерживает подсветку и выделение моделей и мешей. Подсветка рисует цветную рамку вокруг моделей или мешей при наведении на них курсора мыши. Функция выделения окрашивает рамку вокруг моделей или мешей при клике на них. Используйте свойства HighlightMode и SelectionMode, чтобы выбрать, применяется ли подсветка/выделение к моделям или мешам. Свойство ShowHints управляет отображением подсказок для моделей и мешей.</value>\n  </data>\n  <data name=\"ChartsLollipop\" xml:space=\"preserve\">\n    <value>Представление серии \"Леденцы\" — это элегантная и компактная альтернатива традиционным гистограммам. Вместо громоздких столбцов оно использует тонкие линии с маркерами на концах для визуализации точек данных. Вы можете использовать стандартные маркеры или указать собственные маркеры в формате SVG. Настройка \"Ориентация\" позволяет задать направление линий \"леденцов\" (горизонтальное или вертикальное).</value>\n  </data>\n  <data name=\"DataGridExportDescription\" xml:space=\"preserve\">\n    <value>Данный пример демонстрирует функциональность экспорта Data Grid. Data Grid может экспортировать данные в форматы XLSX (Microsoft Excel) и PDF, сохраняя при этом настройки группировки строк, сортировки данных и форматирование ячеек.</value>\n  </data>\n  <data name=\"ExportProgressTitle\" xml:space=\"preserve\">\n    <value>Экспорт</value>\n  </data>\n  <data name=\"ExportProgressMessage\" xml:space=\"preserve\">\n    <value>Выполняется экспорт...</value>\n  </data>\n  <data name=\"ExportProgressPromptMessage\" xml:space=\"preserve\">\n    <value>Вы хотите открыть экспортированный файл?</value>\n  </data>\n  <data name=\"TreeListExportDescription\" xml:space=\"preserve\">\n    <value>Компонент TreeList позволяет экспортировать данные в форматы XLSX (Microsoft Excel) и PDF. Функция экспорта в Excel сохраняет иерархию узлов, сортировку данных и форматирование значений в результирующем XLSX документе. Механизм рендеринга PDF следует концепции WYSIWYG, что гарантирует точное воспроизведение компоновки элементов TreeList в результирующем документе.</value>\n  </data>\n  <data name=\"UseCasesGroupInfo_Desc\" xml:space=\"preserve\">\n    <value>Это демо-приложение эмулирует ипотечный калькулятор, созданный с помощью элементов управления Data Grid (таблица данных) и Cartesian Chart (декартов график). Data Grid представляет детальный график платежей в виде таблицы. Синхронизированный график отображает эти данные, показывая соотношение основного долга и процентов в течение всего срока кредита.</value>\n  </data>\n  <data name=\"EmptyPoints\" xml:space=\"preserve\">\n    <value>Диаграмма поддерживает работу с неполными наборами данных. Используйте \"пустые точки\", чтобы создать видимые разрывы в серии там, где значения отсутствуют. Чтобы задать пустую точку, установите её значение как double.NaN, double.PositiveInfinity или double.NegativeInfinity.</value>\n  </data>\n  <data name=\"StackedArea\" xml:space=\"preserve\">\n    <value>Вид серии \"Область с накоплением\" показывает абсолютные соотношения между всеми рядами данных. Каждый ряд отображается в виде залитой области, наложенной на предыдущую, где её толщина представляет абсолютное значение. Верхняя линия показывает совокупную сумму всех рядов.</value>\n  </data>\n  <data name=\"FullStackedArea\" xml:space=\"preserve\">\n    <value>Вид серии \"Область с полным накоплением\" (100% область с накоплением) показывает пропорциональные соотношения между всеми рядами данных. Каждый ряд отображается в виде залитой области, наложенной на предыдущую, где её толщина представляет процентный вклад в общую сумму. Верхняя линия всегда указывает на 100%.</value>\n  </data>\n  <data name=\"RobotArm\" xml:space=\"preserve\">\n    <value>В этой демонстрации представлен 3D-манипулятор, загруженный из файла FBX. С помощью интерактивной панели справа вы можете управлять каждым шарниром (от основания до захватного механизма), применяя преобразования к вложенным 3D-моделям. Модель от Ryan King Art https://sketchfab.com/ryankingart.</value>\n  </data>\n  <data name=\"STL\" xml:space=\"preserve\">\n    <value>Эта демонстрация представляет 3D-модель печатной платы, отображаемую в элементе управления Graphics3DControl. В примере показано, как можно импортировать сложную модель из файла STL с помощью библиотеки Assimp. Загруженная геометрия используется для инициализации сеток, вершин и материалов в Graphics3DControl.</value>\n  </data>\n</root>"
  },
  {
    "path": "DemoCenter/DemoCenter/Resources.zh-Hans.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"EremexTabControlCanOrganizeTheContentsOfAB\" xml:space=\"preserve\">\n    <value>Eremex Tab Control 可以将绑定项源的内容组织成选项卡式用户界面。它支持选项卡重新排序、多种选项卡布局模式以及用于添加和关闭选项卡的内置按钮。</value>\n  </data>\n  <data name=\"TheMxMessageBoxDialogAllowsYouToDisplayMes\" xml:space=\"preserve\">\n    <value>MxMessageBox 对话框允许您向用户显示消息并提问。该对话框支持 Eremex 绘制主题，并且与项目中的其他 EMX 控件保持一致。使用右侧的可视元素自定义并显示示例消息框。</value>\n  </data>\n  <data name=\"SplitContainerControlAllowsYouToPlaceConte\" xml:space=\"preserve\">\n    <value>Split Container Control 允许您将内容放置在两个面板上，并通过用户可拖动的分隔条来调整面板大小。启用面板折叠功能后，用户可以单击分隔条以折叠和恢复面板。</value>\n  </data>\n  <data name=\"TheDockManagerComponentAllowsYouToImplemen\" xml:space=\"preserve\">\n    <value>Dock Manager 组件允许您实现流行 IDE 中的经典停靠用户界面。您可以创建支持停靠、自动隐藏和浮动操作的工具面板。特殊的文档容器设计用于显示窗口的主要内容。您可以创建多个文档并将其组织成选项卡式用户界面。</value>\n  </data>\n  <data name=\"TheToolbarManagerComponentAllowsYouToImple\" xml:space=\"preserve\">\n    <value>ToolbarManager 组件允许您实现经典的工具栏和菜单用户界面。您不仅可以将工具栏停靠在窗口边缘，还可以停靠在任何指定位置。用户可以使用拖放操作自定义工具栏布局。他们还可以显示自定义窗口以访问所有（隐藏和可见的）工具栏项，并使用拖放操作移动这些项。</value>\n  </data>\n  <data name=\"TheToolbarsMenuLibraryContainsAPopupMenuCo\" xml:space=\"preserve\">\n    <value>工具栏和菜单库包含一个 PopupMenu 组件，您可以使用它将上下文菜单附加到任何控件。Eremex 上下文菜单样式设置与所有工具栏库组件一致。</value>\n  </data>\n  <data name=\"TheChartControlSupportsInstantDisplayOfRap\" xml:space=\"preserve\">\n    <value>Chart Control 支持即时显示快速变化的实时数据。此示例展示了如何使用特殊的数据适配器实现移动视口。</value>\n  </data>\n  <data name=\"TheChartControlSGraphicsRenderingIsOptimiz\" xml:space=\"preserve\">\n    <value>Chart Control 的图形渲染经过优化，可以显示大量数据。即使系列包含数百万个点，控件仍能提供高性能。</value>\n  </data>\n  <data name=\"CartesianChartMultipleAxes\" xml:space=\"preserve\">\n    <value>这个示例演示了 CartesianChart 控件中的多重坐标轴功能，以及自定义坐标轴布局、位置、标签、网格线等选项。\n• 多重坐标轴 — CartesianChart 控件允许创建多个 X 轴和 Y 轴，并将每个数据序列绑定到各自的坐标轴。\n• 坐标轴位置 — 您可以将特定的 X 轴或 Y 轴显示在默认位置的另一侧：X 轴位于顶部，Y 轴位于右侧。\n• 交换坐标轴 — 通过单个属性即可交换坐标轴，使 Y 轴水平显示，X 轴垂直显示。\n• 反转坐标轴方向 — 对于单个坐标轴，您可以将数值顺序从默认的（从左到右、从下到上）改为反转方向（从右到左、从上到下）。\n• 滚动和缩放坐标轴 — 您可以通过鼠标点击拖拽或在单个坐标轴上使用鼠标滚轮来滚动和缩放这些轴，而不会影响其他坐标轴。</value>\n  </data>\n  <data name=\"ChartControlSupportsLogarithmicScalesForAn\" xml:space=\"preserve\">\n    <value>Chart Control 支持对其任何数值轴使用对数刻度。默认情况下使用以 10 为底的对数。您可以指定自定义对数底数以更改数据缩放比例。</value>\n  </data>\n  <data name=\"ThisDemoShowsConstantLinesAndStripsUsedToH\" xml:space=\"preserve\">\n    <value>此演示展示了用于在 CartesianChart 控件中突出显示特定值和值范围的常量和带状区域。右键单击图表以创建 X 轴的自定义常量线。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW\" xml:space=\"preserve\">\n    <value>此示例展示了点系列视图，它允许您绘制单个点。</value>\n  </data>\n  <data name=\"TheLineSeriesViewShownInThisExampleAllowsY\" xml:space=\"preserve\">\n    <value>此示例中展示的线系列视图允许您通过连接点来绘制图表。</value>\n  </data>\n  <data name=\"TheAreaSeriesViewAllowsYouDisplayFilledAre\" xml:space=\"preserve\">\n    <value>区域系列视图允许您显示填充区域。当您需要直观地比较两个或多个数据系列时，此视图非常有用。</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee\" xml:space=\"preserve\">\n    <value>散点线系列视图在您需要按数据系列中出现的顺序连接点时非常有用。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheStepLineSeriesVi\" xml:space=\"preserve\">\n    <value>此示例展示了阶梯线系列视图，它通过水平和垂直线段连接点。</value>\n  </data>\n  <data name=\"TheStepAreaSeriesViewConnectsPointsWithHor\" xml:space=\"preserve\">\n    <value>阶梯区域系列视图通过水平和垂直线段连接点，并使用指定颜色填充线与 X 轴之间的区域。</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues\" xml:space=\"preserve\">\n    <value>此示例中的数据系列包含每个数据点的两个 Y 值。范围区域视图填充这些 Y 值之间的区域。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheSideBySideBarSer\" xml:space=\"preserve\">\n    <value>此示例展示了并排条形系列视图，它将数据可视化为一组矩形条。</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues1\" xml:space=\"preserve\">\n    <value>此示例中的数据系列包含每个数据点的两个 Y 值。并排范围条形视图在这些 Y 值之间绘制矩形条。</value>\n  </data>\n  <data name=\"TheCandlestickSeriesViewAllowsYouToCreateA\" xml:space=\"preserve\">\n    <value>蜡烛图系列视图允许您创建描述资产价格变动的金融图表。对于每个时间段，图表显示包含开盘价、收盘价、最高价和最低价的数据集。\n\n股票数据：https://www.investing.com/</value>\n  </data>\n  <data name=\"InThisDemoTheCandlestickSeriesViewUsesASpe\" xml:space=\"preserve\">\n    <value>在此演示中，蜡烛图系列视图使用特殊的数据适配器（SummaryCandlestickDataAdapter），它接受原始价格数据并从中构建蜡烛图。\n原始价格是资产在特定时间点的单个价格值。数据适配器根据指定的时间单位将原始价格聚合为蜡烛图。\n例如，数据可以聚合为 1 秒、1 分钟、1 小时、1 天、1 周等，或聚合为选定时间单位的倍数，例如 5 秒、15 分钟、2 天等。</value>\n  </data>\n  <data name=\"TheDataGridSGroupingFeatureMakesItEasyToSu\" xml:space=\"preserve\">\n    <value>Data Grid 的分组功能使用户可以轻松汇总信息。他们可以通过将列拖到分组面板上来按无限数量的列对数据进行分组。</value>\n  </data>\n  <data name=\"YouCanEmbedAnyControlInDataGridCellsToPres\" xml:space=\"preserve\">\n    <value>您可以在 Data Grid 单元格中嵌入任何控件，以按您希望的方式呈现和编辑单元格数据。此演示展示了 Eremex 的内置编辑器：DateEditor、SpinEditor 和 ComboBoxEditor。当您在单元格中使用 Eremex 编辑器时，Data Grid 的性能会显著提高，尤其是在处理大型数据源时。</value>\n  </data>\n  <data name=\"TheDataValidationMechanismAllowsYouToCheck\" xml:space=\"preserve\">\n    <value>数据验证机制允许您检查单元格值并显示包含无效数据的单元格中的错误。您可以使用 DataAnnotation 属性和 IDataErrorInfo/INotifyDataErrorInfo 接口在 ItemsSource 级别验证数据。在此演示中切换“显示 ItemsSource 错误”复选框以查看来自 DataAnnotation 属性的数据验证错误。Data Grid 还允许您使用 ValidateCellValue 事件来实现自定义规则以验证用户输入。</value>\n  </data>\n  <data name=\"DataGridSupportsBuiltInDataSearchAndFiltra\" xml:space=\"preserve\">\n    <value>Data Grid 提供了多种过滤和搜索数据的方法：\n • 列过滤菜单： 将鼠标悬停在列标题上，然后单击过滤按钮以打开菜单。您可以同时对一个或多个列应用过滤器。\n • 自动过滤行： 顶部的这一专用行允许您直接将过滤值输入到任何列中。网格会立即显示仅与您输入的内容匹配的记录。\n • 搜索面板： 在所有列中搜索文本。搜索面板可以设置为始终可见，或通过 Ctrl+F 快捷键激活。匹配的记录会被显示，并且文本在单元格内高亮显示。\n • 代码中的过滤： 对于高级场景，您可以创建自定义过滤条件，并使用控件的 API 以编程方式应用它们。</value>\n  </data>\n  <data name=\"RegardlessOfTheNumberOfColumnsAndRowsInThe\" xml:space=\"preserve\">\n    <value>无论控件中有多少列和行，Data Grid 在水平或垂直滚动或排序/分组数据时仍能保持响应。内置的数据虚拟化机制仅更新视口内的单元格，以保持高性能滚动。</value>\n  </data>\n  <data name=\"DataGridAdaptsRowHeightToFitCellContentsTe\" xml:space=\"preserve\">\n    <value>Data Grid 会调整行高以适应单元格内容。文本列可以以单行或多行显示数据。为列分配 TextEditor 内置编辑器（或其派生类），并启用文本换行以多行显示文本。</value>\n  </data>\n  <data name=\"InThisDemoDataGridEmulatesTheWindowsTaskMa\" xml:space=\"preserve\">\n    <value>在此演示中，Data Grid 通过显示频繁更新的模拟进程来模拟 Windows 任务管理器。如果绑定项源实现了 INotifyPropertyChanged 接口，Data Grid 支持自动数据更新。在此示例中，使用 ObservableObject 类（实现 INotifyPropertyChanged 接口）和 CommunityToolkit.Mvvm 库中定义的 ObservableProperty 属性支持对基础业务对象的更改通知。</value>\n  </data>\n  <data name=\"DataGridSupportsMultipleRowSelectionModeWh\" xml:space=\"preserve\">\n    <value>DataGrid 支持多行选择模式，允许您和用户一次选择（突出显示）多行。用户可以使用鼠标和键盘选择多行。按住 CTRL 和/或 SHIFT 键单击行以选择行。</value>\n  </data>\n  <data name=\"DataGridFixedColumnsDescription\" xml:space=\"preserve\">\n    <value>要在水平滚动期间保留基本数据，您可以将列固定（固定）到左侧或右侧边缘。一旦固定，这些列将保持静止，而其他数据则滚动。启用内置的“固定”列菜单以允许用户在运行时修复列。</value>\n  </data>    \n  <data name=\"DataGridSupportsDragAndDropOperationsWithi\" xml:space=\"preserve\">\n    <value>Data Grid 支持在控件内部和外部控件（例如 Tree List 或另一个 Data Grid）之间进行拖放操作。此示例展示了在 Data Grid 内部和之间的拖放功能。AllowDragDrop 选项激活拖放功能。{0}必须启用 AllowDragDropSortedRows 选项以允许对已排序/分组的 Data Grid 进行拖放操作。当数据已排序或分组时，拖放操作会修改拖动行在排序列中的值。{1}在此示例中，控件绑定到包含相同业务对象的集合。这确保了在从源网格到目标网格的拖放操作期间自动移动行。当您将一行从一个网格移动到另一个网格时，相应的项会在两个网格控件的项源之间移动。</value>\n  </data>\n  <data name=\"DataGridColumnBandsDescription\" xml:space=\"preserve\">\n    <value>列带允许您通过在列上方显示共享标题，将列以可视方式组合在一起。列带和列标题均可包含文本、图像或自定义内容。此演示展示了以下功能：\n • 从源生成列带 — 您可以从视图模型中定义的列带源填充列带。\n • 分层列带 — 该控件允许您创建具有无限嵌套级别的分层列带。\n • 固定列支持 — 列带可以与固定列配合使用。当您固定列时，该列及其列带在水平滚动期间将保持静止。</value>\n  </data>\n  <data name=\"TheEremexControlsLibraryIncludesMultipleEd\" xml:space=\"preserve\">\n    <value>Eremex 控件库包括多个编辑器，为您提供高级数据编辑功能。这些编辑器允许您显示和编辑不同数据类型（数字、布尔值、日期时间、枚举等）的数据。它们支持数据验证机制、样式设置以及嵌入到容器控件（Data Grid、Tree List、Property Grid 和工具栏/菜单）中。</value>\n  </data>\n  <data name=\"TheEditorsLibraryIncludesTheTextEditorAndB\" xml:space=\"preserve\">\n    <value>编辑器库包括 Text Editor 和 Button Editor 控件，它们提供基本的文本编辑功能：数据验证、水印（编辑器为空时显示的提示）以及控制文本选择和数据编辑操作的多个选项。Button Editor 支持无限数量的内置常规按钮和复选框按钮，它们可以在编辑框的左侧或右侧显示文本或图像。</value>\n  </data>\n  <data name=\"TheSpinEditorIsANumericValueEditorWithBuil\" xml:space=\"preserve\">\n    <value>Spin Editor 是一个数值编辑器，带有用于按特定值（增量）增加和减少数字的内置旋转按钮。用户可以通过单击这些按钮或按键盘上的上下箭头来增加和减少数字。SpinEditor 使用数字掩码将用户输入限制为仅数字值，并根据指定的模式格式化编辑值。</value>\n  </data>\n  <data name=\"TheComboBoxEditorFeaturesADropdownListOfIt\" xml:space=\"preserve\">\n    <value>ComboBox Editor 具有一个下拉列表，用户可以从列表中选择一个或多个项目。编辑器可以显示字符串列表、业务对象列表或枚举值。在多选模式下，项目复选框允许用户一次选择多个项目。</value>\n  </data>\n  <data name=\"YouCanUseTheSegmentedEditorToPresentASetOf\" xml:space=\"preserve\">\n    <value>您可以使用 Segmented Editor 将一组选项呈现为水平排列的段。用户可以单击其中一个段以选择相应的选项，或按住 CTRL 键单击选定的段以清除选择。编辑器允许您从字符串列表、业务对象列表或枚举类型填充段。</value>\n  </data>\n  <data name=\"TheDateEditorFeaturesADropdownCalendarThat\" xml:space=\"preserve\">\n    <value>Date Editor 具有一个下拉日历，允许用户选择日期。日历的导航栏使用户可以浏览月份和年份。DateEditor 使用日期时间掩码将用户输入限制为仅日期时间值，并根据指定的模式格式化编辑值。</value>\n  </data>\n  <data name=\"TheColorEditorAndPopupColorEditorControlsA\" xml:space=\"preserve\">\n    <value>Color Editor 和 Popup Color Editor 控件允许用户选择颜色。这些控件支持三种调色板：默认（可在代码中自定义）、标准（固定颜色）和自定义（用户可自定义）。内置的颜色选择器帮助用户从颜色空间添加自定义颜色，或以 RGB 和 HSB 格式指定颜色值。</value>\n  </data>\n  <data name=\"TheHyperlinkEditorDisplaysItsContentAsAHyp\" xml:space=\"preserve\">\n    <value>Hyperlink Editor 将其内容显示为超链接。编辑器支持手动（默认）和自动超链接处理。专用命令或事件允许您手动处理超链接点击。启用自动超链接导航以允许编辑器在点击时自动执行链接。</value>\n  </data>\n  <data name=\"YouCanCreateComboBoxAndSegmentedEditorsIte\" xml:space=\"preserve\">\n    <value>您可以从枚举类型值创建 ComboBox 和 Segmented Editors 的项目。应用于枚举值的专用 Data Annotation 属性允许您使用图像、显示文本和工具提示填充控件的项目。</value>\n  </data>\n  <data name=\"UseMemoEditorToDisplayAndEditLargeTextInAP\" xml:space=\"preserve\">\n    <value>使用 MemoEditor 在弹出窗口中显示和编辑大文本，无论是否启用文本换行。IsTextEditable 属性允许您防止在编辑框中编辑文本。当该属性为 false 时，编辑框可以显示一个特殊图标，指示弹出窗口中存在文本。</value>\n  </data>\n  <data name=\"Graphics3DControlAllowsYouToVisualizeAndIn\" xml:space=\"preserve\">\n    <value>Graphics3DControl 允许您可视化和与 3D 模型交互。使用右侧的属性窗格自定义控件的基本渲染和行为设置。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlT\" xml:space=\"preserve\">\n    <value>此示例展示了一个使用线条渲染 3D 模型的 Graphics3DControl。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlT1\" xml:space=\"preserve\">\n    <value>此示例展示了一个使用点渲染 3D 模型的 Graphics3DControl。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesDynamicTransformati\" xml:space=\"preserve\">\n    <value>此示例展示了应用于 Graphics3DControl 中 3D 模型的动态变换。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesAGraphics3DControlD1\" xml:space=\"preserve\">\n    <value>此示例展示了一个显示具有简单材质的 3D 模型的 Graphics3DControl。使用右侧的属性窗格自定义材质设置。</value>\n  </data>\n  <data name=\"InThisExampleAGraphics3DControlDisplaysA3D\" xml:space=\"preserve\">\n    <value>在此示例中，Graphics3DControl 显示具有纹理材质的 3D 模型。使用右侧的材质窗格选择纹理。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesTheIsometricAndPers\" xml:space=\"preserve\">\n    <value>此示例展示了 Graphics3DControl 支持的等距和透视相机。使用右侧的相机窗格选择相机模式和预定义的相机视图之一。</value>\n  </data>\n  <data name=\"AHeatmapRendersA2DimensionalArrayOfValuesA\" xml:space=\"preserve\">\n    <value>热力图将二维数组的值渲染为颜色编码的矩阵。每个数据点的颜色对应于数据点的值。此示例展示了热力图控件，它允许您从数据创建热力图。单击右侧的颜色渐变以将此颜色编码应用于热力图。\n\n图片来源：韦伯太空望远镜，https://webbtelescope.org/</value>\n  </data>\n  <data name=\"InThisExampleTheHeatmapControlUsesCustomCo\" xml:space=\"preserve\">\n    <value>在此示例中，热力图控件使用自定义颜色编码来实时可视化样本信号的强度变化。顶部的图表控件显示此信号的振幅。控件在底层数据变化时通过计时器无缝更新。</value>\n  </data>\n  <data name=\"InAPolarChartEachDataPointIsDeterminedByAn\" xml:space=\"preserve\">\n    <value>在极坐标图中，每个数据点由角度和距离确定。此示例展示了用于突出显示特定值和值范围的常量和带状区域。角度范围和距离范围在此演示的代码中设置。在图表内左键单击以创建角度的自定义常量线。右键单击以创建距离的自定义常量线。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW1\" xml:space=\"preserve\">\n    <value>此示例展示了点系列视图，它允许您绘制单个点。</value>\n  </data>\n  <data name=\"TheLineSeriesViewShownInThisExampleAllowsY1\" xml:space=\"preserve\">\n    <value>此示例中展示的线系列视图允许您通过连接点来绘制图表。</value>\n  </data>\n  <data name=\"TheAreaSeriesViewAllowsYouDisplayFilledAre1\" xml:space=\"preserve\">\n    <value>区域系列视图允许您显示图表与零点之间的填充区域。当您需要直观地比较两个或多个数据系列时，此视图非常有用。</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee1\" xml:space=\"preserve\">\n    <value>散点线系列视图在您需要按数据系列中出现的顺序连接点时非常有用。</value>\n  </data>\n  <data name=\"ADataSeriesInThisExampleContainsTwoYValues2\" xml:space=\"preserve\">\n    <value>此示例中的数据系列包含每个数据点的两个 Y 值。范围区域视图填充这些 Y 值之间的区域。</value>\n  </data>\n  <data name=\"PropertyGridAutomaticallyDetectsTheTypeOfB\" xml:space=\"preserve\">\n    <value>属性网格自动检测绑定字段的类型，并使用适当的 Eremex 数据编辑器来显示和编辑单元格值。您可以显式地为特定字段分配编辑器，以覆盖默认行为并自定义编辑器设置。</value>\n  </data>\n  <data name=\"PropertyGridTabRowsAllowYouToGroupASetOfFi\" xml:space=\"preserve\">\n    <value>属性网格的选项卡行允许您将一组字段分组到选项卡式用户界面中。每行中的选项卡项显示其自己的一组绑定字段。</value>\n  </data>\n  <data name=\"RibbonControlAllowsYouToIntegrateMicrosoft\" xml:space=\"preserve\">\n    <value>RibbonControl 允许您将受 Microsoft Office 启发的导航菜单集成到您的 Avalonia UI 应用程序中。该控件提供两种视图：经典视图（三行项目）和简化视图（一行项目）。控件右下角的下拉按钮打开一个选择器以在这些视图之间切换。{0}RibbonControl 支持多种项目类型：大按钮和小按钮、复选框按钮、子菜单、内置编辑器、内联和下拉画廊、按钮组等。您可以根据需要创建任意数量的页面，并将项目放置在快速访问工具栏或选项卡标题区域。{1}按下 ALT 键以聚焦到功能区，然后使用键盘在功能区元素之间导航并激活命令。</value>\n  </data>\n  <data name=\"ThisExampleDemonstratesThePointSeriesViewW2\" xml:space=\"preserve\">\n    <value>此示例展示了点系列视图，它允许您在史密斯图上绘制单个点。</value>\n  </data>\n  <data name=\"TheScatterLineSeriesViewIsUsefulWhenYouNee2\" xml:space=\"preserve\">\n    <value>散点线系列视图在您需要按数据系列中出现的顺序连接点时非常有用。</value>\n  </data>\n  <data name=\"TheTreeListSAutoFilterRowDisplayedAtTheTop\" xml:space=\"preserve\">\n    <value>Tree List 控件提供了多种过滤和搜索数据的方法：\n • 列过滤菜单： 将鼠标悬停在列标题上，然后单击过滤按钮以打开菜单。您可以同时对一个或多个列应用过滤器。\n • 自动过滤行： 顶部的专用行允许您直接将过滤值输入到任何列中。控件会立即显示仅与您输入内容匹配的记录。\n • 搜索面板： 在所有列中搜索文本。搜索面板可以设置为始终可见，或通过 Ctrl+F 快捷键激活。匹配的记录会被显示，且文本在单元格内高亮显示。\n • 代码过滤： 对于高级场景，您可以创建自定义过滤条件，并使用控件的 API 以编程方式应用它们。</value>\n  </data>\n  <data name=\"EremexEditorsAreUsedInTreeListCellsByDefau\" xml:space=\"preserve\">\n    <value>默认情况下，Eremex 编辑器用于树列表单元格中以显示和编辑常见数据类型（布尔值、整数、枚举等）的单元格值。此演示展示了隐式分配的内置编辑器，并演示了如何显式指定树列表列的编辑器。</value>\n  </data>\n  <data name=\"YouCanBindTreeListToAHierarchicalDataSourc\" xml:space=\"preserve\">\n    <value>您可以将树列表绑定到分层数据源，该数据源通过集合属性或特殊数据选择器返回子数据。此演示展示了如何创建一个选择器，以提供磁盘上文件夹的分层结构。</value>\n  </data>\n  <data name=\"TheTreeListAndTreeViewControlsSupportMulti\" xml:space=\"preserve\">\n    <value>树列表和树视图控件支持多节点选择模式，允许您和用户一次选择（突出显示）多个节点。用户可以使用鼠标和键盘选择多个节点。按住 CTRL 和/或 SHIFT 键单击节点以选择节点。</value>\n  </data>\n  <data name=\"TreeListColumnBandsDescription\" xml:space=\"preserve\">\n    <value>列带功能允许您通过在列上方显示共享标题，将多列以可视化的方式组合在一起。列标题和列带标题均可包含文本、图像或自定义内容。该控件允许您创建具有无限嵌套级别的分层列带。</value>\n  </data>\n  <data name=\"WASMOnlyText1\" xml:space=\"preserve\">\n    <value>此演示仅适用于桌面模式。下载应用程序。</value>\n  </data>\n  <data name=\"WASMOnlyText2\" xml:space=\"preserve\">\n    <value>解决方案并运行 DemoCenter.Desktop 项目以查看此演示。</value>\n  </data>\n  <data name=\"Skybox\" xml:space=\"preserve\">\n    <value>Graphics3DControl支持天空盒(Skybox)功能，为3D场景提供背景。天空盒是一个包围整个场景的巨大立方体，具有六个纹理面（前、后、左、右、顶和底）。这些纹理被映射到立方体的内侧，营造出遥远的天空、地平线或背景的视觉效果。</value>\n  </data>\n  <data name=\"Lights\" xml:space=\"preserve\">\n    <value>Graphics3DControl 允许为3D场景指定自定义光源。支持的光源类型包括：点光源（Point）、平行光（Directional）、相机点光源（Camera Point）和相机平行光（Camera Directional）。使用自定义光源时，默认光源会自动关闭。</value>\n  </data>\n  <data name=\"HighlightingAndSelection3D\" xml:space=\"preserve\">\n    <value>Graphics3DControl 支持模型和网格的高亮与选中功能。高亮功能会在鼠标悬停在模型或网格上时，为其绘制彩色边框。选中功能则在点击模型或网格时为其添加彩色边框。通过 HighlightMode 和 SelectionMode 属性，可选择高亮/选中是应用于模型还是网格。ShowHints 属性控制模型和网格的提示信息是否可见。</value>\n  </data>\n  <data name=\"ChartsLollipop\" xml:space=\"preserve\">\n    <value>棒棒糖系列视图是一种时尚、节省空间的传统条形图替代方案。它不使用笨重的条形，而是采用顶端带有标记的细线来可视化数据点。您可以使用默认标记，或以SVG格式指定自定义标记。通过“方向”设置，您可以指定棒棒糖线条的方向（水平或垂直）。</value>\n  </data>\n  <data name=\"DataGridExportDescription\" xml:space=\"preserve\">\n    <value>此示例演示了 Data Grid 控件的导出功能。Data Grid 可以将数据导出为 XLSX (Microsoft Excel) 和 PDF 格式，同时保留数据整形选项，包括行分组、排序和单元格格式。</value>\n  </data>\n  <data name=\"ExportProgressTitle\" xml:space=\"preserve\">\n    <value>导出</value>\n  </data>\n  <data name=\"ExportProgressMessage\" xml:space=\"preserve\">\n    <value>正在导出...</value>\n  </data>\n  <data name=\"ExportProgressPromptMessage\" xml:space=\"preserve\">\n    <value>您想打开导出的文件吗？</value>\n  </data>\n  <data name=\"TreeListExportDescription\" xml:space=\"preserve\">\n    <value>树状列表（TreeList）支持将数据导出为XLSX（Microsoft Excel）和PDF格式。其Excel导出功能具备数据感知特性——可在输出的XLSX文档中保留控件的数据整形配置（节点层级结构、数据排序和数值格式化）。PDF渲染引擎遵循WYSIWYG（所见即所得）原则，确保树状列表元素在输出文档中的布局能够被精确还原。</value>\n  </data>\n  <data name=\"UseCasesGroupInfo_Desc\" xml:space=\"preserve\">\n    <value>本演示应用模拟了一个抵押贷款计算器，它使用 Data Grid（数据网格）和 Cartesian Chart（直角坐标图表）控件构建。数据网格以表格形式呈现详细的还款计划。同步的图表会将此数据绘制出来，显示在贷款期限内本金和利息之间的关系。</value>\n  </data>\n  <data name=\"EmptyPoints\" xml:space=\"preserve\">\n    <value>本演示展示了图表控件如何借助\"空点\"处理不完整的数据集。这些点允许您在值缺失的位置创建系列中的可见间隙。要将某个点指定为空点，请将其值设置为 double.NaN、double.PositiveInfinity 或 double.NegativeInfinity。</value>\n  </data>\n  <data name=\"StackedArea\" xml:space=\"preserve\">\n    <value>堆叠面积图系列视图展示所有数据系列之间的绝对关系。每个系列以填充区域的形式层叠在前一个系列之上，其厚度表示该系列的绝对值。顶部的线条显示所有系列的总和。</value>\n  </data>\n  <data name=\"FullStackedArea\" xml:space=\"preserve\">\n    <value>百分比堆叠面积图系列视图（100% 堆叠面积图）展示所有数据系列之间的比例关系。每个系列以填充区域的形式层叠在前一个系列之上，其厚度表示该系列占总体的百分比。顶部线条始终显示为100%。</value>\n  </data>\n  <data name=\"RobotArm\" xml:space=\"preserve\">\n    <value>本演示展示了一个从FBX文件加载的3D机械臂。通过右侧的交互面板，您可以对嵌套的3D模型应用变换，从而操控每个关节（从底座到机械爪）。模型由 Ryan King Art 设计 https://sketchfab.com/ryankingart。</value>\n  </data>\n  <data name=\"STL\" xml:space=\"preserve\">\n    <value>本演示展示了在Graphics3DControl中渲染的电路板3D模型。该示例展示了如何使用Assimp库从STL文件导入复杂模型。加载的几何数据用于初始化Graphics3DControl中的网格、顶点和材质。</value>\n  </data>\n</root>"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewLocator.cs",
    "content": "using System;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Templates;\nusing Avalonia.Media;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter;\n\npublic class ViewLocator : IDataTemplate\n{\n    public Control Build(object data)\n    {\n        if (data is null)\n            return null;\n\n        var name = data.GetType().FullName!.Replace(\"ViewModel\", \"View\");\n        var type = Type.GetType(name);\n\n        if (type != null)\n        {\n            return (Control)Activator.CreateInstance(type)!;\n        }\n        \n        return new TextBlock { Text = name + \" not found!\", Foreground = new SolidColorBrush(Colors.Red), \n            HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center, \n            VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center};\n    }\n\n    public bool Match(object data)\n    {\n        return data is ViewModelBase;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Bars/BarItemsPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing Avalonia;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class BarItemsPageViewModel : PageViewModelBase\n    {\n        public BarItemsPageViewModel()\n        {\n        }\n        static List<Size> glyphSizes;\n        public static List<Size> GlyphSizes\n        {\n            get\n            {\n                if (glyphSizes == null)\n                    glyphSizes = new List<Size> { new Size(48, 48), new Size(32, 32), new Size(20, 20), new Size(16, 16) };\n                return glyphSizes;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Bars/BarsGroupViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class BarsGroupViewModel : PageViewModelBase\n    {\n        public BarsGroupViewModel()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Bars/BarsOverviewPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class BarsOverviewPageViewModel : PageViewModelBase\n    {\n        public BarsOverviewPageViewModel()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Bars/ContextMenuPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class ContextMenuPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] ObservableCollection<MechInfo> mechs;\n        [ObservableProperty] bool orderByAscending;\n        [ObservableProperty] bool orderByDescending;\n\n        [ObservableProperty] DateTime dateTime;\n\n        private Random random = new Random();\n\n        public ContextMenuPageViewModel()\n        {\n            ReloadMechs();\n            DateTime = DateTime.Now;\n        }\n\n        [RelayCommand]\n        public void Reload() => ReloadMechs();\n\n        [RelayCommand]\n        public void ClearAllButTheFirst() => Mechs = new ObservableCollection<MechInfo> { Mechs.First() };\n\n        void ReloadMechs(int count = 4)\n        {\n            var result = new ObservableCollection<MechInfo>();\n            var mechsCount = CsvSources.Mechs.Count;\n\n            do\n            {\n                var item = CsvSources.Mechs[random.Next(0, mechsCount)];\n                if(!result.Contains(item))\n                    result.Add(item);\n            }\n            while (result.Count < count);\n            Mechs = result;\n            if (OrderByAscending)\n                CreateAscendingMechs();\n            else if (OrderByDescending)\n                CreateDescendingMechs();\n        }\n\n        partial void OnOrderByAscendingChanged(bool value)\n        {\n            if (value) \n            { \n                CreateAscendingMechs();\n                OrderByDescending = false;\n            }\n        }\n\n        partial void OnOrderByDescendingChanged(bool value)\n        {\n            if (value)\n            {\n                CreateDescendingMechs();\n                OrderByAscending = false;\n            }                \n        }\n\n        private void CreateAscendingMechs() => Mechs = new ObservableCollection<MechInfo>(Mechs.OrderBy(x => x.Name));\n\n        private void CreateDescendingMechs() => Mechs = new ObservableCollection<MechInfo>(Mechs.OrderByDescending(x => x.Name));\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Bars/ToolbarAndMenuPageViewModel.cs",
    "content": "﻿using Avalonia.Threading;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class ToolbarAndMenuPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] string message;\n        [ObservableProperty] private bool isSyncing;\n        [ObservableProperty] private string syncText = \"Sync Completed\";\n        [ObservableProperty] private double syncProgress = 100;\n        [ObservableProperty] private string text = \"Text Editor (please type here)\";\n        [ObservableProperty] private bool autoSyncEnabled = true;\n\n        public ToolbarAndMenuPageViewModel()\n        {\n            Message = GetType().FullName;\n            timer =  new() { Interval = TimeSpan.FromMilliseconds(10) };\n            timer.Tick += TimerOnTick;\n        }\n\n        private void TimerOnTick(object sender, EventArgs e)\n        {\n            SyncProgress = Math.Min(100, SyncProgress + 1);\n            if(SyncProgress == 100)\n            {\n                IsSyncing = false;\n            }\n        }\n\n        [RelayCommand]\n        public void ToggleSync(object par)\n        {\n            IsSyncing = !IsSyncing;\n        }\n\n        partial void OnTextChanged(string value)\n        {\n            if(AutoSyncEnabled)\n            {\n                IsSyncing = true;\n            }\n        }\n        \n        partial void OnIsSyncingChanged(bool value)\n        {\n            if(IsSyncing)\n            {\n                SyncText = \"Syncing...\";\n                StartSynchronization();\n            }\n            else\n            {\n                if(SyncProgress == 100)\n                {\n                    SyncText = \"Sync Completed\";   \n                }\n                else\n                {\n                    SyncText = \"Click the circle to sync the document\";\n                }\n\n                StopSynchronization();\n            }\n        }\n\n        private readonly DispatcherTimer timer;\n        private void StartSynchronization()\n        {\n            SyncProgress = 0;\n            timer.Start();\n        }\n\n        private void StopSynchronization()\n        {\n            timer.Stop();\n        }\n\n        partial void OnAutoSyncEnabledChanged(bool value)\n        {\n            if (value)\n            {\n                IsSyncing = true;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianAreaSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianAreaSeriesViewViewModel : ChartsPageViewModel\n{\n    static double Sin(double argument) => Math.Sin(argument);\n    static double Cos(double argument) => Math.Cos(argument);\n\n    const int ItemsCount = 100;\n    const double Step = 4 * Math.PI / ItemsCount;\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, Step, ItemsCount, Sin)},\n        new SeriesViewModel { Color = Color.FromArgb(255, 0, 120, 122), DataAdapter = new FormulaDataAdapter(0, Step, ItemsCount, Cos)},\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianCandlestickAggregationViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianCandlestickAggregationViewModel : ChartsPageViewModel\n{\n    const double MinPrice = 5.0;\n    const double StartPrice = 24.0;\n    const int ItemsCount = 30 * 24 * 60; \n    \n    [ObservableProperty] SummaryCandlestickDataAdapter stockData;\n    [ObservableProperty] DateTimeUnit measureUnit = DateTimeUnit.Hour;\n    [ObservableProperty] int measureUnitFactor = 1;\n    \n    public CartesianCandlestickAggregationViewModel()\n    {\n        var random = new Random(3);\n        var arguments = new List<DateTime>(ItemsCount);\n        var values = new List<double>(ItemsCount);\n        var now = DateTime.Now;\n        double prevValue = StartPrice;\n        for (int i = 0; i < ItemsCount; i++)\n        {\n            double value = prevValue + (random.NextDouble() - 0.5) / 8d;\n            if (value <= MinPrice)\n                value = 2 * MinPrice - value;\n            arguments.Add(now.AddMinutes(i - ItemsCount));\n            values.Add(value);\n            prevValue = value;\n        }\n\n        stockData = new SummaryCandlestickDataAdapter(arguments, values) { MeasureUnit = MeasureUnit, MeasureUnitFactor = MeasureUnitFactor };\n    }\n\n    [RelayCommand]\n    void SetMeasureUnit(DateTimeUnitItem unit)\n    {\n        MeasureUnit = unit.Unit;\n        MeasureUnitFactor = unit.Factor;\n        StockData.MeasureUnit = unit.Unit;\n        StockData.MeasureUnitFactor = unit.Factor;\n    }\n}\n\npublic class DateTimeUnitItem\n{\n    public DateTimeUnit Unit { get; set; }\n    public int Factor { get; set; }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianCandlestickSeriesViewViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianCandlestickSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] CandlestickDataAdapter stockData;\n    [ObservableProperty] SortedDateTimeDataAdapter volumeData;\n    \n    public CartesianCandlestickSeriesViewViewModel()\n    {\n        var data = CsvSources.Stock;\n        var arguments = new List<DateTime>(data.Count);\n        var open = new List<double>(data.Count);\n        var high = new List<double>(data.Count);\n        var low = new List<double>(data.Count);\n        var close = new List<double>(data.Count);\n        var volume = new List<double>(data.Count);\n        for (var i = data.Count - 1; i >= 0; i--)\n        {\n            arguments.Add(data[i].Date);\n            open.Add(data[i].Open);\n            high.Add(data[i].High);\n            low.Add(data[i].Low);\n            close.Add(data[i].Close);\n            volume.Add(data[i].Volume);\n        }\n        StockData = new CandlestickDataAdapter(arguments, open, high, low, close);\n        volumeData = new SortedDateTimeDataAdapter(arguments, volume);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianChartAxesPageViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\r\nusing Avalonia.Media;\r\nusing CommunityToolkit.Mvvm.ComponentModel;\r\nusing Eremex.AvaloniaUI.Charts;\r\n\r\nnamespace DemoCenter.ViewModels;\r\n\r\npublic partial class CartesianChartAxesPageViewModel : ChartsPageViewModel\r\n{\r\n    static readonly Color Color1 = Color.FromArgb(255, 189, 20, 54);\r\n    static readonly Color Color2 = Color.FromArgb(255, 0, 120, 122);\r\n    \r\n    static double Formula1(double argument) => Math.Pow(argument, 2);\r\n    static double Formula2(double argument) => Math.Pow(argument, 1.7);\r\n\r\n    [ObservableProperty] AxisViewModel selectedAxis;\r\n    [ObservableProperty] ObservableCollection<AxisViewModel> axesX = new()\r\n    {\r\n        new AxisViewModel { Key = \"1\", Title = \"First Axis X\", Color = Color1, ShowInterlacing = true, ShowMajorGridlines = true, ShowMinorGridlines = true },\r\n        new AxisViewModel { Key = \"2\", Title = \"Second Axis X\", Color = Color2, Position = AxisPosition.Far }\r\n    };\r\n    [ObservableProperty] ObservableCollection<AxisViewModel> axesY = new()\r\n    {\r\n        new AxisViewModel { Key = \"1\", Title = \"First Axis Y\", Color = Color1, ShowInterlacing = true, ShowMajorGridlines = true, ShowMinorGridlines = true, Reverse = true },\r\n        new AxisViewModel { Key = \"2\", Title = \"Second Axis Y\", Color = Color2, Position = AxisPosition.Far }\r\n    };\r\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\r\n    {\r\n        new SeriesViewModel { Color = Color1, AxisXKey = \"1\", AxisYKey = \"1\", DataAdapter = new FormulaDataAdapter(0, 1, 100, Formula1)},\r\n        new SeriesViewModel { Color = Color2, AxisXKey = \"2\", AxisYKey = \"2\", DataAdapter = new FormulaDataAdapter(0, 1, 200, Formula2)},\r\n    };\r\n\r\n    public IEnumerable<AxisViewModel> Axes\r\n    {\r\n        get\r\n        {\r\n            foreach (var axis in AxesX)\r\n                yield return axis;\r\n            foreach (var axis in AxesY)\r\n                yield return axis;\r\n        }\r\n    }\r\n\r\n    public CartesianChartAxesPageViewModel()\r\n    {\r\n        SelectedAxis = AxesX.First();\r\n    }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianChartLargeDataPageViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\r\nusing Avalonia.Media;\r\nusing CommunityToolkit.Mvvm.ComponentModel;\r\nusing Eremex.AvaloniaUI.Charts;\r\n\r\nnamespace DemoCenter.ViewModels;\r\n\r\npublic partial class CartesianChartLargeDataPageViewModel : ChartsPageViewModel\r\n{\r\n    static double Formula(double argument, int index) => Math.Sin(argument) +\r\n                                                         Math.Sin(argument / 100.0) +\r\n                                                         30 * Math.Sin(argument / 1000.0) +\r\n                                                         1000 * (1 + 0.1 * index % 10) *\r\n                                                         Math.Sin(argument / 100000.0 + Math.PI / 6 * index);\r\n\r\n    const int ItemsCount = 1_000_000;\r\n\r\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\r\n    {\r\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, 1, ItemsCount, arg => Formula(arg, 0))},\r\n        new SeriesViewModel { Color = Color.FromArgb(255, 0, 120, 122), DataAdapter = new FormulaDataAdapter(0, 1, ItemsCount, arg => Formula(arg, 1))},\r\n    };\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianChartLogarithmicScalePageViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\r\nusing Avalonia.Media;\r\nusing CommunityToolkit.Mvvm.ComponentModel;\r\nusing DemoCenter.DemoData;\r\nusing Eremex.AvaloniaUI.Charts;\r\n\r\nnamespace DemoCenter.ViewModels;\r\n\r\npublic partial class CartesianChartLogarithmicScalePageViewModel : ChartsPageViewModel\r\n{\r\n    static readonly Color[] colors = new[]\r\n    {\r\n        Color.FromArgb(255, 168, 207, 213),\r\n        Color.FromArgb(255, 163, 201, 207),\r\n        Color.FromArgb(255, 138, 193, 201),\r\n        Color.FromArgb(255, 107, 178, 188),\r\n        Color.FromArgb(255, 103, 171, 181),\r\n        Color.FromArgb(255, 31, 114, 115),\r\n        Color.FromArgb(255, 0, 95, 96)\r\n    };\r\n\r\n    const double LogBase = 10;\r\n    \r\n    [ObservableProperty] LogarithmicAxisViewModel axisX = new() { LogarithmicBase = LogBase };\r\n    [ObservableProperty] bool logarithmicX = true;\r\n    [ObservableProperty] CustomLabelFormatter frequencyFormatter = new(o => $\"{o} Hz\");\r\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new();\r\n\r\n    public CartesianChartLogarithmicScalePageViewModel()\r\n    {\r\n        var data = CsvSources.Logarithmic;\r\n        for (int i = 0; i < 7; i++)\r\n            series.Add(new SeriesViewModel { Color = colors[i], DataAdapter = CreateDataAdapter(data, i + 1) });\r\n    }\r\n    SortedNumericDataAdapter CreateDataAdapter(List<CsvDoubleColumn> data, int valueIndex)\r\n    {\r\n        var result = new SortedNumericDataAdapter();\r\n        for (int i = 0; i < data[0].Data.Count; i++)\r\n            result.Add(data[0].Data[i], data[valueIndex].Data[i]);\r\n        return result;\r\n    }\r\n    partial void OnLogarithmicXChanged(bool value) => AxisX.LogarithmicBase = value ? LogBase : null;\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianChartRealtimePageViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\r\nusing Avalonia.Media;\r\nusing Avalonia.Threading;\r\nusing CommunityToolkit.Mvvm.ComponentModel;\r\nusing DemoCenter.ViewModels.DataAdapters;\r\n\r\nnamespace DemoCenter.ViewModels;\r\n\r\npublic partial class CartesianChartRealtimePageViewModel : ChartsPageViewModel\r\n{\r\n    static readonly Color[] colors = new[]\r\n    {\r\n        Color.FromArgb(255, 204, 55, 28),\r\n        Color.FromArgb(255, 255, 106, 0),\r\n        Color.FromArgb(255, 0, 148, 255),\r\n        Color.FromArgb(255, 119, 133, 255),\r\n        Color.FromArgb(255, 0, 127, 128),\r\n        Color.FromArgb(255, 91, 171, 171)\r\n    };\r\n    \r\n    readonly DispatcherTimer timer = new(DispatcherPriority.Background);\r\n    readonly RealtimeDataGenerator generator = new(6, 500, 35);\r\n\r\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new();\r\n    \r\n    public CartesianChartRealtimePageViewModel()\r\n    {\r\n        generator.GenerateInitialData();\r\n        timer.Tick += (_, _) => generator.UpdateAdapters(); \r\n        timer.Interval = TimeSpan.FromMilliseconds(2);\r\n\r\n        for (int i = 0; i < generator.Adapters.Length; i++)\r\n            series.Add(new SeriesViewModel { Color = colors[i], DataAdapter = generator.Adapters[i] });\r\n    }\r\n    public void Start()\r\n    {\r\n        generator.Start();\r\n        timer.Start();\r\n    }\r\n    public void Stop()\r\n    {\r\n        generator.Stop();\r\n        timer.Stop();\r\n    }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianEmptyPointsViewModel.cs",
    "content": "﻿using Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianEmptyPointsViewModel : ChartsPageViewModel\n{\n    const int PointsCount = 100;\n\n    static bool IsEmpty(double v) => v is > 30 and < 40 or > 60 and < 70;\n    \n    [ObservableProperty] List<ViewViewModel> views;\n    [ObservableProperty] SeriesViewBase selectedView;\n    [ObservableProperty] ISeriesDataAdapter dataAdapter;\n\n    public CartesianEmptyPointsViewModel()\n    {\n        var color = Color.FromArgb(255, 189, 20, 54);\n        var color2 = Color.FromArgb(255, 0, 120, 122);\n        \n        var simpleAdapter = new FormulaDataAdapter(0, 1, PointsCount, d => IsEmpty(d) ? double.NaN : Math.Sin(d / 10));\n        views =\n        [\n            new(\"Line\", simpleAdapter, new CartesianLineSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Area\", simpleAdapter, new CartesianAreaSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Scatter Line\", CreateScatterData(), new CartesianScatterLineSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Step Line\", simpleAdapter, new CartesianStepLineSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Step Area\", simpleAdapter, new CartesianStepAreaSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Range Area\", CreateRangeData(), new CartesianRangeAreaSeriesView { Color = Color.FromArgb(255, 67, 201, 39), Color1 = color, Color2 = color2, ShowMarkers1 = true, ShowMarkers2 = true })\n        ];\n        selectedView = views[0].View;\n        dataAdapter = views[0].DataAdapter;\n    }\n\n    ScatterDataAdapter CreateScatterData()\n    {\n        var scatterData = new List<(double, double)>(PointsCount);\n        for (int i = 0; i < PointsCount; i++)\n        {\n            double factor = 0.1 * i;\n            double v = IsEmpty(i) ? double.NaN : factor * Math.Sin(factor);\n            scatterData.Add((factor * Math.Cos(factor), v));\n        }\n        return new ScatterDataAdapter(scatterData);\n    }\n    TimeSpanRangeDataAdapter CreateRangeData()\n    {\n        var rangeData = new List<(TimeSpan, double, double)>(PointsCount);\n        for (double i = 0; i < PointsCount; i++)\n        {\n            double v = IsEmpty(i) ? double.NaN : Math.Sin(i / 10);\n            rangeData.Add((TimeSpan.FromSeconds(i), v, v - 1));\n        }\n        return new TimeSpanRangeDataAdapter(rangeData);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianFullStackedAreaSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianFullStackedAreaSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromUInt32(0xFF9B59B6), DataAdapter = new SortedNumericDataAdapter()},\n        new SeriesViewModel { Color = Color.FromUInt32(0xFFE74C3C), DataAdapter = new SortedNumericDataAdapter()},\n        new SeriesViewModel { Color = Color.FromUInt32(0xFFF39C12), DataAdapter = new SortedNumericDataAdapter()}\n    };\n\n    public CartesianFullStackedAreaSeriesViewViewModel()\n    {\n        const int pointCount = 15;\n        const int step = 1;\n        var random = new Random();\n        for (int i = 0; i < pointCount; i++)\n        {\n            ((SortedNumericDataAdapter)series[0].DataAdapter).Add(i * step, 20 + 10 * Math.Cos(i * 0.1) + random.NextDouble() * 5);\n            ((SortedNumericDataAdapter)series[1].DataAdapter).Add(i * step, 15 + 8 * Math.Sin(i * 0.6) + random.NextDouble() * 4);\n            ((SortedNumericDataAdapter)series[2].DataAdapter).Add(i * step, 8 + 8 * Math.Cos(i * 0.1) + random.NextDouble() * 4);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianLineSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianLineSeriesViewViewModel : ChartsPageViewModel\n{\n    static double Sin(double argument) => Math.Sin(argument);\n    static double Cos(double argument) => Math.Cos(argument);\n\n    const int ItemsCount = 100;\n    const double Step = 4 * Math.PI / ItemsCount;\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, Step, ItemsCount, Sin)},\n        new SeriesViewModel { Color = Color.FromArgb(255, 0, 120, 122), DataAdapter = new FormulaDataAdapter(0, Step, ItemsCount, Cos)},\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianLollipopSeriesViewViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianLollipopSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] SortedNumericDataAdapter dataAdapter = new();\n    [ObservableProperty] CartesianLollipopOrientation lineOrientation = CartesianLollipopOrientation.Vertical;\n    [ObservableProperty] double lineThickness = 1;\n    [ObservableProperty] double markerSize = 12;\n    \n    public CartesianLollipopSeriesViewViewModel()\n    {\n        const int step = 30; \n        for (int i = -step; i < step; i++)\n        {\n            double x = 0.5 * Math.PI * i / step;\n            double y = Math.Sin(x);\n            DataAdapter.Add(x, y);\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianPointSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.ViewModels.DataAdapters;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianPointSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] private ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(64, 189, 20, 54), DataAdapter = new ClusterDataAdapter(2000, -1000, 2000, -1000, 10000) },\n        new SeriesViewModel { Color = Color.FromArgb(64, 0, 120, 122), DataAdapter = new ClusterDataAdapter(1000, -2000, 1000, -2000, 10000) }\n    };\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianRangeAreaSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianRangeAreaSeriesViewViewModel : ChartsPageViewModel\n{\n    readonly Random random = new();\n\n    [ObservableProperty] Color color = Color.FromArgb(255, 67, 201, 39);\n    [ObservableProperty] Color color1 = Color.FromArgb(255, 189, 20, 54);\n    [ObservableProperty] Color color2 = Color.FromArgb(255, 0, 120, 122);\n    [ObservableProperty] NumericRangeDataAdapter dataAdapter = new();\n\n    public CartesianRangeAreaSeriesViewViewModel()\n    {\n        for (int i = 0; i < 20; i++)\n        {\n            double argument = i;\n            double value1 = random.NextDouble() + 1.5;\n            double value2 = random.NextDouble() + 0.5;\n            if (i is > 6 and < 13)\n                DataAdapter.Add(argument, value2, value1);\n            else\n                DataAdapter.Add(argument, value1, value2);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianScatterLineSeriesViewViewModel.cs",
    "content": "﻿using Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianScatterLineSeriesViewViewModel : ChartsPageViewModel\n{\n    const int ItemsCount = 500;\n\n    [ObservableProperty] SeriesViewModel series;\n\n    public CartesianScatterLineSeriesViewViewModel()\n    {\n        var data = new List<(double, double)>(ItemsCount);\n        for (int i = 0; i < ItemsCount; i++)\n        {\n            double factor = 0.1 * i;\n            data.Add((factor * Math.Cos(factor), factor * Math.Sin(factor)));\n        }\n\n        Series = new() { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new ScatterDataAdapter(data) };\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianSideBySideBarSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianSideBySideBarSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] private ObservableCollection<SeriesViewModel> series = new();\n\n    public CartesianSideBySideBarSeriesViewViewModel()\n    {\n        var random = new Random(4);\n        var start = DateTime.Now.AddMonths(-1);\n        SortedDateTimeDataAdapter adapter1 = new();\n        SortedDateTimeDataAdapter adapter2 = new();\n        for (int i = 0; i < 12; i++)\n        {\n            var argument = start.AddDays(i);\n            adapter1.Add(argument, random.NextDouble() * 100 - 30);\n            adapter2.Add(argument, random.NextDouble() * 100 - 30);\n        }\n        \n        series.Add(new SeriesViewModel { Color = Color.FromArgb(180, 189, 20, 54), DataAdapter = adapter1 });\n        series.Add(new SeriesViewModel { Color = Color.FromArgb(180, 0, 120, 122), DataAdapter = adapter2 });\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianSideBySideRangeBarSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianSideBySideRangeBarSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] private ObservableCollection<SeriesViewModel> series = new();\n\n    public CartesianSideBySideRangeBarSeriesViewViewModel()\n    {\n        var random = new Random(10);\n        NumericRangeDataAdapter adapter1 = new();\n        NumericRangeDataAdapter adapter2 = new();\n        for (int i = 0; i < 12; i++)\n        {\n            adapter1.Add(i, random.NextDouble() * 100, random.NextDouble() * 100);\n            adapter2.Add(i, random.NextDouble() * 100, random.NextDouble() * 100);\n        }\n        \n        series.Add(new SeriesViewModel { Color = Color.FromArgb(180, 189, 20, 54), DataAdapter = adapter1 });\n        series.Add(new SeriesViewModel { Color = Color.FromArgb(180, 0, 120, 122), DataAdapter = adapter2 });\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianStackedAreaSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianStackedAreaSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromUInt32(0xFF9B59B6), DataAdapter = new SortedNumericDataAdapter()},\n        new SeriesViewModel { Color = Color.FromUInt32(0xFFE74C3C), DataAdapter = new SortedNumericDataAdapter()},\n        new SeriesViewModel { Color = Color.FromUInt32(0xFFF39C12), DataAdapter = new SortedNumericDataAdapter()}\n    };\n\n    public CartesianStackedAreaSeriesViewViewModel()\n    {\n        const int pointCount = 15;\n        const int step = 1;\n        var random = new Random();\n        for (int i = 0; i < pointCount; i++)\n        {\n            ((SortedNumericDataAdapter)series[0].DataAdapter).Add(i * step, 20 + 10 * Math.Cos(i * 0.1) + random.NextDouble() * 5);\n            ((SortedNumericDataAdapter)series[1].DataAdapter).Add(i * step, 15 + 8 * Math.Sin(i * 0.6) + random.NextDouble() * 4);\n            ((SortedNumericDataAdapter)series[2].DataAdapter).Add(i * step, 8 + 8 * Math.Cos(i * 0.1) + random.NextDouble() * 4);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianStepAreaSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianStepAreaSeriesViewViewModel : ChartsPageViewModel\n{\n    static Random Random = new(1);\n    static double Formula1(double argument) => Random.NextDouble() * 20 + 10;\n    static double Formula2(double argument) => Random.NextDouble() * 20;\n\n    const int ItemsCount = 10;\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, 1, ItemsCount, Formula1)},\n        new SeriesViewModel { Color = Color.FromArgb(255, 0, 120, 122), DataAdapter = new FormulaDataAdapter(0, 1, ItemsCount, Formula2)},\n    };\n\n    public CartesianStepAreaSeriesViewViewModel()\n    {\n        Random = new Random(1);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianStepLineSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianStepLineSeriesViewViewModel : ChartsPageViewModel\n{\n    static Random Random = new(1);\n    static double Formula1(double argument) => Random.NextDouble() * 20;\n    static double Formula2(double argument) => Random.NextDouble() * 20 - 10;\n\n    const int ItemsCount = 10;\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, 1, ItemsCount, Formula1)},\n        new SeriesViewModel { Color = Color.FromArgb(255, 0, 120, 122), DataAdapter = new FormulaDataAdapter(0, 1, ItemsCount, Formula2)},\n    };\n    \n    public CartesianStepLineSeriesViewViewModel()\n    {\n        Random = new Random(1);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/CartesianStripsAndConstantLinesViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class CartesianStripsAndConstantLinesViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] SeriesViewModel series = new() { Color = Color.FromArgb(255, 0, 120, 122), DataAdapter = CreateAdapter() };\n    [ObservableProperty] ObservableCollection<ConstantLineViewModel> constantLines = new();\n    \n    static ISeriesDataAdapter CreateAdapter()\n    {\n        const int pointsCount = 250;\n        \n        var random = new Random(0);\n        var arguments = new List<TimeSpan>(pointsCount);\n        var values = new List<double>(pointsCount);\n        double startTemperature = 30;\n        for (int i = 0; i < pointsCount; i++) {\n            arguments.Add(TimeSpan.FromSeconds(i));\n            double temperature = startTemperature + (random.NextDouble() - 0.5) * 10;\n            if (temperature > 90)\n                temperature -= 20;\n            if (temperature < 20)\n                temperature += 10;\n            values.Add(temperature);\n            startTemperature = temperature;\n        }\n        \n        return new SortedTimeSpanDataAdapter(arguments, values);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/ChartElementViewModels/AxisViewModel.cs",
    "content": "﻿using Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class AxisViewModel : ObservableObject\n{\n    [ObservableProperty] AxisPosition position;\n    [ObservableProperty] string title;\n    [ObservableProperty] string key;\n    [ObservableProperty] bool showTitle = true;\n    [ObservableProperty] bool showLabels = true;\n    [ObservableProperty] bool showInterlacing;\n    [ObservableProperty] bool? showMajorGridlines = false;\n    [ObservableProperty] bool? showMinorGridlines = false;\n    [ObservableProperty] int minorCount = 3;\n    [ObservableProperty] Color color;\n    [ObservableProperty] bool reverse;\n\n    public override string ToString() => Title;\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/ChartElementViewModels/ConstantLineViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class ConstantLineViewModel : ObservableObject\n{\n    [ObservableProperty] string title;\n    [ObservableProperty] object axisValue;\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/ChartElementViewModels/CustomLabelFormatter.cs",
    "content": "﻿using Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic class CustomLabelFormatter : IAxisLabelFormatter\n{\n    readonly Func<object, string> formatFunc;\n\n    public CustomLabelFormatter(Func<object, string> formatFunc)\n    {\n        this.formatFunc = formatFunc;\n    }\n    public string Format(object value) => formatFunc(value);\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/ChartElementViewModels/LogarithmicAxisViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class LogarithmicAxisViewModel : ObservableObject\n{\n    [ObservableProperty] double? logarithmicBase;\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/ChartElementViewModels/SeriesViewModel.cs",
    "content": "﻿using Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class SeriesViewModel : ObservableObject\n{\n    [ObservableProperty] string axisXKey;\n    [ObservableProperty] string axisYKey;\n    [ObservableProperty] Color color;\n    [ObservableProperty] ISeriesDataAdapter dataAdapter;\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/ChartElementViewModels/ViewViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class ViewViewModel : ViewModelBase\n{\n    [ObservableProperty] string name;\n    [ObservableProperty] SeriesViewBase view;\n    [ObservableProperty] ISeriesDataAdapter dataAdapter;\n\n    public ViewViewModel(string name, ISeriesDataAdapter adapter, SeriesViewBase view)\n    {\n        Name = name;\n        View = view;\n        DataAdapter = adapter;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/ChartsPageViewModel.cs",
    "content": "﻿namespace DemoCenter.ViewModels;\n\npublic partial class ChartsPageViewModel : PageViewModelBase\n{\n    public ChartsPageViewModel()\n    {\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/Data/ClusterDataAdapter.cs",
    "content": "﻿using Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels.DataAdapters;\n\npublic class ClusterDataAdapter : ISeriesDataAdapter\n{\n    readonly int count;\n    readonly List<double> arguments;\n    readonly List<double> values;\n\n    public int ItemCount => count;\n    public bool IsDataSorted => false;\n    public event SeriesDataAdapterDataChangedEventHandler DataChanged;\n\n    public ClusterDataAdapter(int xMinus, int xPlus, int yMinus, int yPlus, int count)\n    {\n        this.count = count;\n        arguments = new List<double>(count);\n        values = new List<double>(count);\n        \n        var random = new Random(0);\n        int deltaX = xMinus - xPlus;\n        int deltaY = yMinus - yPlus;\n        double centerX = 0.5 * xMinus + 0.5 * xPlus;\n        double centerY = 0.5 * yMinus + 0.5 * yPlus;\n        for (int i = 0; i < count; i++) {\n            double half = 0.5 * i + 1;\n            double ratio = Math.Max(2.1, count / half);\n            int xOffset = (int)(deltaX / ratio);\n            int yOffset = (int)(deltaY / ratio);\n            double delta = xMinus - xOffset - centerX;\n            int rx, ry;\n            do {\n                rx = random.Next(xPlus + xOffset, xMinus - xOffset);\n                ry = random.Next(yPlus + yOffset, yMinus - yOffset);\n            }\n            while (delta * delta < Math.Pow(centerX - rx, 2) + Math.Pow(centerY - ry, 2));\n            arguments.Add(rx);\n            values.Add(ry);\n        };\n    }\n    public Dictionary<AxisType, ScaleType> GetScaleTypes() => new() { { AxisType.Argument, ScaleType.Numeric }, { AxisType.Value, ScaleType.Numeric } };\n    protected virtual void OnDataChanged(ISeriesDataAdapter adapter, SeriesDataAdapterDataChangedEventArgs e) => DataChanged?.Invoke(adapter, e);\n    public double GetNumericalValue(int index, SeriesDataMemberType dataMember) => dataMember switch\n    {\n        SeriesDataMemberType.Argument => arguments[index],\n        SeriesDataMemberType.Value => values[index],\n        _ => throw new ArgumentOutOfRangeException(nameof(dataMember), dataMember, null)\n    };\n    public DateTime GetDateTimeValue(int index, SeriesDataMemberType dataMember) => throw new NotImplementedException();\n    public TimeSpan GetTimeSpanValue(int index, SeriesDataMemberType dataMember) => throw new NotImplementedException();\n    public string GetQualitativeValue(int index, SeriesDataMemberType dataMember) => throw new NotImplementedException();\n\n    public string GetUnderlyingData(int index) => null;\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/Data/RealtimeDataGenerator.cs",
    "content": "﻿using Eremex.AvaloniaUI.Charts;\r\n\r\nnamespace DemoCenter.ViewModels.DataAdapters;\r\n\r\npublic class RealtimeDataGenerator\r\n{\r\n    readonly Random random = new(1);\r\n    readonly object sync = new();\r\n    readonly int interval;\r\n    readonly int pointsCount;\r\n    readonly List<(TimeSpan, double)>[] buffers;\r\n    readonly SortedTimeSpanDataAdapter[] adapters;\r\n    readonly double[] yAdditions;\r\n    bool enabled;\r\n    Thread generatingThread;\r\n    \r\n    int AdaptersCount => adapters.Length;\r\n    public SortedTimeSpanDataAdapter[] Adapters => adapters;\r\n        \r\n    public RealtimeDataGenerator(int adaptersCount, int pointsCount, int interval)\r\n    {\r\n        this.interval = interval;\r\n        this.pointsCount = pointsCount;\r\n        adapters = new SortedTimeSpanDataAdapter[adaptersCount];\r\n        buffers = new List<(TimeSpan, double)>[adaptersCount];\r\n        yAdditions = new double[adaptersCount];\r\n        for (int i = 0; i < AdaptersCount; i++)\r\n        {\r\n            adapters[i] = new SortedTimeSpanDataAdapter();\r\n            buffers[i] = new List<(TimeSpan, double)>();\r\n        }\r\n    }\r\n    (TimeSpan, double) CreatePoint(int index, TimeSpan timeStamp)\r\n    {\r\n        double arg = timeStamp.TotalMilliseconds;\r\n        yAdditions[index] += random.Next(10, 20) * Math.Sign(random.NextDouble() - 0.5);\r\n        if (yAdditions[index] < -30)\r\n            yAdditions[index] += 10;\r\n        if (yAdditions[index] > 30)\r\n            yAdditions[index] -= 10;\r\n        double indication = 5 * Math.Sin((index + 1) * Math.Cos(arg)) + 100 * index + (random.NextDouble() - 0.5) * 5 + yAdditions[index];\r\n        return (timeStamp, indication);\r\n    }\r\n    void GeneratingLoop()\r\n    {\r\n        var timeStamp = TimeSpan.FromMilliseconds(pointsCount * interval);\r\n        var addition = TimeSpan.FromMilliseconds(interval);\r\n        while (enabled)\r\n        {\r\n            Thread.Sleep((int)addition.TotalMilliseconds);\r\n            timeStamp += addition;\r\n            for (int i = 0; i < AdaptersCount; i++)\r\n            {\r\n                var point = CreatePoint(i, timeStamp);\r\n                lock (sync)\r\n                {\r\n                    buffers[i].Add(point);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    public void GenerateInitialData()\r\n    {\r\n        for (int i = 0; i < pointsCount - 1; i++)\r\n        {\r\n            var argument = TimeSpan.FromMilliseconds(i * interval);\r\n            for (int j = 0; j < AdaptersCount; j++)\r\n                adapters[j].Add(CreatePoint(j, argument));\r\n        }\r\n    }\r\n    public void Start()\r\n    {\r\n        generatingThread ??= new Thread(GeneratingLoop);\r\n        enabled = true;\r\n        generatingThread.Start();\r\n    }\r\n    public void Stop()\r\n    {\r\n        enabled = false;\r\n        generatingThread?.Join();\r\n        generatingThread = null;\r\n    }\r\n    public void UpdateAdapters()\r\n    {\r\n        lock (sync)\r\n        {\r\n            for (int i = 0; i < AdaptersCount; i++)\r\n            {\r\n                adapters[i].AddRange(buffers[i]);\r\n                adapters[i].RemoveFromStart(buffers[i].Count);\r\n                buffers[i].Clear();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/Data/SmithSampleDataAdapter.cs",
    "content": "﻿using Avalonia;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels.DataAdapters;\n\npublic class SmithSampleDataAdapter : ScatterDataAdapter\n{\n    static List<(double, double)> CreatePoints() => new()\n    {\n        new(4.0927416947323625, 5.039470338092902),\n        new(3.92510559125759, 5.038444841265609),\n        new(2.9609480516938445, 4.388962584752334),\n        new(2.5546535427921997, 4.000471294814654),\n        new(1.964717762258852, 3.3997119638438367),\n        new(1.664097447415818, 3.0249308991544144),\n        new(1.443557453328536, 2.7954983980116954),\n        new(1.2681152405414577, 2.502502932413702),\n        new(1.1100296667507819, 2.1847040378971396),\n        new(0.9392207784153547, 1.854062392922539),\n        new(0.846089195699504, 1.7082233596053027),\n        new(0.7705257398312417, 1.5529513803851396),\n        new(0.6719552097724123, 1.352344942921545),\n        new(0.5877645431815587, 1.180666264709727),\n        new(0.5111203186726802, 1.0322050014852482),\n        new(0.46301028834485936, 0.921361441133213),\n        new(0.38351079156636886, 0.7998918714458432),\n        new(0.3478144093933388, 0.7194480222678319),\n        new(0.3248983102732522, 0.6642728279656329),\n        new(0.2816305674430336, 0.5855939023590193),\n        new(0.25584555266104975, 0.5226929043338495),\n        new(0.23529646617441882, 0.4683983374673091),\n        new(0.21602243403906227, 0.42985460828467703),\n        new(0.21230948367795713, 0.3827462979735884),\n        new(0.20497820337091424, 0.33847337013198103),\n        new(0.18900574934462128, 0.2970955634833308),\n        new(0.18394916472084608, 0.26015163253654855),\n        new(0.17845441391224548, 0.2172719442948981),\n        new(0.17224167022622433, 0.18135577409329476),\n        new(0.17029203319744238, 0.12565543452267378),\n        new(0.16657050817062716, 0.07287521161882622),\n        new(0.17101775870369532, -0.011101043410171247),\n        new(0.1629916144256333, -0.0741315546761855),\n        new(0.1697711624181565, -0.12260488128437728),\n        new(0.19961866302746403, -0.20896384612510208),\n        new(0.19924677434147384, -0.24065671934610092),\n        new(0.20464883477630527, -0.28036502928504925),\n        new(0.21632626503829122, -0.3322953198300484),\n        new(0.21360546678353406, -0.46906870241922927),\n        new(0.19844543817776145, -0.5815443598287293),\n        new(0.20704405829292036, -0.6257752253896222),\n        new(0.23047251687560255, -0.7000964320154291),\n        new(0.2614096427695895, -0.7866609226726707),\n        new(0.28998891117547276, -0.8641624707525366),\n        new(0.30051700092548717, -0.9691090162228121),\n        new(0.32157358472227837, -1.0192188232132002),\n        new(0.3601509245920335, -1.0971208063694364),\n        new(0.4081488865392029, -1.2087206939785746),\n        new(0.45908678614089393, -1.2926720229648234),\n        new(0.5053734699314155, -1.3879021297922591),\n        new(0.5761497281206099, -1.5099000218570713),\n        new(0.6974549985645953, -1.670380473622166),\n        new(0.8148891027221786, -1.7734593809369144),\n        new(1.0435229738246268, -1.8847248777424928),\n        new(1.1975740297463773, -1.929533901723999),\n        new(1.5721806813354386, -1.9939896392916607),\n        new(1.8170907463573003, -1.9977084642445946)\n    };\n    \n    public SmithSampleDataAdapter() : base(CreatePoints())\n    {\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/HeatmapColorProvidersViewModel.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing AvaloniaEdit.Utils;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.Helpers;\nusing Eremex.AvaloniaUI.Charts;\nusing Eremex.AvaloniaUI.Charts.Native;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class HeatmapColorProvidersViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] HeatmapDataAdapter dataAdapter = HeatmapHelper.GetAdapter(\"hlsp_jwst-ero_jwst_miri_carina_f1130w_v1_i2d\");\n    [ObservableProperty] HeatmapColorProviderItem selectedColorProvider;\n    public string MiddleX => DataAdapter.XArguments[DataAdapter.XArguments.Count / 2];\n    public string MiddleY => DataAdapter.YArguments[DataAdapter.YArguments.Count / 2];\n    public List<HeatmapColorProviderItem> ColorProviders { get; } = new()\n    {\n        new(\"Hot Spot\", new HeatmapRangeStop[]\n        {\n            new() { Value = 0.0, Color = Color.FromRgb(0, 0, 0) },\n            new() { Value = 0.6, Color = Color.FromRgb(160, 160, 160) },\n            new() { Value = 0.65, Color = Color.FromRgb(238, 137, 17) },\n            new() { Value = 0.8, Color = Color.FromRgb(242, 36, 0) },\n            new() { Value = 1.0, Color = Color.FromRgb(160, 20, 0) }\n        }),\n\n        new(\"Rainbow\", new HeatmapRangeStop[]\n        {\n            new() { Value = 0.0, Color = Color.FromRgb(0, 8, 73) },\n            new() { Value = 0.2, Color = Color.FromRgb(0, 118, 212) },\n            new() { Value = 0.4, Color = Color.FromRgb(64, 171, 57) },\n            new() { Value = 0.6, Color = Color.FromRgb(241, 197, 9) },\n            new() { Value = 0.8, Color = Color.FromRgb(247, 38, 63) },\n            new() { Value = 1.0, Color = Color.FromRgb(250, 226, 202) }\n        }),\n\n        new(),\n\n        new(\"Green\", new HeatmapRangeStop[]\n        {\n            new() { Value = 0.0, Color = Colors.Black },\n            new() { Value = 1.0, Color = Colors.Lime }\n        }),\n        \n        new(\"Hot Metal\", new HeatmapRangeStop[]\n        {\n            new() { Value = 0.0, Color = Color.FromRgb(0, 0, 12) },\n            new() { Value = 0.2, Color = Color.FromRgb(74, 25, 144) },\n            new() { Value = 0.4, Color = Color.FromRgb(187, 38, 143) },\n            new() { Value = 0.6, Color = Color.FromRgb(230, 77, 12) },\n            new() { Value = 0.8, Color = Color.FromRgb(248, 218, 12) },\n            new() { Value = 1.0, Color = Color.FromRgb(248, 251, 245) }\n        }),\n\n        new(\"Cold Spot\", new HeatmapRangeStop[]\n        {\n            new() { Value = 0.0, Color = Color.FromRgb(1, 33, 184) },\n            new() { Value = 0.2, Color = Color.FromRgb(46, 168, 220) },\n            new() { Value = 0.25, Color = Color.FromRgb(155, 155, 155) },\n            new() { Value = 1.0, Color = Color.FromRgb(0, 0, 0) }\n        })\n    };\n\n    public HeatmapColorProvidersViewModel()\n    {\n        SelectedColorProvider = ColorProviders[4];\n    }\n}\n\npublic partial class HeatmapColorProviderItem : ObservableObject\n{\n    public string Name { get; }\n    public IHeatmapColorProvider ColorProvider { get; }\n    public IImage PreviewImage { get; }\n\n    public HeatmapColorProviderItem()\n    {\n        Name = \"Gray\";\n        ColorProvider = new HeatmapGrayscaleColorProvider();\n        PreviewImage = UpdatePreview();\n    }\n    public HeatmapColorProviderItem(string name, IEnumerable<HeatmapRangeStop> rangeStops)\n    {\n        Name = name;\n        var provider = new HeatmapRangeColorProvider { IsNormalizedValues = true };\n        provider.AddRange(rangeStops);\n        ColorProvider = provider;\n        PreviewImage = UpdatePreview();\n    }\n    IImage UpdatePreview()\n    {\n        const int width = 200;\n        const int height = 8;\n        var bitmap = new RenderTargetBitmap(new PixelSize(width, height), new Vector(96, 96));\n        using var context = bitmap.CreateDrawingContext();\n        var range = new MinMaxValues(0, width);\n        for (int i = 0; i < width; i++)\n        {\n            var brush = new SolidColorBrush(ColorProvider.GetColor(i, range));\n            context.FillRectangle(brush, new Rect(i, 0, i + 1, height));\n        }\n        return bitmap;\n    }\n} \n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/HeatmapRealTimeViewModel.cs",
    "content": "﻿using Avalonia.Threading;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class HeatmapRealTimeViewModel : ChartsPageViewModel\n{\n    const int BandSize = 1000;\n    const int TimeSize = 500;\n    const int StartFrequency = 2000;\n    const int TimeInterval = 20;\n    const double Amplitude = -50;\n    const int ListingSize = BandSize / 20;\n    \n    static double Interpolate(double y1, double y2, double mu)\n    {\n        double mu2 = (1 - Math.Cos(mu * Math.PI)) * 0.5;\n        return y1 * (1 - mu2) + y2 * mu2;\n    }\n    static string ToYLabel(DateTime dateTime) => dateTime.ToString(\"HH:mm:ss.ffff\");\n\n    readonly DispatcherTimer timer = new(DispatcherPriority.Background);\n    readonly double[,] values = new double[TimeSize, BandSize];\n    readonly double[] signalValues = new double[BandSize];\n    readonly double[] bands = new[] { 0, 0.3, 0, 0, 0.2, 0, 0, 0.9, 0, 0, 0.3, 0, 0.01, 0, 0 };\n    readonly Random random = new(0);\n    readonly Dictionary<string, int> xArgumentsIndices = new();\n    List<string> yArguments = new(TimeSize);\n    public string[] xArguments = new string[BandSize];\n    \n\n    [ObservableProperty] HeatmapDataAdapter waterfallAdapter;\n    [ObservableProperty] QualitativeDataAdapter signalAdapter;\n    [ObservableProperty] string mainFrequency;\n    [ObservableProperty] string bandLeftFrequency;\n    [ObservableProperty] string bandRightFrequency;\n\n    public HeatmapRealTimeViewModel()\n    {\n        for (int i = 0; i < xArguments.Length; i++)\n        {\n            string value = $\"{((StartFrequency + i) * 0.001):#.###}k\";\n            xArguments[i] = value;\n            xArgumentsIndices.Add(value, i);\n        }\n        mainFrequency = xArguments[xArguments.Length / 2];\n        bandLeftFrequency = xArguments[xArguments.Length / 2 - ListingSize];\n        bandRightFrequency = xArguments[xArguments.Length / 2 + ListingSize];\n        for (int i = 0; i < TimeSize; i++)\n        {\n            for (int j = 0; j < BandSize; j++)\n                values[i, j] = Amplitude;\n        }\n        var now = DateTime.Now;\n        for (int i = 0; i < TimeSize; i++)\n            yArguments.Add(ToYLabel(now.AddMilliseconds((i - TimeSize) * TimeInterval)));\n        GenerateData();\n        waterfallAdapter = new HeatmapDataAdapter(xArguments, yArguments, values);\n        signalAdapter = new QualitativeDataAdapter(xArguments, signalValues);\n\n        timer.Tick += UpdateAdapter;\n        timer.Interval = TimeSpan.FromMilliseconds(TimeInterval);\n    }\n    void UpdateAdapter(object sender, EventArgs e)\n    {\n        GenerateData();\n        WaterfallAdapter.UpdateValues(values);\n        yArguments.Add(ToYLabel(DateTime.Now));\n        yArguments.RemoveAt(0);\n        WaterfallAdapter.UpdateYArguments(yArguments);\n        SignalAdapter.Clear();\n        for (int i = 0; i < BandSize; i++)\n            SignalAdapter.Add(xArguments[i], signalValues[i]);\n    }\n    void GenerateData()\n    {\n        for (int i = 0; i < bands.Length; i++)\n            bands[i] = Math.Max(0, Math.Min(1, bands[i] + (random.NextDouble() - 0.5) * 0.05));\n        Array.Copy(values, BandSize, values, 0, values.Length - BandSize);\n        for (int i = 0; i < signalValues.Length; i++)\n        {\n            double relativePosition = (double)i * (bands.Length - 1) / signalValues.Length;\n            double value = Interpolate(bands[(int)relativePosition], bands[(int)relativePosition + 1], relativePosition - Math.Floor(relativePosition));\n            value = Math.Round((1 - Math.Min(1, Math.Max(0, value + (random.NextDouble() - 0.5) * 0.05))) * Amplitude);\n            signalValues[i] = value;\n            values[TimeSize - 1, i] = value;\n        }\n    }\n    public void Start() => timer.Start();\n    public void Stop() => timer.Stop();\n    public void UpdateFrequency(string value)\n    {\n        int index = Math.Min(Math.Max(ListingSize, xArgumentsIndices[value]), BandSize - ListingSize - 1);\n        MainFrequency = xArguments[index];\n        BandLeftFrequency = xArguments[index - ListingSize];\n        BandRightFrequency = xArguments[index + ListingSize];\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/PolarAreaSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class PolarAreaSeriesViewViewModel : ChartsPageViewModel\n{\n    static double Cos(double argument) => Math.Cos(4 * Math.PI * argument / 180) + 1;\n\n    const int ItemsCount = 180;\n    const double Step = 360d / ItemsCount;\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, Step, ItemsCount + 1, Cos)},\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/PolarEmptyPointsViewModel.cs",
    "content": "﻿using Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class PolarEmptyPointsViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] List<ViewViewModel> views;\n    [ObservableProperty] SeriesViewBase selectedView;\n    [ObservableProperty] ISeriesDataAdapter dataAdapter;\n\n    public PolarEmptyPointsViewModel()\n    {\n        var color = Color.FromArgb(255, 189, 20, 54);\n        var color2 = Color.FromArgb(255, 0, 120, 122);\n        \n        var simpleAdapter = new FormulaDataAdapter(0, 2, 181, d => d is > 100 and < 170 or > 280 and < 350 ? double.NaN : Math.Cos(4 * Math.PI * d / 180) + 1);\n        views =\n        [\n            new(\"Line\", simpleAdapter, new PolarLineSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Area\", simpleAdapter, new PolarAreaSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Scatter Line\", CreateScatterData(), new PolarScatterLineSeriesView { Color = color, ShowMarkers = true }),\n            new(\"Range Area\", CreateRangeData(), new PolarRangeAreaSeriesView { Color = Color.FromArgb(255, 67, 201, 39), Color1 = color, Color2 = color2, ShowMarkers1 = true, ShowMarkers2 = true })\n        ];\n        selectedView = views[0].View;\n        dataAdapter = views[0].DataAdapter;\n    }\n    ScatterDataAdapter CreateScatterData()\n    {\n        var points = new List<(double, double)>();\n        points.AddRange(CreateFoliumPart(120, 180));\n        points.AddRange(CreateFoliumPart(0, 90));\n        points.AddRange(CreateFoliumPart(270, 330));\n        return new ScatterDataAdapter(points);\n\n        IEnumerable<(double, double)> CreateFoliumPart(int minAngle, int maxAngle)\n        {\n            for (double i = minAngle; i <= maxAngle; i += 5)\n            {\n                double angleRad = i * Math.PI / 180;\n                double sin = Math.Sin(angleRad);\n                double cos = Math.Cos(angleRad);\n                double r = 3.0 * sin * cos / (Math.Pow(sin, 3.0) + Math.Pow(cos, 3.0));\n                if (r is >= 0 and <= 3)\n                    yield return (i, i is > 30 and < 60 ? double.NaN : r);\n            }\n        }\n    }\n    NumericRangeDataAdapter CreateRangeData()\n    {\n        var rangeData = new List<(double, double, double)>();\n        for (double i = 0; i <= 360; i += 5)\n        {\n            bool isEmpty = i is > 60 and < 120 or > 240 and < 300;\n            double value1 = isEmpty ? double.NaN : Math.Sin(Math.PI * i / 720);\n            double value2 = isEmpty ? double.NaN : Math.Cos(Math.PI * i / 720);\n            rangeData.Add((i, value1, value2));\n        }\n        return new NumericRangeDataAdapter(rangeData);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/PolarLineSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class PolarLineSeriesViewViewModel : ChartsPageViewModel\n{\n    static double Cos(double argument) => Math.Cos(4 * Math.PI * argument / 180);\n\n    const int ItemsCount = 180;\n    const double Step = 360d / ItemsCount;\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, Step, ItemsCount + 1, Cos)},\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/PolarPointSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class PolarPointSeriesViewViewModel : ChartsPageViewModel\n{\n    static double Cos(double argument) => Math.Cos(4 * Math.PI * argument / 180);\n\n    const int ItemsCount = 180;\n    const double Step = 360d / ItemsCount;\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new FormulaDataAdapter(0, Step, ItemsCount, Cos)},\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/PolarRangeAreaSeriesViewViewModel.cs",
    "content": "﻿using Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class PolarRangeAreaSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] Color color = Color.FromArgb(255, 67, 201, 39);\n    [ObservableProperty] Color color1 = Color.FromArgb(255, 189, 20, 54);\n    [ObservableProperty] Color color2 = Color.FromArgb(255, 0, 120, 122);\n    [ObservableProperty] NumericRangeDataAdapter dataAdapter = new();\n\n    public PolarRangeAreaSeriesViewViewModel()\n    {\n        for (int i = 0; i <= 360; i += 5)\n        {\n            double value1 = Math.Sin(Math.PI * i / 720);\n            double value2 = Math.Cos(Math.PI * i / 720);\n            DataAdapter.Add(i, value1, value2);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/PolarScatterLineSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class PolarScatterLineSeriesViewViewModel : ChartsPageViewModel\n{\n    static IEnumerable<(double, double)> CreateFoliumPart(int minAngle, int maxAngle)\n    {\n        for (int i = minAngle; i <= maxAngle; i += 5)\n        {\n            double angleRad = i * Math.PI / 180;\n            double sin = Math.Sin(angleRad);\n            double cos = Math.Cos(angleRad);\n            double r = 3.0 * sin * cos / (Math.Pow(sin, 3.0) + Math.Pow(cos, 3.0));\n            if (r is >= 0 and <= 3)\n                yield return (i, r);\n        }\n    }\n    static ScatterDataAdapter CreateFolium()\n    {\n        var points = new List<(double, double)>();\n        points.AddRange(CreateFoliumPart(120, 180));\n        points.AddRange(CreateFoliumPart(0, 90));\n        points.AddRange(CreateFoliumPart(270, 330));\n        return new ScatterDataAdapter(points);\n    }\n\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = CreateFolium() }\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/PolarStripsAndConstantLinesViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class PolarStripsAndConstantLinesViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] SeriesViewModel series = new() { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = CreateAdapter() };\n    [ObservableProperty] ObservableCollection<ConstantLineViewModel> constantLinesX = new();\n    [ObservableProperty] ObservableCollection<ConstantLineViewModel> constantLinesY = new();\n    \n    static ISeriesDataAdapter CreateAdapter()\n    {\n        var values = new List<(double, double)>\n        {\n            (0, 16), (5, 15.7), (10, 15), (16, 13), (20, 10), (22, 5), (26, 0), (28, -5), (29, 0), (30, -10), (32, -5),\n            (34, 0), (39, 3), (44, 0), (45, -5), (48, -10), (50, -5), (52, 0), (55, 2), (58, 0), (60, -3), (62, -5),\n            (65, -2), (68, 0), (70, 1), (72, 0), (76, -6), (80, -3), (85, -2), (88, -5), (91, -10), (98, -6), (100, -7),\n            (102, -10), (104, -16), (106, -12), (110, -10), (114, -8), (118, -10), (120, -15), (125, -18), (127, -10),\n            (130, -7), (137, -6), (138, -7), (140, -9), (146, -5), (150, -3), (154, -2), (160, -4), (165, -5),\n            (170, -8), (180, -9)\n        };\n        int count = values.Count;\n        for (int i = count - 1; i >= 0; i--)\n            values.Add((360 - values[i].Item1, values[i].Item2));\n        return new SortedNumericDataAdapter(values);\n    }\n\n    [RelayCommand]\n    void ClearConstantLines()\n    {\n        ConstantLinesX.Clear();\n        ConstantLinesY.Clear();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/SmithLineSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.ViewModels.DataAdapters;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class SmithLineSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new SmithSampleDataAdapter()},\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Charts/SmithPointSeriesViewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.ViewModels.DataAdapters;\nusing Eremex.AvaloniaUI.Charts;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class SmithPointSeriesViewViewModel : ChartsPageViewModel\n{\n    [ObservableProperty] ObservableCollection<SeriesViewModel> series = new()\n    {\n        new SeriesViewModel { Color = Color.FromArgb(255, 189, 20, 54), DataAdapter = new SmithSampleDataAdapter()},\n    };\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/CommonControls/CommonControlsGroupViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class CommonControlsGroupViewModel : PageViewModelBase\n    {\n        [ObservableProperty] string message;\n\n        public CommonControlsGroupViewModel()\n        {\n            Message = GetType().FullName;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/CommonControls/MessageBoxPageViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Avalonia.Layout;\nusing Eremex.AvaloniaUI.Controls;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class MessageBoxPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] private string title = \"MxMessageBox Title\";\n        [ObservableProperty] private string text = \"MxMessageBox can display a text message, an icon and a set of standard buttons.\";\n        [ObservableProperty] private MessageBoxButtons buttons = MessageBoxButtons.OkCancel;\n        [ObservableProperty] private MessageBoxIcon icon = MessageBoxIcon.Information;\n        [ObservableProperty] private MessageBoxResult result = MessageBoxResult.Ok;\n        [ObservableProperty] private HorizontalAlignment buttonAlignment = HorizontalAlignment.Right;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/CommonControls/SplitContainerControlPageViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing Eremex.AvaloniaUI.Controls.Editors;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class SplitContainerControlPageViewModel : PageViewModelBase\n    {\n        public IList<CarInfo> Cars { get; } = CsvSources.Cars;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/CommonControls/TabControlPageViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing Eremex.AvaloniaUI.Controls.Editors;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Avalonia.Controls;\nusing CommunityToolkit.Mvvm.Input;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TabControlPageViewModel : PageViewModelBase\n    {\n        private static readonly Random rnd = new(DateTime.Now.Millisecond);\n        private int newCarCount;\n        private readonly ObservableCollection<CarInfo> cars = new(CsvSources.Cars);\n\n        [ObservableProperty] private TabStripLayoutType layoutType = TabStripLayoutType.Stretch;\n        [ObservableProperty] private Dock placement = Dock.Top;\n        [ObservableProperty] private TabDragMode dragMode = TabDragMode.Reorder;\n        [ObservableProperty] private TabHeaderOrientation headerOrientation;\n\n        [ObservableProperty]\n        private TabControlCloseButtonShowMode closeButtonShowMode = TabControlCloseButtonShowMode.None;\n\n        [ObservableProperty] private TabControlNewButtonShowMode newButtonShowMode = TabControlNewButtonShowMode.None;\n\n        [ObservableProperty] private CarInfo selectedCar;\n\n        [ObservableProperty] private bool isTabPanelVisible = true;\n\n        public IEnumerable<CarInfo> Cars => cars;\n\n        public IEnumerable<TabControlCloseButtonShowMode> CloseButtonShowModes { get; } = new[]\n        {\n            TabControlCloseButtonShowMode.None,\n            TabControlCloseButtonShowMode.InActiveTab,\n            TabControlCloseButtonShowMode.InAllTabs,\n            TabControlCloseButtonShowMode.InHeaderPanel,\n            TabControlCloseButtonShowMode.InAllTabs | TabControlCloseButtonShowMode.InHeaderPanel\n        };\n\n        [RelayCommand]\n        private void OnNew()\n        {\n            var randomCar = CsvSources.Cars[rnd.Next(CsvSources.Cars.Count - 1)];\n            var newCar = new CarInfo($\"New Car ({++newCarCount})\", randomCar);\n            cars.Add(newCar);\n\n            SelectedCar = newCar;\n        }\n        \n        [RelayCommand]\n        private void OnClose(object parameter)\n        {\n            if (parameter is CarInfo car)\n            {\n                cars.Remove(car);\n            }\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridColumnBandsViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing System.Collections;\nusing System.Collections.ObjectModel;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class DataGridColumnBandsViewModel : PageViewModelBase\n{\n    [ObservableProperty]\n    IList sales;\n\n    [ObservableProperty]\n    IList<BandInfo> bands;\n\n    public DataGridColumnBandsViewModel()\n    {\n        Sales = EmployeesData.GenerateComplexEmployeeSales();\n\n        Bands = new ObservableCollection<BandInfo>();\n        for (int i = 1; i < 4; i++)\n        {\n            var year = DateTime.Now.Year - i;\n            var band = new BandInfo() { BandName = \"\" + year, Children = new List<BandInfo>() };\n            for (int j = 0; j < 4; j++)\n            {\n                var quarterName = \"Q\" + (j + 1);\n                band.Children.Add(new BandInfo() { BandName = year + \"/\" + quarterName, Header = quarterName });\n            }\n            Bands.Add(band);\n        }\n    }\n}\n\npublic class BandInfo\n{\n    public string BandName { get; set; }\n\n    public string Header { get; set; }\n\n    public IList<BandInfo> Children { get; set; }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridDataEditorsViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridDataEditorsViewModel : PageViewModelBase\n    {   \n\n        [ObservableProperty]\n        IList<EmployeeInfo> employees;\n\n        public DataGridDataEditorsViewModel()\n        {\n            Employees = EmployeesData.GenerateEmployeeInfo();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridDragDropPageViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing DemoCenter.DemoData.CsvClasses;\nusing System.Collections.ObjectModel;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridDragDropPageViewModel : PageViewModelBase\n    {   \n        public DataGridDragDropPageViewModel()\n        {\n            ProductsInWarehouse = CsvSources.StockProducts.Take(50).ToList();\n            ProductsInStock = CsvSources.StockProducts.TakeLast(20).ToList();\n        }\n\n        public List<StockProduct> ProductsInStock { get; }\n\n        public List<StockProduct> ProductsInWarehouse { get; }\n\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridExportViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing DemoCenter.DemoData;\nusing Eremex.DocumentProcessing.Exports;\n\nnamespace DemoCenter.ViewModels\n{\n    public enum ExportType { Xlsx, Pdf }\n\n    public partial class DataGridExportViewModel : PageViewModelBase\n    {\n        public DataGridExportViewModel()\n        {\n            ApparelProducts = DemoData.ApparelProducts.GenerateData(10000);\n        }\n\n        #region xlsx export properties\n\n        [ObservableProperty]\n        private bool xlsExportColumnHeaders = true;\n\n        [ObservableProperty]\n        private bool xlsExportBandHeaders = true;\n\n        #endregion\n\n        #region page export properties\n\n        [ObservableProperty]\n        private bool pageExportColumnHeaders = true;\n\n        [ObservableProperty]\n        private bool pageExportBandHeaders = true;\n\n        [ObservableProperty]\n        private bool fitToPageWidth = true;\n\n        [ObservableProperty]\n        private bool landscape = true;\n\n        #endregion\n\n        public IList<ApparelProduct> ApparelProducts { get; }\n\n        public event Action<ExportType> RequestExport;\n        public event Action<MxImageFormat> RequestExportImage;\n\n        [RelayCommand]\n        private void Export(ExportType type)\n        {\n            RequestExport?.Invoke(type);\n        }\n\n        [RelayCommand]\n        private void ExportImage(MxImageFormat format)\n        {\n            RequestExportImage?.Invoke(format);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridFilteringViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridFilteringViewModel : PageViewModelBase\n    {   \n        [ObservableProperty]\n        IList<EmployeeInfo> employees;\n\n        public DataGridFilteringViewModel()\n        {\n            Employees = EmployeesData.GenerateEmployeeInfo();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridFixedColuimnsViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridFixedColumnsViewModel : PageViewModelBase\n    {\n\n        [ObservableProperty]\n        IList<EmployeeInfo> employees;\n\n        [ObservableProperty]\n        bool autoHideScrollbars = true;\n\n        public DataGridFixedColumnsViewModel()\n        {\n            Employees = EmployeesData.GenerateEmployeeInfo();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridGroupingPageViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridGroupingPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty]\n        IList<EmployeeSale> sales;\n\n        public DataGridGroupingPageViewModel()\n        {\n            Sales = EmployeesData.GenerateEmployeeSales();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridLargeDataPageViewModel.cs",
    "content": "﻿using Avalonia.Controls.Platform;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing DemoCenter.DemoData;\nusing System;\nusing System.Collections;\nusing System.Data;\nusing System.Reflection;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridLargeDataViewModel : PageViewModelBase\n    {\n        [ObservableProperty]\n        IEnumerable<LargeDataItem> items;\n\n        [ObservableProperty]\n        IEnumerable<LargeDataColumn> columns;\n\n        [ObservableProperty]\n        ItemsCount selectedItemsCount;\n\n        [ObservableProperty]\n        ItemsCount selectedColumnsCount;\n\n        Random random = new Random();\n\n        public DataGridLargeDataViewModel()\n        {\n            SelectedItemsCount = ItemsCount.Medium;\n            SelectedColumnsCount = ItemsCount.Small;\n            Generate();\n        }\n\n        [RelayCommand]\n        void Generate()\n        {\n            Columns = Enumerable.Range(0, GetColumnsCount()).Select(x => GetColumn(x)).ToList();\n            Items = Enumerable.Range(0, GetItemsCount()).Select(x => new LargeDataItem() { Id = x }).ToList();\n\n            LargeDataColumn GetColumn(int index)\n            {\n                if (index == 0)\n                    return new LargeDataColumn(\"Id\", \"Id (0)\", typeof(int));\n\n                int remainder = (index - 1) % 5;\n                switch (remainder)\n                {\n                    case 1:\n                        return new LargeDataColumn($\"Numeric ({index})\", typeof(int));\n                    case 2:\n                        return new LargeDataColumn($\"ComboBox ({index})\", typeof(string));\n                    case 3:\n                        return new LargeDataColumn($\"DateTime ({index})\", typeof(DateTime));\n                    case 4:\n                        return new LargeDataColumn($\"CheckBox ({index})\", typeof(bool));\n\n                    default:\n                        return new LargeDataColumn($\"Text ({index})\", typeof(string));\n                }\n            }\n        }\n\n        int GetItemsCount()\n        {\n            switch (SelectedItemsCount)\n            {\n                case ItemsCount.Small:\n                    return 100000;\n                case ItemsCount.Medium:\n                    return 500000;\n                default:\n                    return 1000000;\n            }\n        }\n\n        int GetColumnsCount()\n        {\n            switch (SelectedColumnsCount)\n            {\n                case ItemsCount.Small:\n                    return 100;\n                case ItemsCount.Medium:\n                    return 500;\n                default:\n                    return 1000;\n            }\n        }\n    }\n\n    public enum ItemsCount\n    {\n        Small,\n        Medium,\n        Large\n    }\n\n    public class LargeDataItem\n    {\n        public int Id { get; set; }\n    }\n\n    public class LargeDataColumn\n    {\n        public LargeDataColumn(string fieldName, Type dataType)\n        {\n            FieldName = fieldName;\n            Header = fieldName;\n            DataType = dataType;\n        }\n        \n        public LargeDataColumn(string fieldName, string header, Type dataType)\n        {\n            FieldName = fieldName;\n            Header = header;\n            DataType = dataType;\n        }\n\n        public string FieldName { get; private set; }\n\n        public string Header { get; private set; }\n\n        public Type DataType { get; private set; }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridLiveDataPageViewModel.cs",
    "content": "﻿using Avalonia.Threading;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing System.Collections.ObjectModel;\nusing System.Diagnostics;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridLiveDataPageViewModel : PageViewModelBase\n    {\n        static IReadOnlyList<(string name, int count)> ProcessList { get; } = new List<(string name, int count)>()\n        {\n            (\"DemoCenter.Desktop\", 1), (\"Microsoft Edge\", 5), (\"Microsoft Visual Studio 2022\", 3), (\"Windows Explorer\", 4),\n            (\"Google Chrome\", 5), (\"Notepad\", 3), (\"Paint\", 2), (\"Desktop Window Manager\", 1), (\"Task Manager\", 1),\n            (\"Calculator\", 1), (\"Mail\", 1), (\"Media Player\", 1), (\"Cortana\", 1), (\"Settings\", 1),\n            (\"Delta Design\", 1), (\"Telegram Desktop\", 1), (\"System\", 1), (\"System Interrupts\", 1), (\"Runtime Broker\", 10),\n            (\"COM Surrogate\", 5), (\"CTF Loader\", 1), (\"AggregatorHost\", 1), (\"Client Server Runtime Process\", 1), (\"Registry\", 1),\n            (\"Microsoft IME\", 1), (\"Host Process for Window Tasks\", 1), (\"Application Frame Host\", 1), (\"Console Window Host\", 3), (\"Antimalware Core Service\", 1),\n            (\"Shell Infrastructure Host\", 1), (\"Windows Start-Up Application\", 1), (\"Windows Session Manager\", 1), (\"Secure System\", 1), (\"Credential Guard & Key Guard\", 1),\n            (\"Local Security Authority Process\", 1), (\"svchost\", 30)\n        };\n\n        Random random = new Random();\n        DispatcherTimer dispatcherTimer;\n\n        [ObservableProperty]\n        IList<ProcessInfo> processes;\n\n        [ObservableProperty]\n        double totalCpuLoad;\n\n        [ObservableProperty]\n        double totalMemoryLoad;\n\n        [ObservableProperty]\n        double totalDiskLoad;\n\n        [ObservableProperty]\n        double totalNetworkLoad;\n\n        [ObservableProperty]\n        double totalGpuLoad;\n\n        public DataGridLiveDataPageViewModel()\n        {\n            var source = new List<ProcessInfo>();\n            foreach (var process in ProcessList)\n            {\n                for (var i = 0; i < process.count; i++)\n                    source.Add(new ProcessInfo() { Name = process.name });\n            }\n            Processes = new ObservableCollection<ProcessInfo>(source.OrderBy(x => random.Next()));\n            UpdateProcesses();\n            dispatcherTimer = new DispatcherTimer();\n            dispatcherTimer.Interval = TimeSpan.FromMilliseconds(250);\n            dispatcherTimer.Tick += DispatcherTimer_Tick;\n        }\n\n        void UpdateProcesses()\n        {\n            UpdateValue(x => TotalCpuLoad = x, (p, x) => p.CpuLoad = x, 8, 40, 30);\n\n            UpdateValue(x => TotalMemoryLoad = x, (p, x) => p.MemoryLoad = x, 20, 32 * 1024, 10 * 1024);\n\n            UpdateValue(x => TotalDiskLoad = x, (p, x) => p.DiskLoad = x, 5, 10, 10);\n\n            UpdateValue(x => TotalNetworkLoad = x, (p, x) => p.NetworkLoad = x, 5, 10, 1);\n\n            UpdateValue(x => TotalGpuLoad = x, (p, x) => p.GpuLoad = x, 2, 10, 0);\n        }\n\n        public void RunUpdate()\n        {\n            dispatcherTimer.Start();\n        }\n\n        public void StopUpdate()\n        {\n            dispatcherTimer.Stop();\n        }\n\n        private void DispatcherTimer_Tick(object sender, EventArgs e)\n        {\n            UpdateProcesses();\n        }\n\n        void UpdateValue(Action<double> updateTotalValue, Action<ProcessInfo, double> updateProcessValue, int activeProcessCount, double maxActiveValue, double otherValue)\n        {   \n            var processes = Processes.ToList();\n            var sum = 0d;\n\n            maxActiveValue = maxActiveValue * random.Next(3) / 3;\n\n            for (int i = 0; i < activeProcessCount; i++)\n            {\n                var index = random.Next(processes.Count);\n                var value = Math.Round(maxActiveValue * random.NextDouble(), 1);\n                maxActiveValue -= value;\n                updateProcessValue(processes[index], value);\n                sum += value;\n                processes.RemoveAt(index);\n            }\n\n            foreach (var process in processes)\n            {\n                var value = Math.Round(otherValue / Processes.Count * random.NextDouble(), 1);\n                updateProcessValue(process, value);\n                sum += value;\n            }\n\n            updateTotalValue(sum);\n        }\n    }\n\n    public partial class ProcessInfo : ObservableObject\n    {\n        [ObservableProperty]\n        string name;\n\n        [ObservableProperty]\n        double cpuLoad;\n\n        [ObservableProperty]\n        double memoryLoad;\n\n        [ObservableProperty]\n        double diskLoad;\n\n        [ObservableProperty]\n        double networkLoad;\n\n        [ObservableProperty]\n        double gpuLoad;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridMultipleSelectionPageViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing System.Collections.ObjectModel;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridMultipleSelectionPageViewModel : PageViewModelBase\n    {   \n        public DataGridMultipleSelectionPageViewModel()\n        {\n            Employees = EmployeesData.GenerateEmployeeInfo();\n            SelectedEmployees = new(Employees.Take(5));\n        }\n\n        public ObservableCollection<EmployeeInfo> SelectedEmployees { get; }\n\n        public IList<EmployeeInfo> Employees { get; }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridPageViewModel.cs",
    "content": "﻿namespace DemoCenter.ViewModels\n{\n    public partial class DataGridPageViewModel : PageViewModelBase\n    {\n        public DataGridPageViewModel()\n        {\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridRowAutoHeightViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridRowAutoHeightViewModel : PageViewModelBase\n    {\n        public IList<CarInfo> Cars { get; } = CsvSources.Cars;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DataGrid/DataGridValidationViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DataGridValidationViewModel : PageViewModelBase\n    {   \n        [ObservableProperty]\n        IList<EmployeeValidationInfo> employees;\n\n        public DataGridValidationViewModel()\n        {\n            Employees = EmployeesData.GenerateValidationEmployeeInfo();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DesktopOnlyViewModel.cs",
    "content": "﻿namespace DemoCenter.ViewModels;\n\npublic partial class DesktopOnlyViewModel : PageViewModelBase\n{   \n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/DockManager/IdeLayoutPageViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.ComponentModel.DataAnnotations;\nusing System.Windows.Input;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class IdeLayoutPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] private object focusedSolutionItem;\n        \n        public IdeLayoutPageViewModel()\n        {\n            var embeddedFiles = App.EmbeddedResources.Where(x => x.EndsWith(\".cs\") || x.EndsWith(\".axaml\"));\n            \n            var projectNode = new SolutionProjectNode(\"AvaloniaApplication\", string.Empty);\n        \n            foreach (var s in embeddedFiles)\n            {\n                var ext = GetExtension(s);\n                var nameWithoutExtension = GetFileNameWithoutExtension(s, ext);\n                var splitName = nameWithoutExtension.Split(\".\");\n\n                string currentPath = string.Empty;\n                \n                for (var i = 0; i < splitName.Length; i++)\n                {\n                    var last = i == splitName.Length - 1;\n                    \n                    var name = last ? splitName[i] + ext : splitName[i];\n                    var parent =  SolutionNodes.FirstOrDefault(x => x.Path == currentPath) ?? projectNode;\n                    \n                    currentPath = Path.Join(currentPath, name);\n                    var node = SolutionNodes.FirstOrDefault(x => x.Path == currentPath);\n                    if (node == null)\n                    {\n                        node = last ? new SolutionFile(name, currentPath, s) : new SolutionFolder(name, currentPath);\n                        node.ParentId = parent.Id;\n                        SolutionNodes.Add(node);\n                    }\n                }\n            }\n\n            SolutionNodes.Add(projectNode);\n            SolutionNodes.Add(new SolutionDependenciesNode { ParentId = projectNode.Id });\n\n            var focusedItem = SolutionNodes.OfType<SolutionFile>().First();\n            FocusedSolutionItem = focusedItem;\n            Open(focusedItem);\n        }\n\n        public ObservableCollection<SolutionNodeBase> SolutionNodes { get; } = new();\n        public ObservableCollection<IdeLayoutDocumentViewModel> Documents { get; } = new();\n        \n        public void Open(SolutionFile solutionFile)\n        {\n            var document = Documents.FirstOrDefault(x => x.Uri == solutionFile.Uri);\n            if (document == null)\n            {\n                document = new IdeLayoutDocumentViewModel\n                {\n                    Header = solutionFile.Filename,\n                    Uri = solutionFile.Uri\n                };\n\n                document.CloseCommand = new RelayCommand(() => Documents.Remove(document));\n                Documents.Add(document);\n            }\n\n            document.IsActive = true;\n        }\n        \n        private static string GetExtension(string filename)\n        {\n            return filename.EndsWith(\".axaml.cs\") ? \".axaml.cs\" : Path.GetExtension(filename);\n        }\n\n        private static string GetFileNameWithoutExtension(string filename, string extension)\n        {\n            return filename.Replace(extension, \"\");\n        }\n    }\n\n    public class SolutionProjectNode : SolutionNodeBase\n    {\n        [Display(Name = \"File Name\")] public string Filename => $\"{Name}.csproj\";\n\n        public SolutionProjectNode(string name, string fullPath) : base(name, fullPath) { }\n    }\n\n    public class SolutionFolder : SolutionNodeBase\n    {\n        [Display(Name = \"Folder Name\")] public string FolderName => Name;\n\n        [Display(Name = \"Full Path\")] public string FullPath => Path;\n\n        public SolutionFolder(string name, string fullPath) : base(name, fullPath) { }\n    }\n    \n    public enum BuildAction\n    {\n        Resource,\n        [Display(Name=\"Avalonia XAML\")]\n        AvaloniaXaml,\n        [Display(Name=\"C# Compiler\")]\n        CSharpCompiler,\n        Content,\n        None\n    }\n\n    public enum CopyToOutputDirectory\n    {\n        [Display(Name = \"Do not copy\")]\n        DoNotCopy,\n        [Display(Name = \"Copy always\")]\n        CopyAlways,\n        [Display(Name = \"Copy if newer\")]\n        CopyIfNewer\n    }\n\n    public partial class SolutionFile : SolutionNodeBase\n    {\n        [ObservableProperty, Display(Name = \"Build Action\")]\n        [property:Category(\"Advanced\")]\n        private BuildAction buildAction;\n        \n        [ObservableProperty, Display(Name = \"Copy to Output Directory\")]\n        [property:Category(\"Advanced\")]\n        private CopyToOutputDirectory copyToOutputDirectory;\n        \n        [ObservableProperty, Display(Name = \"Custom Tool\")]\n        [property:Category(\"Advanced\")]\n        private string customTool;\n        \n        [ObservableProperty, Display(Name = \"Custom Tool Namespace\")]\n        [property:Category(\"Advanced\")]\n        private string customToolNamespace;\n\n        public SolutionFile(string name, string fullPath, string uri) : base(name, fullPath)\n        {\n            if (fullPath.EndsWith(\".cs\"))\n            {\n                buildAction = BuildAction.CSharpCompiler;\n            }\n            else if (fullPath.EndsWith(\".axaml\"))\n            {\n                buildAction = BuildAction.AvaloniaXaml;\n            }\n\n            Uri = uri;\n        }\n        \n        [Browsable(false)]\n        public string Uri { get; }\n\n        [Display(Name = \"File Name\")]\n        public string Filename => Name;\n        [Display(Name = \"Full Path\")]\n        public string FullPath => Path;\n    }\n\n    public class SolutionDependenciesNode : SolutionNodeBase\n    {\n        public SolutionDependenciesNode() : base(\"Dependencies\", string.Empty) { }\n    }\n\n    public abstract partial class SolutionNodeBase : ObservableObject\n    {\n        [ObservableProperty]\n        [property:Browsable(false)]\n        private bool isExpanded;\n\n        protected SolutionNodeBase(string name, string fullPath)\n        {\n            Name = name;\n            Path = fullPath;\n            Id = Guid.NewGuid();\n        }\n        \n        [Browsable(false)] public object Id { get; }\n        \n        [Browsable(false)] public object ParentId { get; set; }\n\n        [Browsable(false)] public string Name { get; }\n\n        [Browsable(false)] public string Path { get; }\n    }\n\n    public partial class IdeLayoutDocumentViewModel : ObservableObject\n    {\n        [ObservableProperty] private string header;\n        [ObservableProperty] private string uri;\n        [ObservableProperty] private bool isActive;\n        [ObservableProperty] private ICommand closeCommand;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/ColorEditorPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Editors;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class ColorEditorPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] bool showStandardColors = true;\n        [ObservableProperty] bool showCustomColors = true;\n        [ObservableProperty] ColorsShowMode colorsShowMode = ColorsShowMode.StandardColors | ColorsShowMode.CustomColors;\n\n        [ObservableProperty] ObservableCollection<Color> customColors1 = new ObservableCollection<Color>() \n        { \n            Color.FromRgb(0x7d, 0xd7, 0xab), Color.FromRgb(0xc5, 0x94, 0x88), Color.FromRgb(0x47, 0xfe, 0xff), Color.FromRgb(0xe9, 0xbf, 0x3f), \n        };\n        [ObservableProperty] ObservableCollection<Color> customColors2 = new ObservableCollection<Color>()\n        {\n            Color.FromRgb(0x7d, 0x82, 0x82), Color.FromRgb(0xa1, 0x17, 0x2a), Color.FromRgb(0x58, 0xd9, 0xdb), Colors.Yellow,\n        };\n\n        public ColorEditorPageViewModel()\n        {\n        }\n\n        partial void OnShowStandardColorsChanged(bool value)\n        {\n            if(value)\n                ColorsShowMode |= ColorsShowMode.StandardColors;\n            else\n                ColorsShowMode &= ~ColorsShowMode.StandardColors;\n        }\n        partial void OnShowCustomColorsChanged(bool value)\n        {\n            if (value)\n                ColorsShowMode |= ColorsShowMode.CustomColors;\n            else\n                ColorsShowMode &= ~ColorsShowMode.CustomColors;\n        }\n\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/ComboBoxEditorPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Text;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.Editors;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class ComboBoxEditorPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] string yachtValue = CsvSources.YachtNames[3];\n        [ObservableProperty] FilterCondition editableViewFilterCondition = FilterCondition.StartsWith;\n\n        [ObservableProperty] List<ElementInfo> elements;\n        [ObservableProperty] ElementInfo selectedElement;\n\n        [ObservableProperty] IList<MechInfo> mechs;\n        [ObservableProperty] ObservableCollection<MechInfo> selectedMechs;\n\n        [ObservableProperty] string[] separators = new[] { \";\", \".\", \"...\", \"|\" };\n        [ObservableProperty] string selectedSeparator;\n\n        public ComboBoxEditorPageViewModel()\n        {\n            Elements = ElementsSources.Elements;\n            SelectedElement = Elements[9];\n\n            Mechs = CsvSources.Mechs;\n            SelectedMechs = new ObservableCollection<MechInfo>() { Mechs[1], Mechs[5], Mechs[6], Mechs[9] };\n            SelectedSeparator = Separators[0];\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/DateEditorPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.Editors;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class DateEditorPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] bool showNullButton;\n        [ObservableProperty] ComponentPlacement nullValueButtonPosition;\n\n        [ObservableProperty] DateTime? current;\n        [ObservableProperty] DateTime? minimum;\n        [ObservableProperty] DateTime? maximum;\n\n        [ObservableProperty] string[] formats = new[] { \"d\", \"D\", \"MMMM dd\" };\n        [ObservableProperty] string selectedTextFormat;\n\n        public DateEditorPageViewModel()\n        {\n\n            ShowNullButton = true;\n            Current = DateTime.Now.AddDays(4);\n            Maximum = DateTime.Now.AddMonths(4);\n            SelectedTextFormat = formats[0];\n        }\n\n        partial void OnShowNullButtonChanged(bool value) => NullValueButtonPosition = value ? ComponentPlacement.Popup : ComponentPlacement.None;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/EditorsGroupViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\n\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class EditorsGroupViewModel : PageViewModelBase\n    {\n        public EditorsGroupViewModel()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/EditorsOverviewPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class EditorsOverviewPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] DateTime selectedDate = DateTime.Today.AddDays(3);\n        [ObservableProperty] GraphicView graphicView = GraphicView.Front;\n\n        [ObservableProperty] ElementInfo selectedItem;\n        [ObservableProperty] IEnumerable<ElementInfo> elements;\n        public EditorsOverviewPageViewModel()\n        {\n            Elements = ElementsSources.Elements.Take(new Range(15, 25));\n            SelectedItem = Elements.ElementAt(3);\n        }\n        [RelayCommand]\n        public void ShowPage(string parameter)\n        {\n            try\n            {\n                Process.Start(new ProcessStartInfo(parameter) { UseShellExecute = true });\n            }\n            catch { };\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/EnumSourcePageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing Eremex.AvaloniaUI.Controls.DataControl;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class EnumSourcePageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] GraphicPosition graphicPosition;\n        [ObservableProperty] GraphicView graphicView;\n        [ObservableProperty] EnumMembersSortMode sortMode;\n\n        //public event Action UpdateEnumSources;\n\n        public EnumSourcePageViewModel()\n        {\n            SortMode = EnumMembersSortMode.Default;\n            GraphicPosition = GraphicPosition.Maximum;\n            GraphicView = GraphicView.Top;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/HyperlinkEditorPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\n\nusing DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class HyperlinkEditorPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] IEnumerable<YachtInfo> yachts;\n\n        public HyperlinkEditorPageViewModel()\n        {\n            Yachts = CsvSources.Yachts;\n        }\n\n        public event Action<string> SelectDemo;\n\n        [RelayCommand]\n        public void ShowDemo(string moduleName)\n        {\n            SelectDemo?.Invoke(moduleName);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/MemoEditorPageViewModel.cs",
    "content": "﻿using Avalonia.Controls.Primitives;\nusing CommunityToolkit.Mvvm.ComponentModel;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class MemoEditorPageViewModel : PageViewModelBase\n{\n    [ObservableProperty] private ScrollBarVisibility horizontalScrollbarVisibility = ScrollBarVisibility.Auto;\n    [ObservableProperty] private ScrollBarVisibility verticalScrollbarVisibility = ScrollBarVisibility.Auto;\n\n    [ObservableProperty] private ScrollBarVisibility[] scrollbarVisibilityItems = new[]\n    {\n        ScrollBarVisibility.Auto, ScrollBarVisibility.Visible, ScrollBarVisibility.Hidden, ScrollBarVisibility.Disabled\n    };\n\n    [ObservableProperty] private string text = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, \" + Environment.NewLine +\n                                               \"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum \" + Environment.NewLine +\n                                               \"dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \" + Environment.NewLine +\n                                               \"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore \" + Environment.NewLine +\n                                               \"veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem \" + Environment.NewLine +\n                                               \"quia voluptas sit aspernatur aut odit aut fugit, \" + Environment.NewLine +\n                                               \"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. \" + Environment.NewLine +\n                                               \"Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, \" + Environment.NewLine +\n                                               \"consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et \" + Environment.NewLine +\n                                               \"dolore magnam aliquam quaerat voluptatem. Ut enim ad \" + Environment.NewLine +\n                                               \"minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid \" + Environment.NewLine +\n                                               \"ex ea commodi consequatur? Quis autem vel eum iure \" + Environment.NewLine +\n                                               \"reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum \" + Environment.NewLine +\n                                               \"qui dolorem eum fugiat quo voluptas nulla pariatur? \" + Environment.NewLine +\n                                               \"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis \" + Environment.NewLine +\n                                               \"praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias \" + Environment.NewLine +\n                                               \"excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui \" + Environment.NewLine +\n                                               \"officia deserunt mollitia animi, id est laborum et dolorum fuga. \" + Environment.NewLine +\n                                               \"Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum \" + Environment.NewLine +\n                                               \"soluta nobis est eligendi optio cumque nihil impedit quo minus id \" + Environment.NewLine +\n                                               \"quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor \" + Environment.NewLine +\n                                               \"repellendus. Temporibus autem quibusdam et aut officiis debitis aut \" + Environment.NewLine +\n                                               \"rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae \" + Environment.NewLine +\n                                               \"non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, \" + Environment.NewLine +\n                                               \"ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.\";\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/SegmentedEditorPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing Eremex.AvaloniaUI.Controls.DataControl;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class SegmentedEditorPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] GraphicView graphicView;\n        [ObservableProperty] string[] viewTypes;\n        [ObservableProperty] string selectedViewType;\n\n        public SegmentedEditorPageViewModel()\n        {\n            GraphicView = GraphicView.Top;\n            ViewTypes = new[] { \"Primary\", \"Secondary\" };\n            SelectedViewType = ViewTypes[0];\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/SpinEditorPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing DemoCenter.DemoData;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class SpinEditorPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] IEnumerable<YachtInfo> yachts;\n        public SpinEditorPageViewModel()\n        {\n            Yachts = CsvSources.Yachts.Take(4);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Editors/TextEditingPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\n\nusing Eremex.AvaloniaUI.Controls.Common;\nusing Eremex.AvaloniaUI.Controls.Editors;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TextEditingPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] string logContent = string.Empty;\n        [ObservableProperty] string selectedString = string.Empty;\n        [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ShowPreviousCommand)), NotifyCanExecuteChangedFor(nameof(ShowNextCommand))] string selectedEditor;\n        [ObservableProperty] bool showError;\n        [ObservableProperty] ValidationInfo validationInfo;\n\n        List<string> editors;\n\n        public TextEditingPageViewModel()\n        {\n            editors = typeof(BaseEditor).Assembly\n                .GetTypes()\n                .Where(x => x.IsSubclassOf(typeof(BaseEditor)))\n                .Select(x => x.Name)\n                .ToList();\n            SelectedEditor = \"TextEditor\";\n            ShowError = true;\n        }\n\n        [RelayCommand]\n        public void AddLogLine(string parameter)\n        {\n            LogContent += $\"{parameter} button click!\" + Environment.NewLine;\n        }\n\n        [RelayCommand(CanExecute = nameof(CanShowPrevious))]\n        public void ShowPrevious(string parameter) => UpdateSelectedEditor(parameter, -1);\n\n        public bool CanShowPrevious() => SelectedEditor != editors.First();\n\n        [RelayCommand(CanExecute = nameof(CanShowNext))]\n        public void ShowNext(string parameter) => UpdateSelectedEditor(parameter, 1);\n\n        public bool CanShowNext() => SelectedEditor != editors.Last();\n\n        void UpdateSelectedEditor(string parameter, int increment)\n        {\n            var index = editors.IndexOf(SelectedEditor);\n            SelectedEditor = editors[index + increment];\n            AddLogLine(parameter);\n        }\n\n        [RelayCommand]\n        public void ClearLog() => LogContent = string.Empty;\n\n        partial void OnShowErrorChanged(bool value)\n        {\n            ValidationInfo = value ? new ValidationInfo(\"Incorrect text!\") : null;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlCameraViewModel.cs",
    "content": "﻿using System.Numerics;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlCameraViewModel : Graphics3DControlViewModel\n{\n\tconst float size = 10;\n    const float max = size;\n    const float min = -size;\n    \n    static Vector3 v1 = new(min, min, max);\n    static Vector3 v2 = new(max, min, max);\n    static Vector3 v3 = new(max, max, max);\n    static Vector3 v4 = new(min, max, max);\n    static Vector3 v5 = new(min, max, min);\n    static Vector3 v6 = new(min, min, min);\n    static Vector3 v7 = new(max, min, min);\n    static Vector3 v8 = new(max, max, min);\n\n    [ObservableProperty] List<MeshViewModel> meshes = new()\n    {\n\t    new(new Vertex3D[]\n\t\t    {\n\t\t\t    new() { Position = v1, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, 0, 1) },\n\t\t\t    new() { Position = v2, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, 0, 1) },\n\t\t\t    new() { Position = v3, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, 0, 1) },\n\t\t\t    new() { Position = v4, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, 0, 1) }\n\t\t    },\n\t\t    new uint[] { 0, 1, 2, 2, 3, 0 })\n\t    {\n\t\t    MaterialKey = \"Front\",\n\t\t    Name = \"Front\",\n\t    },\n\t    new(new Vertex3D[]\n\t\t    {\n\t\t\t    new() { Position = v8, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, 0, -1) },\n\t\t\t    new() { Position = v7, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, 0, -1) },\n\t\t\t    new() { Position = v6, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, 0, -1) },\n\t\t\t    new() { Position = v5, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, 0, -1) }\n\t\t    },\n\t\t    new uint[] { 0, 1, 2, 2, 3, 0 })\n\t    {\n\t\t    MaterialKey = \"Back\",\n\t\t    Name = \"Back\"\n\t    },\n\t    new(new Vertex3D[]\n\t\t    {\n\t\t\t    new() { Position = v1, TextureCoord = new Vector2(1, 1), Normal = new Vector3(-1, 0, 0) },\n\t\t\t    new() { Position = v4, TextureCoord = new Vector2(1, 0), Normal = new Vector3(-1, 0, 0) },\n\t\t\t    new() { Position = v5, TextureCoord = new Vector2(0, 0), Normal = new Vector3(-1, 0, 0) },\n\t\t\t    new() { Position = v6, TextureCoord = new Vector2(0, 1), Normal = new Vector3(-1, 0, 0) }\n\t\t    },\n\t\t\tnew uint[] { 0, 1, 2, 2, 3, 0 })\n\t    {\n\t\t    MaterialKey = \"Left\",\n\t\t    Name = \"Left\"\n\t    },\n\t    new(new Vertex3D[]\n\t\t    {\n\t\t\t    new() { Position = v2, TextureCoord = new Vector2(0, 1), Normal = new Vector3(1, 0, 0) },\n\t\t\t    new() { Position = v7, TextureCoord = new Vector2(1, 1), Normal = new Vector3(1, 0, 0) },\n\t\t\t    new() { Position = v8, TextureCoord = new Vector2(1, 0), Normal = new Vector3(1, 0, 0) },\n\t\t\t    new() { Position = v3, TextureCoord = new Vector2(0, 0), Normal = new Vector3(1, 0, 0) }\n\t\t    },\n\t\t    new uint[] { 0, 1, 2, 2, 3, 0 })\n\t    {\n\t\t    MaterialKey = \"Right\",\n\t\t    Name = \"Right\"\n\t    },\n\t    new(new Vertex3D[]\n\t\t    {\n\t\t\t    new() { Position = v8, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, 1, 0)},\n\t\t\t    new() { Position = v5, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, 1, 0)},\n\t\t\t    new() { Position = v4, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, 1, 0)},\n\t\t\t    new() { Position = v3, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, 1, 0)}\n\t\t    },\n\t\t    new uint[] { 0, 1, 2, 2, 3, 0 })\n\t    {\n\t\t    MaterialKey = \"Top\",\n\t\t    Name = \"Top\"\n\t    },\n\t    new(new Vertex3D[]\n\t\t    {\n\t\t\t    new() { Position = v2, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, -1, 0) },\n\t\t\t    new() { Position = v1, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, -1, 0) },\n\t\t\t    new() { Position = v6, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, -1, 0) },\n\t\t\t    new() { Position = v7, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, -1, 0) }\n\t\t    },\n\t\t    new uint[] { 0, 1, 2, 2, 3, 0 })\n\t    {\n\t\t    MaterialKey = \"Bottom\",\n\t\t    Name = \"Bottom\"\n\t    }\n    };\n    [ObservableProperty] List<CameraItem> cameras = new() { new CameraItem(new PerspectiveCamera()), new(new IsometricCamera()) };\n    [ObservableProperty] CameraItem selectedCamera;\n    [ObservableProperty] List<SimplePbrMaterial> materials = new()\n    {\n\t    new SimplePbrMaterial(Colors.Red, \"Front\"),\n\t    new(Colors.Lime, \"Back\"),\n\t    new(Colors.Blue, \"Left\"),\n\t    new(Colors.Yellow, \"Right\"),\n\t    new(Colors.Magenta, \"Top\"),\n\t    new(Colors.Cyan, \"Bottom\"),\n    };\n\n    public Graphics3DControlCameraViewModel()\n    {\n\t    SelectedCamera = Cameras[0];\n    }\n}\n\npublic class CameraItem\n{\n\tpublic Camera Camera { get; }\n\tpublic bool IsPerspective => Camera is PerspectiveCamera;\n\tpublic float FieldOfView\n\t{\n\t\tget => Camera is PerspectiveCamera camera ? camera.FieldOfView : default;\n\t\tset\n\t\t{\n\t\t\tif (Camera is PerspectiveCamera camera)\n\t\t\t\tcamera.FieldOfView = value;\n\t\t}\n\t}\n\tpublic string Name => Camera is PerspectiveCamera ? \"Perspective Camera\" : \"Isometric Camera\";\n\n\tpublic CameraItem(Camera camera)\n\t{\n\t\tCamera = camera;\n\t}\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlHighlightingViewModel.cs",
    "content": "﻿#nullable enable\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Numerics;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlHighlightingViewModel : Graphics3DControlViewModel\n{\n    [ObservableProperty] ObservableCollection<GeometryModel3D> models = new();\n    [ObservableProperty] SelectableElement? highlightedElement;\n    [ObservableProperty] SelectableElement? selectedElement;\n\n    public Graphics3DControlHighlightingViewModel()\n    {\n\t    const float offset = 3;\n        AddCube(new Vector3(offset, 0, -offset));\n        AddPyramid(new Vector3(-offset, 0, offset));\n        var model = Model3DLoader.LoadModel(\"Teapot Model\", \"DemoCenter.Resources.Graphics3D.Models.Teapot.obj\");\n        model.Meshes.Single().Hint = \"Teapot Mesh\";\n        models.Add(model);\n    }\n    void AddCube(Vector3 offset)\n    {\n\t    const float size = 1;\n\t    const float max = size;\n\t    const float min = -size;\n    \n\t    var v1 = new Vector3(min, min, max) + offset;\n\t    var v2 = new Vector3(max, min, max) + offset;\n\t    var v3 = new Vector3(max, max, max) + offset;\n\t    var v4 = new Vector3(min, max, max) + offset;\n\t    var v5 = new Vector3(min, max, min) + offset;\n\t    var v6 = new Vector3(min, min, min) + offset;\n\t    var v7 = new Vector3(max, min, min) + offset;\n\t    var v8 = new Vector3(max, max, min) + offset;\n\n\t    var geometry = new GeometryModel3D\n\t    {\n\t\t    Meshes =\n\t\t    {\n\t\t\t    new()\n\t\t\t    {\n\t\t\t\t    Vertices =new Vertex3D[]\n\t\t\t\t    {\n\t\t\t\t\t    new() { Position = v1, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, 0, 1) },\n\t\t\t\t\t    new() { Position = v2, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, 0, 1) },\n\t\t\t\t\t    new() { Position = v3, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, 0, 1) },\n\t\t\t\t\t    new() { Position = v4, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, 0, 1) }\n\t\t\t\t    },\n\t\t\t\t    Indices =new uint[] { 0, 1, 2, 2, 3, 0 },\n\t\t\t\t    Hint = \"Front\"\n\t\t\t    },\n\t\t\t    new()\n\t\t\t    {\n\t\t\t\t    Vertices = new Vertex3D[]\n\t\t\t\t    {\n\t\t\t\t\t    new() { Position = v8, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, 0, -1) },\n\t\t\t\t\t    new() { Position = v7, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, 0, -1) },\n\t\t\t\t\t    new() { Position = v6, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, 0, -1) },\n\t\t\t\t\t    new() { Position = v5, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, 0, -1) }\n\t\t\t\t    },\n\t\t\t\t    Indices = new uint[] { 0, 1, 2, 2, 3, 0 },\n\t\t\t\t    Hint = \"Back\"\n\t\t\t    },\n\t\t\t    new()\n\t\t\t    {\n\t\t\t\t    Vertices = new Vertex3D[]\n\t\t\t\t    {\n\t\t\t\t\t    new() { Position = v1, TextureCoord = new Vector2(1, 1), Normal = new Vector3(-1, 0, 0) },\n\t\t\t\t\t    new() { Position = v4, TextureCoord = new Vector2(1, 0), Normal = new Vector3(-1, 0, 0) },\n\t\t\t\t\t    new() { Position = v5, TextureCoord = new Vector2(0, 0), Normal = new Vector3(-1, 0, 0) },\n\t\t\t\t\t    new() { Position = v6, TextureCoord = new Vector2(0, 1), Normal = new Vector3(-1, 0, 0) }\n\t\t\t\t    },\n\t\t\t\t    Indices = new uint[] { 0, 1, 2, 2, 3, 0 },\n\t\t\t\t    Hint = \"Left\"\n\t\t\t    },\n\t\t\t    new()\n\t\t\t    {\n\t\t\t\t    Vertices = new Vertex3D[]\n\t\t\t\t    {\n\t\t\t\t\t    new() { Position = v2, TextureCoord = new Vector2(0, 1), Normal = new Vector3(1, 0, 0) },\n\t\t\t\t\t    new() { Position = v7, TextureCoord = new Vector2(1, 1), Normal = new Vector3(1, 0, 0) },\n\t\t\t\t\t    new() { Position = v8, TextureCoord = new Vector2(1, 0), Normal = new Vector3(1, 0, 0) },\n\t\t\t\t\t    new() { Position = v3, TextureCoord = new Vector2(0, 0), Normal = new Vector3(1, 0, 0) }\n\t\t\t\t    },\n\t\t\t\t    Indices = new uint[] { 0, 1, 2, 2, 3, 0 },\n\t\t\t\t    Hint = \"Right\"\n\t\t\t    },\n\t\t\t    new()\n\t\t\t    {\n\t\t\t\t    Vertices = new Vertex3D[]\n\t\t\t\t    {\n\t\t\t\t\t    new() { Position = v8, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, 1, 0) },\n\t\t\t\t\t    new() { Position = v5, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, 1, 0) },\n\t\t\t\t\t    new() { Position = v4, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, 1, 0) },\n\t\t\t\t\t    new() { Position = v3, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, 1, 0) }\n\t\t\t\t    },\n\t\t\t\t    Indices = new uint[] { 0, 1, 2, 2, 3, 0 },\n\t\t\t\t    Hint = \"Top\"\n\t\t\t    },\n\t\t\t    new()\n\t\t\t    {\n\t\t\t\t    Vertices = new Vertex3D[]\n\t\t\t\t    {\n\t\t\t\t\t    new() { Position = v2, TextureCoord = new Vector2(1, 0), Normal = new Vector3(0, -1, 0) },\n\t\t\t\t\t    new() { Position = v1, TextureCoord = new Vector2(0, 0), Normal = new Vector3(0, -1, 0) },\n\t\t\t\t\t    new() { Position = v6, TextureCoord = new Vector2(0, 1), Normal = new Vector3(0, -1, 0) },\n\t\t\t\t\t    new() { Position = v7, TextureCoord = new Vector2(1, 1), Normal = new Vector3(0, -1, 0) }\n\t\t\t\t    },\n\t\t\t\t    Indices = new uint[] { 0, 1, 2, 2, 3, 0 },\n\t\t\t\t    Hint = \"Bottom\"\n\t\t\t    }\n\t\t    },\n\t\t    Hint = \"Cube\"\n\t    };\n\t    Models.Add(geometry);\n    }\n    void AddPyramid(Vector3 offset)\n    {\n        var basis = new MeshGeometry3D\n        {\n            Vertices = new[]\n            {\n                new Vertex3D(new Vector3(-1, 0, -1) + offset, -Vector3.UnitY),\n                new Vertex3D(new Vector3(-1, 0, 1) + offset, -Vector3.UnitY),\n                new Vertex3D(new Vector3(1, 0, 1) + offset, -Vector3.UnitY),\n                new Vertex3D(new Vector3(1, 0, -1) + offset, -Vector3.UnitY)\n            },\n            Indices = new uint[] { 0, 1, 2, 0, 2, 3 },\n            Hint = \"Basis\"\n        };\n        var triangle1 = CreateTriangle(\"Left\", basis.Vertices[0].Position, basis.Vertices[1].Position);\n        var triangle2 = CreateTriangle(\"Front\", basis.Vertices[1].Position, basis.Vertices[2].Position);\n        var triangle3 = CreateTriangle(\"Right\", basis.Vertices[2].Position, basis.Vertices[3].Position);\n        var triangle4 = CreateTriangle(\"Back\", basis.Vertices[3].Position, basis.Vertices[0].Position);\n        Models.Add(new GeometryModel3D {\n            Hint = \"Pyramid\",\n            Meshes = { basis, triangle1, triangle2, triangle3, triangle4 }\n        });\n\n        MeshGeometry3D CreateTriangle(string name, Vector3 p1, Vector3 p2)\n        {\n            var p3 = new Vector3(0, 2, 0) + offset;\n            var normal = Vector3.Cross(p2 - p1, p3 - p1);\n            return new MeshGeometry3D\n            {\n                Vertices = new[]\n                {\n                    new Vertex3D(p2, normal),\n                    new Vertex3D(p1, normal),\n                    new Vertex3D(p3, normal)\n                },\n                Indices = new uint[] { 0, 1, 2 },\n                Hint = name\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlLightsViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Numerics;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlLightsViewModel : Graphics3DControlViewModel\n{\n    const float LightDistance = 40;\n    const float LightHeight = 0;\n    const float PlaneSize = 80;\n    const float PlaneZ = -20;\n\n    static float Normalize(byte value) => (float)value / byte.MaxValue;\n    static Vector3 ToVector3(Color color) => new(Normalize(color.R), Normalize(color.G), Normalize(color.B));\n\n    [ObservableProperty] ObservableCollection<GeometryModel3D> models = new();\n    [ObservableProperty] ObservableCollection<Material> materials = new();\n    [ObservableProperty] ObservableCollection<LightViewModel> lights = new();\n\n    public Graphics3DControlLightsViewModel()\n    {\n        AddLight(Colors.White, new Vector3(LightDistance, LightHeight, 0), \"White\");\n        AddLight(Colors.Red, new Vector3(-LightDistance, LightHeight, 0), \"Red\");\n        AddLight(Colors.Lime, new Vector3(0, LightHeight, -LightDistance), \"Green\");\n        AddLight(Colors.Blue, new Vector3(0, LightHeight, LightDistance), \"Blue\");\n        AddSphere(15);\n        AddPlane();\n    }\n    void AddSphere(float scale)\n    {\n        var model = Model3DLoader.LoadModel(string.Empty, \"DemoCenter.Resources.Graphics3D.Models.Sphere.obj\");\n        model.Transform = Matrix4x4.CreateScale(scale);\n        Models.Add(model);\n    }\n    void AddLight(Color color, Vector3 position, string materialKey)\n    {\n        var model = Model3DLoader.LoadModel(string.Empty, \"DemoCenter.Resources.Graphics3D.Models.Sphere.obj\");\n        model.Transform = CreateTransform(LightViewModel.DefaultRadius);\n        model.Meshes.Single().MaterialKey = materialKey;\n        model.Meshes.Single().Hint = materialKey;\n        var lightMaterial = new SimplePbrMaterial\n        {\n            Key = materialKey,\n            Albedo = LightViewModel.DefaultColorIntensity * ToVector3(color),\n            AmbientOcclusion = 0,\n            Roughness = 0,\n            Metallic = 0,\n            Emission = LightViewModel.DefaultColorIntensity * ToVector3(color)\n        }; \n        Materials.Add(lightMaterial);\n        Models.Add(model);\n        var light = new LightViewModel(position, color, materialKey);\n        light.PropertyChanged += (s, e) =>\n        {\n            if (e.PropertyName == nameof(LightViewModel.Radius))\n                model.Transform = CreateTransform(((LightViewModel)s)!.Radius);\n            else if (e.PropertyName == nameof(LightViewModel.ColorIntensity))\n            {\n                var colorVector = ToVector3(light.Color) * light.ColorIntensity;\n                lightMaterial.Albedo = colorVector;\n                lightMaterial.Emission = colorVector;\n            }\n        };\n        Lights.Add(light);\n        \n        Matrix4x4 CreateTransform(float radius) => Matrix4x4.CreateScale(radius / model.BoundingBox!.Value.Size.X) * Matrix4x4.CreateTranslation(position);\n    }\n    void AddPlane()\n    {\n        const string materialKey = \"Plane\";\n\n        Materials.Add(new SimplePbrMaterial { Key = materialKey, Albedo = Vector3.One, AmbientOcclusion = 0 });\n        var mesh = new MeshGeometry3D();\n        mesh.Vertices = new[]\n        {\n            new Vertex3D(new Vector3(-PlaneSize, PlaneZ, -PlaneSize), Vector3.UnitY),\n            new Vertex3D(new Vector3(-PlaneSize, PlaneZ, PlaneSize), Vector3.UnitY),\n            new Vertex3D(new Vector3(PlaneSize, PlaneZ, PlaneSize), Vector3.UnitY),\n            new Vertex3D(new Vector3(PlaneSize, PlaneZ, -PlaneSize), Vector3.UnitY),\n        };\n        mesh.Indices = new uint[] { 0, 1, 2, 0, 2, 3 };\n        mesh.MaterialKey = materialKey;\n        Models.Add(new GeometryModel3D { Meshes = { mesh } });\n    }\n}\n\npublic partial class LightViewModel : ViewModelBase\n{\n    public const float DefaultRadius = 10;\n    public const float DefaultColorIntensity = 1;\n    \n    [ObservableProperty] Vector3 position;\n    [ObservableProperty] Color color;\n    [ObservableProperty] float radius = DefaultRadius;\n    [ObservableProperty] float colorIntensity = DefaultColorIntensity;\n    public string Name { get; }\n\n    public LightViewModel(Vector3 position, Color color, string name)\n    {\n        Position = position;\n        Color = color;\n        Name = name;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlLinesViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Reflection;\nusing Assimp;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlLinesViewModel : Graphics3DControlViewModel\n{\n    static GeometryModel3D LoadModel(string modelName, string resourceName, string materialKey = null)\n    {\n        var assembly = Assembly.GetAssembly(typeof(Graphics3DControlViewModel));\n        var stream = assembly!.GetManifestResourceStream(resourceName);\n        using var context = new AssimpContext();\n        var scene = context.ImportFileFromStream(stream);\n\n        var model = new GeometryModel3D();\n        if (!string.IsNullOrEmpty(modelName))\n            model.Hint = modelName;\n        \n        foreach (var mesh in scene.Meshes)\n        {\n            var vertices = new Vertex3D[mesh.VertexCount];\n            for (int i = 0; i < mesh.VertexCount; ++i)\n                vertices[i] = new Vertex3D { Normal = mesh.Normals[i], Position = mesh.Vertices[i] };\n            var indices = new List<uint>();\n            foreach (var face in mesh.Faces)\n            {\n                for (int i = 0; i < face.IndexCount - 1; ++i)\n                {\n                    indices.Add((uint)face.Indices[i]);\n                    indices.Add((uint)face.Indices[i + 1]);\n                }\n            }\n            model.Meshes.Add(new MeshGeometry3D { Vertices = vertices, Indices = indices.ToArray(), FillType = MeshFillType.Lines });\n        }\n\n        return model;\n    }\n    \n    [ObservableProperty] ObservableCollection<GeometryModel3D> models = new();\n    [ObservableProperty] float lineWidth = 1;\n\n    public Graphics3DControlLinesViewModel()\n    {\n        var model = LoadModel(\"Teapot\", \"DemoCenter.Resources.Graphics3D.Models.Teapot_Quad.obj\");\n        model.TranslateToZero();\n        models.Add(model);\n    }\n    protected override void OnPropertyChanged(PropertyChangedEventArgs e)\n    {\n        base.OnPropertyChanged(e);\n        if (e.PropertyName == nameof(LineWidth))\n        {\n            foreach (var mesh in Models.Single().Meshes)\n                mesh.PrimitiveSize = LineWidth;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlOverviewViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Text;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\nusing Microsoft.Extensions.Logging;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlOverviewViewModel : Graphics3DControlViewModel\n{\n    [ObservableProperty] ObservableCollection<GeometryModel3D> models = new();\n    [ObservableProperty] CustomLogger logger;\n\n    public Graphics3DControlOverviewViewModel()\n    {\n        var model = Model3DLoader.LoadModel(\"Teapot\", \"DemoCenter.Resources.Graphics3D.Models.Teapot.obj\");\n        model.TranslateToZero();\n        models.Add(model);\n        Logger = new CustomLogger();\n    }\n}\n\npublic class CustomLogger : ILogger, INotifyPropertyChanged\n{\n    readonly StringBuilder sb = new();\n    \n    public string Text => sb.ToString();\n    \n    public event PropertyChangedEventHandler PropertyChanged;\n\n    public IDisposable BeginScope<TState>(TState state) => null;\n    public bool IsEnabled(LogLevel logLevel) => true;\n    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)\n    {\n        if (IsEnabled(logLevel))\n        {\n            var message = formatter(state, exception);\n            sb.AppendLine($\"[{logLevel}] {message}\");\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Text)));\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlPointsViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Numerics;\nusing System.Reflection;\nusing Avalonia.Media.Imaging;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlPointsViewModel : Graphics3DControlViewModel\n{\n    class Arm\n    {\n        float Center { get; }\n        float HalfAngle { get; }\n        public float Min { get; }\n        public float Max { get; }\n        public float Length { get; }\n\n        public Arm(float min, float max, float length)\n        {\n            Min = min;\n            Max = max;\n            Length = length;\n            Center = 0.5f * (Max + Min);\n            HalfAngle = 0.5f * (Max - Min);\n        }\n        public Vector2 GetRadiusAndElevation(Random random, float minRadius, float maxElevation, float angle)\n        {\n            float factorR = 1f - MathF.Abs((Center - angle) / HalfAngle);\n            float radius = random.NextSingle() * ((1f - factorR * factorR) * Length + minRadius);\n            float factorE = radius / (minRadius + Length);\n            float elevation = (random.NextSingle() - 0.5f) * (1f - factorE * factorE * factorE) * maxElevation * 2f;\n            return new Vector2(radius, elevation);\n        }\n    }\n    \n    const int StarsCount = 5_000_000;\n    const float LargeArmRadius = 0.7f;\n    const float SmallArmRadius = 0.5f;\n    const float CenterRadius = 0.2f;\n    const float MaxElevation = 0.1f;\n    const float NoiseXY = MaxElevation;\n    const float NoiseZ = MaxElevation * 0.5f;\n    const float MaxRadius = CenterRadius + LargeArmRadius;\n    \n    [ObservableProperty] ObservableCollection<MeshGeometry3D> meshes = new();\n    [ObservableProperty] float pointSize;\n    [ObservableProperty] Bitmap emissionImage;\n\n    public Graphics3DControlPointsViewModel()\n    {\n        var assembly = Assembly.GetAssembly(typeof(Graphics3DControlViewModel));\n        var stream = assembly!.GetManifestResourceStream(\"DemoCenter.Resources.Graphics3D.Textures.Galaxy.png\");\n        EmissionImage = new Bitmap(stream!);\n\n        var vertices = new Vertex3D[StarsCount];\n        var arms = new Dictionary<int, Arm>();\n        arms.Add(0, new Arm(0, 0.5f * MathF.PI, LargeArmRadius));\n        arms.Add(1, arms[0]);\n        arms.Add(2, new Arm(0.5f * MathF.PI, 0.75f * MathF.PI, SmallArmRadius));\n        arms.Add(3, new Arm(0.75f * MathF.PI, MathF.PI, SmallArmRadius));\n        arms.Add(4, new Arm(MathF.PI, 1.5f * MathF.PI, LargeArmRadius));\n        arms.Add(5, arms[4]);\n        arms.Add(6, new Arm(1.5f * MathF.PI, 1.75f * MathF.PI, SmallArmRadius));\n        arms.Add(7, new Arm(1.75f * MathF.PI, 2f * MathF.PI, SmallArmRadius));\n        \n        var random = new Random(42);\n        for (int i = 0; i < StarsCount; i++)\n        {\n            float angle = random.NextSingle() * MathF.PI * 2f;\n            int octave = (int)MathF.Min(arms.Count - 1, MathF.Floor(angle / (MathF.PI * 0.25f)));\n            var vec = arms[octave].GetRadiusAndElevation(random, CenterRadius, MaxElevation, angle);\n            float radius = vec.X;\n            angle += vec.X / MaxRadius * MathF.PI * 1.5f;\n            float x = MathF.Cos(angle) * radius + random.NextSingle() * NoiseXY;\n            float z = MathF.Sin(angle) * radius + random.NextSingle() * NoiseXY;\n            float y = random.NextSingle() * vec.Y + random.NextSingle() * NoiseZ;\n\n            float textureU = MathF.Max(0f, MathF.Min(1f, radius / MaxRadius + (random.NextSingle() - 0.5f) * 0.25f));\n            \n            vertices[i] = new Vertex3D\n            {\n                Position = new Vector3(x, y, z),\n                TextureCoord = new Vector2(textureU, 0)\n            };\n        }\n\n        Meshes.Add(new MeshGeometry3D\n        {\n            FillType = MeshFillType.Points,\n            Vertices = vertices,\n            MaterialKey = \"material\"\n        });\n    }\n    protected override void OnPropertyChanged(PropertyChangedEventArgs e)\n    {\n        base.OnPropertyChanged(e);\n        if (e.PropertyName == nameof(PointSize))\n        {\n            foreach (var mesh in Meshes)\n                mesh.PrimitiveSize = PointSize;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlRobotArmViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Reflection;\nusing Assimp;\nusing Num = System.Numerics;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlRobotArmViewModel : Graphics3DControlViewModel\n{\n    List<Num.Vector3> offsets =\n    [\n        new(0, 0, 0), // Base\n        new(0, 0, 5.15f), // Arm 1\n        new(0, 0, 4.8f), // Arm 2\n        new(0, 0, 4.6f), // Wrist\n        new(-1.3f, 0, 1.7f), // Claw 1\n        new(1.3f, 0, 1.7f) // Claw 2\n    ];\n\n    [ObservableProperty] float claws = 0;\n    [ObservableProperty] float wrist = 0;\n    [ObservableProperty] float arm2 = 0;\n    [ObservableProperty] float arm1X = 0;\n    [ObservableProperty] float arm1Y = 0;\n    [ObservableProperty] float arm1Z = 0;\n    [ObservableProperty] ObservableCollection<GeometryModel3D> models;\n\n    public Graphics3DControlRobotArmViewModel()\n    {\n        models = LoadModels(\"DemoCenter.Resources.Graphics3D.Models.robot_arm_2.fbx\");\n        ApplyTransformations();\n    }\n\n    protected override void OnPropertyChanged(PropertyChangedEventArgs e)\n    {\n        if (e.PropertyName is nameof(Claws) or nameof(Wrist) or nameof(Arm2) or nameof(Arm1X) or nameof(Arm1Y) or nameof(Arm1Z))\n            ApplyTransformations();\n        base.OnPropertyChanged(e);\n    }\n    void ApplyTransformations()\n    {\n        var transform = Num.Matrix4x4.CreateTranslation(0, 0, -11);\n        for (int i = 0; i < Models.Count; i++)\n        {\n            var localTransform = GetTransform(i);\n            Models[i].Transform = localTransform * Num.Matrix4x4.CreateTranslation(offsets[i]) * transform;\n            if (i < 4)\n                transform = Models[i].Transform;\n        }\n    }\n    void ProcessNode(Node node, Scene scene, ObservableCollection<GeometryModel3D> result)\n    {\n        if (node.HasMeshes)\n        {\n            foreach (var index in node.MeshIndices)\n                result.Add(GetModel(scene, node, index));\n        }\n\n        if (node.HasChildren)\n        {\n            foreach (var childNode in node.Children)\n                ProcessNode(childNode, scene, result);\n        }\n    }\n    Num.Matrix4x4 GetTransform(int index) => index switch\n    {\n        1 => Num.Matrix4x4.CreateFromYawPitchRoll(Arm1Y, Arm1X, Arm1Z), // Arm 1\n        2 => Num.Matrix4x4.CreateRotationY(Arm2), // Arm 2: Y\n        3 => Num.Matrix4x4.CreateRotationZ(Wrist), // Wrist: Z\n        4 => Num.Matrix4x4.CreateRotationY(Claws), // Claw 1: +Y\n        5 => Num.Matrix4x4.CreateRotationY(-Claws), // Claw 2: -Y\n        _ => Num.Matrix4x4.Identity\n    };\n    ObservableCollection<GeometryModel3D> LoadModels(string path)\n    {\n        var result = new ObservableCollection<GeometryModel3D>();\n        var assembly = Assembly.GetAssembly(typeof(Graphics3DControlRobotArmViewModel));\n        var stream = assembly!.GetManifestResourceStream(path);\n        using var context = new AssimpContext();\n        var scene = context.ImportFileFromStream(stream);\n        ProcessNode(scene.RootNode, scene, result);\n        return result;\n    }\n    GeometryModel3D GetModel(Scene scene, Node node, int index)\n    {\n        var model = new GeometryModel3D { Name = node.Name };\n        var mesh = scene.Meshes[index];\n        var vertices = new Vertex3D[mesh.Vertices.Count];\n        for (int i = 0; i < mesh.Vertices.Count; i++)\n        {\n            vertices[i] = new Vertex3D { Position = mesh.Vertices[i], Normal = mesh.Normals[i] };\n        }\n        model.Meshes.Add(new MeshGeometry3D\n        {\n            Hint = node.Name,\n            Vertices = vertices,\n            Indices = scene.Meshes[index].GetUnsignedIndices().ToArray(),\n        });\n        return model;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlSimpleMaterialsViewModel.cs",
    "content": "﻿#nullable enable\nusing System.Collections.ObjectModel;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlSimpleMaterialsViewModel : Graphics3DControlViewModel\n{\n    [ObservableProperty] ObservableCollection<GeometryModel3D> models = new();\n    [ObservableProperty] Skybox? skybox = null;\n\n    public Graphics3DControlSimpleMaterialsViewModel()\n    {\n        var model = Model3DLoader.LoadModel(string.Empty, \"DemoCenter.Resources.Graphics3D.Models.Sphere.obj\");\n        models.Add(model);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlSkyboxViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.IO.Compression;\nusing System.Numerics;\nusing System.Reflection;\nusing Assimp;\nusing Avalonia.Media.Imaging;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlSkyboxViewModel : Graphics3DControlViewModel\n{\n    static Skybox LoadSkybox(Assembly assembly, string resourceName)\n    {\n        var stream = assembly!.GetManifestResourceStream(resourceName);\n        using var archive = new ZipArchive(stream!, ZipArchiveMode.Read);\n        var skybox = new Skybox();\n        foreach (var entry in archive.Entries)\n        {\n            if (!entry.Name.EndsWith(\".jpg\"))\n                continue;\n            using var entryStream = entry.Open();\n            using var memoryStream = new MemoryStream();\n            entryStream.CopyTo(memoryStream);\n            memoryStream.Seek(0, SeekOrigin.Begin);\n            var bitmap = new Bitmap(memoryStream);\n            if (entry.Name.StartsWith(\"negx\"))\n                skybox.Left = bitmap;\n            else if (entry.Name.StartsWith(\"negy\"))\n                skybox.Bottom = bitmap;\n            else if (entry.Name.StartsWith(\"negz\"))\n                skybox.Rear = bitmap;\n            else if (entry.Name.StartsWith(\"posx\"))\n                skybox.Right = bitmap;\n            else if (entry.Name.StartsWith(\"posy\"))\n                skybox.Top = bitmap;\n            else if (entry.Name.StartsWith(\"posz\"))\n                skybox.Front = bitmap;\n        }\n        return skybox;\n    }\n    \n    [ObservableProperty] string materialKey;\n    [ObservableProperty] uint[] indices;\n    [ObservableProperty] Vertex3D[] vertices;\n    [ObservableProperty] ObservableCollection<TexturedPbrMaterial> materials = new();\n    [ObservableProperty] ObservableCollection<Skybox> skyboxes = new();\n    [ObservableProperty] Skybox selectedSkybox = new();\n\n    public Graphics3DControlSkyboxViewModel()\n    {\n        var assembly = Assembly.GetAssembly(typeof(Graphics3DControlViewModel));\n        var material = Graphics3DControlTexturedMaterialsViewModel.LoadMaterial(assembly, \"DemoCenter.Resources.Graphics3D.Materials.AlienPanels.zip\");\n        materialKey = material.Key;\n        materials.Add(material);\n        \n        var stream = assembly!.GetManifestResourceStream(\"DemoCenter.Resources.Graphics3D.Models.Sphere.obj\");\n        using var context = new AssimpContext();\n        var scene = context.ImportFileFromStream(stream);\n\n        var mesh = scene.Meshes.Single();\n        vertices = new Vertex3D[mesh.VertexCount];\n        for (int i = 0; i < mesh.VertexCount; ++i)\n            vertices[i] = new Vertex3D\n            {\n                Normal = mesh.Normals[i], \n                Position = mesh.Vertices[i],\n                TextureCoord = new Vector2(mesh.TextureCoordinateChannels[0][i].X, mesh.TextureCoordinateChannels[0][i].Y)\n            };\n        indices = mesh.GetUnsignedIndices().ToArray();\n        \n        var skyboxNames = assembly!.GetManifestResourceNames().Where(name => name.StartsWith(\"DemoCenter.Resources.Graphics3D.Skyboxes.\"));\n        foreach (var skyboxName in skyboxNames)\n            skyboxes.Add(LoadSkybox(assembly, skyboxName));\n        selectedSkybox = Skyboxes.First();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlStlViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.IO.Compression;\nusing System.Numerics;\nusing System.Reflection;\nusing Assimp;\nusing Avalonia;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\nusing Material = Eremex.AvaloniaUI.Controls3D.Material;\nusing Vector = Avalonia.Vector;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlStlViewModel : Graphics3DControlViewModel\n{\n    static GeometryModel3D LoadModel(string modelName, string resourceName)\n    {\n        var assembly = Assembly.GetAssembly(typeof(Graphics3DControlViewModel));\n        var stream = assembly!.GetManifestResourceStream(resourceName);\n        using var archive = new ZipArchive(stream!, ZipArchiveMode.Read);\n        using var stlStream = archive.Entries.Single().Open();\n        \n        using var context = new AssimpContext();\n        var scene = context.ImportFileFromStream(stlStream);\n\n        var model = new GeometryModel3D { Name = modelName };\n        int geometryIndex = 0;\n        foreach (var mesh in scene.Meshes)\n        {\n            var vertices = new Vertex3D[mesh.VertexCount];\n            for (int i = 0; i < mesh.VertexCount; ++i)\n                vertices[i] = new Vertex3D { Normal = mesh.Normals[i], Position = mesh.Vertices[i] };\n            model.Meshes.Add(new MeshGeometry3D\n            {\n                Hint = $\"Solid {geometryIndex++}\",\n                MaterialKey = mesh.Name,\n                Vertices = vertices,\n                Indices = mesh.GetUnsignedIndices().ToArray()\n            });\n        }\n\n        return model;\n    }\n\n    [ObservableProperty] ObservableCollection<GeometryModel3D> models = new();\n    [ObservableProperty] ObservableCollection<Material> materials = new();\n    [ObservableProperty] Skybox skybox;\n\n    public Graphics3DControlStlViewModel()\n    {\n        skybox = CreateSkybox();\n        \n        var model = LoadModel(\"ddBox\", \"DemoCenter.Resources.Graphics3D.Models.ddBox-C1.zip\");\n        models.Add(model);\n\n        materials.Add(new SimplePbrMaterial { Key = \"0\", Emission = new Vector3(1f, 1f, 1f), AmbientOcclusion = 1f, Roughness = 0f, Metallic = 0f, Albedo = new Vector3(1f, 1f, 1f) });\n        materials.Add(new SimplePbrMaterial { Key = \"1\", Emission = new Vector3(0f, 0f, 0f), AmbientOcclusion = 1f, Roughness = 0.5f, Metallic = 0.5f, Albedo = new Vector3(0f, 0f, 0f) });\n        materials.Add(new SimplePbrMaterial { Key = \"2\", Emission = new Vector3(1f, 1f, 1f), AmbientOcclusion = 1f, Roughness = 0.5f, Metallic = 0.5f, Albedo = new Vector3(1f, 1f, 1f) });\n        materials.Add(new SimplePbrMaterial { Key = \"3\", Emission = new Vector3(0.06781025f, 0.009843134f, 0.0028190238f), AmbientOcclusion = 1f, Roughness = 0f, Metallic = 1f, Albedo = new Vector3(0.6117647f, 0.33333334f, 0.15294118f) });\n        materials.Add(new SimplePbrMaterial { Key = \"4\", Emission = new Vector3(0.0023305754f, 0.0023305754f, 0.0023305754f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.1254902f, 0.1254902f, 0.1254902f) });\n        materials.Add(new SimplePbrMaterial { Key = \"5\", Emission = new Vector3(0.09655207f, 0.12331263f, 0.19574657f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.6627451f, 0.69803923f, 0.7647059f) });\n        materials.Add(new SimplePbrMaterial { Key = \"6\", Emission = new Vector3(0.33176473f, 0.22588237f, 0.09176471f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.5529412f, 0.3764706f, 0.15294118f) });\n        materials.Add(new SimplePbrMaterial { Key = \"7\", Emission = new Vector3(0.18041758f, 0.18041758f, 0.18041758f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.7529412f, 0.7529412f, 0.7529412f) });\n        materials.Add(new SimplePbrMaterial { Key = \"8\", Emission = new Vector3(0.28941178f, 0.28941178f, 0.28941178f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.48235294f, 0.48235294f, 0.48235294f) });\n        materials.Add(new SimplePbrMaterial { Key = \"9\", Emission = new Vector3(0.03764706f, 0.01882353f, 0.01882353f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.0627451f, 0.03137255f, 0.03137255f) });\n        materials.Add(new SimplePbrMaterial { Key = \"10\", Emission = new Vector3(0.22588237f, 0.22588237f, 0.22588237f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.3764706f, 0.3764706f, 0.3764706f) });\n        materials.Add(new SimplePbrMaterial { Key = \"11\", Emission = new Vector3(0.0018750911f, 0.0018750911f, 0.0018750911f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.09411765f, 0.09411765f, 0.09411765f) });\n        materials.Add(new SimplePbrMaterial { Key = \"12\", Emission = new Vector3(0.08202213f, 0.09655207f, 0.107642084f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.6392157f, 0.6627451f, 0.6784314f) });\n        materials.Add(new SimplePbrMaterial { Key = \"13\", Emission = new Vector3(0.78298604f, 0.43056834f, 0.0625f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.9647059f, 0.8784314f, 0.6f) });\n        materials.Add(new SimplePbrMaterial { Key = \"14\", Emission = new Vector3(0.26733335f, 0.26733335f, 0.26733335f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.73333334f, 0.73333334f, 0.73333334f) });\n        materials.Add(new SimplePbrMaterial { Key = \"15\", Emission = new Vector3(0.78298604f, 0.43056834f, 0.0625f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.9647059f, 0.8784314f, 0.6f) });\n        materials.Add(new SimplePbrMaterial { Key = \"16\", Emission = new Vector3(0.022247758f, 0.071598776f, 0.024138017f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.4509804f, 0.61960787f, 0.4627451f) });\n        materials.Add(new SimplePbrMaterial { Key = \"17\", Emission = new Vector3(0.06599185f, 0.337129f, 0.08660467f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.60784316f, 0.84313726f, 0.64705884f) });\n        materials.Add(new SimplePbrMaterial { Key = \"18\", Emission = new Vector3(0.64731914f, 0.23042239f, 0.032550503f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.9372549f, 0.7882353f, 0.5058824f) });\n        materials.Add(new SimplePbrMaterial { Key = \"19\", Emission = new Vector3(0.071598776f, 0.0071034976f, 0.0015501967f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.61960787f, 0.28627452f, 0.06666667f) });\n        materials.Add(new SimplePbrMaterial { Key = \"20\", Emission = new Vector3(0f, 0f, 0f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0f, 0f, 0f) });\n        materials.Add(new SimplePbrMaterial { Key = \"21\", Emission = new Vector3(0.15058824f, 0.15058824f, 0.15058824f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.2509804f, 0.2509804f, 0.2509804f) });\n        materials.Add(new SimplePbrMaterial { Key = \"22\", Emission = new Vector3(0.0f, 0.0f, 0.0f), AmbientOcclusion = 1f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.80f, 0.37f, 0.40f) });\n        materials.Add(new SimplePbrMaterial { Key = \"23\", Emission = new Vector3(0.18898825f, 0.18898825f, 0.18898825f), AmbientOcclusion = 0.30200002f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.3764706f, 0.3764706f, 0.3764706f) });\n        materials.Add(new SimplePbrMaterial { Key = \"24\", Emission = new Vector3(0.0925255f, 0.25395298f, 0.30513728f), AmbientOcclusion = 0.4f, Roughness = 0f, Metallic = 0.051000003f, Albedo = new Vector3(0.53f, 0.76f, 0.82f) });\n        materials.Add(new SimplePbrMaterial { Key = \"25\", Emission = new Vector3(0.026910512f, 0.026910512f, 0.026910512f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.47843137f, 0.47843137f, 0.47843137f) });\n        materials.Add(new SimplePbrMaterial { Key = \"26\", Emission = new Vector3(0.0101143615f, 0.0101143615f, 0.011276099f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.3372549f, 0.3372549f, 0.3529412f) });\n        materials.Add(new SimplePbrMaterial { Key = \"27\", Emission = new Vector3(0.17557949f, 0.17557949f, 0.17557949f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.7490196f, 0.7490196f, 0.7490196f) });\n        materials.Add(new SimplePbrMaterial { Key = \"28\", Emission = new Vector3(1f, 0.25688884f, 0.030001458f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(1f, 0.8039216f, 0.49411765f) });\n        materials.Add(new SimplePbrMaterial { Key = \"29\", Emission = new Vector3(0.001003472f, 0.004988914f, 0.29428673f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.003921569f, 0.23529412f, 0.8235294f) });\n        materials.Add(new SimplePbrMaterial { Key = \"30\", Emission = new Vector3(1f, 1f, 1f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(1f, 1f, 1f) });\n        materials.Add(new SimplePbrMaterial { Key = \"31\", Emission = new Vector3(0.11365596f, 0.06599185f, 0.038316723f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.6862745f, 0.60784316f, 0.5294118f) });\n        materials.Add(new SimplePbrMaterial { Key = \"32\", Emission = new Vector3(0.0025982664f, 0.025486596f, 0.0036995586f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.14117648f, 0.47058824f, 0.19215687f) });\n        materials.Add(new SimplePbrMaterial { Key = \"33\", Emission = new Vector3(0.24329598f, 0.29428673f, 0.64731914f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.79607844f, 0.8235294f, 0.9372549f) });\n        materials.Add(new SimplePbrMaterial { Key = \"34\", Emission = new Vector3(0.3758518f, 0.35596412f, 0.21823005f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.85882354f, 0.8509804f, 0.78039217f) });\n        materials.Add(new SimplePbrMaterial { Key = \"35\", Emission = new Vector3(0.08899106f, 0.057605617f, 0.043894872f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.6509804f, 0.5882353f, 0.54901963f) });\n        materials.Add(new SimplePbrMaterial { Key = \"36\", Emission = new Vector3(0.0015501967f, 0.0014681702f, 0.0012472285f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.06666667f, 0.05882353f, 0.03529412f) });\n        materials.Add(new SimplePbrMaterial { Key = \"37\", Emission = new Vector3(0.0055619394f, 0.0055619394f, 0.0055619394f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.2509804f, 0.2509804f, 0.2509804f) });\n        materials.Add(new SimplePbrMaterial { Key = \"38\", Emission = new Vector3(0.35596412f, 0.35596412f, 0.35596412f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.8509804f, 0.8509804f, 0.8509804f) });\n        materials.Add(new SimplePbrMaterial { Key = \"39\", Emission = new Vector3(0.0077070394f, 0.0077070394f, 0.0077070394f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.29803923f, 0.29803923f, 0.29803923f) });\n        materials.Add(new SimplePbrMaterial { Key = \"40\", Emission = new Vector3(0.25f, 0.25688884f, 0.25f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.8f, 0.8039216f, 0.8f) });\n        materials.Add(new SimplePbrMaterial { Key = \"41\", Emission = new Vector3(0f, 0f, 0f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0f, 0f, 0f) });\n        materials.Add(new SimplePbrMaterial { Key = \"42\", Emission = new Vector3(0.09655207f, 0.12331263f, 0.19049743f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.6627451f, 0.69803923f, 0.7607843f) });\n        materials.Add(new SimplePbrMaterial { Key = \"43\", Emission = new Vector3(0.46715084f, 0.52080804f, 0.5966273f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.8901961f, 0.90588236f, 0.9254902f) });\n        materials.Add(new SimplePbrMaterial { Key = \"44\", Emission = new Vector3(0.23677175f, 0.27871513f, 0.61306757f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.7921569f, 0.8156863f, 0.92941177f) });\n        materials.Add(new SimplePbrMaterial { Key = \"45\", Emission = new Vector3(0.031677626f, 0.031677626f, 0.031677626f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.5019608f, 0.5019608f, 0.5019608f) });\n        materials.Add(new SimplePbrMaterial { Key = \"46\", Emission = new Vector3(0.7619897f, 0.7619897f, 0.7619897f), AmbientOcclusion = 1f, Roughness = 0f, Metallic = 0f, Albedo = new Vector3(0.9607843f, 0.9607843f, 0.9607843f) });\n        materials.Add(new SimplePbrMaterial { Key = \"47\", Emission = new Vector3(0.11678775f, 0.06599185f, 0.038316723f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.6901961f, 0.60784316f, 0.5294118f) });\n        materials.Add(new SimplePbrMaterial { Key = \"48\", Emission = new Vector3(0.18041758f, 0.06599185f, 0.00459823f), AmbientOcclusion = 0.4f, Roughness = 0.19607843f, Metallic = 0.8f, Albedo = new Vector3(0.7529412f, 0.60784316f, 0.22352941f) });\n        materials.Add(new SimplePbrMaterial { Key = \"49\", Emission = new Vector3(0.0012815954f, 0.004988914f, 0.0012815954f), AmbientOcclusion = 1f, Roughness = 0f, Metallic = 0f, Albedo = new Vector3(0.039215688f, 0.23529412f, 0.039215688f) });\n    }\n    Skybox CreateSkybox()\n    {\n        var image = CreateImage();\n        return new Skybox\n        {\n            IsVisible = false,\n            Left = image,\n            Right = image,\n            Top = image,\n            Bottom = image,\n            Front = image,\n            Rear = image\n        };\n    }\n    Bitmap CreateImage()\n    {\n        const int size = 1000;\n        var bitmap = new RenderTargetBitmap(new PixelSize(size, size), new Vector(96, 96));\n        using var context = bitmap.CreateDrawingContext();\n        var brush = new RadialGradientBrush\n        {\n            GradientStops =\n            {\n                new GradientStop(Colors.White, 0.0f),\n                new GradientStop(Colors.Gray, 0.8f),\n            }\n        };\n        context.FillRectangle(brush, new Rect(0, 0, size, size));\n        return bitmap;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlTexturedMaterialsViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.IO.Compression;\nusing System.Numerics;\nusing System.Reflection;\nusing Assimp;\nusing Avalonia.Media.Imaging;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlTexturedMaterialsViewModel : Graphics3DControlViewModel\n{\n    public static TexturedPbrMaterial LoadMaterial(Assembly assembly, string resourceName)\n    {\n        var stream = assembly!.GetManifestResourceStream(resourceName);\n        using var archive = new ZipArchive(stream!, ZipArchiveMode.Read);\n        var material = new TexturedPbrMaterial { Key = resourceName.Split('.')[^2] };\n        foreach (var entry in archive.Entries)\n        {\n            using var entryStream = entry.Open();\n            using var memoryStream = new MemoryStream();\n            entryStream.CopyTo(memoryStream);\n            memoryStream.Seek(0, SeekOrigin.Begin);\n            var bitmap = new Bitmap(memoryStream);\n            if (entry.Name.StartsWith(\"Albedo\"))\n                material.Albedo = bitmap;\n            else if (entry.Name.StartsWith(\"AO\"))\n                material.AmbientOcclusion = bitmap;\n            else if (entry.Name.StartsWith(\"Metallic\"))\n                material.Metallic = bitmap;\n            else if (entry.Name.StartsWith(\"Roughness\"))\n                material.Roughness = bitmap;\n            else if (entry.Name.StartsWith(\"Normal\"))\n                material.Normal = bitmap;\n            else if (entry.Name.StartsWith(\"Emissive\"))\n                material.Emission = bitmap;\n        }\n        return material;\n    }\n\n    [ObservableProperty] ObservableCollection<TexturedPbrMaterial> materials = new();\n    [ObservableProperty] TexturedPbrMaterial selectedMaterial;\n    [ObservableProperty] Vertex3D[] vertices;\n    [ObservableProperty] uint[] indices;\n\n    public Graphics3DControlTexturedMaterialsViewModel()\n    {\n        var assembly = Assembly.GetAssembly(typeof(Graphics3DControlViewModel));\n        var textureNames = assembly!.GetManifestResourceNames().Where(name => name.StartsWith(\"DemoCenter.Resources.Graphics3D.Materials.\"));\n        foreach (var textureName in textureNames)\n            materials.Add(LoadMaterial(assembly, textureName));\n        selectedMaterial = Materials.First();\n        \n        var stream = assembly!.GetManifestResourceStream(\"DemoCenter.Resources.Graphics3D.Models.Sphere.obj\");\n        using var context = new AssimpContext();\n        var scene = context.ImportFileFromStream(stream);\n\n        var mesh = scene.Meshes.Single();\n        vertices = new Vertex3D[mesh.VertexCount];\n        for (int i = 0; i < mesh.VertexCount; ++i)\n            vertices[i] = new Vertex3D\n            {\n                Normal = mesh.Normals[i], \n                Position = mesh.Vertices[i],\n                TextureCoord = new Vector2(mesh.TextureCoordinateChannels[0][i].X, mesh.TextureCoordinateChannels[0][i].Y)\n            };\n        indices = mesh.GetUnsignedIndices().ToArray();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlTransformationViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Numerics;\nusing Avalonia.Media;\nusing Avalonia.Threading;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class Graphics3DControlTransformationViewModel : Graphics3DControlViewModel\n{\n    readonly DispatcherTimer timer = new(DispatcherPriority.Background);\n    readonly Vector3[] offsets = new Vector3[] { new(0, -1, 1), new(0, -1, -1.9f), new(0, 1.8f, 1.9f) };\n    readonly float[] rotationSpeed = new float[] { 4000, -2000, -2000 };\n    readonly DateTime start = DateTime.Now;\n\n    [ObservableProperty] ObservableCollection<SimplePbrMaterial> materials = new();\n    [ObservableProperty] ObservableCollection<GeometryModel3D> models = new();\n\n    public Graphics3DControlTransformationViewModel()\n    {\n        Materials.Add(new SimplePbrMaterial(Colors.Red, \"Gear1\"));\n        Materials.Add(new SimplePbrMaterial(Colors.Green, \"Gear2\"));\n        Materials.Add(new SimplePbrMaterial(Colors.Blue, \"Gear3\"));\n        Models.Add(Model3DLoader.LoadModel(\"Gear 1\", \"DemoCenter.Resources.Graphics3D.Models.Gear_1.obj\", \"Gear1\"));\n        Models.Add(Model3DLoader.LoadModel(\"Gear 2\", \"DemoCenter.Resources.Graphics3D.Models.Gear_2.obj\", \"Gear2\"));\n        Models.Add(Model3DLoader.LoadModel(\"Gear 3\", \"DemoCenter.Resources.Graphics3D.Models.Gear_3.obj\", \"Gear3\"));\n        UpdateTransformations();\n        timer.Tick += TimerOnTick; \n        timer.Interval = TimeSpan.FromMilliseconds(5);\n    }\n    void TimerOnTick(object sender, EventArgs e) => UpdateTransformations();\n    void UpdateTransformations()\n    {\n        float milliseconds = (float)Math.Floor((DateTime.Now - start).TotalMilliseconds);\n        for (int i = 0; i < 3; i++)\n        {\n            float factor = (milliseconds % rotationSpeed[i]) / rotationSpeed[i];\n            var transform = Matrix4x4.CreateFromYawPitchRoll(0, MathF.PI * 2 * factor, MathF.PI * 0.5f);\n            transform.M41 = offsets[i].X;\n            transform.M42 = offsets[i].Y;\n            transform.M43 = offsets[i].Z;\n            Models[i].Transform = transform;\n        }\n    }\n    public void Start() => timer.Start();\n    public void Stop() => timer.Stop();\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Graphics3DControlViewModel.cs",
    "content": "﻿namespace DemoCenter.ViewModels;\n\npublic class Graphics3DControlViewModel : PageViewModelBase\n{\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/MeshViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class MeshViewModel : ObservableObject\n{\n    [ObservableProperty] string name;\n    [ObservableProperty] string materialKey;\n    [ObservableProperty] Vertex3D[] vertices;\n    [ObservableProperty] uint[] indices;\n    [ObservableProperty] MeshFillType type;\n    [ObservableProperty] uint size;\n\n    public MeshViewModel(Vertex3D[] vertices, uint[] indices)\n    {\n        this.vertices = vertices;\n        this.indices = indices;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Graphics3DControl/Model3DLoader.cs",
    "content": "﻿using System.Reflection;\nusing Assimp;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.ViewModels;\n\npublic static class Model3DLoader\n{\n    public static GeometryModel3D LoadModel(string modelName, string resourceName, string materialKey = null)\n    {\n        var assembly = Assembly.GetAssembly(typeof(Graphics3DControlViewModel));\n        var stream = assembly!.GetManifestResourceStream(resourceName);\n        using var context = new AssimpContext();\n        var scene = context.ImportFileFromStream(stream);\n\n        var model = new GeometryModel3D();\n        if (!string.IsNullOrEmpty(modelName))\n            model.Hint = modelName;\n        \n        foreach (var mesh in scene.Meshes)\n        {\n            var vertices = new Vertex3D[mesh.VertexCount];\n            for (int i = 0; i < mesh.VertexCount; ++i)\n                vertices[i] = new Vertex3D { Normal = mesh.Normals[i], Position = mesh.Vertices[i] };\n            var indices = mesh.GetUnsignedIndices().ToArray();\n            var meshGeometry = new MeshGeometry3D { Vertices = vertices, Indices = indices };\n            if (!string.IsNullOrEmpty(materialKey))\n                meshGeometry.MaterialKey = materialKey;\n            model.Meshes.Add(meshGeometry);\n        }\n\n        return model;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/MainViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Globalization;\nusing System.Reflection;\nusing Avalonia.Styling;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.ProductsData;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class MainViewModel : ViewModelBase\n{   \n    [ObservableProperty] \n    ProductInfoBase currentProductItem;\n    [ObservableProperty]\n    PageViewModelBase currentProductItemViewModel;\n\n    [ObservableProperty] \n    string title;\n\n    [ObservableProperty]\n    List<LocaleInfo> locales;\n\n    [ObservableProperty]\n    CultureInfo selectedLocale;\n\n    [ObservableProperty]\n    List<ThemeVariantInfo> themeVariants;\n\n    [ObservableProperty]\n    ThemeVariant selectedThemeVariant;\n\n    [ObservableProperty] \n    List<ProductInfoBase> products;\n    public List<ProductInfoBase> FlatProducts = new List<ProductInfoBase>();\n\n    [ObservableProperty]\n    ObservableCollection<string> sourceFiles;\n    [ObservableProperty]\n    string sourceFile;\n\n    [ObservableProperty]\n    string selectedCode;\n\n    [ObservableProperty]\n    bool allowCode = true;\n\n    [ObservableProperty]\n    bool isDemoSelected = true;\n    \n    private readonly string titlePrefix;\n\n    public MainViewModel() { }\n\n    public MainViewModel(ThemeVariant startupThemeVariant = null)\n    {\n        var version = Assembly.GetExecutingAssembly().GetName().Version?.ToString(3) ?? \"1.0\";\n        titlePrefix = $\"Demo Center v.{version}\";\n        \n        ThemeVariants = new List<ThemeVariantInfo>()\n        {\n            new(\"Light\", ThemeVariant.Light),\n            new(\"Dark\", ThemeVariant.Dark),\n        };\n\n        Locales = new List<LocaleInfo>()\n        {\n           new(\"En\", new CultureInfo(\"en-Us\")),\n           new(\"Ru\", new CultureInfo(\"ru-Ru\")),\n           new(\"CN\", new CultureInfo(\"zh-CN\")),\n        };\n        SelectedThemeVariant = startupThemeVariant == ThemeVariant.Dark ? ThemeVariant.Dark : ThemeVariant.Light;\n        SelectedLocale = Locales.First().Locale;//EN\n        \n        Products = ProductsData.Products.GetOrCreate();\n        PopulateFlatCollection();\n        CurrentProductItem = FlatProducts.FirstOrDefault(x => x is PageInfo && AllowDemoContent(x));\n    }\n\n    public void SelectProduct(string productName) => CurrentProductItem = FlatProducts.FirstOrDefault(x => string.Equals(x.Name, productName));\n\n    partial void OnCurrentProductItemChanged(ProductInfoBase value)\n    {\n        if (value is null)\n        {\n            CurrentProductItemViewModel = null;\n            return;\n        }\n        \n        if (value is GroupInfo)\n            return;\n        \n        CreateTitle(value);\n\n        var allowContent = AllowDemoContent(value);\n        CurrentProductItemViewModel = allowContent ? CurrentProductItem?.ViewModelGetter?.Invoke() : new DesktopOnlyViewModel();\n        AllowCode = allowContent;\n        if (!AllowCode)\n            IsDemoSelected = true;\n        var viewModelName = CurrentProductItemViewModel?.GetType().Name;\n        var viewName = viewModelName.Replace(\"ViewModel\", \"View\");\n\n        SourceFiles = new ObservableCollection<string> { $\"{viewName}.axaml\", $\"{viewName}.axaml.cs\", $\"{viewModelName}.cs\", };\n        SourceFile = SourceFiles.First();\n    }\n\n    private void CreateTitle(ProductInfoBase product)\n    {\n        var groupPrefix = string.Empty;\n        var title = string.Empty;\n\n        if (product is PageInfo page)\n        {\n            var group = GetGroupInfo(page);\n            if (group != null)\n                groupPrefix = $\" - {group.Title}\";\n            title = $\" - {page.Title}\";\n        }\n        else\n            title = $\" - {product?.Title}\";\n        Title = $\"{titlePrefix}{groupPrefix}{title}\";\n    }\n\n    private GroupInfo GetGroupInfo(ProductInfoBase value)\n    {\n        if (value is PageInfo info)\n            return Products.OfType<GroupInfo>().FirstOrDefault(x => x.Pages.Contains(info));\n        return null;\n    }\n\n    private bool AllowDemoContent(ProductInfoBase product) => !App.IsWebApp || (product.ShowInWeb && GetGroupInfo(product) is { } group && group.ShowInWeb);\n\n    private void PopulateFlatCollection()\n    {\n        FlatProducts.Clear();\n        foreach (var product in Products)\n        {\n            FlatProducts.Add(product);\n            if (product is GroupInfo productGroup)\n                foreach (var page in productGroup.Pages)\n                    FlatProducts.Add(page);\n        }\n    }\n\n    partial void OnSelectedLocaleChanged(CultureInfo value)\n    {\n        CultureInfo.CurrentCulture = value;\n        CultureInfo.CurrentUICulture = value;\n\n        var current = CurrentProductItem;\n        CurrentProductItem = null;\n        CurrentProductItem = current;\n    }\n}\n\npublic class ThemeVariantInfo\n{\n    public string ThemeVariantName { get; init; } \n\n    public ThemeVariant ThemeVariant { get; init; }\n\n    public ThemeVariantInfo(string name, ThemeVariant themeVariant)\n    {\n        ThemeVariantName = name;\n        ThemeVariant = themeVariant;\n    }\n}\n\npublic class LocaleInfo\n{\n    public string LocaleName { get; init; }\n\n    public CultureInfo Locale { get; init; }\n\n    public LocaleInfo(string name, CultureInfo culture)\n    {\n        LocaleName = name;\n        Locale = culture;\n    }\n}\n\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/PageViewModelBase.cs",
    "content": "﻿using Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public abstract partial class PageViewModelBase : ViewModelBase\n    {\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/PropertyGrid/PropertyGridDataEditorsViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class PropertyGridDataEditorsViewModel : PageViewModelBase\n    {\n        [ObservableProperty] \n        object selectedObject;\n\n        public PropertyGridDataEditorsViewModel()\n        {\n            var employees = EmployeesData.GenerateEmployeeInfo();\n            SelectedObject = employees[new Random().Next(employees.Count)];\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/PropertyGrid/PropertyGridGroupViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class PropertyGridGroupViewModel : PageViewModelBase\n    {\n        [ObservableProperty] string message;\n\n        public PropertyGridGroupViewModel()\n        {\n            Message = GetType().FullName;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/PropertyGrid/PropertyGridTabItemsViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class PropertyGridTabItemsViewModel : PageViewModelBase\n    {   \n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Ribbon/RibbonGroupViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class RibbonGroupViewModel : PageViewModelBase\n{\n    [ObservableProperty] string message;\n\n    public RibbonGroupViewModel()\n    {\n        Message = GetType().FullName;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Ribbon/WordPadExampleViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DynamicData;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class WordPadExampleViewModel : PageViewModelBase\n{\n\t[ObservableProperty] private ObservableCollection<string> fonts;\n\t[ObservableProperty] private ObservableCollection<int> fontSizes;\n\t[ObservableProperty] private string selectedFont;\n\t[ObservableProperty] private int selectedSize;\n\t[ObservableProperty] private ObservableCollection<FontStyleGalleryItem> fontStyles;\n\t\n\tpublic WordPadExampleViewModel()\n\t{\n\t\tfonts = new ObservableCollection<string>();\n\t\tfonts.AddRange(FontManager.Current.SystemFonts.Select(x => x.Name).OrderBy(x => x).ToList());\n\t\tselectedFont = fonts.FirstOrDefault(f => f == \"Arial\");\n\t\tif (selectedFont == null)\n\t\t\tselectedFont = fonts[0];\n\t\tfontSizes = new ObservableCollection<int>\n\t\t{\n\t\t\t8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72\n\t\t};\n\t\tselectedSize = 14;\n\t\tfontStyles = new ObservableCollection<FontStyleGalleryItem>\n\t\t{\n\t\t\tnew FontStyleGalleryItem { Header = \"Normal\", FontSize = 14 },\n\t\t\tnew FontStyleGalleryItem { Header = \"Heading\", FontSize = 22, Foreground = Brushes.SteelBlue },\n\t\t\tnew FontStyleGalleryItem { Header = \"Heading 2\", FontSize = 18, Foreground = Brushes.SteelBlue },\n\t\t\tnew FontStyleGalleryItem { Header = \"Title\", FontSize = 24 },\n\t\t\tnew FontStyleGalleryItem { Header = \"Subtitle\", FontSize = 14, Foreground = Brushes.DimGray },\n\t\t\tnew FontStyleGalleryItem { Header = \"Subtle Empha\", FontSize = 14, FontStyle = FontStyle.Italic, Foreground = Brushes.DimGray },\n\t\t\tnew FontStyleGalleryItem { Header = \"Emphasis\", FontSize = 14, FontStyle = FontStyle.Italic },\n\t\t\tnew FontStyleGalleryItem { Header = \"Intense Emphasis\", FontSize = 14, FontStyle = FontStyle.Italic, Foreground = Brushes.SteelBlue },\n\t\t\tnew FontStyleGalleryItem { Header = \"Strong\", FontSize = 14, FontWeight = FontWeight.Bold },\n\t\t\tnew FontStyleGalleryItem { Header = \"Quote\", FontSize = 14, FontStyle = FontStyle.Italic },\n\t\t\tnew FontStyleGalleryItem { Header = \"Intense Refer\", FontSize = 16, FontWeight = FontWeight.Bold, Foreground = Brushes.SteelBlue },\n\t\t\tnew FontStyleGalleryItem { Header = \"Book Title\", FontSize = 12, FontWeight = FontWeight.Bold, FontStyle = FontStyle.Italic },\n\t\t\tnew FontStyleGalleryItem { Header = \"List Paragraph\", FontSize = 14 }\n\t\t};\n\t}\n}\n\npublic class FontStyleGalleryItem : ObservableObject\n{\n\tpublic string Header { get; set; }\n\tpublic double FontSize { get; set; }\n\tpublic FontWeight FontWeight { get; set; } = FontWeight.Normal;\n\tpublic FontStyle FontStyle { get; set; } = FontStyle.Normal;\n\tpublic IBrush Foreground { get; set; }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/StandardControls/PrimitivesPageViewModel.cs",
    "content": "﻿using Avalonia.Controls;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class PrimitivesPageViewModel : PageViewModelBase\n    {\n        public PrimitivesPageViewModel()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/StandardControls/ProgressBarPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class ProgressBarPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] string [] formats = new[] { \"{1:0}%\", \"{1:0}\", \"{1:N2}\" } ;\n        [ObservableProperty] string selectedTextFormat;\n\n        public ProgressBarPageViewModel()\n        {\n            SelectedTextFormat = formats[0];\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/StandardControls/SliderPageViewModel.cs",
    "content": "﻿using Avalonia.Controls;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class SliderPageViewModel : PageViewModelBase\n    {\n        [ObservableProperty] TickPlacement tickPlacement;\n\n        public SliderPageViewModel()\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/StandardControls/StandardControlsGroupViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class StandardControlsGroupViewModel : PageViewModelBase\n    {\n        public StandardControlsGroupViewModel()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/StandardControls/StandardControlsOverviewPageViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class StandardControlsOverviewPageViewModel : PageViewModelBase\n    {\n        public StandardControlsOverviewPageViewModel()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/StandardControls/UseCasesGroupViewModel.cs",
    "content": "﻿namespace DemoCenter.ViewModels\n{\n    public partial class UseCasesGroupViewModel : PageViewModelBase\n    {\n        public UseCasesGroupViewModel()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Tools/DeveloperToolsGroupViewModel.cs",
    "content": "﻿namespace DemoCenter.ViewModels;\n\npublic class DeveloperToolsGroupViewModel : PageViewModelBase\n{\n    \n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/Tools/SvgIconsBrowserViewModel.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Reflection;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.ListView;\nusing Eremex.AvaloniaUI.Icons;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class SvgIconsBrowserViewModel : PageViewModelBase\n{\n    [ObservableProperty] private List<SvgIconCategoryViewModel> categories;\n    [ObservableProperty] private SvgIconCategoryViewModel focusedCategory;\n    [ObservableProperty] private List<SvgIconViewModel> items;\n    [ObservableProperty] private object focusedItem;\n    [ObservableProperty] private string searchText;\n    [ObservableProperty] private string iconPath;\n    [ObservableProperty] private string iconAxamlPath;\n    [ObservableProperty] private bool hintVisible;\n\n    public SvgIconsBrowserViewModel()\n    {\n        LoadIcons();\n        focusedCategory = Categories.Count > 0? Categories[0]: null;\n        focusedItem = Items[1];\n    }\n\n    private readonly string[] prohibitedCategories = new[] { \"Library\", \"Logo\", \"Painting\", \"PCB\", \"Scheme\", \"SimOne\", \"SimPCB\", \"Simtera\", \"Status\", \"_8\", \"_144\" };\n    private readonly Dictionary<string, string> mappingCategories = new()\n    {\n        {\"_3D\", \"3D\"}, {\"Dimensional_lines\", \"Dimensions\"}, {\"Drawing\", \"Graphical Editor\"},\n        {\"CAM\", \"Factory\"}, {\"Graphics\", \"Charts\"}, {\"Models\", \"Schematic\"}, {\"Scaling\", \"Zoom\"}, {\"_12\", \"Glyphs\"}, {\"_40\", \"Status\"}\n    };\n    private void LoadIcons()\n    {\n        var cat = typeof(Basic).Assembly.GetTypes().Where(t => t.Namespace != null && t.Namespace.Contains(\".Icons\")).ToList();\n        List<SvgIconCategoryViewModel> catList = new List<SvgIconCategoryViewModel>(cat.Count);\n        List<SvgIconViewModel> iconList = new List<SvgIconViewModel>();\n        foreach(var c in cat)\n        {\n            if(prohibitedCategories.Contains(c.Name))\n                continue;\n            var icons = c.GetProperties(BindingFlags.Static | BindingFlags.Public).Where(p => p.PropertyType == typeof(IImage)).ToList();\n            if(icons.Count == 0)\n                continue;\n            string name = c.Name;\n            mappingCategories.TryGetValue(name, out name);\n            name ??= c.Name;\n            var cm = new SvgIconCategoryViewModel(this) { DisplayName = name, Name = c.Name, IsChecked = true };\n            cm.PropertyChanged += OnSvgCategoryPropertyChanged;\n\n            foreach(var pi in icons)\n            {\n                var ivm = new SvgIconViewModel(cm, pi.Name, (IImage)pi.GetValue(null));\n                iconList.Add(ivm);\n            }\n            catList.Add(cm);\n        }\n\n        Categories = catList;\n        Items = iconList;\n    }\n    \n    void OnSvgCategoryPropertyChanged(object sender, PropertyChangedEventArgs e)\n    {\n        if(e.PropertyName == nameof(SvgIconCategoryViewModel.IsChecked))\n        {\n            RequestUpdateData?.Invoke();\n        } \n    }\n\n    public event Action RequestUpdateData;\n\n    public event Action<SvgIconCategoryViewModel> RequestScrollToCategory;\n    partial void OnFocusedCategoryChanged(SvgIconCategoryViewModel value)\n    {\n        if(value is { IsChecked: true })\n        {\n            RequestScrollToCategory?.Invoke(value);\n        }\n    }\n    \n    partial void OnFocusedItemChanged(object value)\n    {\n        if(value is SvgIconViewModel vm)\n        {\n            IconPath = vm.Path;\n            IconAxamlPath = vm.AxamlPath;\n            HintVisible = true;\n        }\n        else\n        {\n            IconPath = string.Empty;\n            IconAxamlPath = string.Empty;\n            HintVisible = false;\n        }\n    }\n\n    public void OnCustomFilter(ListViewFilterEventArgs e)\n    {\n        SvgIconViewModel vm = (SvgIconViewModel)e.Item;\n        e.Visible = vm.Category.IsChecked && (string.IsNullOrEmpty(SearchText) || vm.Name.Contains(SearchText, StringComparison.OrdinalIgnoreCase));\n    }\n\n    public void OnCategoryCheckedChanged(SvgIconCategoryViewModel cat)\n    {\n        RequestUpdateData?.Invoke();\n        if(cat.IsChecked)\n        {\n            RequestScrollToCategory?.Invoke(cat);\n        }\n    }\n}\n\npublic partial class SvgIconCategoryViewModel : ObservableObject, IComparable<SvgIconCategoryViewModel>, IComparable\n{\n    [ObservableProperty] private bool isChecked;\n    [ObservableProperty] private string name;\n    [ObservableProperty] private string displayName;\n    [ObservableProperty] private bool isExpanded;\n\n    public SvgIconCategoryViewModel(SvgIconsBrowserViewModel owner)\n    {\n        this.owner = owner;\n    }\n\n    private SvgIconsBrowserViewModel owner;\n    \n    public int CompareTo(SvgIconCategoryViewModel other)\n    {\n        return String.Compare(Name, other.Name, StringComparison.Ordinal);\n    }\n    public int CompareTo(object other)\n    {\n        return String.Compare(Name, ((SvgIconCategoryViewModel)other).Name, StringComparison.Ordinal);\n    }\n\n    partial void OnIsCheckedChanged(bool value)\n    {\n        this.owner.OnCategoryCheckedChanged(this);\n    }\n}\n\npublic partial class SvgIconViewModel : ObservableObject, IComparable<SvgIconViewModel>, IComparable\n{\n    [ObservableProperty] private string name;\n    [ObservableProperty] private string path;\n    [ObservableProperty] private string axamlPath;\n    [ObservableProperty] private IImage icon;\n    [ObservableProperty] private SvgIconCategoryViewModel category;\n\n    public SvgIconViewModel(SvgIconCategoryViewModel category, string name, IImage icon)\n    {\n        this.category = category;\n        this.name = name;\n        path = $\"{Category.Name}.{Name}\";\n        axamlPath = $\"{{x:Static mxi:{Category.Name}.{Name}}}\";\n        this.icon = icon;\n    }\n\n    public string CategoryName => Category?.DisplayName;\n    public int CompareTo(SvgIconViewModel other)\n    {\n        return String.Compare(Name, other.Name, StringComparison.Ordinal);\n    }\n\n    public int CompareTo(object other)\n    {\n        return String.Compare(Name, ((SvgIconViewModel)other)?.Name, StringComparison.Ordinal);\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/TreeList/FolderBrowserPageViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\n\nnamespace DemoCenter.ViewModels\n{\n    public class FolderBrowserPageViewModel : PageViewModelBase\n    {\n        public FolderBrowserPageViewModel()\n        {\n            Drives = CreateDrives();\n        }\n\n        public List<DriveFileSystemItemModel> Drives { get; }\n\n        private List<DriveFileSystemItemModel> CreateDrives()\n        {\n            List<DriveFileSystemItemModel> drives = new();\n            Array.ForEach(Directory.GetLogicalDrives(), drive => drives.Add(new DriveFileSystemItemModel(drive)));\n            return drives;\n        }\n    }\n\n    public class DriveFileSystemItemModel : FolderFileSystemItem\n    {\n        public DriveFileSystemItemModel(string driveName) : base(driveName, driveName, FileSystemItem.DriveType, $\"<{FileSystemItem.DriveType}>\") { }\n    }\n\n    public class FolderFileSystemItem : FileSystemItem\n    {\n        private List<FileSystemItem> items;\n        public FolderFileSystemItem(string name, string fullName, string type, string size) : base(name, fullName, type, size) { }\n\n        public List<FileSystemItem> Items\n        {\n            get\n            {\n                if (items == null)\n                    items = CreateItems();\n                return items;\n            }\n        }\n\n        private List<FileSystemItem> CreateItems()\n        {\n            var items = new List<FileSystemItem>();\n            CreateFolderItems(items);\n            CreateFileItems(items);\n            return items;\n        }\n\n        private void CreateFileItems(IList<FileSystemItem> items)\n        {\n            try\n            {\n                var files = Directory.GetFiles(FullName);\n                foreach (var file in files)\n                {\n                    try\n                    {\n                        items.Add(new FileSystemItem(Path.GetFileName(file), file, FileSystemItem.FileType, GetFileSize(file)));\n                    }\n                    catch { }\n                }\n            }\n            catch { }\n\n            string GetFileSize(string fullName) => FileSizeHelper.FileSizeToString(new FileInfo(fullName).Length);\n        }\n\n        private void CreateFolderItems(IList<FileSystemItem> items)\n        {\n            try\n            {\n                var directories = Directory.GetDirectories(FullName);\n                foreach (var directory in directories)\n                {\n                    try\n                    {\n                        items.Add(new FolderFileSystemItem(GetDirectoryName(directory), directory, FileSystemItem.FolderType, $\"<{FileSystemItem.FolderType}>\"));\n                    }\n                    catch { }\n                }\n            }\n            catch { }\n\n            string GetDirectoryName(string fullName) => new DirectoryInfo(fullName).Name;\n        }\n    }\n\n    public class FileSystemItem\n    {\n        public const string FileType = \"File\", FolderType = \"Folder\", DriveType = \"Drive\";\n\n        public FileSystemItem(string name, string fullName, string type, string size)\n        {\n            Name = name;\n            FullName = fullName;\n            Type = type;\n            Size = size;\n        }\n        public string Name { get; }\n        public string FullName { get; }\n        public string Type { get; }\n        public string Size { get; }           \n    }\n\n    internal static class FileSizeHelper\n    {\n        static readonly long BytesInKilobyte = 1024, BytesInMegabyte = BytesInKilobyte * 1024, BytesInGigabyte = BytesInMegabyte * 1024;\n\n        public static string FileSizeToString(long size)\n        {\n            if (size > BytesInGigabyte)\n                return $\"{size / BytesInGigabyte:0.##} GB\";\n            else if (size > BytesInMegabyte)\n                return $\"{size / BytesInMegabyte:0.##} MB\";\n            else if (size > BytesInKilobyte)\n                return $\"{size / BytesInKilobyte:0.##} KB\";\n            else\n                return size > 0 ? $\"1 KB\" : $\"0 KB\";\n        }\n    }\n\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/TreeList/TreeListColumnBandsViewModel.cs",
    "content": "﻿using DemoCenter.DemoData;\nusing System.Collections.ObjectModel;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TreeListColumnBandsViewModel : PageViewModelBase\n    {\n        public TreeListColumnBandsViewModel()\n        {\n            Sales = SalesData.GenerateData();\n        }\n\n        public IList<SalesData> Sales { get; }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/TreeList/TreeListDataEditorsPageViewModel.cs",
    "content": "﻿using DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TreeListDataEditorsPageViewModel : PageViewModelBase\n    {\n        public TreeListDataEditorsPageViewModel()\n        {\n            Tasks = ProjectTasksGenerator.Generate();\n        }\n\n        public List<ProjectTask> Tasks { get; }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/TreeList/TreeListExportViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\nusing DemoCenter.DemoData;\nusing Eremex.DocumentProcessing.Exports;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TreeListExportViewModel : PageViewModelBase\n    {\n        public TreeListExportViewModel()\n        {\n            InfrastructureItems = InfrastructureData.GenerateData();\n        }\n\n        public List<InfrastructureItem> InfrastructureItems { get; }\n\n        #region xlsx export properties\n\n        [ObservableProperty]\n        private bool xlsExportColumnHeaders = true;\n\n        [ObservableProperty]\n        private bool xlsExportBandHeaders = true;\n\n        #endregion\n\n        #region page export properties\n\n        [ObservableProperty]\n        private bool pageExportColumnHeaders = true;\n\n        [ObservableProperty]\n        private bool pageExportBandHeaders = true;\n\n        [ObservableProperty]\n        private bool fitToPageWidth = true;\n\n        [ObservableProperty]\n        private bool landscape = false;\n\n        #endregion\n\n        public IList<ApparelProduct> ApparelProducts { get; }\n\n        public event Action<ExportType> RequestExport;\n        public event Action<MxImageFormat> RequestExportImage;\n\n        [RelayCommand]\n        private void Export(ExportType type)\n        {\n            RequestExport?.Invoke(type);\n        }\n\n        [RelayCommand]\n        private void ExportImage(MxImageFormat format)\n        {\n            RequestExportImage?.Invoke(format);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/TreeList/TreeListFilteringPageViewModel.cs",
    "content": "﻿using DemoCenter.DemoData;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TreeListFilteringPageViewModel : PageViewModelBase\n    {\n        public TreeListFilteringPageViewModel()\n        {\n            Tasks = ProjectTasksGenerator.Generate();\n        }\n\n        public List<ProjectTask> Tasks { get; }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/TreeList/TreeListGroupViewModel.cs",
    "content": "﻿using CommunityToolkit.Mvvm.ComponentModel;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TreeListGroupViewModel : PageViewModelBase\n    {\n        [ObservableProperty] string message;\n\n        public TreeListGroupViewModel()\n        {\n            Message = GetType().FullName;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/TreeList/TreeListMultipleSelectionPageViewModel.cs",
    "content": "﻿using DemoCenter.DemoData;\nusing System.Collections.ObjectModel;\n\nnamespace DemoCenter.ViewModels\n{\n    public partial class TreeListMultipleSelectionPageViewModel : PageViewModelBase\n    {\n        public TreeListMultipleSelectionPageViewModel()\n        {\n            Tasks = ProjectTasksGenerator.Generate();\n            SelectedTasks = new(Tasks[0].Tasks.Take(5));\n        }\n\n        public List<ProjectTask> Tasks { get; }\n\n        public ObservableCollection<ProjectTask> SelectedTasks { get; }\n\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/UseCases/FinancialServices/MortgageCalculatorViewModel.cs",
    "content": "﻿using Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing DemoCenter.Models;\nusing Eremex.AvaloniaUI.Charts;\nusing System;\n\nnamespace DemoCenter.ViewModels;\n\npublic partial class MortgageCalculatorViewModel : PageViewModelBase\n{\n    [ObservableProperty] decimal principal = 300000m;\n    [ObservableProperty] decimal annualInterestRate = 5;\n    [ObservableProperty] int loanTermYears = 30;\n    [ObservableProperty] decimal monthlyPayment;\n\n    [ObservableProperty] List<PaymentDetail> amortizationSchedule = new();\n    [ObservableProperty] PaymentDetail selectedPaymentDetail;\n    [ObservableProperty] Bitmap housePreviewImage;\n\n    [ObservableProperty] SortedNumericDataAdapter principalSeriesDataAdapter, interestSeriesDataAdapter, totalMonthlyPaymentSeriesDataAdapter;\n\n    [ObservableProperty] FuncLabelFormatter currencyFormatter = new(o => String.Format(\"{0:c}\", o));\n    [ObservableProperty] FuncLabelFormatter argumentFormatter = new(o => String.Format(\"{0:0}\", o));\n\n    public MortgageCalculatorViewModel()\n    {\n        CalculateMortgage();\n    }\n\n    partial void OnPrincipalChanged(decimal value)\n    {\n        CalculateMortgage();\n    }\n\n    partial void OnAnnualInterestRateChanged(decimal value)\n    {\n        CalculateMortgage();\n    }\n\n    partial void OnLoanTermYearsChanged(int value)\n    {\n        CalculateMortgage();\n    }\n\n\n    private void CalculateMortgage()\n    {\n        try\n        {\n            MonthlyPayment = SampleMortgageCalculator.CalculateMonthlyPayment(\n                Principal,\n                AnnualInterestRate,\n                LoanTermYears);\n\n            AmortizationSchedule = SampleMortgageCalculator.GenerateAmortizationSchedule(\n                Principal,\n                AnnualInterestRate,\n                LoanTermYears);\n            HousePreviewImage = CalcHousePreviewImage(Principal);\n        }\n        catch (ArgumentOutOfRangeException)\n        {\n            // Reset to default values if invalid input\n            MonthlyPayment = 0;\n            AmortizationSchedule = new List<PaymentDetail>();\n        }\n        var argumentList = AmortizationSchedule.Select(s => (double)s.MonthNumber).ToList();\n        InterestSeriesDataAdapter = new FormatedTextSortedNumericDataAdapter(argumentList, AmortizationSchedule.Select(s => (double)s.InterestAmount).ToList());\n        PrincipalSeriesDataAdapter = new FormatedTextSortedNumericDataAdapter(argumentList, AmortizationSchedule.Select(s => (double)s.PrincipalAmount).ToList());\n        TotalMonthlyPaymentSeriesDataAdapter = new FormatedTextSortedNumericDataAdapter(argumentList, AmortizationSchedule.Select(s => (double)s.PaymentAmount).ToList());\n\n    }\n\n    static Bitmap GetImage(string imageName) \n    {\n        var imageUrl = \"avares://DemoCenter/DemoData/HouseImages/\" + imageName;\n        return new Bitmap(AssetLoader.Open(new Uri(imageUrl)));\n    }\n\n    Dictionary<int, Bitmap> houseImages = new Dictionary<int, Bitmap>()\n        {\n            {0, GetImage(\"House-3-Level.jpg\") },\n            {1, GetImage(\"House-4-Level.jpg\") },\n            {2, GetImage(\"House-5-Level.jpg\") },\n            {3, GetImage(\"House-6-Level.jpg\") },\n            {4, GetImage(\"House-7-Level.jpg\") },\n            {5, GetImage(\"House-Vip.jpg\") },\n\n        };\n\n\n    private Bitmap CalcHousePreviewImage(decimal principal)\n    {\n\n        var minimum = 100000;\n        var maximum = 1000000;\n\n        var grade = (maximum - minimum) / 5;\n        int index = (int)(principal - minimum) / grade;\n        return houseImages[index];\n    }\n\n}\n\npublic class FormatedTextSortedNumericDataAdapter : SortedNumericDataAdapter, ISeriesDataAdapter\n{\n    public FormatedTextSortedNumericDataAdapter(IList<double> arguments, IList<double> values) : base(arguments, values)\n    {\n    }\n\n    public string GetDataMemberPrefix(SeriesDataMemberType dataMember)\n    {\n        switch (dataMember)\n        {\n            case SeriesDataMemberType.Value:\n                return \"Payment \";\n            default:\n                return \"Month \";\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/ViewModels/UseCases/FinancialServices/SampleMortgageCalculator.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DemoCenter.Models;\n\npublic class SampleMortgageCalculator\n{\n    /// <summary>\n    /// Calculates the monthly payment for a mortgage\n    /// </summary>\n    /// <param name=\"principal\">The loan amount</param>\n    /// <param name=\"annualInterestRate\">Annual interest rate (as a percentage, e.g., 3.5 for 3.5%)</param>\n    /// <param name=\"loanTermYears\">Loan term in years</param>\n    /// <returns>Monthly payment amount</returns>\n    public static decimal CalculateMonthlyPayment(\n        decimal principal,\n        decimal annualInterestRate,\n        int loanTermYears)\n    {\n        if (principal <= 0)\n            throw new ArgumentOutOfRangeException(nameof(principal), \"Principal must be positive\");\n\n        if (annualInterestRate < 0)\n            throw new ArgumentOutOfRangeException(nameof(annualInterestRate), \"Interest rate cannot be negative\");\n\n        if (loanTermYears <= 0)\n            throw new ArgumentOutOfRangeException(nameof(loanTermYears), \"Loan term must be positive\");\n\n        if (annualInterestRate == 0)\n            return principal / (loanTermYears * 12);\n\n        var monthlyRate = annualInterestRate / 100 / 12;\n        var numberOfPayments = loanTermYears * 12;\n\n        var payment = principal * monthlyRate * (decimal)Math.Pow(1 + (double)monthlyRate, numberOfPayments)\n                    / (decimal)(Math.Pow(1 + (double)monthlyRate, numberOfPayments) - 1);\n\n        return Math.Round(payment, 2);\n    }\n\n    /// <summary>\n    /// Generates an amortization schedule for the mortgage\n    /// </summary>\n    /// <param name=\"principal\">The loan amount</param>\n    /// <param name=\"annualInterestRate\">Annual interest rate (as a percentage)</param>\n    /// <param name=\"loanTermYears\">Loan term in years</param>\n    /// <returns>List of monthly payment details</returns>\n    public static List<PaymentDetail> GenerateAmortizationSchedule(\n        decimal principal,\n        decimal annualInterestRate,\n        int loanTermYears)\n    {\n        var schedule = new List<PaymentDetail>();\n        var monthlyPayment = CalculateMonthlyPayment(principal, annualInterestRate, loanTermYears);\n        var monthlyRate = annualInterestRate / 100 / 12;\n        var remainingBalance = principal;\n\n        for (int month = 1; month <= loanTermYears * 12; month++)\n        {\n            var interestPayment = remainingBalance * monthlyRate;\n            var principalPayment = monthlyPayment - interestPayment;\n\n            if (month == loanTermYears * 12)\n            {\n                principalPayment = remainingBalance;\n                interestPayment = monthlyPayment - principalPayment;\n                remainingBalance = 0;\n            }\n            else\n            {\n                remainingBalance -= principalPayment;\n            }\n\n            schedule.Add(new PaymentDetail(\n                month,\n                monthlyPayment,\n                principalPayment,\n                interestPayment,\n                remainingBalance > 0 ? remainingBalance : 0\n            ));\n        }\n\n        return schedule;\n    }\n}\n\npublic class PaymentDetail\n{\n    public int MonthNumber { get; set; }\n    public decimal PaymentAmount { get; set; }\n    public decimal PrincipalAmount { get; set; }\n    public decimal InterestAmount { get; set; }\n    public decimal RemainingBalance { get; set; }\n\n    public PaymentDetail(\n        int monthNumber,\n        decimal paymentAmount,\n        decimal principalAmount,\n        decimal interestAmount,\n        decimal remainingBalance)\n    {\n        MonthNumber = monthNumber;\n        PaymentAmount =  Math.Round(paymentAmount, 2);\n        PrincipalAmount = Math.Round(principalAmount, 2);\n        InterestAmount = Math.Round(interestAmount, 2);\n        RemainingBalance = Math.Round(remainingBalance, 2);\n    }\n\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/BarItemsPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.BarItemsPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"640\"\n             d:DesignWidth=\"850\"\n             x:DataType=\"vm:BarItemsPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:BarItemsPageViewModel />\n    </Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <mxb:ToolbarManager IsWindowManager=\"True\" x:Name=\"DemoControl\">\n            <Grid RowDefinitions=\"Auto, 100, Auto, 100, Auto\"\n                  HorizontalAlignment=\"Center\"\n                  Margin=\"0,80,0,0\" Width=\"420\">\n\n                <mxb:ToolbarContainerControl>\n                    <mxb:Toolbar ShowCustomizationButton=\"False\" AllowDragToolbar=\"False\">\n                        <mxb:ToolbarButtonItem Name=\"ButtonItem\" Header=\"Create\" \n                                               Glyph=\"{x:Static mxi:Basic.Folder_Add}\" \n                                               GlyphSize=\"32,32\"/>\n                        <mxb:ToolbarCheckItem x:Name=\"ButtonCheckItem\" Header=\"Lock\" \n                                              Glyph=\"{x:Static mxi:PCB.Layer_Lock}\" GlyphSize=\"32,32\"/>\n                        \n                        <mxb:ToolbarButtonItem x:Name=\"ButtonDropDownItem\"\n                                               Header=\"Save\" \n                                               Glyph=\"{x:Static mxi:Basic.Save}\" GlyphSize=\"32,32\">\n                            <mxb:ToolbarButtonItem.DropDownControl>\n                                <mxb:PopupMenu>\n                                    <mxb:ToolbarButtonItem Header=\"Save All\" \n                                                           Glyph=\"{x:Static mxi:Basic.Save_All}\"/>\n                                    <mxb:ToolbarButtonItem Header=\"Save 3D model\" \n                                                           Glyph=\"{x:Static mxi:_3D.Save}\"/>\n                                </mxb:PopupMenu>\n                            </mxb:ToolbarButtonItem.DropDownControl>\n                        </mxb:ToolbarButtonItem>\n\n                        <mxb:ToolbarEditorItem EditorValue=\"Toolbar editor item\" EditorWidth=\"200\">\n                            <mxb:ToolbarEditorItem.EditorProperties>\n                                <mxe:ButtonEditorProperties/>\n                            </mxb:ToolbarEditorItem.EditorProperties>\n                        </mxb:ToolbarEditorItem>\n                    </mxb:Toolbar>\n                </mxb:ToolbarContainerControl>\n\n                <mxe:GroupBox Grid.Row=\"2\" Header=\"Selected Item\" Classes=\"LayoutItem\" HorizontalAlignment=\"Left\">\n                    <StackPanel Spacing=\"10\">\n                        <RadioButton x:Name=\"ButtonItemSelector\" Classes=\"LayoutItem\" GroupName=\"G1\" IsChecked=\"True\" \n                                     IsCheckedChanged=\"OnRadioButtonCheckedChanged\">\n                            <RadioButton.Content>\n                                <StackPanel Orientation=\"Horizontal\">\n                                    <Image Source=\"{x:Static mxi:Basic.Folder_Add}\" Width=\"32\" Height=\"32\"/>\n                                    <Label Content=\"BarButtonItem\" Classes=\"LayoutItem\"/>\n                                </StackPanel>\n                            </RadioButton.Content>\n                        </RadioButton>\n                        <RadioButton x:Name=\"ButtonCheckItemSelector\" Classes=\"LayoutItem\" GroupName=\"G1\"\n                                     IsCheckedChanged=\"OnRadioButtonCheckedChanged\">\n                            <RadioButton.Content>\n                                <StackPanel Orientation=\"Horizontal\">\n                                    <Image Source=\"{x:Static mxi:PCB.Layer_Lock}\" Width=\"32\" Height=\"32\"/>\n                                    <Label Content=\"BarCheckItem\" Classes=\"LayoutItem\"/>\n                                </StackPanel>\n                            </RadioButton.Content>\n                        </RadioButton>\n                        <RadioButton x:Name=\"ButtonDropDownItemSelector\" Classes=\"LayoutItem\" GroupName=\"G1\"\n                                     IsCheckedChanged=\"OnRadioButtonCheckedChanged\">\n                            <RadioButton.Content>\n                                <StackPanel Orientation=\"Horizontal\">\n                                    <Image Source=\"{x:Static mxi:Basic.Save}\" Width=\"32\" Height=\"32\"/>\n                                    <Label Content=\"BarButtonItem with DropDown\" Classes=\"LayoutItem\"/>\n                                </StackPanel>\n                            </RadioButton.Content>\n                        </RadioButton>\n                        <RadioButton x:Name=\"TextItemSelector\" Classes=\"LayoutItem\" GroupName=\"G1\"\n                                     IsCheckedChanged=\"OnRadioButtonCheckedChanged\">\n                            <RadioButton.Content>\n                                <StackPanel Orientation=\"Horizontal\">\n                                    <Image Source=\"{x:Static mxi:Basic.Info}\" Width=\"32\" Height=\"32\"/>\n                                    <Label Content=\"BarTextItem\" Classes=\"LayoutItem\"/>\n                                </StackPanel>\n                            </RadioButton.Content>\n                        </RadioButton>\n                    </StackPanel>\n                </mxe:GroupBox>\n                <mxb:ToolbarContainerControl Grid.Row=\"4\">\n                    <mxb:Toolbar ShowCustomizationButton=\"False\" AllowDragToolbar=\"False\">\n                        <mxb:ToolbarTextItem x:Name=\"TextItem\"\n                                             DisplayMode=\"Both\" Header=\"Info\"\n                                             ShowBorder=\"False\"\n                                             Glyph=\"{x:Static mxi:Basic.Info}\"\n                                             GlyphSize=\"32,32\"/>\n                    </mxb:Toolbar>\n                </mxb:ToolbarContainerControl>\n            </Grid>\n        </mxb:ToolbarManager>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox x:Name=\"PropertiesSelector\" Header=\"Selected item properties\">\n                <StackPanel>\n                    <mxe:CheckEditor x:Name=\"IsVisibleSelector\" Content=\"Is Visible\" IsChecked=\"{Binding IsVisible, Mode=TwoWay}\" Classes=\"LayoutItem\"/>\n                    <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Enabled\" IsChecked=\"{Binding IsEnabled, Mode=TwoWay}\" Classes=\"LayoutItem\"/>\n                    <Grid ColumnDefinitions=\"Auto, *\" RowDefinitions=\"Auto, Auto, Auto, Auto, Auto, Auto\">\n                        <Label Content=\"Display Mode:\" Classes=\"LayoutItem\" Grid.Row=\"0\"/>\n                        <mxe:ComboBoxEditor x:Name=\"DisplayModeSelector\" Grid.Row=\"0\" Grid.Column=\"1\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mxb:ToolbarItemDisplayMode}\"\n                                            EditorValue=\"{Binding DisplayMode, Mode=TwoWay}\"\n                                            Classes=\"LayoutItem\" />                        \n                        <Label Content=\"Glyph Alignment:\" Classes=\"LayoutItem\" Grid.Row=\"1\"/>\n                        <mxe:ComboBoxEditor x:Name=\"AlignmentSelector\" Grid.Row=\"1\" Grid.Column=\"1\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mxb:Alignment}\" \n                                            EditorValue=\"{Binding GlyphAlignment, Mode=TwoWay}\" \n                                            Classes=\"LayoutItem\"/>\n                        <Label Content=\"Glyph Size:\" Classes=\"LayoutItem\" Grid.Row=\"2\"/>\n                        <mxe:ComboBoxEditor x:Name=\"GlyphSizeSelector\" Grid.Row=\"2\" Grid.Column=\"1\"\n                                            ItemsSource=\"{x:Static vm:BarItemsPageViewModel.GlyphSizes}\"\n                                            EditorValue=\"{Binding GlyphSize, Mode=TwoWay}\"\n                                            Classes=\"LayoutItem\"/>\n                        <Label Content=\"Open Mode:\" Classes=\"LayoutItem\" Grid.Row=\"3\"\n                               IsVisible=\"{Binding #ButtonDropDownItemSelector.IsChecked}\"/>\n                        <mxe:ComboBoxEditor x:Name=\"DropDownOpenModeSelector\" Grid.Row=\"3\" Grid.Column=\"1\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mxb:DropDownOpenMode}\"\n                                            EditorValue=\"{Binding #ButtonDropDownItem.DropDownOpenMode, Mode=TwoWay}\"\n                                            Classes=\"LayoutItem\"\n                                            IsVisible=\"{Binding #ButtonDropDownItemSelector.IsChecked}\"/>\n                        <Label Content=\"Arrow Visibility:\" Classes=\"LayoutItem\" Grid.Row=\"4\"\n                               IsVisible=\"{Binding #ButtonDropDownItemSelector.IsChecked}\"/>\n                        <mxe:ComboBoxEditor x:Name=\"DropDownArrowVisibilitySelector\" Grid.Row=\"4\" Grid.Column=\"1\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mxb:DropDownArrowVisibility}\"\n                                            EditorValue=\"{Binding #ButtonDropDownItem.DropDownArrowVisibility, Mode=TwoWay}\"\n                                            Classes=\"LayoutItem\"\n                                            IsVisible=\"{Binding #ButtonDropDownItemSelector.IsChecked}\"/>\n                        <Label Content=\"Arrow Alignment:\" Classes=\"LayoutItem\" Grid.Row=\"5\"\n                               IsVisible=\"{Binding #ButtonDropDownItemSelector.IsChecked}\"/>\n                        <mxe:ComboBoxEditor x:Name=\"DropDownArrowAlignmentSelector\" Grid.Row=\"5\" Grid.Column=\"1\" IsTextEditable=\"False\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mxb:DropDownArrowAlignment}\"\n                                            EditorValue=\"{Binding #ButtonDropDownItem.DropDownArrowAlignment, Mode=TwoWay}\"\n                                            Classes=\"LayoutItem\"\n                                            IsVisible=\"{Binding #ButtonDropDownItemSelector.IsChecked}\"/>\n                    </Grid>\n                    <mxe:CheckEditor x:Name=\"IsCheckedSelector\" Content=\"Is Checked\"\n                                     IsVisible=\"{Binding #ButtonCheckItemSelector.IsChecked}\"\n                                     IsChecked=\"{Binding #ButtonCheckItem.IsChecked, Mode=TwoWay}\" \n                                     Classes=\"LayoutItem\"/>\n                    <mxe:CheckEditor x:Name=\"ShowBorderSelector\" Content=\"Show Border\"\n                                     IsVisible=\"{Binding #TextItemSelector.IsChecked}\"\n                                     IsChecked=\"{Binding #TextItem.ShowBorder, Mode=TwoWay}\"\n                                     Classes=\"LayoutItem\"/>\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/BarItemsPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Interactivity;\n\nnamespace DemoCenter.Views\n{\n    public partial class BarItemsPageView : UserControl\n    {\n        public BarItemsPageView()\n        {\n            InitializeComponent();\n            PropertiesSelector.DataContext = ButtonItem;\n        }\n\n        private void OnRadioButtonCheckedChanged(object sender, RoutedEventArgs e)\n        {\n            var source = e.Source as RadioButton;\n\n            if (source.IsChecked != true)\n                return;\n            if(source == ButtonItemSelector)\n                PropertiesSelector.DataContext = ButtonItem;\n            else if (source == ButtonCheckItemSelector)\n                PropertiesSelector.DataContext = ButtonCheckItem;\n            else if(source == ButtonDropDownItemSelector)\n                PropertiesSelector.DataContext = ButtonDropDownItem;\n            else if(source == TextItemSelector)\n                PropertiesSelector.DataContext = TextItem;         \n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/BarsGroupView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.BarsGroupView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxpg=\"clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxdg=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataGrid;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxb=\"clr-namespace:Eremex.AvaloniaUI.Controls.Bars;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxu=\"clr-namespace:Eremex.AvaloniaUI.Controls.Utils;assembly=Eremex.Avalonia.Controls\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:view=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"700\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:BarsGroupViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:BarsGroupViewModel />\n    </Design.DataContext>\n\n    <TextBlock VerticalAlignment=\"Center\"\n               HorizontalAlignment=\"Center\"\n               FontSize=\"16\"\n               Text=\"See product pages for details.\"/>  \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/BarsGroupView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class BarsGroupView : UserControl\n    {\n        public BarsGroupView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/BarsOverviewPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.BarsOverviewPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"700\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:BarsOverviewPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:BarsOverviewPageViewModel />\n    </Design.DataContext>\n\n    <Grid Width=\"440\" Height=\"640\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Top\" Margin=\"0,80,0,0\">\n        <mxb:ToolbarManager IsWindowManager=\"True\" x:Name=\"DemoControl\">\n            <Grid RowDefinitions=\"Auto, 400, Auto\" ColumnDefinitions=\"Auto, *, Auto\">\n                <mxb:ToolbarContainerControl DockType=\"Top\" Grid.ColumnSpan=\"3\">\n                    <mxb:Toolbar DisplayMode=\"MainMenu\">\n                        <mxb:ToolbarMenuItem Header=\"Menu\"/>\n                        <mxb:ToolbarMenuItem Header=\"File\"/>\n                        <mxb:ToolbarMenuItem Header=\"Options\" Alignment=\"Far\"/>\n                    </mxb:Toolbar>\n                    <mxb:Toolbar x:Name=\"FileToolbar\" ShowCustomizationButton=\"False\" AllowDragToolbar=\"False\" StretchToolbar=\"True\">\n                        <mxb:ToolbarButtonItem Header=\"New\" Glyph=\"{x:Static mxi:Basic.Doc_Add}\" GlyphSize=\"48,48\"/>\n                        <mxb:ToolbarEditorItem EditorWidth=\"200\" EditorValue=\"Editor item\">\n                            <mxb:ToolbarEditorItem.EditorProperties>\n                                <mxe:ButtonEditorProperties HorizontalContentAlignment=\"Center\"/>\n                            </mxb:ToolbarEditorItem.EditorProperties>\n                        </mxb:ToolbarEditorItem>\n\n                        <mxb:ToolbarButtonItem x:Name=\"ButtonDropDownItem\"\n                                               Header=\"Save\"\n                                               Glyph=\"{x:Static mxi:Basic.Save}\" GlyphSize=\"48,48\">\n                            <mxb:ToolbarButtonItem.DropDownControl>\n                                <mxb:PopupMenu>\n                                    <mxb:ToolbarButtonItem Header=\"Save All\" Glyph=\"{x:Static mxi:Basic.Save_All}\" GlyphSize=\"32,32\"/>\n                                    <mxb:ToolbarButtonItem Header=\"Save 3D model\" Glyph=\"{x:Static mxi:Basic.Save}\" GlyphSize=\"32,32\"/>\n                                </mxb:PopupMenu>\n                            </mxb:ToolbarButtonItem.DropDownControl>\n                        </mxb:ToolbarButtonItem>\n                        <mxb:ToolbarButtonItem Header=\"Clear\" Glyph=\"{x:Static mxi:Basic.Table_Clear}\" GlyphSize=\"48,48\"/>\n                    </mxb:Toolbar>\n                </mxb:ToolbarContainerControl>           \n                <mxb:ToolbarContainerControl Grid.Row=\"1\" DockType=\"Left\"/>\n                <Label Grid.Row=\"1\" Grid.Column=\"1\" Content=\"See product pages for details.\" \n                       HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\n                       FontSize=\"16\"/>\n                <mxb:ToolbarContainerControl Grid.Row=\"1\" Grid.Column=\"2\" DockType=\"Right\"/>\n                <mxb:ToolbarContainerControl Grid.Row=\"2\" Grid.ColumnSpan=\"3\" DockType=\"Bottom\">\n                    <mxb:Toolbar DisplayMode=\"StatusBar\" x:Name=\"StatusBar\" ShowCustomizationButton=\"False\">\n                        <mxb:ToolbarTextItem ShowBorder=\"False\"\n                         Glyph=\"{x:Static mxi:Basic.Info}\"\n                         GlyphSize=\"32,32\"/>\n                        <mxb:ToolbarTextItem Header=\"Status Bar\" ShowBorder=\"False\" Alignment=\"Far\"/>\n                    </mxb:Toolbar>\n                </mxb:ToolbarContainerControl>\n            </Grid>\n        </mxb:ToolbarManager>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/BarsOverviewPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class BarsOverviewPageView : UserControl\n    {\n        public BarsOverviewPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/ContextMenuPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.ContextMenuPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:ContextMenuPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:ContextMenuPageViewModel />\n    </Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <mxb:ToolbarManager IsWindowManager=\"True\">\n            <ContentControl Classes=\"DemoUserControl\" x:Name=\"DemoControl\">\n                <Grid RowDefinitions=\"50, Auto, 80, Auto, 80, Auto, 80\"\n                      HorizontalAlignment=\"Center\" Width=\"400\">\n                    <Grid.Styles>\n                        <Style Selector=\"TextBox\">\n                            <Setter Property=\"ClearSelectionOnLostFocus\" Value=\"False\"/>\n                            <Setter Property=\"mxb:ToolbarManager.ContextPopup\">\n                                <Setter.Value>\n                                    <Template>\n                                        <mxb:PopupMenu Header=\"Edit Menu\" ShowHeader=\"True\">\n                                            <mxb:ToolbarButtonItem Header=\"Cut\" HotKeyDisplayString=\"Ctrl+X\" Command=\"{Binding $parent[TextBox].Cut}\" IsEnabled=\"{Binding $parent[TextBox].CanCut}\"\n                                                                   Glyph=\"{x:Static mxi:Basic.Cut}\"/>\n                                            <mxb:ToolbarButtonItem Header=\"Copy\" HotKeyDisplayString=\"Ctrl+C\" Command=\"{Binding $parent[TextBox].Copy}\" IsEnabled=\"{Binding $parent[TextBox].CanCopy}\"\n                                                                   Glyph=\"{x:Static mxi:Basic.Copy}\"/>\n                                            <mxb:ToolbarButtonItem Header=\"Paste\" HotKeyDisplayString=\"Ctrl+V\" Command=\"{Binding $parent[TextBox].Paste}\" IsEnabled=\"{Binding $parent[TextBox].CanPaste}\"\n                                                                   Glyph=\"{x:Static mxi:Basic.Paste}\"/>\n                                            <mxb:ToolbarButtonItem Header=\"Undo\" HotKeyDisplayString=\"Ctrl+Z\" Command=\"{Binding $parent[TextBox].Undo}\" IsEnabled=\"{Binding $parent[TextBox].CanUndo}\"\n                                                                   Glyph=\"{x:Static mxi:Basic.Undo}\"\n                                                                   ShowSeparator=\"True\"/>\n                                            <mxb:ToolbarButtonItem Header=\"Redo\" HotKeyDisplayString=\"Ctrl+Y\"  Command=\"{Binding $parent[TextBox].Redo}\" IsEnabled=\"{Binding $parent[TextBox].CanRedo}\"\n                                                                   Glyph=\"{x:Static mxi:Basic.Redo}\"/>\n                                            <mxb:ToolbarButtonItem Header=\"Select All\" HotKeyDisplayString=\"Ctrl+A\" Command=\"{Binding $parent[TextBox].SelectAll}\"\n                                                                   ShowSeparator=\"True\"/>\n                                            <mxb:ToolbarButtonItem Header=\"Clear\" Command=\"{Binding $parent[TextBox].Clear}\"\n                                                                   Glyph=\"{x:Static mxi:Basic.Remove}\"/>\n                                        </mxb:PopupMenu>\n                                    </Template>\n                                </Setter.Value>\n                            </Setter>\n                        </Style>\n                    </Grid.Styles>\n\n                    <Label Content=\"Button editor\" VerticalAlignment=\"Bottom\" Classes=\"LayoutItem\"/>\n                    <mxe:ButtonEditor EditorValue=\"Majestic Mariner\" Grid.Row=\"1\" Classes=\"LayoutItem\">\n                        <mxe:ButtonEditor.Buttons>\n                            <mxe:ButtonSettings ToolTip.Tip=\"Delete\" Glyph=\"{x:Static mxi:Basic.Remove}\"/>\n                        </mxe:ButtonEditor.Buttons>\n                    </mxe:ButtonEditor>\n\n                    <Label Grid.Row=\"2\" Content=\"Date editor\" VerticalAlignment=\"Bottom\" Classes=\"LayoutItem\"/>\n                    <mxe:DateEditor Grid.Row=\"3\" EditorValue=\"{Binding DateTime}\" Classes=\"LayoutItem\"/>\n\n                    <Label Content=\"Segmented editor\" Grid.Row=\"4\" VerticalAlignment=\"Bottom\" Classes=\"LayoutItem\"/>\n                    <mxe:SegmentedEditor Grid.Row=\"5\" ItemsSource=\"{Binding Mechs}\" DisplayMember=\"Name\" Classes=\"LayoutItem\" MinHeight=\"28\">\n                        <mxb:ToolbarManager.ContextPopup>\n                            <mxb:PopupMenu IsEnabled=\"{Binding #IsEnabledSelector.IsChecked}\"\n                                           ShowIconStrip=\"{Binding #ShowIconsStripSelector.IsChecked}\"\n                                           IsVisible=\"{Binding #IsVisibleSelector.IsChecked}\" >\n                                <mxb:ToolbarButtonItem Header=\"Reload\" Command=\"{Binding Reload}\"\n                                                       Glyph=\"{x:Static mxi:Basic.Update}\"/>\n                                <mxb:ToolbarCheckItem Header=\"Order by Ascending\" IsChecked=\"{Binding OrderByAscending, Mode=TwoWay}\"\n                                                      ShowSeparator=\"True\"/>\n                                <mxb:ToolbarCheckItem Header=\"Order by Descending\" IsChecked=\"{Binding OrderByDescending, Mode=TwoWay}\"/>\n                                <mxb:ToolbarButtonItem Header=\"Clear all but the first\" Command=\"{Binding ClearAllButTheFirst}\"\n                                                       Glyph=\"{x:Static mxi:Basic.Table_Clear}\"\n                                                       ShowSeparator=\"True\"/>\n                            </mxb:PopupMenu>\n                        </mxb:ToolbarManager.ContextPopup>\n                    </mxe:SegmentedEditor>\n\n                    <Label Grid.Row=\"6\" Content=\"Right click over editor to show a context menu\" HorizontalAlignment=\"Center\"\n                           VerticalAlignment=\"Bottom\" FontSize=\"16\"/>\n                </Grid>\n            </ContentControl>\n        </mxb:ToolbarManager>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Segmented Editor Properties\"  Classes=\"PropertiesGroup\">\n                <StackPanel>\n                    <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Menu Enabled\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"IsVisibleSelector\" Content=\"Is Menu Visible\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"ShowIconsStripSelector\" Content=\"Show Icon Strip\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/ContextMenuPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class ContextMenuPageView : UserControl\n    {\n        public ContextMenuPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/Helpers/Converters.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Interactivity;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Media;\nusing System;\nusing System.Data.Common;\nusing System.Globalization;\nusing System.Windows.Input;\n\nnamespace DemoCenter.Views.Bars.Helpers;\n\npublic class LineAndColumnToTextConverter : MarkupExtension, IMultiValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n\n    public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (values.Count == 2 && values[0] is int line && values[1] is int column)\n        {\n            return $\"Line {line}, Column {column}\";\n        }\n\n        return string.Empty;\n    }\n}\n\npublic class FontNameToFontFamilyConverter : MarkupExtension, IValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return ((FontFamily)value).Name;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return new FontFamily((string)value);\n    }\n}\n\npublic class BoolToFontWeightConverter : MarkupExtension, IValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return ((FontWeight)value) == FontWeight.Bold;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return (bool)value ? FontWeight.Bold : FontWeight.Normal;\n    }\n}\n\npublic class BoolToFontStyleConverter : MarkupExtension, IValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return (FontStyle)value == FontStyle.Italic;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return (bool)value ? FontStyle.Italic : FontStyle.Normal;\n    }\n}\n\npublic class ColorToBrushConverter : MarkupExtension, IValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if(value is SolidColorBrush brush)\n            return brush.Color;\n        return null;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return new SolidColorBrush((Color)value);\n        \n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/Helpers/ScaleDecorator.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Interactivity;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Media;\nusing CommunityToolkit.Mvvm.Input;\nusing System;\nusing System.Data.Common;\nusing System.Windows.Input;\n\nnamespace DemoCenter.Views.Bars.Helpers;\n\npublic class ScaleDecorator : Decorator\n{\n    public static readonly StyledProperty<double> ScaleProperty = AvaloniaProperty.Register<ScaleDecorator, double>(nameof(Scale), defaultValue: 1);\n\n    static ScaleDecorator()\n    {\n        ScaleProperty.Changed.AddClassHandler<ScaleDecorator>((x, e) => x.OnScaleChanged());\n    }\n\n    public ScaleDecorator()\n    {\n        DecreaseCommand = new RelayCommand(() => Scale -= 0.1, () => Scale > 0.2);\n        IncreaseCommand = new RelayCommand(() => Scale += 0.1, () => Scale < 3);\n        DefaultScaleCommand = new RelayCommand(() => Scale = 1, () => Scale != 1);\n    }\n\n    public double Scale\n    {\n        get => GetValue(ScaleProperty);\n        set => SetValue(ScaleProperty, value);\n    }\n\n    public IRelayCommand DecreaseCommand { get; }\n\n    public IRelayCommand IncreaseCommand { get; }\n\n    public IRelayCommand DefaultScaleCommand { get; }\n\n    private void OnScaleChanged()\n    {\n        DecreaseCommand.NotifyCanExecuteChanged();\n        IncreaseCommand.NotifyCanExecuteChanged();\n        DefaultScaleCommand.NotifyCanExecuteChanged();\n        InvalidateArrange();\n        Child.RenderTransform = new ScaleTransform(Scale, Scale);\n    }\n\n    protected override Size ArrangeOverride(Size finalSize)\n    {\n        var size = new Size(finalSize.Width / Scale, finalSize.Height / Scale);\n        var position = new Point((finalSize.Width - size.Width) / 2, (finalSize.Height - size.Height) / 2);\n        Child.Arrange(new Rect(position, size));\n        return finalSize;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/Helpers/TextBoxHelper.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Interactivity;\nusing Avalonia.Markup.Xaml;\n\nusing System;\nusing System.Data.Common;\nusing System.Windows.Input;\n\nnamespace DemoCenter.Views.Bars.Helpers;\n\npublic class TextBoxHelper : AvaloniaObject\n{\n    public static readonly AttachedProperty<bool> IsEnabledProperty = AvaloniaProperty.RegisterAttached<TextBoxHelper, TextBox, bool>(\"IsEnabled\");\n\n    public static readonly AttachedProperty<int> LineProperty = AvaloniaProperty.RegisterAttached<TextBoxHelper, TextBox, int>(\"Line\", defaultValue: 1);\n\n    public static readonly AttachedProperty<int> ColumnProperty = AvaloniaProperty.RegisterAttached<TextBoxHelper, TextBox, int>(\"Column\", defaultValue: 1);\n\n    public static bool GetIsEnabled(TextBox textBox)\n    {\n        return textBox.GetValue(IsEnabledProperty);\n    }\n\n    public static void SetIsEnabled(TextBox textBox, bool isEnabled)\n    {\n        textBox.SetValue(IsEnabledProperty, isEnabled);\n    }\n\n    public static int GetLine(TextBox textBox)\n    {\n        return textBox.GetValue(LineProperty);\n    }\n\n    public static void SetLine(TextBox textBox, int line)\n    {\n        textBox.SetValue(LineProperty, line);\n    }\n\n    public static int GetColumn(TextBox textBox)\n    {\n        return textBox.GetValue(ColumnProperty);\n    }\n\n    public static void SetColumn(TextBox textBox, int column)\n    {\n        textBox.SetValue(ColumnProperty, column);\n    }\n\n    static TextBoxHelper()\n    {\n        IsEnabledProperty.Changed.Subscribe(x => OnIsEnabledChanged(x));\n    }\n\n    private static void OnIsEnabledChanged(AvaloniaPropertyChangedEventArgs<bool> e)\n    {\n        var textBox = (TextBox)e.Sender;\n        if (textBox == null)\n            return;\n\n        if(e.NewValue.Value)\n            textBox.PropertyChanged += TextBox_PropertyChanged;\n        else\n            textBox.PropertyChanged -= TextBox_PropertyChanged;\n    }\n\n    private static void TextBox_PropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)\n    {\n        if (e.Property == TextBox.CaretIndexProperty)\n        {\n            var textBox = (TextBox)sender;\n\n            SetLine(textBox, GetLineNumber(textBox));\n            SetColumn(textBox, GetColumnNumber(textBox));\n        }\n    }\n\n    private static int GetLineNumber(TextBox textBox)\n    {\n        int currentIndex = 0;\n        int lineNumber = 1;\n        while(currentIndex < textBox.CaretIndex)\n        {\n            if (textBox.Text.Length < currentIndex + textBox.NewLine.Length)\n                break;\n            if (textBox.Text.Substring(currentIndex, textBox.NewLine.Length) == textBox.NewLine)\n            {\n                lineNumber++;\n                currentIndex += textBox.NewLine.Length;\n            }\n            else\n            {\n                currentIndex++;\n            }\n        }\n        return lineNumber;\n    }\n\n    private static int GetColumnNumber(TextBox textBox)\n    {   \n        int currentIndex = textBox.CaretIndex - textBox.NewLine.Length;\n        while (currentIndex >= 0)\n        {   \n            if (textBox.Text.Substring(currentIndex, textBox.NewLine.Length) == textBox.NewLine)\n            {\n                currentIndex += textBox.NewLine.Length;\n                break;\n            }\n            else\n            {\n                currentIndex--;\n            }\n        }\n        currentIndex = Math.Max(currentIndex, 0);\n        return textBox.CaretIndex - currentIndex + 1;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/ToolbarAndMenuPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.ToolbarAndMenuPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:view=\"clr-namespace:DemoCenter.Views;assembly=DemoCenter\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:helpers=\"clr-namespace:DemoCenter.Views.Bars.Helpers;assembly=DemoCenter\"\n             d:DesignHeight=\"640\"\n             d:DesignWidth=\"800\"\n             x:Name=\"Page\"\n             x:DataType=\"vm:ToolbarAndMenuPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:ToolbarAndMenuPageViewModel />\n\t</Design.DataContext>\n\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ControlTemplate x:Key=\"DemoToolbarBorderTemplate\">\n                <Grid>\n                    <Border HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" MinHeight=\"22\" Padding=\"1\">\n                        <ContentPresenter Content=\"{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}\"/>\n                    </Border>\n                    <Border CornerRadius=\"4\" Margin=\"1, 2\" IsHitTestVisible=\"False\" Background=\"LightPink\" Classes.highlight=\"{Binding $parent[mxb:Toolbar].(view:ToolbarAndMenuPageView.IsToolbarSelected)}\" Opacity=\"0\" IsVisible=\"False\"/>\n                </Grid>\n            </ControlTemplate>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <UserControl.Styles>\n        <Style Selector=\"Border.highlight\">\n            <Style.Animations>\n                <Animation Duration=\"0:0:2\" IterationCount=\"1\">\n                    <KeyFrame Cue=\"0%\">\n                        <Setter Property=\"IsVisible\" Value=\"True\"/>\n                    </KeyFrame>\n                    <KeyFrame Cue=\"20%\">\n                        <Setter Property=\"Opacity\" Value=\"0.3\"/>\n                    </KeyFrame>\n                    <KeyFrame Cue=\"80%\">\n                        <Setter Property=\"Opacity\" Value=\"0.6\"/>\n                    </KeyFrame>\n                    <KeyFrame Cue=\"100%\">\n                        <Setter Property=\"Opacity\" Value=\"0\"/>\n                    </KeyFrame>\n                </Animation>\n            </Style.Animations>\n        </Style>\n        <Style Selector=\"mxb|Toolbar /template/ContentControl#PART_Border\">\n            <Setter Property=\"Template\" Value=\"{StaticResource DemoToolbarBorderTemplate}\"/>\n        </Style>\n        <Style Selector=\"mxb|Toolbar:floating /template/ContentControl#PART_Border\">\n            <Setter Property=\"Template\" Value=\"{StaticResource DemoToolbarBorderTemplate}\"/>\n        </Style>\n        <Style Selector=\"mxb|Toolbar:vertical /template/ContentControl#PART_Border\">\n            <Setter Property=\"Template\" Value=\"{StaticResource DemoToolbarBorderTemplate}\"/>\n        </Style>\n    </UserControl.Styles>\n\n    <Border BorderThickness=\"0\">\n        <Grid ColumnDefinitions=\"*, 250\">\n            <mxb:ToolbarManager IsWindowManager=\"True\" x:Name=\"DemoControl\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\" BorderThickness=\"0,0,1,0\">\n                <Grid RowDefinitions=\"Auto, *, Auto\" ColumnDefinitions=\"Auto, *, Auto\">\n                    <mxb:ToolbarContainerControl Grid.ColumnSpan=\"3\" DockType=\"Top\">\n                        <mxb:Toolbar x:Name=\"MainMenu\" ToolbarName=\"Main Menu\" DisplayMode=\"MainMenu\" ShowCustomizationButton=\"False\">\n                            <mxb:ToolbarMenuItem Header=\"File\" Category=\"File\">\n                                <mxb:ToolbarButtonItem Header=\"New\" Glyph=\"{x:Static mxi:Basic.Doc_Add}\" Category=\"File\"/>\n                                <mxb:ToolbarButtonItem Header=\"Open\" Glyph=\"{x:Static mxi:Basic.Folder_Open}\" Category=\"File\"/>\n                                <mxb:ToolbarButtonItem Header=\"Save\" Glyph=\"{x:Static mxi:Basic.Save}\" Category=\"File\"/>\n                                <mxb:ToolbarButtonItem Header=\"Print\" Glyph=\"{x:Static mxi:Basic.Print}\" ShowSeparator=\"True\"  Category=\"File\"/>\n                            </mxb:ToolbarMenuItem>\n\n                            <mxb:ToolbarMenuItem Header=\"Edit\" Category=\"Edit\">\n                                <mxb:ToolbarButtonItem Header=\"Cut\" Glyph=\"{x:Static mxi:Basic.Cut}\" Category=\"Edit\"/>\n                                <mxb:ToolbarButtonItem Header=\"Copy\" Glyph=\"{x:Static mxi:Basic.Copy}\" Category=\"Edit\"/>\n                                <mxb:ToolbarButtonItem Header=\"Paste\" Glyph=\"{x:Static mxi:Basic.Paste}\" Category=\"Edit\"/>\n                                <mxb:ToolbarButtonItem Header=\"Select All\" Command=\"{Binding #textBox.SelectAll}\" Category=\"Edit\" ShowSeparator=\"True\"/>\n                                <mxb:ToolbarButtonItem Header=\"Clear all\" Command=\"{Binding #textBox.Clear}\" Glyph=\"{x:Static mxi:Basic.Table_Clear}\" Category=\"Edit\"/>\n                            </mxb:ToolbarMenuItem>\n\n                            <mxb:ToolbarMenuItem Header=\"View\" Category=\"View\">\n                                <mxb:ToolbarMenuItem Header=\"Zoom\">\n                                    <mxb:ToolbarButtonItem Header=\"Zoom Out\" Command=\"{Binding #scaleDecorator.DecreaseCommand}\" Category=\"View\"/>\n                                    <mxb:ToolbarButtonItem Header=\"Zoom In\" Command=\"{Binding #scaleDecorator.IncreaseCommand}\" Category=\"View\"/>\n                                    <mxb:ToolbarButtonItem Header=\"Restore Default Zoom\" Command=\"{Binding #scaleDecorator.DefaultScaleCommand}\" Category=\"View\"/>\n                                </mxb:ToolbarMenuItem>\n                                <mxb:ToolbarCheckItem Header=\"Status Bar\" IsChecked=\"{Binding #StatusBar.IsVisible, Mode=TwoWay}\" Category=\"View\"/>\n                            </mxb:ToolbarMenuItem>\n                            \n                            <mxb:ToolbarMenuItem Header=\"Format\" Category=\"Format\">\n                                <mxb:ToolbarCheckItem Header=\"Bold\" IsChecked=\"{Binding #textBox.FontWeight, Converter={helpers:BoolToFontWeightConverter}, Mode=TwoWay}\" Glyph=\"{x:Static mxi:Basic.Font_Bold}\" Category=\"Font\"/>\n                                <mxb:ToolbarCheckItem Header=\"Italic\" IsChecked=\"{Binding #textBox.FontStyle, Converter={helpers:BoolToFontStyleConverter}, Mode=TwoWay}\" Glyph=\"{x:Static mxi:Basic.Font_Italic}\" Category=\"Font\"/>\n                            </mxb:ToolbarMenuItem>\n\n                            <mxb:ToolbarMenuItem Alignment=\"Far\" Header=\"Options\" Category=\"Options\">\n                                <mxb:ToolbarButtonItem Header=\"Check for Updates\" Category=\"Options\"/>\n                                <mxb:ToolbarButtonItem Header=\"About\" Category=\"Options\" ShowSeparator=\"True\"/>\n                            </mxb:ToolbarMenuItem>\n                        </mxb:Toolbar>\n\n                        <mxb:Toolbar x:Name=\"FileToolbar\" ToolbarName=\"File\" ShowCustomizationButton=\"False\">\n                            <mxb:ToolbarButtonItem Header=\"New\" Glyph=\"{x:Static mxi:Basic.Doc_Add}\" Category=\"File\"/>\n                            <mxb:ToolbarButtonItem Header=\"Open\" Glyph=\"{x:Static mxi:Basic.Folder_Open}\" Category=\"File\"/>\n                            <mxb:ToolbarButtonItem Header=\"Save\" Glyph=\"{x:Static mxi:Basic.Save}\" Category=\"File\"/>\n                            <mxb:ToolbarButtonItem Header=\"Print\" Glyph=\"{x:Static mxi:Basic.Print}\" Alignment=\"Far\" Category=\"File\"/>\n                        </mxb:Toolbar>\n\n                        <mxb:Toolbar x:Name=\"EditToolbar\" ToolbarName=\"Edit\" ShowCustomizationButton=\"False\">\n                            <mxb:ToolbarButtonItem Header=\"Cut\" Command=\"{Binding #textBox.Cut}\" IsEnabled=\"{Binding #textBox.CanCut}\" Glyph=\"{x:Static mxi:Basic.Cut}\" Category=\"Edit\"/>\n                            <mxb:ToolbarButtonItem Header=\"Copy\" Command=\"{Binding #textBox.Copy}\" IsEnabled=\"{Binding #textBox.CanCopy}\" Glyph=\"{x:Static mxi:Basic.Copy}\" Category=\"Edit\"/>\n                            <mxb:ToolbarButtonItem Header=\"Paste\" Command=\"{Binding #textBox.Paste}\" IsEnabled=\"{Binding #textBox.CanPaste}\" Glyph=\"{x:Static mxi:Basic.Paste}\" Category=\"Edit\"/>\n                        </mxb:Toolbar>\n                        \n                        <mxb:Toolbar x:Name=\"FontToolbar\" ToolbarName=\"Font\" ShowCustomizationButton=\"False\">\n                            <mxb:ToolbarCheckItem Header=\"Bold\" IsChecked=\"{Binding #textBox.FontWeight, Converter={helpers:BoolToFontWeightConverter}, Mode=TwoWay}\" Glyph=\"{x:Static mxi:Basic.Font_Bold}\" Category=\"Font\"/>\n                            <mxb:ToolbarCheckItem Header=\"Italic\" IsChecked=\"{Binding #textBox.FontStyle, Converter={helpers:BoolToFontStyleConverter}, Mode=TwoWay}\" Glyph=\"{x:Static mxi:Basic.Font_Italic}\" Category=\"Font\"/>\n                            <!--Does not work with TextBox-->\n\n                            <mxb:ToolbarEditorItem Header=\"Font Color:\" Category=\"Font\" EditorWidth=\"150\" EditorValue=\"{Binding #textBox.Foreground, Converter={helpers:ColorToBrushConverter}, Mode=TwoWay}\">\n                                <mxb:ToolbarEditorItem.EditorProperties>\n                                    <mxe:PopupColorEditorProperties />\n                                </mxb:ToolbarEditorItem.EditorProperties>\n                            </mxb:ToolbarEditorItem>\n\n                            <mxb:ToolbarEditorItem Header=\"Font:\" EditorWidth=\"150\" Category=\"Font\" EditorValue=\"{Binding #textBox.FontFamily, Converter={helpers:FontNameToFontFamilyConverter}, Mode=TwoWay}\">\n                                <mxb:ToolbarEditorItem.EditorProperties>\n                                    <mxe:ComboBoxEditorProperties ItemsSource=\"{Binding $parent[view:ToolbarAndMenuPageView].Fonts}\"/>\n                                </mxb:ToolbarEditorItem.EditorProperties>\n                            </mxb:ToolbarEditorItem>\n\n                            <mxb:ToolbarEditorItem Header=\"Font Size:\" EditorWidth=\"75\" Category=\"Font\" EditorValue=\"{Binding #textBox.FontSize, Mode=TwoWay}\">\n                                <mxb:ToolbarEditorItem.EditorProperties>\n                                    <mxe:ComboBoxEditorProperties ItemsSource=\"{Binding $parent[view:ToolbarAndMenuPageView].FontSizes}\"/>\n                                </mxb:ToolbarEditorItem.EditorProperties>\n                            </mxb:ToolbarEditorItem>\n                        </mxb:Toolbar>\n                    </mxb:ToolbarContainerControl>\n                    <mxb:ToolbarContainerControl DockType=\"Left\" Grid.Row=\"1\"/>\n                    <helpers:ScaleDecorator x:Name=\"scaleDecorator\" Grid.Row=\"1\" Grid.Column=\"1\">\n                        <TextBox x:Name=\"textBox\" Text=\"{Binding Text}\" AcceptsReturn=\"True\" CornerRadius=\"0\" FontFamily=\"Arial\" FontSize=\"20\" helpers:TextBoxHelper.IsEnabled=\"True\"/>\n                    </helpers:ScaleDecorator>\n                    <mxb:ToolbarContainerControl DockType=\"Right\" Grid.Row=\"1\" Grid.Column=\"2\"/>\n                    <mxb:ToolbarContainerControl Grid.Row=\"2\" Grid.ColumnSpan=\"3\" DockType=\"Bottom\">\n                        <mxb:Toolbar DisplayMode=\"StatusBar\" ToolbarName=\"Status Bar\" x:Name=\"StatusBar\" ShowCustomizationButton=\"False\">\n                            <mxb:ToolbarButtonItem \n                                                  DisplayMode=\"Glyph\" Command=\"{Binding ToggleSyncCommand}\"\n                                                  Header=\"{Binding SyncText}\">\n                                <mxb:ToolbarButtonItem.GlyphTemplate>\n                                    <DataTemplate>\n                                        <mx:CircleProgressIndicator Value=\"{Binding $parent[mxb:ToolbarButtonItem].DataContext.SyncProgress}\" \n                                                                        IsAnimated=\"{Binding $parent[mxb:ToolbarButtonItem].DataContext.IsSyncing}\"\n                                                                        Thickness=\"1\"\n                                                                        Foreground=\"{DynamicResource Fill/Accent/Primary/Enabled}\"/>\n                                    </DataTemplate>\n                                </mxb:ToolbarButtonItem.GlyphTemplate>\n                            </mxb:ToolbarButtonItem>\n                            <mxb:ToolbarCheckItem ShowSeparator=\"True\"\n                                                  Header=\"Auto Sync Enabled\"\n                                                  CheckBoxStyle=\"CheckBox\"\n                                                  IsChecked=\"{Binding AutoSyncEnabled}\"/>\n                            <mxb:ToolbarTextItem Alignment=\"Far\" ShowSeparator=\"True\" ShowBorder=\"False\" Category=\"Info\" CustomizationName=\"Position Info\">\n                                <mxb:ToolbarTextItem.Header>\n                                    <MultiBinding Converter=\"{helpers:LineAndColumnToTextConverter}\">\n                                        <Binding ElementName=\"textBox\" Path=\"(helpers:TextBoxHelper.Line)\"/>\n                                        <Binding ElementName=\"textBox\" Path=\"(helpers:TextBoxHelper.Column)\"/>\n                                    </MultiBinding>\n                                </mxb:ToolbarTextItem.Header>\n                            </mxb:ToolbarTextItem>\n                            <mxb:ToolbarTextItem Header=\"{Binding #scaleDecorator.Scale, StringFormat={}Zoom: {0:P0}}\" ShowBorder=\"False\" Alignment=\"Far\" ShowSeparator=\"True\" Category=\"Info\" CustomizationName=\"Zoom Info\"/>\n                        </mxb:Toolbar>\n                    </mxb:ToolbarContainerControl>\n                </Grid>\n            </mxb:ToolbarManager>\n            \n            <!--Options-->\n            <StackPanel Grid.Column=\"1\">\n                <mxe:GroupBox Grid.Row=\"2\" Header=\"Selected Toolbar\" Classes=\"PropertiesGroup\">\n                    <StackPanel>\n                        <RadioButton x:Name=\"MainMenuSelector\" Classes=\"PropertyEditor\" GroupName=\"G1\" IsChecked=\"True\" Content=\"Main Menu\" IsCheckedChanged=\"OnRadioButtonCheckedChanged\"/>\n                        <RadioButton x:Name=\"FileToolbarSelector\" Classes=\"PropertyEditor\" GroupName=\"G1\" IsCheckedChanged=\"OnRadioButtonCheckedChanged\" Content=\"File Toolbar\"/>\n                        <RadioButton x:Name=\"EditToolbarSelector\" Classes=\"PropertyEditor\" GroupName=\"G1\" IsCheckedChanged=\"OnRadioButtonCheckedChanged\" Content=\"Edit Toolbar\"/>\n                        <RadioButton x:Name=\"FontToolbarSelector\" Classes=\"PropertyEditor\" GroupName=\"G1\" IsCheckedChanged=\"OnRadioButtonCheckedChanged\" Content=\"Font Toolbar\"/>\n                        <RadioButton x:Name=\"StatusBarSelector\" Classes=\"PropertyEditor\" GroupName=\"G1\" IsCheckedChanged=\"OnRadioButtonCheckedChanged\" Content=\"Status Bar\"/>\n                    </StackPanel>\n                </mxe:GroupBox>\n\n                <mxe:GroupBox x:Name=\"PropertiesSelector\" Header=\"Selected toolbar properties\" Classes=\"PropertiesGroup\">\n                    <StackPanel>\n                        <mxe:CheckEditor x:Name=\"IsVisibleSelector\" Content=\"Is Visible\" IsChecked=\"{Binding IsVisible, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                        <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Enabled\" IsChecked=\"{Binding IsEnabled, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                        <mxe:CheckEditor x:Name=\"AllowDragToolbarSelector\" Content=\"Allow Drag\" IsChecked=\"{Binding AllowDragToolbar, Mode=TwoWay}\" IsThreeState=\"True\" Classes=\"PropertyEditor\"/>\n                        <mxe:CheckEditor x:Name=\"ShowCustomizationButtonSelector\" Content=\"Show Customization Button\" IsChecked=\"{Binding ShowCustomizationButton, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                        <mxe:CheckEditor x:Name=\"StretchToolbarSelector\" Content=\"Stretch Toolbar\" IsChecked=\"{Binding StretchToolbar, Mode=TwoWay}\" Classes=\"PropertyEditor\">\n                            <mxe:CheckEditor.IsVisible>\n                                <MultiBinding Converter=\"{x:Static BoolConverters.Or}\">\n                                    <Binding ElementName=\"FileToolbarSelector\"\n                                             Path=\"IsChecked\"/>\n                                    <Binding ElementName=\"EditToolbarSelector\"\n                                             Path=\"IsChecked\"/>\n                                </MultiBinding>\n                            </mxe:CheckEditor.IsVisible>\n                        </mxe:CheckEditor>\n                    </StackPanel>\n                </mxe:GroupBox>\n            </StackPanel>\n        </Grid>\n    </Border>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Bars/ToolbarAndMenuPageView.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing Avalonia.Media;\n\nnamespace DemoCenter.Views\n{\n    public partial class ToolbarAndMenuPageView : UserControl\n    {\n        public static readonly AttachedProperty<bool> IsToolbarSelectedProperty =\n            AvaloniaProperty.RegisterAttached<ToolbarAndMenuPageView, AvaloniaObject, bool>(\"IsToolbarSelected\");\n\n        public static bool GetIsToolbarSelected(AvaloniaObject target)\n        {\n            return target.GetValue(IsToolbarSelectedProperty);\n        }\n\n        public static void SetIsToolbarSelected(AvaloniaObject target, bool isToolbarSelected)\n        {\n            target.SetValue(IsToolbarSelectedProperty, isToolbarSelected);\n        }\n\n        IReadOnlyList<string> fonts;\n\n        public IReadOnlyList<string> Fonts =>\n            fonts ?? (fonts = FontManager.Current.SystemFonts.Select(x => x.Name).OrderBy(x => x).ToList());\n\n        public IReadOnlyList<double> FontSizes { get; } = new List<double>()\n            { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72 };\n\n\n\n        public ToolbarAndMenuPageView()\n        {\n            InitializeComponent();\n\n            PropertiesSelector.DataContext = MainMenu;\n        }\n\n        private void OnRadioButtonCheckedChanged(object sender, RoutedEventArgs e)\n        {\n            var source = e.Source as RadioButton;\n\n            if(source.IsChecked != true)\n                return;\n\n            if(PropertiesSelector.DataContext is AvaloniaObject oldToolbar)\n                SetIsToolbarSelected(oldToolbar, false);\n\n            if(source == MainMenuSelector)\n                PropertiesSelector.DataContext = MainMenu;\n            else if(source == FileToolbarSelector)\n                PropertiesSelector.DataContext = FileToolbar;\n            else if(source == EditToolbarSelector)\n                PropertiesSelector.DataContext = EditToolbar;\n            else if(source == FontToolbarSelector)\n                PropertiesSelector.DataContext = FontToolbar;\n            else if(source == StatusBarSelector)\n                PropertiesSelector.DataContext = StatusBar;\n\n            SetIsToolbarSelected((AvaloniaObject)PropertiesSelector.DataContext, true);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianAreaSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianAreaSeriesViewView\"\n             x:DataType=\"vm:CartesianAreaSeriesViewViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianAreaSeriesView Color=\"{Binding Color}\"\n                                                     Transparency=\"{Binding ElementName=SlTransparency, Path=Value}\"\n                                                     ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                     MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                     Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Transparency\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlTransparency\" Minimum=\"0\" Maximum=\"1\" Value=\"0.3\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianAreaSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianAreaSeriesViewView : UserControl\n{\n    public CartesianAreaSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianCandlestickAggregationView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianCandlestickAggregationView\"\n             x:DataType=\"vm:CartesianCandlestickAggregationViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" x:Name=\"DemoControl\">\n            <mxc:CartesianSeries DataAdapter=\"{Binding StockData}\" SeriesName=\"Price\">\n                <mxc:CartesianCandlestickSeriesView Color=\"#00787A\" ReductionColor=\"#BD1436\" />\n            </mxc:CartesianSeries>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\">\n                    <mxc:AxisX.ScaleOptions>\n                        <mxc:DateTimeScaleOptions MeasureUnit=\"{Binding MeasureUnit}\" MeasureUnitFactor=\"{Binding MeasureUnitFactor}\" />\n                    </mxc:AxisX.ScaleOptions>\n                </mxc:AxisX>\n            </mxc:CartesianChart.AxesX>\n            \n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY Title=\"Price\" Position=\"Far\">\n                    <mxc:AxisYRange AlwaysShowZeroLevel=\"False\" />\n                </mxc:AxisY>\n            </mxc:CartesianChart.AxesY>\n            \n            <mxc:CartesianChart.CrosshairOptions>\n                <mxc:CrosshairOptions SeriesLabelMode=\"OneForAllSeries\" />\n            </mxc:CartesianChart.CrosshairOptions>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <RadioButton Command=\"{Binding SetMeasureUnitCommand}\">\n                    15 Minutes\n                    <RadioButton.CommandParameter>\n                        <vm:DateTimeUnitItem Unit=\"Minute\" Factor=\"15\" />\n                    </RadioButton.CommandParameter>\n                </RadioButton>\n                <RadioButton Command=\"{Binding SetMeasureUnitCommand}\">\n                    30 Minutes\n                    <RadioButton.CommandParameter>\n                        <vm:DateTimeUnitItem Unit=\"Minute\" Factor=\"30\" />\n                    </RadioButton.CommandParameter>\n                </RadioButton>\n                <RadioButton Command=\"{Binding SetMeasureUnitCommand}\" IsChecked=\"True\">\n                    1 Hour\n                    <RadioButton.CommandParameter>\n                        <vm:DateTimeUnitItem Unit=\"Hour\" Factor=\"1\" />\n                    </RadioButton.CommandParameter>\n                </RadioButton>\n                <RadioButton Command=\"{Binding SetMeasureUnitCommand}\">\n                    5 Hours\n                    <RadioButton.CommandParameter>\n                        <vm:DateTimeUnitItem Unit=\"Hour\" Factor=\"5\" />\n                    </RadioButton.CommandParameter>\n                </RadioButton>\n                <RadioButton Command=\"{Binding SetMeasureUnitCommand}\">\n                    1 Day\n                    <RadioButton.CommandParameter>\n                        <vm:DateTimeUnitItem Unit=\"Day\" Factor=\"1\" />\n                    </RadioButton.CommandParameter>\n                </RadioButton>\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianCandlestickAggregationView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianCandlestickAggregationView : UserControl\n{\n    public CartesianCandlestickAggregationView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianCandlestickSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianCandlestickSeriesViewView\"\n             x:DataType=\"vm:CartesianCandlestickSeriesViewViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid RowDefinitions=\"Auto *\">\n        <TextBlock Grid.Row=\"0\" Margin=\"12\" HorizontalAlignment=\"Center\" FontSize=\"16\" FontWeight=\"Bold\">Bitcoin Historical Data</TextBlock>\n\n        <mxc:CartesianChart Grid.Row=\"1\" Classes=\"DemoChart\" x:Name=\"DemoControl\">\n            <mxc:CartesianSeries AxisYKey=\"Volume\" DataAdapter=\"{Binding VolumeData}\" SeriesName=\"Volume\">\n                <mxc:CartesianSideBySideBarSeriesView Color=\"#A0A0A0A0\" BorderThickness=\"0\" BarWidth=\"1\" />\n            </mxc:CartesianSeries>\n            <mxc:CartesianSeries AxisYKey=\"Price\" DataAdapter=\"{Binding StockData}\" SeriesName=\"Price\">\n                <mxc:CartesianCandlestickSeriesView Color=\"#00787A\" ReductionColor=\"#BD1436\" />\n            </mxc:CartesianSeries>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\">\n                    <mxc:AxisXRange MinSideMargin=\"0.01\" MaxSideMargin=\"0.01\" />\n                    <mxc:AxisX.ScaleOptions>\n                        <mxc:DateTimeScaleOptions MeasureUnit=\"Day\" />\n                    </mxc:AxisX.ScaleOptions>\n                </mxc:AxisX>\n            </mxc:CartesianChart.AxesX>\n            \n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY Title=\"Price\" Position=\"Far\" Key=\"Price\">\n                    <mxc:AxisYRange AlwaysShowZeroLevel=\"False\" />\n                </mxc:AxisY>\n                <mxc:AxisY Title=\"Volume\" Position=\"Near\" Key=\"Volume\">\n                    <mxc:AxisYRange />\n                </mxc:AxisY>\n            </mxc:CartesianChart.AxesY>\n            \n            <mxc:CartesianChart.CrosshairOptions>\n                <mxc:CrosshairOptions SeriesLabelMode=\"OneForAllSeries\" />\n            </mxc:CartesianChart.CrosshairOptions>\n        </mxc:CartesianChart>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianCandlestickSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianCandlestickSeriesViewView : UserControl\n{\n    public CartesianCandlestickSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartAxesPageView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\r\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\r\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\r\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\r\n             x:Class=\"DemoCenter.Views.CartesianChartAxesPageView\"\r\n             x:DataType=\"vm:CartesianChartAxesPageViewModel\"\r\n             x:CompileBindings=\"True\">\r\n    <Grid ColumnDefinitions=\"* 250\">\r\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" x:Name=\"DemoControl\"\r\n                            SeriesSource=\"{Binding Series}\" AxesXSource=\"{Binding AxesX}\" AxesYSource=\"{Binding AxesY}\">\r\n            <mxc:CartesianChart.SeriesTemplate>\r\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\r\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\" AxisXKey=\"{Binding AxisXKey}\" AxisYKey=\"{Binding AxisYKey}\">\r\n                        <mxc:CartesianAreaSeriesView Color=\"{Binding Color}\" Thickness=\"2\" />\r\n                    </mxc:CartesianSeries>\r\n                </DataTemplate>\r\n            </mxc:CartesianChart.SeriesTemplate>\r\n            \r\n            <mxc:CartesianChart.AxisXTemplate>\r\n                <DataTemplate x:DataType=\"vm:AxisViewModel\">\r\n                    <mxc:AxisX Key=\"{Binding Key}\"\r\n                               Color=\"{Binding Color}\" \r\n                               Position=\"{Binding Position}\"\r\n                               Title=\"{Binding Title}\"\r\n                               ShowTitle=\"{Binding ShowTitle}\"\r\n                               ShowLabels=\"{Binding ShowLabels}\"\r\n                               ShowInterlacing=\"{Binding ShowInterlacing}\"\r\n                               ShowMajorGridlines=\"{Binding ShowMajorGridlines}\"\r\n                               ShowMinorGridlines=\"{Binding ShowMinorGridlines}\"\r\n                               MinorCount=\"{Binding MinorCount}\"\r\n                               Reverse=\"{Binding Reverse} \"/>\r\n                </DataTemplate>\r\n            </mxc:CartesianChart.AxisXTemplate>\r\n            \r\n            <mxc:CartesianChart.AxisYTemplate>\r\n                <DataTemplate x:DataType=\"vm:AxisViewModel\">\r\n                    <mxc:AxisY Key=\"{Binding Key}\"\r\n                               Color=\"{Binding Color}\"\r\n                               Position=\"{Binding Position}\"\r\n                               Title=\"{Binding Title}\"\r\n                               ShowTitle=\"{Binding ShowTitle}\"\r\n                               ShowLabels=\"{Binding ShowLabels}\"\r\n                               ShowInterlacing=\"{Binding ShowInterlacing}\"\r\n                               ShowMajorGridlines=\"{Binding ShowMajorGridlines}\"\r\n                               ShowMinorGridlines=\"{Binding ShowMinorGridlines}\"\r\n                               MinorCount=\"{Binding MinorCount}\"\r\n                               Reverse=\"{Binding Reverse} \"/>\r\n                </DataTemplate>\r\n            </mxc:CartesianChart.AxisYTemplate>\r\n        </mxc:CartesianChart>\r\n\r\n        <StackPanel Grid.Column=\"1\">\r\n            <mxe:GroupBox Header=\"Cartesian Chart\" Classes=\"PropertiesGroup\">\r\n                <mxe:CheckEditor Content=\"Swap Axes\" IsChecked=\"{Binding ElementName=DemoControl, Path=SwapAxes}\" Classes=\"PropertyEditor\"/>\r\n            </mxe:GroupBox>\r\n            <mxe:GroupBox Header=\"Selected Axis\" Classes=\"PropertiesGroup\">\r\n                <mxe:ComboBoxEditor ItemsSource=\"{Binding Axes}\" EditorValue=\"{Binding SelectedAxis}\" Classes=\"PropertyEditor\" Margin=\"0,12,0,0\"/>\r\n            </mxe:GroupBox>\r\n            <mxe:GroupBox Header=\"Properties\"  Classes=\"PropertiesGroup\">\r\n                <StackPanel Orientation=\"Vertical\">\r\n                    <Label Content=\"Position\" Classes=\"TopPropertyLabel\" />\r\n                    <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxc:AxisPosition}\" EditorValue=\"{Binding SelectedAxis.Position}\" Classes=\"PropertyEditor\"/>\r\n\r\n                    <mxe:CheckEditor Content=\"Reverse\" IsChecked=\"{Binding SelectedAxis.Reverse}\" Classes=\"PropertyEditor\"/>\r\n                    <mxe:CheckEditor Content=\"Show Title\" IsChecked=\"{Binding SelectedAxis.ShowTitle}\" Classes=\"PropertyEditor\"/>\r\n                    <mxe:TextEditor IsEnabled=\"{Binding SelectedAxis.ShowTitle}\" EditorValue=\"{Binding SelectedAxis.Title}\" Margin=\"0,8,0,0\" Classes=\"PropertyEditor\"/>\r\n                    <mxe:CheckEditor Content=\"Show Labels\" IsChecked=\"{Binding SelectedAxis.ShowLabels}\" Classes=\"PropertyEditor\"/>\r\n\r\n                    <mxe:CheckEditor Content=\"Show Major Gridlines\" IsChecked=\"{Binding SelectedAxis.ShowMajorGridlines}\" Classes=\"PropertyEditor\"/>\r\n                    <mxe:CheckEditor Content=\"Show Interlacing\" IsEnabled=\"{Binding SelectedAxis.ShowMajorGridlines}\" IsChecked=\"{Binding SelectedAxis.ShowInterlacing}\" Classes=\"PropertyEditor\"/>\r\n                    <mxe:CheckEditor Content=\"Show Minor Gridlines\" IsChecked=\"{Binding SelectedAxis.ShowMinorGridlines}\" Classes=\"PropertyEditor\"/>\r\n                    <Label Content=\"Minor Count\" Classes=\"PropertyLabel\"/>\r\n                    <Slider Minimum=\"0\" Maximum=\"9\" Value=\"{Binding SelectedAxis.MinorCount}\" Margin=\"0,8,0,0\" />\r\n                </StackPanel>\r\n            </mxe:GroupBox>\r\n        </StackPanel>\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartAxesPageView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\r\nusing Eremex.AvaloniaUI.Charts;\r\n\r\nnamespace DemoCenter.Views;\r\n\r\npublic partial class CartesianChartAxesPageView : UserControl\r\n{\r\n    public CartesianChartAxesPageView()\r\n    {\r\n        InitializeComponent();\r\n    }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartLargeDataPageView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\r\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\r\n             x:Class=\"DemoCenter.Views.CartesianChartLargeDataPageView\"\r\n             x:DataType=\"vm:CartesianChartLargeDataPageViewModel\"\r\n>\r\n    <Grid RowDefinitions=\"Auto Auto *\">\r\n        <TextBlock Grid.Row=\"0\" Margin=\"12, 12, 12, 0\" HorizontalAlignment=\"Center\" FontSize=\"16\" FontWeight=\"Bold\">Large data</TextBlock>\r\n        <TextBlock Grid.Row=\"1\" Margin=\"12, 4, 12, 12\" HorizontalAlignment=\"Center\" FontSize=\"14\">2 series with 1 million points each</TextBlock>\r\n        \r\n        <mxc:CartesianChart Grid.Row=\"2\" Classes=\"DemoChartWithNoOptions\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\r\n            <mxc:CartesianChart.SeriesTemplate>\r\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\r\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\r\n                        <mxc:CartesianLineSeriesView Color=\"{Binding Color}\" />\r\n                    </mxc:CartesianSeries>\r\n                </DataTemplate>\r\n            </mxc:CartesianChart.SeriesTemplate>\r\n\r\n            <mxc:CartesianChart.AxesX>\r\n                <mxc:AxisX ShowTitle=\"False\" />\r\n            </mxc:CartesianChart.AxesX>\r\n            <mxc:CartesianChart.AxesY>\r\n                <mxc:AxisY ShowTitle=\"False\" />\r\n            </mxc:CartesianChart.AxesY>\r\n        </mxc:CartesianChart>\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartLargeDataPageView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\r\n\r\nnamespace DemoCenter.Views;\r\n\r\npublic partial class CartesianChartLargeDataPageView : UserControl\r\n{\r\n    public CartesianChartLargeDataPageView()\r\n    {\r\n        InitializeComponent();\r\n    }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartLogarithmicScalePageView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\r\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\r\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\r\n             x:Class=\"DemoCenter.Views.CartesianChartLogarithmicScalePageView\"\r\n             x:DataType=\"vm:CartesianChartLogarithmicScalePageViewModel\"\r\n>\r\n    <Grid ColumnDefinitions=\"* 250\" RowDefinitions=\"Auto *\">\r\n        <TextBlock Grid.Row=\"0\" Grid.Column=\"0\" Margin=\"12\" HorizontalAlignment=\"Center\" FontSize=\"16\" FontWeight=\"Bold\">Raw Frequency Response</TextBlock>\r\n\r\n        <mxc:CartesianChart Grid.Column=\"0\" Grid.Row=\"1\" Classes=\"DemoChartWithNoOptions\" x:Name=\"DemoControl\" SeriesSource=\"{Binding Series}\">\r\n            <mxc:CartesianChart.SeriesTemplate>\r\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\r\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\r\n                        <mxc:CartesianLineSeriesView Color=\"{Binding Color}\" />\r\n                    </mxc:CartesianSeries>\r\n                </DataTemplate>\r\n            </mxc:CartesianChart.SeriesTemplate>\r\n            \r\n            <mxc:CartesianChart.AxesX>\r\n                <mxc:AxisX Title=\"Frequency\">\r\n                    <mxc:AxisX.ScaleOptions>\r\n                        <mxc:NumericScaleOptions LogarithmicBase=\"{Binding AxisX.LogarithmicBase}\"\r\n                                                 LabelFormatter=\"{Binding FrequencyFormatter}\" />\r\n                    </mxc:AxisX.ScaleOptions>\r\n                </mxc:AxisX>\r\n            </mxc:CartesianChart.AxesX>\r\n            <mxc:CartesianChart.AxesY>\r\n                <mxc:AxisY Title=\"Amplitude (dB SPL)\">\r\n                    <mxc:AxisYRange AlwaysShowZeroLevel=\"False\" />\r\n                </mxc:AxisY>\r\n            </mxc:CartesianChart.AxesY>\r\n        </mxc:CartesianChart>\r\n\r\n        <StackPanel Grid.Column=\"1\" Grid.RowSpan=\"2\">\r\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\r\n                <mxe:CheckEditor Content=\"Logarithmic X-Axis\" IsChecked=\"{Binding LogarithmicX}\" Classes=\"PropertyEditor\"/>\r\n            </mxe:GroupBox>\r\n        </StackPanel>\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartLogarithmicScalePageView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\r\n\r\nnamespace DemoCenter.Views;\r\n\r\npublic partial class CartesianChartLogarithmicScalePageView : UserControl\r\n{\r\n    public CartesianChartLogarithmicScalePageView()\r\n    {\r\n        InitializeComponent();\r\n    }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartRealtimePageView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\r\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\r\n             x:Class=\"DemoCenter.Views.CartesianChartRealtimePageView\"\r\n             x:DataType=\"vm:CartesianChartRealtimePageViewModel\"\r\n>\r\n    <Grid RowDefinitions=\"Auto Auto *\">\r\n        <TextBlock Grid.Row=\"0\" Margin=\"12, 12, 12, 0\" HorizontalAlignment=\"Center\" FontSize=\"16\" FontWeight=\"Bold\">Real-Time data</TextBlock>\r\n        <TextBlock Grid.Row=\"1\" Margin=\"12, 4, 12, 12\" HorizontalAlignment=\"Center\" FontSize=\"14\">6 series with 500 points each</TextBlock>\r\n        \r\n        <mxc:CartesianChart Grid.Row=\"2\" Classes=\"DemoChartWithNoOptions\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\r\n            <mxc:CartesianChart.SeriesTemplate>\r\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\r\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\r\n                        <mxc:CartesianLineSeriesView Color=\"{Binding Color}\" />\r\n                    </mxc:CartesianSeries>\r\n                </DataTemplate>\r\n            </mxc:CartesianChart.SeriesTemplate>\r\n            \r\n            <mxc:CartesianChart.AxesX>\r\n                <mxc:AxisX Title=\"Time\" ShowInterlacing=\"False\" ShowMajorGridlines=\"False\" ShowMinorGridlines=\"False\" />\r\n            </mxc:CartesianChart.AxesX>\r\n            <mxc:CartesianChart.AxesY>\r\n                <mxc:AxisY ShowTitle=\"False\" ShowInterlacing=\"False\" ShowMinorGridlines=\"False\" />\r\n            </mxc:CartesianChart.AxesY>\r\n        </mxc:CartesianChart>\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianChartRealtimePageView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\r\nusing Avalonia.Interactivity;\r\nusing DemoCenter.ViewModels;\r\n\r\nnamespace DemoCenter.Views;\r\n\r\npublic partial class CartesianChartRealtimePageView : UserControl\r\n{\r\n    CartesianChartRealtimePageViewModel ViewModel => DataContext as CartesianChartRealtimePageViewModel;\r\n    \r\n    public CartesianChartRealtimePageView()\r\n    {\r\n        InitializeComponent();\r\n    }\r\n    protected override void OnLoaded(RoutedEventArgs e)\r\n    {\r\n        base.OnLoaded(e);\r\n        ViewModel?.Start();\r\n    }\r\n    protected override void OnUnloaded(RoutedEventArgs e)\r\n    {\r\n        base.OnUnloaded(e);\r\n        ViewModel?.Stop();\r\n    }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianEmptyPointsView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Charts;assembly=Eremex.Avalonia.Charts\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianEmptyPointsView\"\n             x:DataType=\"vm:CartesianEmptyPointsViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChartWithNoOptions\" x:Name=\"DemoControl\">\n            <mxc:CartesianSeries SeriesName=\"Series 1\" DataAdapter=\"{Binding DataAdapter}\" View=\"{Binding SelectedView}\" />\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Views\"  Classes=\"PropertiesGroup\">\n            <ListBox ItemsSource=\"{Binding Views}\" SelectedIndex=\"0\" SelectionChanged=\"ViewOnSelectionChanged\">\n                <ItemsControl.ItemTemplate>\n                    <DataTemplate x:DataType=\"vm:ViewViewModel\">\n                        <Label Content=\"{Binding Name}\" FontWeight=\"Bold\" />\n                    </DataTemplate>\n                </ItemsControl.ItemTemplate>\n            </ListBox>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianEmptyPointsView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianEmptyPointsView : UserControl\n{\n    CartesianEmptyPointsViewModel ViewModel => DataContext as CartesianEmptyPointsViewModel;\n    \n    public CartesianEmptyPointsView()\n    {\n        InitializeComponent();\n    }\n    void ViewOnSelectionChanged(object sender, SelectionChangedEventArgs e)\n    {\n        if (ViewModel is not null && sender is ListBox { SelectedItems.Count: > 0 } listBox && listBox.SelectedItems[0] is ViewViewModel viewModel)\n        {\n            ViewModel.SelectedView = viewModel.View;\n            ViewModel.DataAdapter = viewModel.DataAdapter;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianFullStackedAreaSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianFullStackedAreaSeriesViewView\"\n             x:DataType=\"vm:CartesianFullStackedAreaSeriesViewViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianFullStackedAreaSeriesView Color=\"{Binding Color}\"\n                                                                Transparency=\"{Binding ElementName=SlTransparency, Path=Value}\"\n                                                                ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                                MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                                Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\">\n                    <mxc:AxisY.ScaleOptions>\n                        <mxc:NumericScaleOptions>\n                            <mxc:NumericScaleOptions.LabelFormatter>\n                                <mxc:PercentLabelFormatter />\n                            </mxc:NumericScaleOptions.LabelFormatter>\n                            <mxc:NumericScaleOptions.CrosshairLabelFormatter>\n                                <mxc:PercentLabelFormatter />\n                            </mxc:NumericScaleOptions.CrosshairLabelFormatter>\n                        </mxc:NumericScaleOptions>\n                    </mxc:AxisY.ScaleOptions>\n                </mxc:AxisY>\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"1\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Transparency\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlTransparency\" Minimum=\"0\" Maximum=\"1\" Value=\"0.6\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"5\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianFullStackedAreaSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianFullStackedAreaSeriesViewView : UserControl\n{\n    public CartesianFullStackedAreaSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianLineSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianLineSeriesViewView\"\n             x:DataType=\"vm:CartesianLineSeriesViewViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianLineSeriesView Color=\"{Binding Color}\"\n                                                     ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                     MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                     Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <StackPanel Grid.Column=\"1\" Orientation=\"Vertical\">\n            <mxe:GroupBox Header=\"Cartesian Chart\" Classes=\"PropertiesGroup\">\n                <mxe:CheckEditor Content=\"Swap Axes\" IsChecked=\"{Binding ElementName=DemoControl, Path=SwapAxes}\" Classes=\"PropertyEditor\"/>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"Properties\"  Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                    <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                    <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                    <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                    <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianLineSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianLineSeriesViewView : UserControl\n{\n    public CartesianLineSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianLollipopSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Charts;assembly=Eremex.Avalonia.Charts\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianLollipopSeriesViewView\"\n             x:DataType=\"vm:CartesianLollipopSeriesViewViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" x:Name=\"DemoControl\">\n            <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                <mxc:CartesianLollipopSeriesView Color=\"#BD1436\"\n                                                 LineColor=\"#00787A\"\n                                                 LineThickness=\"{Binding LineThickness}\"\n                                                 MarkerSize=\"{Binding MarkerSize}\"\n                                                 LineOrientation=\"{Binding LineOrientation}\"\n                                                 MarkerImageCss=\".base_color{{fill:{0};}}\">\n                    <SvgImage Source=\"avares://DemoCenter/Resources/Svg/Ring.svg\" />\n                </mxc:CartesianLollipopSeriesView>\n            </mxc:CartesianSeries>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n        </mxc:CartesianChart>\n        \n        <StackPanel Grid.Column=\"1\" Orientation=\"Vertical\">\n            <mxe:GroupBox Header=\"Cartesian Chart\" Classes=\"PropertiesGroup\">\n                <mxe:CheckEditor Content=\"Swap Axes\" IsChecked=\"{Binding ElementName=DemoControl, Path=SwapAxes}\" Classes=\"PropertyEditor\"/>\n            </mxe:GroupBox>\n            <mxe:GroupBox  Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                    <Slider Minimum=\"1\" Maximum=\"8\" Value=\"{Binding LineThickness}\" Classes=\"PropertyEditor\" IsSnapToTickEnabled=\"True\" TickFrequency=\"1\" />\n                    <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                    <Slider Minimum=\"10\" Maximum=\"20\" Value=\"{Binding MarkerSize}\" Classes=\"PropertyEditor\" IsSnapToTickEnabled=\"True\" TickFrequency=\"1\" />\n                    <Label Content=\"Line Orientation\" Classes=\"TopPropertyLabel\" />\n                    <mxe:ComboBoxEditor EditorValue=\"{Binding LineOrientation}\" ItemsSource=\"{mx:EnumItemsSource EnumType=mxc:CartesianLollipopOrientation}\" />\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianLollipopSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianLollipopSeriesViewView : UserControl\n{\n    public CartesianLollipopSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianPointSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianPointSeriesViewView\"\n             x:DataType=\"vm:CartesianPointSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianPointSeriesView Color=\"{Binding Color}\" MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"6\" Classes=\"PropertyEditor\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianPointSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianPointSeriesViewView : UserControl\n{\n    public CartesianPointSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianRangeAreaSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianRangeAreaSeriesViewView\"\n             x:DataType=\"vm:CartesianRangeAreaSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" x:Name=\"DemoControl\">\n            <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                <mxc:CartesianRangeAreaSeriesView Color=\"{Binding Color}\"\n                                                  Color1=\"{Binding Color1}\"\n                                                  Color2=\"{Binding Color2}\"\n                                                  Transparency=\"{Binding ElementName=SlTransparency, Path=Value}\"\n                                                  ShowMarkers1=\"{Binding ElementName=CheShowMarkers1, Path=IsChecked}\"\n                                                  ShowMarkers2=\"{Binding ElementName=CheShowMarkers2, Path=IsChecked}\"\n                                                  Marker1Size=\"{Binding ElementName=SlMarkerSize1, Path=Value}\"\n                                                  Marker2Size=\"{Binding ElementName=SlMarkerSize2, Path=Value}\"\n                                                  Thickness1=\"{Binding ElementName=SlLineThickness1, Path=Value}\" \n                                                  Thickness2=\"{Binding ElementName=SlLineThickness2, Path=Value}\" />\n            </mxc:CartesianSeries>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <StackPanel Grid.Column=\"1\" Orientation=\"Vertical\">\n            <mxe:GroupBox Header=\"Cartesian Chart\" Classes=\"PropertiesGroup\">\n                <mxe:CheckEditor Content=\"Swap Axes\" IsChecked=\"{Binding ElementName=DemoControl, Path=SwapAxes}\" Classes=\"PropertyEditor\"/>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"Properties\"  Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <Label Content=\"Transparency\" Classes=\"TopPropertyLabel\" />\n\n                    <Slider x:Name=\"SlTransparency\" Minimum=\"0\" Maximum=\"1\" Value=\"0.3\" Classes=\"PropertyEditor\" />\n                    <Label Content=\"Line 1 Thickness\" Classes=\"TopPropertyLabel\" />\n                    <Slider x:Name=\"SlLineThickness1\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                    <mxe:CheckEditor x:Name=\"CheShowMarkers1\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                    <Label Content=\"Marker 1 Size\" Classes=\"TopPropertyLabel\" />\n                    <Slider x:Name=\"SlMarkerSize1\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers1, Path=IsChecked}\" />\n                \n                    <Label Content=\"Line 2 Thickness\" Classes=\"TopPropertyLabel\" />\n                    <Slider x:Name=\"SlLineThickness2\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                    <mxe:CheckEditor x:Name=\"CheShowMarkers2\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                    <Label Content=\"Marker 1 Size\" Classes=\"TopPropertyLabel\" />\n                    <Slider x:Name=\"SlMarkerSize2\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers2, Path=IsChecked}\" />\n                </StackPanel>\n            </mxe:GroupBox>            \n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianRangeAreaSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianRangeAreaSeriesViewView : UserControl\n{\n    public CartesianRangeAreaSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianScatterLineSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianScatterLineSeriesViewView\"\n             x:DataType=\"vm:CartesianScatterLineSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" x:Name=\"DemoControl\">\n            <mxc:CartesianSeries DataAdapter=\"{Binding Series.DataAdapter}\">\n                <mxc:CartesianScatterLineSeriesView Color=\"{Binding Series.Color}\"\n                                             ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                             MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                             Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" \n                                             MarkerImageCss=\".base_color{{fill:{0};}}\">\n                    <SvgImage Source=\"avares://DemoCenter/Resources/Svg/Ring.svg\" />\n                </mxc:CartesianScatterLineSeriesView>\n            </mxc:CartesianSeries>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianScatterLineSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianScatterLineSeriesViewView : UserControl\n{\n    public CartesianScatterLineSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianSideBySideBarSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianSideBySideBarSeriesViewView\"\n             x:DataType=\"vm:CartesianSideBySideBarSeriesViewViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Classes=\"DemoChartWithNoOptions\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianSideBySideBarSeriesView Color=\"{Binding Color}\" BarWidth=\"0.7\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\">\n                    <mxc:AxisX.ScaleOptions>\n                        <mxc:DateTimeScaleOptions MeasureUnit=\"Day\" />\n                    </mxc:AxisX.ScaleOptions>\n                </mxc:AxisX>\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Cartesian Chart\" Classes=\"PropertiesGroup\">\n            <mxe:CheckEditor Content=\"Swap Axes\" IsChecked=\"{Binding ElementName=DemoControl, Path=SwapAxes}\" Classes=\"PropertyEditor\" VerticalAlignment=\"Top\" />\n        </mxe:GroupBox>        \n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianSideBySideBarSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianSideBySideBarSeriesViewView : UserControl\n{\n    public CartesianSideBySideBarSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianSideBySideRangeBarSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianSideBySideRangeBarSeriesViewView\"\n             x:DataType=\"vm:CartesianSideBySideRangeBarSeriesViewViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Classes=\"DemoChartWithNoOptions\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianSideBySideRangeBarSeriesView Color=\"{Binding Color}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n                \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Cartesian Chart\" Classes=\"PropertiesGroup\">\n            <mxe:CheckEditor Content=\"Swap Axes\" IsChecked=\"{Binding ElementName=DemoControl, Path=SwapAxes}\" Classes=\"PropertyEditor\" VerticalAlignment=\"Top\" />\n        </mxe:GroupBox>        \n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianSideBySideRangeBarSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianSideBySideRangeBarSeriesViewView : UserControl\n{\n    public CartesianSideBySideRangeBarSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStackedAreaSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianStackedAreaSeriesViewView\"\n             x:DataType=\"vm:CartesianStackedAreaSeriesViewViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianStackedAreaSeriesView Color=\"{Binding Color}\"\n                                                            Transparency=\"{Binding ElementName=SlTransparency, Path=Value}\"\n                                                            ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                            MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                            Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"1\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Transparency\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlTransparency\" Minimum=\"0\" Maximum=\"1\" Value=\"0.6\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"5\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStackedAreaSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianStackedAreaSeriesViewView : UserControl\n{\n    public CartesianStackedAreaSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStepAreaSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianStepAreaSeriesViewView\"\n             x:DataType=\"vm:CartesianStepAreaSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianStepAreaSeriesView Color=\"{Binding Color}\"\n                                                         InvertedStep=\"{Binding ElementName=CheInvertedStep, Path=IsChecked}\"\n                                                         Transparency=\"{Binding ElementName=SlTransparency, Path=Value}\"\n                                                         ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                         MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                         Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <mxe:CheckEditor x:Name=\"CheInvertedStep\" Content=\"Inverted Step\" IsChecked=\"False\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Transparency\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlTransparency\" Minimum=\"0\" Maximum=\"1\" Value=\"0.3\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStepAreaSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianStepAreaSeriesViewView : UserControl\n{\n    public CartesianStepAreaSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStepLineSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianStepLineSeriesViewView\"\n             x:DataType=\"vm:CartesianStepLineSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:CartesianChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:CartesianChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:CartesianSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:CartesianStepLineSeriesView Color=\"{Binding Color}\"\n                                                         InvertedStep=\"{Binding ElementName=CheInvertedStep, Path=IsChecked}\"\n                                                         ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                         MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                         Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:CartesianSeries>\n                </DataTemplate>\n            </mxc:CartesianChart.SeriesTemplate>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY ShowTitle=\"False\" />\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <mxe:CheckEditor x:Name=\"CheInvertedStep\" Content=\"Inverted Step\" IsChecked=\"False\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStepLineSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianStepLineSeriesViewView : UserControl\n{\n    public CartesianStepLineSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStripsAndConstantLinesView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.CartesianStripsAndConstantLinesView\"\n             x:DataType=\"vm:CartesianStripsAndConstantLinesViewModel\"\n>\n    <Grid RowDefinitions=\"Auto *\">\n        <TextBlock Grid.Row=\"0\" Margin=\"12, 12, 12, 0\" HorizontalAlignment=\"Center\" FontSize=\"16\" FontWeight=\"Bold\">Temperature Data</TextBlock>\n        \n        <mxc:CartesianChart Grid.Row=\"1\" Classes=\"DemoChartWithNoOptions\" x:Name=\"DemoControl\" ScrollMouseButton=\"Left\" PointerPressed=\"DemoControl_OnPointerPressed\">\n            <mxc:CartesianChart.Series>\n                <mxc:CartesianSeries DataAdapter=\"{Binding Series.DataAdapter}\">\n                    <mxc:CartesianLineSeriesView Color=\"{Binding Series.Color}\" Thickness=\"2\" />\n                </mxc:CartesianSeries>\n            </mxc:CartesianChart.Series>\n\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX ShowTitle=\"False\" ConstantLinesSource=\"{Binding ConstantLines}\">\n                    <mxc:AxisX.ConstantLineTemplate>\n                        <DataTemplate x:DataType=\"vm:ConstantLineViewModel\">\n                            <mxc:ConstantLine Color=\"#BD1436\" Title=\"{Binding Title}\" AxisValue=\"{Binding AxisValue}\" />\n                        </DataTemplate>\n                    </mxc:AxisX.ConstantLineTemplate>\n                </mxc:AxisX>\n            </mxc:CartesianChart.AxesX>\n            \n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY Title=\"t(°C)\" TitlePosition=\"WithLabels\">\n                    <mxc:AxisYRange AlwaysShowZeroLevel=\"False\" />\n                    <mxc:AxisY.ConstantLines>\n                        <mxc:ConstantLine Title=\"Overheat 85°C\" AxisValue=\"85\" Color=\"#BD1436\" />\n                    </mxc:AxisY.ConstantLines>\n                    <mxc:AxisY.Strips>\n                        <mxc:Strip AxisValue1=\"40\" AxisValue2=\"65\" Color=\"#4043C927\" />\n                    </mxc:AxisY.Strips>\n                </mxc:AxisY>\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/CartesianStripsAndConstantLinesView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views;\n\npublic partial class CartesianStripsAndConstantLinesView : UserControl\n{\n    CartesianStripsAndConstantLinesViewModel ViewModel => DataContext as CartesianStripsAndConstantLinesViewModel;\n    \n    public CartesianStripsAndConstantLinesView()\n    {\n        InitializeComponent();\n    }\n    void DemoControl_OnPointerPressed(object sender, PointerPressedEventArgs e)\n    {\n        var point = e.GetCurrentPoint(DemoControl);\n        if (point.Properties.IsRightButtonPressed && ViewModel is not null)\n        {\n            var coords = DemoControl.ScreenPointToDiagramPoint(point.Position);\n            if (coords.InsideViewport)\n            {\n                object argument = coords.AxesX.First().Value;\n                ViewModel.ConstantLines.Add(new ConstantLineViewModel { AxisValue = argument, Title = argument.ToString() });\n            }\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/HeatmapColorProvidersView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.HeatmapColorProvidersView\"\n             x:DataType=\"vm:HeatmapColorProvidersViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:Heatmap Grid.Column=\"0\" Classes=\"DemoChart\" x:Name=\"DemoControl\"\n                     DataAdapter=\"{Binding DataAdapter}\"\n                     ColorProvider=\"{Binding SelectedColorProvider.ColorProvider}\">\n\n            <mxc:Heatmap.AxisX>\n                <mxc:HeatmapAxisX ShowTitle=\"False\">\n                    <mxc:HeatmapAxisX.ConstantLines>\n                        <mxc:ConstantLine AxisValue=\"{Binding MiddleX}\" ShowTitle=\"False\" Color=\"#A0FFFFFF\" ShowBehind=\"False\" />\n                    </mxc:HeatmapAxisX.ConstantLines>\n                </mxc:HeatmapAxisX>\n            </mxc:Heatmap.AxisX>\n            \n            <mxc:Heatmap.AxisY>\n                <mxc:HeatmapAxisY ShowTitle=\"False\">\n                    <mxc:HeatmapAxisY.ConstantLines>\n                        <mxc:ConstantLine AxisValue=\"{Binding MiddleY}\" ShowTitle=\"False\" Color=\"#A0FFFFFF\" ShowBehind=\"False\" />\n                    </mxc:HeatmapAxisY.ConstantLines>\n                </mxc:HeatmapAxisY>\n            </mxc:Heatmap.AxisY>\n        </mxc:Heatmap>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <ListBox ItemsSource=\"{Binding ColorProviders}\" SelectedItem=\"{Binding SelectedColorProvider}\" Padding=\"8\">\n                <ListBox.ItemTemplate>\n                    <DataTemplate x:DataType=\"vm:HeatmapColorProviderItem\">\n                        <StackPanel Orientation=\"Vertical\" Margin=\"0 8 0 8\">\n                            <TextBlock Text=\"{Binding Name}\" />\n                            <Image Source=\"{Binding PreviewImage}\" HorizontalAlignment=\"Stretch\" />\n                        </StackPanel>\n                    </DataTemplate>\n                </ListBox.ItemTemplate>\n            </ListBox>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/HeatmapColorProvidersView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class HeatmapColorProvidersView : UserControl\n{\n    public HeatmapColorProvidersView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/HeatmapRealTimeView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.HeatmapRealTimeView\"\n             x:DataType=\"vm:HeatmapRealTimeViewModel\"\n             x:CompileBindings=\"True\">\n    <UserControl.Resources>\n        <Thickness x:Key=\"DiagramMargin\">100 8 20 8</Thickness>\n    </UserControl.Resources>\n    <Grid RowDefinitions=\"* 3*\">\n        <mxc:CartesianChart Grid.Row=\"0\" Classes=\"DemoChart\" x:Name=\"Chart\" DiagramMargin=\"{StaticResource DiagramMargin}\"\n                            PointerPressed=\"DemoChart_OnPointerPressed\"\n                            PointerMoved=\"DemoChart_OnPointerMoved\"\n                            PointerReleased=\"DemoChart_OnPointerReleased\">\n            <mxc:CartesianSeries SeriesName=\"Signal\" DataAdapter=\"{Binding SignalAdapter}\">\n                <mxc:CartesianLineSeriesView Color=\"#2D55CE\" Thickness=\"2\" />\n            </mxc:CartesianSeries>\n            <mxc:CartesianChart.CrosshairOptions>\n                <mxc:CrosshairOptions ShowCrosshair=\"False\" />\n            </mxc:CartesianChart.CrosshairOptions>\n            <mxc:CartesianChart.AxesX>\n                <mxc:AxisX x:Name=\"AxisX\" Title=\"Frequency\" EnableZooming=\"False\" EnableScrolling=\"False\">\n                    <mxc:AxisXRange MinSideMargin=\"0\" MaxSideMargin=\"0\" />\n                    <mxc:AxisX.ScaleOptions>\n                        <mxc:QualitativeScaleOptions GridSpacing=\"100\" />\n                    </mxc:AxisX.ScaleOptions>\n                    <mxc:AxisX.ConstantLines>\n                        <mxc:ConstantLine AxisValue=\"{Binding MainFrequency}\" ShowBehind=\"False\" />\n                    </mxc:AxisX.ConstantLines>\n                    <mxc:AxisX.Strips>\n                        <mxc:Strip AxisValue1=\"{Binding BandLeftFrequency}\" AxisValue2=\"{Binding BandRightFrequency}\" ShowBehind=\"False\" Color=\"#55A0A0A0\" />\n                    </mxc:AxisX.Strips>\n                </mxc:AxisX>\n            </mxc:CartesianChart.AxesX>\n            <mxc:CartesianChart.AxesY>\n                <mxc:AxisY Title=\"Amplitude\" EnableZooming=\"False\" EnableScrolling=\"False\">\n                    <mxc:AxisYRange WholeMax=\"0\" WholeMin=\"-50\" AutoCorrectWholeRange=\"False\" />\n                </mxc:AxisY>\n            </mxc:CartesianChart.AxesY>\n        </mxc:CartesianChart>\n\n        <mxc:Heatmap Classes=\"DemoChart\" Grid.Row=\"1\" x:Name=\"DemoControl\" DataAdapter=\"{Binding WaterfallAdapter}\" DiagramMargin=\"{StaticResource DiagramMargin}\"\n                     PointerPressed=\"DemoControl_OnPointerPressed\"\n                     PointerMoved=\"DemoControl_OnPointerMoved\"\n                     PointerReleased=\"DemoControl_OnPointerReleased\">\n            <mxc:HeatmapRangeColorProvider>\n                <mxc:HeatmapRangeStop Value=\"-50\" Color=\"#000026\" />\n                <mxc:HeatmapRangeStop Value=\"-37.5\" Color=\"#2D55CE\" />\n                <mxc:HeatmapRangeStop Value=\"-25\" Color=\"#FFFFFF\" />\n                <mxc:HeatmapRangeStop Value=\"-12.5\" Color=\"#FFEE62\" />\n                <mxc:HeatmapRangeStop Value=\"0\" Color=\"#7A0100\" />\n            </mxc:HeatmapRangeColorProvider>\n            <mxc:Heatmap.AxisX>\n                <mxc:HeatmapAxisX Title=\"Frequency\" EnableZooming=\"False\" EnableScrolling=\"False\">\n                    <mxc:HeatmapAxisX.ScaleOptions>\n                        <mxc:QualitativeScaleOptions GridSpacing=\"100\" />\n                    </mxc:HeatmapAxisX.ScaleOptions>\n                    <mxc:HeatmapAxisX.ConstantLines>\n                        <mxc:ConstantLine AxisValue=\"{Binding MainFrequency}\" ShowBehind=\"False\" />\n                    </mxc:HeatmapAxisX.ConstantLines>\n                    <mxc:HeatmapAxisX.Strips>\n                        <mxc:Strip AxisValue1=\"{Binding BandLeftFrequency}\" AxisValue2=\"{Binding BandRightFrequency}\" ShowBehind=\"False\" Color=\"#55A0A0A0\" />\n                    </mxc:HeatmapAxisX.Strips>\n                </mxc:HeatmapAxisX>\n            </mxc:Heatmap.AxisX>\n            <mxc:Heatmap.AxisY>\n                <mxc:HeatmapAxisY ShowTitle=\"False\" EnableZooming=\"False\" EnableScrolling=\"False\" />\n            </mxc:Heatmap.AxisY>\n            <mxc:Heatmap.CrosshairOptions>\n                <mxc:CrosshairOptions ShowCrosshair=\"False\" />\n            </mxc:Heatmap.CrosshairOptions>\n        </mxc:Heatmap>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/HeatmapRealTimeView.axaml.cs",
    "content": "﻿#nullable enable\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views;\n\npublic partial class HeatmapRealTimeView : UserControl\n{\n    readonly Cursor moveCursor = new(StandardCursorType.SizeWestEast);\n    bool isChartSelected;\n    bool isHeatmapSelected;\n    \n    HeatmapRealTimeViewModel? ViewModel => DataContext as HeatmapRealTimeViewModel;\n    \n    public HeatmapRealTimeView()\n    {\n        InitializeComponent();\n    }\n    protected override void OnLoaded(RoutedEventArgs e)\n    {\n        base.OnLoaded(e);\n        ViewModel?.Start();\n    }\n    protected override void OnUnloaded(RoutedEventArgs e)\n    {\n        base.OnUnloaded(e);\n        ViewModel?.Stop();\n    }\n    void DemoChart_OnPointerPressed(object sender, PointerPressedEventArgs e)\n    {\n        if (Chart.ScreenPointToDiagramPoint(e.GetPosition(Chart)).InsideViewport)\n            isChartSelected = true;\n    }\n    void DemoChart_OnPointerMoved(object sender, PointerEventArgs e)\n    {\n        if (isChartSelected)\n        {\n            Chart.Cursor = moveCursor;\n            var diagramPoint = Chart.ScreenPointToDiagramPoint(e.GetPosition(Chart));\n            if (diagramPoint.AxesX.TryGetValue(AxisX, out var val) && val is string str)\n                ViewModel?.UpdateFrequency(str);\n        }\n    }\n    void DemoChart_OnPointerReleased(object sender, PointerReleasedEventArgs e)\n    {\n        var diagramPoint = Chart.ScreenPointToDiagramPoint(e.GetPosition(Chart));\n        if (diagramPoint.InsideViewport && diagramPoint.AxesX.TryGetValue(AxisX, out var val) && val is string str)\n            ViewModel?.UpdateFrequency(str);\n        isChartSelected = false;\n        Chart.Cursor = null;\n    }\n    void DemoControl_OnPointerPressed(object sender, PointerPressedEventArgs e)\n    {\n        if (DemoControl.ScreenPointToDiagramPoint(e.GetPosition(DemoControl)).InsideViewport)\n            isHeatmapSelected = true;\n    }\n    void DemoControl_OnPointerMoved(object sender, PointerEventArgs e)\n    {\n        if (isHeatmapSelected)\n        {\n            DemoControl.Cursor = moveCursor;\n            var diagramPoint = DemoControl.ScreenPointToDiagramPoint(e.GetPosition(DemoControl));\n            if (diagramPoint.ArgumentX is not null)\n                ViewModel?.UpdateFrequency(diagramPoint.ArgumentX);\n        }\n    }\n    void DemoControl_OnPointerReleased(object sender, PointerReleasedEventArgs e)\n    {\n        var diagramPoint = DemoControl.ScreenPointToDiagramPoint(e.GetPosition(DemoControl));\n        if (diagramPoint is { InsideViewport: true, ArgumentX: not null })\n            ViewModel?.UpdateFrequency(diagramPoint.ArgumentX);\n        isHeatmapSelected = false;\n        DemoControl.Cursor = null;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarAreaSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.PolarAreaSeriesViewView\"\n             x:DataType=\"vm:PolarAreaSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:PolarChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:PolarChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:PolarSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:PolarAreaSeriesView Color=\"{Binding Color}\"\n                                                 Transparency=\"{Binding ElementName=SlTransparency, Path=Value}\"\n                                                 ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                 MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                 Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:PolarSeries>\n                </DataTemplate>\n            </mxc:PolarChart.SeriesTemplate>\n        </mxc:PolarChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Transparency\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlTransparency\" Minimum=\"0\" Maximum=\"1\" Value=\"0.3\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarAreaSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class PolarAreaSeriesViewView : UserControl\n{\n    public PolarAreaSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarEmptyPointsView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Charts;assembly=Eremex.Avalonia.Charts\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.PolarEmptyPointsView\"\n             x:DataType=\"vm:PolarEmptyPointsViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:PolarChart Grid.Column=\"0\" Classes=\"DemoChartWithNoOptions\" x:Name=\"DemoControl\">\n            <mxc:PolarSeries SeriesName=\"Series 1\" DataAdapter=\"{Binding DataAdapter}\" View=\"{Binding SelectedView}\" />\n        </mxc:PolarChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Views\"  Classes=\"PropertiesGroup\">\n            <ListBox ItemsSource=\"{Binding Views}\" SelectedIndex=\"0\" SelectionChanged=\"ViewOnSelectionChanged\">\n                <ItemsControl.ItemTemplate>\n                    <DataTemplate x:DataType=\"vm:ViewViewModel\">\n                        <Label Content=\"{Binding Name}\" FontWeight=\"Bold\" />\n                    </DataTemplate>\n                </ItemsControl.ItemTemplate>\n            </ListBox>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarEmptyPointsView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views;\n\npublic partial class PolarEmptyPointsView : UserControl\n{\n    PolarEmptyPointsViewModel ViewModel => DataContext as PolarEmptyPointsViewModel;\n    \n    public PolarEmptyPointsView()\n    {\n        InitializeComponent();\n    }\n    void ViewOnSelectionChanged(object sender, SelectionChangedEventArgs e)\n    {\n        if (ViewModel is not null && sender is ListBox { SelectedItems.Count: > 0 } listBox && listBox.SelectedItems[0] is ViewViewModel viewModel)\n        {\n            ViewModel.SelectedView = viewModel.View;\n            ViewModel.DataAdapter = viewModel.DataAdapter;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarLineSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.PolarLineSeriesViewView\"\n             x:DataType=\"vm:PolarLineSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:PolarChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:PolarChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:PolarSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:PolarLineSeriesView Color=\"{Binding Color}\"\n                                                 ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                 MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                 Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:PolarSeries>\n                </DataTemplate>\n            </mxc:PolarChart.SeriesTemplate>\n        </mxc:PolarChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarLineSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class PolarLineSeriesViewView : UserControl\n{\n    public PolarLineSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarPointSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.PolarPointSeriesViewView\"\n             x:DataType=\"vm:PolarPointSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:PolarChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:PolarChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:PolarSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:PolarPointSeriesView Color=\"{Binding Color}\" MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                  MarkerImageCss=\".base_color{{fill:{0};}}\">\n                            <SvgImage Source=\"avares://DemoCenter/Resources/Svg/Ring.svg\" />\n                        </mxc:PolarPointSeriesView>\n                    </mxc:PolarSeries>\n                </DataTemplate>\n            </mxc:PolarChart.SeriesTemplate>\n        </mxc:PolarChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"12\" Classes=\"PropertyEditor\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarPointSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class PolarPointSeriesViewView : UserControl\n{\n    public PolarPointSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarRangeAreaSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.PolarRangeAreaSeriesViewView\"\n             x:DataType=\"vm:PolarRangeAreaSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:PolarChart Grid.Column=\"0\" Classes=\"DemoChart\" x:Name=\"DemoControl\">\n            <mxc:PolarSeries DataAdapter=\"{Binding DataAdapter}\">\n                <mxc:PolarRangeAreaSeriesView Color=\"{Binding Color}\"\n                                              Color1=\"{Binding Color1}\"\n                                              Color2=\"{Binding Color2}\"\n                                              Transparency=\"{Binding ElementName=SlTransparency, Path=Value}\"\n                                              ShowMarkers1=\"{Binding ElementName=CheShowMarkers1, Path=IsChecked}\"\n                                              ShowMarkers2=\"{Binding ElementName=CheShowMarkers2, Path=IsChecked}\"\n                                              Marker1Size=\"{Binding ElementName=SlMarkerSize1, Path=Value}\"\n                                              Marker2Size=\"{Binding ElementName=SlMarkerSize2, Path=Value}\"\n                                              Thickness1=\"{Binding ElementName=SlLineThickness1, Path=Value}\"\n                                              Thickness2=\"{Binding ElementName=SlLineThickness2, Path=Value}\" />\n            </mxc:PolarSeries>\n        </mxc:PolarChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Transparency\" Classes=\"TopPropertyLabel\" />\n\n                <Slider x:Name=\"SlTransparency\" Minimum=\"0\" Maximum=\"1\" Value=\"0.3\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Line 1 Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness1\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers1\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker 1 Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize1\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers1, Path=IsChecked}\" />\n                \n                <Label Content=\"Line 2 Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness2\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers2\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker 1 Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize2\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers2, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarRangeAreaSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class PolarRangeAreaSeriesViewView : UserControl\n{\n    public PolarRangeAreaSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarScatterLineSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.PolarScatterLineSeriesViewView\"\n             x:DataType=\"vm:PolarScatterLineSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:PolarChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:PolarChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:PolarSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:PolarScatterLineSeriesView Color=\"{Binding Color}\"\n                                                        ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                        MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                        Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\" />\n                    </mxc:PolarSeries>\n                </DataTemplate>\n            </mxc:PolarChart.SeriesTemplate>\n            \n            <mxc:PolarChart.AxisX>\n                <mxc:PolarAxisX StartAngle=\"-90\" />\n            </mxc:PolarChart.AxisX>\n        </mxc:PolarChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarScatterLineSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class PolarScatterLineSeriesViewView : UserControl\n{\n    public PolarScatterLineSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarStripsAndConstantLinesView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.PolarStripsAndConstantLinesView\"\n             x:DataType=\"vm:PolarStripsAndConstantLinesViewModel\"\n>\n    <Grid RowDefinitions=\"Auto *\" ColumnDefinitions=\"* 250\">\n        <TextBlock Grid.Row=\"0\" Grid.Column=\"0\" Margin=\"12, 12, 12, 0\" HorizontalAlignment=\"Center\" FontSize=\"16\" FontWeight=\"Bold\">Radiation Pattern</TextBlock>\n        \n        <mxc:PolarChart Grid.Row=\"1\" Grid.Column=\"0\" Classes=\"DemoChartWithNoOptions\" x:Name=\"DemoControl\" PointerPressed=\"DemoControl_OnPointerPressed\">\n            <mxc:PolarChart.Series>\n                <mxc:PolarSeries DataAdapter=\"{Binding Series.DataAdapter}\">\n                    <mxc:PolarLineSeriesView Color=\"{Binding Series.Color}\" Thickness=\"2\" />\n                </mxc:PolarSeries>\n            </mxc:PolarChart.Series>\n\n            <mxc:PolarChart.AxisX>\n                <mxc:PolarAxisX x:Name=\"AxisX\"\n                                ConstantLinesSource=\"{Binding ConstantLinesX}\"\n                                StartAngle=\"{Binding ElementName=SlStartAngle, Path=Value}\">\n                    <mxc:PolarAxisX.ConstantLineTemplate>\n                        <DataTemplate x:DataType=\"vm:ConstantLineViewModel\">\n                            <mxc:ConstantLine Color=\"#00787A\" Title=\"{Binding Title}\" AxisValue=\"{Binding AxisValue}\" />\n                        </DataTemplate>\n                    </mxc:PolarAxisX.ConstantLineTemplate>\n                    <mxc:PolarAxisX.Strips>\n                        <mxc:Strip AxisValue1=\"-13\" AxisValue2=\"13\" Color=\"#4043C927\" />\n                    </mxc:PolarAxisX.Strips>\n                </mxc:PolarAxisX>\n            </mxc:PolarChart.AxisX>\n            \n            <mxc:PolarChart.AxisY>\n                <mxc:PolarAxisY ConstantLinesSource=\"{Binding ConstantLinesY}\">\n                    <mxc:PolarAxisY.ConstantLineTemplate>\n                        <DataTemplate x:DataType=\"vm:ConstantLineViewModel\">\n                            <mxc:ConstantLine Color=\"#00787A\" Title=\"{Binding Title}\" AxisValue=\"{Binding AxisValue}\" />\n                        </DataTemplate>\n                    </mxc:PolarAxisY.ConstantLineTemplate>\n                    <mxc:AxisY.Strips>\n                        <mxc:Strip AxisValue1=\"3.6\" AxisValue2=\"15.8\" Color=\"#4043C927\" />\n                    </mxc:AxisY.Strips>\n                </mxc:PolarAxisY>\n            </mxc:PolarChart.AxisY>\n        </mxc:PolarChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Grid.Row=\"0\" Grid.RowSpan=\"2\" Header=\"Properties\" Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Start Angle\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlStartAngle\" Minimum=\"0\" Maximum=\"360\" Value=\"270\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Sweep Direction\" Classes=\"TopPropertyLabel\" />\n                <mxe:ComboBoxEditor EditorValue=\"{Binding ElementName=AxisX, Path=SweepDirection, Mode=TwoWay}\"\n                                    ItemsSource=\"{mx:EnumItemsSource EnumType=SweepDirection}\" />\n                <Button Command=\"{Binding ClearConstantLinesCommand}\" Margin=\"0, 8, 0, 0\" HorizontalAlignment=\"Stretch\">Clear Constant Lines</Button>\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/PolarStripsAndConstantLinesView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views;\n\npublic partial class PolarStripsAndConstantLinesView : UserControl\n{\n    PolarStripsAndConstantLinesViewModel ViewModel => DataContext as PolarStripsAndConstantLinesViewModel;\n    \n    public PolarStripsAndConstantLinesView()\n    {\n        InitializeComponent();\n    }\n    void DemoControl_OnPointerPressed(object sender, PointerPressedEventArgs e)\n    {\n        if(ViewModel is null)\n            return;\n        \n        var point = e.GetCurrentPoint(DemoControl);\n        var coords = DemoControl.ScreenPointToDiagramPoint(point.Position);\n        if (coords.InsideViewport && coords.Argument.HasValue && coords.Value is not null)\n        {\n            if (point.Properties.IsLeftButtonPressed)\n                ViewModel.ConstantLinesX.Add(new ConstantLineViewModel { AxisValue = coords.Argument, Title = coords.Argument.ToString() });\n            if (point.Properties.IsRightButtonPressed)\n                ViewModel.ConstantLinesY.Add(new ConstantLineViewModel { AxisValue = coords.Value, Title = coords.Value.ToString() });\n        }\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/SmithLineSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.SmithLineSeriesViewView\"\n             x:DataType=\"vm:SmithLineSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:SmithChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:SmithChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:SmithSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:SmithScatterLineSeriesView Color=\"{Binding Color}\"\n                                                        ShowMarkers=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\"\n                                                        MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                        Thickness=\"{Binding ElementName=SlLineThickness, Path=Value}\"\n                                                        MarkerImageCss=\".base_color{{fill:{0};}}\">\n                            <SvgImage Source=\"avares://DemoCenter/Resources/Svg/Ring.svg\" />\n                        </mxc:SmithScatterLineSeriesView>\n                    </mxc:SmithSeries>\n                </DataTemplate>\n            </mxc:SmithChart.SeriesTemplate>\n        </mxc:SmithChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Thickness\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlLineThickness\" Minimum=\"1\" Maximum=\"8\" Value=\"2\" Classes=\"PropertyEditor\" />\n                <mxe:CheckEditor x:Name=\"CheShowMarkers\" Content=\"Show Markers\" IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"8\" Classes=\"PropertyEditor\" IsEnabled=\"{Binding ElementName=CheShowMarkers, Path=IsChecked}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/SmithLineSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class SmithPointSeriesViewView : UserControl\n{\n    public SmithPointSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/SmithPointSeriesViewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.SmithPointSeriesViewView\"\n             x:DataType=\"vm:SmithPointSeriesViewViewModel\"\n>\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxc:SmithChart Grid.Column=\"0\" Classes=\"DemoChart\" SeriesSource=\"{Binding Series}\" x:Name=\"DemoControl\">\n            <mxc:SmithChart.SeriesTemplate>\n                <DataTemplate x:DataType=\"vm:SeriesViewModel\">\n                    <mxc:SmithSeries DataAdapter=\"{Binding DataAdapter}\">\n                        <mxc:SmithPointSeriesView Color=\"{Binding Color}\" MarkerSize=\"{Binding ElementName=SlMarkerSize, Path=Value}\"\n                                                  MarkerImageCss=\".base_color{{fill:{0};}}\">\n                            <SvgImage Source=\"avares://DemoCenter/Resources/Svg/Ring.svg\" />\n                        </mxc:SmithPointSeriesView>\n                    </mxc:SmithSeries>\n                </DataTemplate>\n            </mxc:SmithChart.SeriesTemplate>\n        </mxc:SmithChart>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Marker Size\" Classes=\"TopPropertyLabel\" />\n                <Slider x:Name=\"SlMarkerSize\" Minimum=\"4\" Maximum=\"20\" Value=\"12\" Classes=\"PropertyEditor\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Charts/SmithPointSeriesViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class SmithLineSeriesViewView : UserControl\n{\n    public SmithLineSeriesViewView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/CommonControlsGroupView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.CommonControlsGroupView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:CommonControlsGroupViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:CommonControlsGroupViewModel />\n\t</Design.DataContext>\n\n    <TextBlock VerticalAlignment=\"Center\"\n               HorizontalAlignment=\"Center\"\n               FontSize=\"16\"\n               Text=\"See product pages for details.\"/>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/CommonControlsGroupView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class CommonControlsGroupView : UserControl\n    {\n        public CommonControlsGroupView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/MessageBoxPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.MessageBoxPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:internal=\"clr-namespace:Eremex.AvaloniaUI.Controls.Internal;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:CompileBindings=\"True\"\n             x:DataType=\"vm:MessageBoxPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:MessageBoxPageViewModel />\n\t</Design.DataContext>\n\t\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Grid RowDefinitions=\"*\" Margin=\"0,40\">\n\t\t\t<Border HorizontalAlignment=\"Center\"\n\t\t\t        VerticalAlignment=\"Center\"\n\t\t\t        BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\"\n\t\t\t        BorderThickness=\"1\"\n\t\t\t        CornerRadius=\"8\">\n\t\t\t\t<mxe:GroupBox Header=\"{Binding Title}\"\n\t\t\t\t              Classes=\"PropertiesGroup\">\n\t\t\t\t\t<mxe:GroupBox.Styles>\n\t\t\t\t\t\t<Style Selector=\"mxe|GroupBox.PropertiesGroup/template/ContentPresenter#PART_HeaderPresenter\">\n\t\t\t\t\t\t\t<Setter Property=\"FontWeight\" Value=\"Normal\"></Setter>\n\t\t\t\t\t\t</Style>\n\t\t\t\t\t</mxe:GroupBox.Styles>\n\t\t\t\t\t<internal:MessageWindowPresenter Text=\"{Binding Text}\"\n\t\t\t\t\t                                 MessageIcon=\"{Binding Icon}\"\n\t\t\t\t\t                                 Buttons=\"{Binding Buttons}\"\n\t\t\t\t\t                                 ButtonAlignment=\"{Binding ButtonAlignment}\"\n\t\t\t\t\t                                 DefaultButton=\"{Binding Result}\"/>\n\t\t\t\t</mxe:GroupBox>\n\t\t\t</Border>\n\t\t</Grid>\n\t\t<!--Options-->\n        <Border Grid.Column=\"1\" BorderThickness=\"1,0,0,0\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n            <StackPanel>\n               <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                    <Grid RowDefinitions=\"Auto Auto Auto Auto Auto Auto Auto Auto Auto Auto Auto Auto Auto\"\n                          ColumnDefinitions=\"3* *\">\n                        <Label Grid.Row=\"0\"\n                               Content=\"Title\"\n                               Classes=\"TopPropertyLabel\"/>                        \n                        <mxe:TextEditor Grid.Row=\"1\"\n                                            EditorValue=\"{Binding Title, Mode=TwoWay}\"\n                                            Classes=\"PropertyEditor\" />\n                        <Label Grid.Row=\"2\"\n                               Content=\"Text\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:TextEditor Grid.Row=\"3\"\n                                            EditorValue=\"{Binding Text, Mode=TwoWay}\"\n                                            Classes=\"PropertyEditor\" />\n\n                        <Label Grid.Row=\"4\"\n                               Content=\"Icon\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"5\"\n                                            EditorValue=\"{Binding Icon, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mx:MessageBoxIcon}\"\n                                            Classes=\"PropertyEditor\" />\n                        <Label Grid.Row=\"6\"\n                               Content=\"Buttons\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"7\"\n                                            EditorValue=\"{Binding Buttons, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mx:MessageBoxButtons}\"\n                                            Classes=\"PropertyEditor\" />\n                        <Label Grid.Row=\"8\"\n                               Content=\"Button Alignment\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"9\"\n                                            EditorValue=\"{Binding ButtonAlignment, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=HorizontalAlignment}\"\n                                            Classes=\"PropertyEditor\" />\n                        <Label Grid.Row=\"10\"\n                               Content=\"Default Button\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"11\"\n                                            EditorValue=\"{Binding Result, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mx:MessageBoxResult}\"\n                                            Classes=\"PropertyEditor\" />\n                        <Button Grid.Row=\"12\"\n                                Classes=\"LayoutItem\"\n                                Content=\"Show MessageBox\"\n                                Click=\"Button_OnClick\"\n                                HorizontalAlignment=\"Center\"/>\n                    </Grid>\n                </mxe:GroupBox> \n            </StackPanel>            \n        </Border>\n\t</Grid>\n</UserControl>"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/MessageBoxPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing Avalonia.Platform;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class MessageBoxPageView : UserControl\n    {\n        public MessageBoxPageView()\n        {\n            InitializeComponent();\n        }\n\n        private void Button_OnClick(object sender, RoutedEventArgs e)\n        {\n            var viewModel = (MessageBoxPageViewModel)DataContext;\n            var res = MxMessageBox.Show(null, viewModel.Text, viewModel.Title, viewModel.Buttons, viewModel.Icon, viewModel.Result, \n                configure: msgBox =>\n                {\n                    msgBox.ButtonAlignment = viewModel.ButtonAlignment;\n                });\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/SplitContainerControlPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.SplitContainerControlPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:demoData=\"clr-namespace:DemoCenter.DemoData\"\n             xmlns:mxlv=\"https://schemas.eremexcontrols.net/avalonia/listview\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:SplitContainerControlPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:SplitContainerControlPageViewModel />\n    </Design.DataContext>\n\n    <UserControl.Styles>\n        <Style Selector=\"mxe|SplitContainerControl\">\n            <Setter Property=\"BorderThickness\" Value=\"{StaticResource EditorBorderThickness}\" />\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource Outline/Neutral/Transparent/Medium}\" />\n        </Style>\n    </UserControl.Styles>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\" VerticalContentAlignment=\"Stretch\"\n                        HorizontalContentAlignment=\"Stretch\">\n            <mxe:SplitContainerControl Margin=\"16\"\n                                       IsCollapsed=\"{Binding IsChecked, ElementName=IsCollapsedSelector}\"\n                                       IsSplitterVisible=\"{Binding IsChecked, ElementName=IsSplitterVisibleSelector}\"\n                                       CollapsePanel=\"{Binding EditorValue, ElementName=CollapsePanelComboBox}\"\n                                       Orientation=\"{Binding EditorValue, ElementName=OrientationComboBox}\"\n                                       CornerRadius=\"0\"\n                                       Panel2MinLength=\"280\"\n                                       Panel2Length=\"280\">\n                <mxe:SplitContainerControl.Panel1>\n                    <mxdg:DataGridControl ItemsSource=\"{Binding Cars}\" AllowEditing=\"False\" ShowGroupPanel=\"False\">\n                        <mxdg:GridColumn FieldName=\"Trademark\" Width=\"3*\" />\n                        <mxdg:GridColumn FieldName=\"TransmissionType\" Width=\"3*\" />\n                        <mxdg:GridColumn FieldName=\"MPG\" Width=\"*\" />\n                        <mxdg:GridColumn FieldName=\"HP\" Width=\"*\" />\n                        <mxdg:GridColumn FieldName=\"Description\" Width=\"300\" MinWidth=\"200\" MaxWidth=\"400\"\n                                         AllowColumnFiltering=\"False\">\n                            <mxdg:GridColumn.EditorProperties>\n                                <mxe:TextEditorProperties TextWrapping=\"Wrap\" />\n                            </mxdg:GridColumn.EditorProperties>\n                        </mxdg:GridColumn>\n                        <mxdg:GridColumn FieldName=\"Price\" Width=\"2*\">\n                            <mxdg:GridColumn.EditorProperties>\n                                <mxe:TextEditorProperties DisplayFormatString=\"c\" />\n                            </mxdg:GridColumn.EditorProperties>\n                        </mxdg:GridColumn>\n                    </mxdg:DataGridControl>\n                </mxe:SplitContainerControl.Panel1>\n                <mxe:SplitContainerControl.Panel2>\n                    <mxlv:ListViewControl ItemsSource=\"{Binding Cars}\">\n                        <mxlv:ListViewControl.ItemTemplate>\n                            <DataTemplate DataType=\"demoData:CarInfo\">\n                                <Border>\n                                    <Image Source=\"{Binding Image}\" Width=\"256\" Height=\"256\" />\n                                </Border>\n                            </DataTemplate>\n                        </mxlv:ListViewControl.ItemTemplate>\n                    </mxlv:ListViewControl>\n                </mxe:SplitContainerControl.Panel2>\n            </mxe:SplitContainerControl>\n        </ContentControl>\n\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto Auto Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"IsCollapsedSelector\" Content=\"IsCollapsed\" Classes=\"PropertyEditor\" />\n                    <mxe:CheckEditor Grid.Row=\"1\" x:Name=\"IsSplitterVisibleSelector\" Content=\"Is Splitter Visible\"\n                                     IsChecked=\"True\" Classes=\"PropertyEditor\" />\n                    <Label Grid.Row=\"2\" Content=\"Collapsed Panel\" Classes=\"PropertyLabel\" />\n                    <mxe:ComboBoxEditor Grid.Row=\"3\"\n                                        ItemsSource=\"{mx:EnumItemsSource EnumType=mxe:SplitContainerControlCollapsePanel}\"\n                                        Classes=\"PropertyEditor\"\n                                        x:Name=\"CollapsePanelComboBox\"\n                                        EditorValue=\"{x:Static mxe:SplitContainerControlCollapsePanel.Panel2}\" />\n                    <Label Grid.Row=\"4\" Content=\"Orientation\" Classes=\"PropertyLabel\" />\n                    <mxe:ComboBoxEditor Grid.Row=\"5\" ItemsSource=\"{mx:EnumItemsSource EnumType=Orientation}\"\n                                        Classes=\"PropertyEditor\"\n                                        x:Name=\"OrientationComboBox\"\n                                        EditorValue=\"{x:Static Orientation.Horizontal}\" />\n                </Grid>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/SplitContainerControlPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class SplitContainerControlPageView : UserControl\n    {\n        public SplitContainerControlPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/TabControlPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.TabControlPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             xmlns:demoData=\"clr-namespace:DemoCenter.DemoData\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:CompileBindings=\"True\"\n             x:DataType=\"vm:TabControlPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:TabControlPageViewModel />\n\t</Design.DataContext>\n\t\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Grid RowDefinitions=\"*\" Margin=\"0,40\">\n\t\t\t<mx:MxTabControl ItemsSource=\"{Binding Cars}\"\n\t\t\t                 TabStripPlacement=\"{Binding Placement}\"\n\t\t\t                 TabStripLayoutType=\"{Binding LayoutType}\"\n\t\t\t                 TabHeaderOrientation=\"{Binding HeaderOrientation}\"\n\t\t\t                 TabDragMode=\"{Binding DragMode}\"\n\t\t\t                 CloseButtonShowMode=\"{Binding CloseButtonShowMode}\"\n\t\t\t                 NewButtonShowMode=\"{Binding NewButtonShowMode}\"\n\t\t\t                 NewCommand=\"{Binding NewCommand}\"\n\t\t\t                 SelectedItem=\"{Binding SelectedCar}\"\n\t\t\t                 IsTabPanelVisible=\"{Binding IsTabPanelVisible}\"\n                             Margin=\"8\" \n                             CornerRadius=\"6\"\n\t\t\t                 x:Name=\"TabControl\">\n\t\t\t\t<mx:MxTabControl.Styles>\n\t\t\t\t\t<Style Selector=\"mx|MxTabItem\">\n\t\t\t\t\t\t<Setter Property=\"CloseCommand\"\n\t\t\t\t\t\t        Value=\"{Binding #TabControl.((vm:TabControlPageViewModel)DataContext).CloseCommand, FallbackValue={x:Null}}\">\n\t\t\t\t\t\t</Setter>\n\t\t\t\t\t\t<Setter Property=\"CloseCommandParameter\" Value=\"{Binding}\"></Setter>\n\t\t\t\t\t</Style>\n\t\t\t\t</mx:MxTabControl.Styles>\n\t\t\t\t<mx:MxTabControl.ItemTemplate>\n\t\t\t\t\t<DataTemplate DataType=\"demoData:CarInfo\">\n\t\t\t\t\t\t<TextBlock Text=\"{Binding Trademark}\"></TextBlock>\n\t\t\t\t\t</DataTemplate>\n\t\t\t\t</mx:MxTabControl.ItemTemplate>\n\t\t\t\t<mx:MxTabControl.ContentTemplate>\n\t\t\t\t\t<DataTemplate DataType=\"demoData:CarInfo\">\n\t\t\t\t\t\t<Grid ColumnDefinitions=\"* Auto\">\n\t\t\t\t\t\t\t<Grid RowDefinitions=\"Auto Auto Auto Auto Auto Auto Auto\"\n\t\t\t\t\t\t\t      ColumnDefinitions=\"Auto *\">\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<Label Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t       Grid.Column=\"0\"\n\t\t\t\t\t\t\t\t       Grid.Row=\"0\"\n\t\t\t\t\t\t\t\t       Content=\"Trademark\"/>\n\t\t\t\t\t\t\t\t<mxe:TextEditor Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t                Grid.Column=\"1\"\n\t\t\t\t\t\t\t\t                Grid.Row=\"0\"\n\t\t\t\t\t\t\t\t                EditorValue=\"{Binding Trademark}\"/>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<Label Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t       Grid.Column=\"0\"\n\t\t\t\t\t\t\t\t       Grid.Row=\"1\"\n\t\t\t\t\t\t\t\t       Content=\"Transmission Speed Count\"/>\n\t\t\t\t\t\t\t\t<mxe:SpinEditor Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t                Grid.Column=\"1\"\n\t\t\t\t\t\t\t\t                Grid.Row=\"1\"\n\t\t\t\t\t\t\t\t                EditorValue=\"{Binding  TransmissionSpeedCount}\"\n\t\t\t\t\t\t\t\t                Minimum=\"2\"/>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<Label Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t       Grid.Column=\"0\"\n\t\t\t\t\t\t\t\t       Grid.Row=\"2\"\n\t\t\t\t\t\t\t\t       Content=\"Transmission Type\"/>\n\t\t\t\t\t\t\t\t<mxe:TextEditor Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t                Grid.Column=\"1\"\n\t\t\t\t\t\t\t\t                Grid.Row=\"2\"\n\t\t\t\t\t\t\t\t                EditorValue=\"{Binding  TransmissionType}\"/>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<Label Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t       Grid.Column=\"0\"\n\t\t\t\t\t\t\t\t       Grid.Row=\"3\"\n\t\t\t\t\t\t\t\t       Content=\"MPG\"></Label>\n\t\t\t\t\t\t\t\t<mxe:SpinEditor Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t                Grid.Column=\"1\"\n\t\t\t\t\t\t\t\t                Grid.Row=\"3\"\n\t\t\t\t\t\t\t\t                EditorValue=\"{Binding  MPG}\"\n\t\t\t\t\t\t\t\t                Minimum=\"0\"/>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<Label Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t       Grid.Column=\"0\"\n\t\t\t\t\t\t\t\t       Grid.Row=\"4\"\n\t\t\t\t\t\t\t\t       Content=\"Description\"/>\n\t\t\t\t\t\t\t\t<mxe:TextEditor Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t                Grid.Column=\"1\"\n\t\t\t\t\t\t\t\t                Grid.Row=\"4\"\n\t\t\t\t\t\t\t\t                \n\t\t\t\t\t\t\t\t                TextBlock.TextWrapping=\"Wrap\"\n\t\t\t\t\t\t\t\t                EditorValue=\"{Binding  Description}\"></mxe:TextEditor>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<Label Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t       Grid.Column=\"0\"\n\t\t\t\t\t\t\t\t       Grid.Row=\"5\"\n\t\t\t\t\t\t\t\t       Content=\"Price\"/>\n\t\t\t\t\t\t\t\t<mxe:SpinEditor Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t                Grid.Column=\"1\"\n\t\t\t\t\t\t\t\t                Grid.Row=\"5\"\n\t\t\t\t\t\t\t\t                EditorValue=\"{Binding  Price}\" Suffix=\"{Binding Currency}\"\n\t\t\t\t\t\t\t\t                Minimum=\"0\"/>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<Label Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t       Grid.Column=\"0\"\n\t\t\t\t\t\t\t\t       Grid.Row=\"6\"\n\t\t\t\t\t\t\t\t       Content=\"Is In Stock\"/>\n\t\t\t\t\t\t\t\t<mxe:CheckEditor Classes=\"LayoutItem\"\n\t\t\t\t\t\t\t\t                 Grid.Column=\"1\"\n\t\t\t\t\t\t\t\t                 Grid.Row=\"6\"\n\t\t\t\t\t\t\t\t                 EditorValue=\"{Binding  IsInStock}\"></mxe:CheckEditor>\n\t\t\t\t\t\t\t</Grid>\n\n\n\t\t\t\t\t\t\t<Image Grid.Column=\"1\"\n\t\t\t\t\t\t\t       Width=\"256\"\n\t\t\t\t\t\t\t       Margin=\"3\"\n\t\t\t\t\t\t\t       Source=\"{Binding Image}\"\n\t\t\t\t\t\t\t       VerticalAlignment=\"Top\">\n\t\t\t\t\t\t\t</Image>\n\t\t\t\t\t\t</Grid>\n\t\t\t\t\t</DataTemplate>\n\t\t\t\t</mx:MxTabControl.ContentTemplate>\n\t\t\t</mx:MxTabControl>\n\t\t</Grid>\n\t\t<!--Options-->\n        <Border Grid.Column=\"1\" BorderThickness=\"1,0,0,0\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n            <StackPanel>\n                <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                    <Grid RowDefinitions=\"Auto Auto Auto Auto Auto Auto Auto Auto Auto\"\n                          ColumnDefinitions=\"3* *\">\n                        <Label Grid.Row=\"0\"\n                               Content=\"Layout Type\"\n                               Classes=\"TopPropertyLabel\"/>                        \n                        <mxe:ComboBoxEditor Grid.Row=\"1\"\n                                            EditorValue=\"{Binding LayoutType, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mx:TabStripLayoutType}\"\n                                            Classes=\"PropertyEditor\" />\n                        <Label Grid.Row=\"2\"\n                               Content=\"Tab Placement\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"3\"\n                                            EditorValue=\"{Binding Placement, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=Dock}\"\n                                            Classes=\"PropertyEditor\" />\n\n                        <Label Grid.Row=\"4\"\n                               Content=\"Tab Orientation\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"5\"\n                                            EditorValue=\"{Binding HeaderOrientation, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mx:TabHeaderOrientation}\"\n                                            Classes=\"PropertyEditor\" />\n                        <mxe:CheckEditor Grid.Row=\"6\"\n                                         Content=\"Is Tab Panel Visible\"\n                                         EditorValue=\"{Binding IsTabPanelVisible, Mode=TwoWay}\"\n                                         Classes=\"PropertyEditor\" />\n                        <Label Grid.Row=\"7\"\n                               Content=\"Tab Drag Mode\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"8\"\n                                            EditorValue=\"{Binding DragMode, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mx:TabDragMode}\"\n                                            Classes=\"PropertyEditor\" />\n                    </Grid>\n                </mxe:GroupBox>\n                <mxe:GroupBox ShowHeader=\"False\" Classes=\"PropertiesGroup\">\n                    <Grid RowDefinitions=\"Auto Auto Auto Auto\"\n                          ColumnDefinitions=\"3* *\">\n                        <Label Grid.Row=\"0\"\n                               Content=\"Close Button Show Mode\" Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"1\"\n                                            EditorValue=\"{Binding CloseButtonShowMode, Mode=TwoWay}\"\n                                            ItemsSource=\"{Binding CloseButtonShowModes}\"\n                                            Classes=\"PropertyEditor\" />\n\n                        <Label Grid.Row=\"2\"\n                               Content=\"New Button Show Mode\"\n                               Classes=\"PropertyLabel\" />\n                        <mxe:ComboBoxEditor Grid.Row=\"3\"\n                                            EditorValue=\"{Binding NewButtonShowMode, Mode=TwoWay}\"\n                                            ItemsSource=\"{mx:EnumItemsSource EnumType=mx:TabControlNewButtonShowMode}\"\n                                            Classes=\"PropertyEditor\" />\n                    </Grid>\n                </mxe:GroupBox>\n            </StackPanel>            \n        </Border>\n\t</Grid>\n</UserControl>"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/CommonControls/TabControlPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class TabControlPageView : UserControl\n    {\n        public TabControlPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Converters/EnumRadioButtonConverter.cs",
    "content": "﻿using System.Collections;\nusing System.ComponentModel;\nusing System.Globalization;\nusing System.Xml;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Threading;\nusing AvaloniaEdit.Highlighting;\nusing DemoCenter.Helpers;\nusing DemoCenter.ProductsData;\nusing DemoCenter.ViewModels;\n\nusing Eremex.AvaloniaUI.Controls.TreeList;\nusing Eremex.AvaloniaUI.Themes;\n\nnamespace DemoCenter.Views;\n\npublic class EnumRadioButtonConverter : IValueConverter\n{\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        var currentValue = Enum.Parse(value.GetType(), (string)parameter);\n        return value.Equals(currentValue);\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        var currentValue = Enum.Parse(targetType, (string)parameter);\n        return (bool)value ? currentValue : BindingOperations.DoNothing;\n    }\n}\n\npublic class NullValueConverter : IValueConverter\n{\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (value == null)\n            return targetType.IsValueType ? Activator.CreateInstance(targetType) : null;\n        return DefaultValueConverter.Instance.Convert(value, targetType, parameter, culture);\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        throw new NotImplementedException();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridColumnBandsView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:views=\"using:DemoCenter.Views\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridColumnBandsView\">\n    <UserControl.Resources>\n        <views:NullValueConverter x:Key=\"nullValueConverter\"/>\n        <DataTemplate x:Key=\"quarterTemplate\">\n            <mxe:TextEditor x:Name=\"PART_Editor\" HorizontalContentAlignment=\"Right\" DisplayFormatString=\"c\"\n                            Background=\"{Binding Value, Converter={views:ColumnBandsValueToBackgroundConverter MinValue=15000, MaxValue=95000, MinValueBrush=#4CFFB4B3, MaxValueBrush=#4C79DC8B}}\"/>\n        </DataTemplate>\n        <DataTemplate x:Key=\"yearTotalTemplate\">\n            <mxe:TextEditor x:Name=\"PART_Editor\" HorizontalContentAlignment=\"Right\" DisplayFormatString=\"c\" FontWeight=\"Bold\" \n                            Background=\"{Binding Value, Converter={views:ColumnBandsValueToBackgroundConverter MinValue=500000, MaxValue=800000, MinValueBrush=#4CFFB4B3, MaxValueBrush=#4C79DC8B}}\"/>\n        </DataTemplate>\n        <DataTemplate x:Key=\"totalTemplate\">\n            <mxe:TextEditor x:Name=\"PART_Editor\" HorizontalContentAlignment=\"Right\" DisplayFormatString=\"c\" FontWeight=\"Bold\"\n                            Background=\"{Binding Value, Converter={views:ColumnBandsValueToBackgroundConverter MinValue=1800000, MaxValue=2200000, MinValueBrush=#4CFFB4B3, MaxValueBrush=#4C79DC8B}}\"/>\n        </DataTemplate>\n    </UserControl.Resources>\n    \n    <mxdg:DataGridControl ItemsSource=\"{Binding Sales}\" BandsSource=\"{Binding Bands}\" AutoGenerateColumns=\"True\" AllowEditing=\"False\"\n\t\t\t\t\t\t  AutoGeneratedColumns=\"DataGridControl_AutoGeneratedColumns\" ShowBandSeparators=\"True\" ShowGroupPanel=\"False\">\n\t\t<mxdg:DataGridControl.Styles>\n\t\t\t<Style Selector=\"mxdg|GridBand\">\n\t\t\t\t<Setter Property=\"BandName\" Value=\"{Binding BandName}\"/>\n\t\t\t\t<Setter Property=\"Header\" Value=\"{Binding Header}\"/>\n\t\t\t\t<Setter Property=\"BandsSource\" Value=\"{Binding Children}\"/>\n\t\t\t\t<Setter Property=\"HeaderHorizontalAlignment\" Value=\"Center\"/>\n\t\t\t</Style>\n\t\t</mxdg:DataGridControl.Styles>\n\t</mxdg:DataGridControl>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridColumnBandsView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.Templates;\nusing Avalonia.Media;\nusing Eremex.AvaloniaUI.Controls.DataControl;\nusing Eremex.AvaloniaUI.Controls.DataGrid;\nusing Eremex.AvaloniaUI.Controls.Editors;\nusing System.Globalization;\n\nnamespace DemoCenter.Views;\n\npublic partial class DataGridColumnBandsView : UserControl\n{\n    public DataGridColumnBandsView()\n    {\n        InitializeComponent();\n    }\n\n    void DataGridControl_AutoGeneratedColumns(object sender, EventArgs e)\n    {\n        var dataGrid = (DataGridControl)sender;\n        foreach (var column in dataGrid.Columns)\n        {\n            int separatorIndex = column.FieldName.LastIndexOf(\"/\");\n            if (separatorIndex == -1)\n            {\n                if(column.FieldName == \"Total\")\n                {\n                    column.FixedMode = FixedMode.Right;\n                    column.CellTemplate = (DataTemplate)Resources[\"totalTemplate\"];\n                }\n                else\n                {\n                    column.FixedMode = FixedMode.Left;\n                }   \n                continue;\n            }\n\n            column.BandName = column.FieldName.Substring(0, separatorIndex);\n            column.Header = column.FieldName.Substring(separatorIndex + 1);\n\n            if (column.FieldName.Contains(\"Total\"))\n            {\n                column.CellTemplate = (DataTemplate)Resources[\"yearTotalTemplate\"];\n            }\n            else\n            {\n                column.CellTemplate = (DataTemplate)Resources[\"quarterTemplate\"];\n            }\n            column.EditorProperties = new TextEditorProperties() { DisplayFormatString = \"c\" };\n        }\n    }\n}\n\npublic class ColumnBandsValueToBackgroundConverter : MarkupExtension, IValueConverter\n{\n    public int MinValue { get; set; }\n\n    public int MaxValue { get; set; }\n\n    public IBrush MinValueBrush { get; set; }\n\n    public IBrush MaxValueBrush { get; set; }\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (value is decimal result)\n        {\n            if (result < MinValue)\n                return MinValueBrush;\n            else if (result > MaxValue)\n                return MaxValueBrush;\n        }\n        return Brushes.Transparent;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        throw new NotImplementedException();\n    }\n\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n\n\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridDataEditorsView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:data=\"clr-namespace:DemoCenter.DemoData\"\n\t\t\t xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n\t\t\t xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n\t\t\t xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n\t\t\t mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridDataEditorsView\">\n    \n    <Grid ColumnDefinitions=\"*, 250\">\n\t    <Border x:Name=\"DemoControl\">\n\t\t\t<mxdg:DataGridControl x:Name=\"dataGrid\" ItemsSource=\"{Binding Employees}\" BorderThickness=\"0,0,1,0\">\n\t\t\t<mxdg:GridColumn FieldName=\"FirstName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"LastName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"HireDate\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:DateEditorProperties/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"Experience\" Width=\"80\" MinWidth=\"80\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:SpinEditorProperties Increment=\"0.5\"/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"Position\" Width=\"*\" MinWidth=\"150\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:ComboBoxEditorProperties ItemsSource=\"{Binding Source={x:Static data:EmployeesData.Positions}}\" IsTextEditable=\"False\"/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"EmploymentType\" Width=\"*\" MinWidth=\"150\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:ComboBoxEditorProperties ItemsSource=\"{mx:EnumItemsSource EnumType=data:EmploymentType}\"/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"BirthDate\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:DateEditorProperties/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"Married\" Width=\"80\" MinWidth=\"80\"/>\n        </mxdg:DataGridControl>\n\t    </Border>\n\n        <Border Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor Content=\"Allow Editing\" IsChecked=\"{Binding #dataGrid.AllowEditing}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"1\" Content=\"Editor Show Mode\" DockPanel.Dock=\"Top\" Classes=\"PropertyLabel\" IsEnabled=\"{Binding #dataGrid.AllowEditing}\"/>\n                    <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:EditorShowMode}\"\n                                        EditorValue=\"{Binding #dataGrid.EditorShowMode}\"\n                                        IsEnabled=\"{Binding #dataGrid.AllowEditing}\"\n                                        Grid.Row=\"2\"\n                                        Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"3\" Content=\"Editor Button Show Mode\" IsEnabled=\"{Binding #dataGrid.AllowEditing}\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:EditorButtonShowMode}\"\n                                        EditorValue=\"{Binding #dataGrid.EditorButtonShowMode}\"\n                                        IsEnabled=\"{Binding #dataGrid.AllowEditing}\"\n                                        Grid.Row=\"4\"\n                                        Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>\n        </Border>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridDataEditorsView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridDataEditorsView : UserControl\n    {\n        public DataGridDataEditorsView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridDragDropPageView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n\t\t\t xmlns:mxdcv=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl.Visuals;assembly=Eremex.Avalonia.Controls\"\n\t\t\t xmlns:mxdgv=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataGrid.Visuals;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n\t\t\t xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n\t\t\t xmlns:data=\"clr-namespace:DemoCenter.DemoData\"\n\t\t\t xmlns:view=\"using:DemoCenter.Views\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridDragDropPageView\">\n\n\t<Grid ColumnDefinitions=\"*, 20, 20, *\" RowDefinitions=\"Auto, *\">\n\t\t<Grid.Resources>\n\t\t\t<view:SmallQuantityToVisibilityConverter x:Key=\"quantityToVisibilityConverter\" />\n\t\t\t<view:SmallQuantityToColorConverter x:Key=\"quantityToColorConverter\" />\n\t\t\t<DataTemplate x:Key=\"quantityTemplate\">\n\t\t\t\t<Grid ColumnDefinitions=\"Auto, *\" Margin=\"8,0\">\n\t\t\t\t\t<Border ToolTip.Tip=\"Small quantity\" IsVisible=\"{Binding Value, Converter={StaticResource quantityToVisibilityConverter}}\" VerticalAlignment=\"Center\">\n\t\t\t\t\t\t<Image Source=\"{x:Static mxi:Basic.Warning}\" />\n\t\t\t\t\t</Border>\n\t\t\t\t\t<TextBlock Grid.Column=\"1\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Center\" Text=\"{Binding Value}\"/>\n\t\t\t\t</Grid>\n\t\t\t</DataTemplate>\n\t\t</Grid.Resources>\n\t\t<Grid.Styles>\n\t\t\t<Style Selector=\"Label\">\n\t\t\t\t<Setter Property=\"FontWeight\" Value=\"Bold\" />\n\t\t\t\t<Setter Property=\"FontSize\" Value=\"16\" />\n\t\t\t\t<Setter Property=\"Margin\" Value=\"0,12,0,0\" />\t\t\t\n\t\t\t</Style>\n\t\t\t<Style Selector=\"mxdg|DataGridControl\">\n\t\t\t\t<Setter Property=\"Margin\" Value=\"16\" />\n\t\t\t\t<Setter Property=\"BorderThickness\" Value=\"1\" />\n\t\t\t\t<Setter Property=\"SelectionMode\" Value=\"Multiple\" />\n\t\t\t\t<Setter Property=\"NavigationMode\" Value=\"Row\" />\n\t\t\t\t<Setter Property=\"AllowDragDrop\" Value=\"True\" /> \n\t\t\t\t<Setter Property=\"AllowDragDropSortedRows\" Value=\"True\" />\n\t\t\t\t<Setter Property=\"AutoExpandAllGroups\" Value=\"True\" />\n\t\t\t</Style>\n\t\t\t<Style Selector=\"mxdgv|DataGridRowControl\">\n\t\t\t\t<Setter Property=\"Background\">\n\t\t\t\t\t<Setter.Value>\n\t\t\t\t\t\t<MultiBinding Converter=\"{StaticResource quantityToColorConverter}\">\n\t\t\t\t\t\t\t<MultiBinding.Bindings>\n\t\t\t\t\t\t\t\t<Binding Path=\"Quantity\" />\n\t\t\t\t\t\t\t\t<DynamicResourceExtension ResourceKey=\"TransparentBrush\"/>\n\t\t\t\t\t\t\t\t<DynamicResourceExtension ResourceKey=\"Icons/Fill/Yellow\"/>\n\t\t\t\t\t\t\t</MultiBinding.Bindings>\n\t\t\t\t\t\t</MultiBinding>\n\t\t\t\t\t</Setter.Value>\n\t\t\t\t</Setter>\n\t\t\t</Style>\n\t\t</Grid.Styles>\n\t\t<Label Content=\"In warehouse\" HorizontalAlignment=\"Center\" />\n\t\t<mxdg:DataGridControl x:Name=\"productsInWarehouseGrid\"\n\t\t\t\t\t\t\t  Grid.Row=\"1\"\n\t\t\t\t\t\t\t  GroupCount=\"1\"\n\t\t\t\t\t\t\t  ItemsSource=\"{Binding ProductsInWarehouse}\">\n\t\t\t<mxdg:GridColumn FieldName=\"Id\" Width=\"50\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Name\" Width=\"*\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Color\" Width=\"*\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Size\" Width=\"70\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Category\" Width=\"*\" SortDirection=\"Descending\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Cost\" Width=\"70\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Quantity\" Width=\"70\" CellTemplate=\"{StaticResource quantityTemplate}\" />\n\t\t</mxdg:DataGridControl>\n\t\t\n\t\t<Image Source=\"{x:Static mxi:_12.Chevron_Left}\" Grid.Column=\"1\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Grid.RowSpan=\"2\" />\n\t\t<Image Source=\"{x:Static mxi:_12.Chevron_Right}\" Grid.Column=\"2\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Grid.RowSpan=\"2\"/>\n\n\t\t<Label Content=\"In stock\" Grid.Column=\"3\" HorizontalAlignment=\"Center\"/>\n\t\t<mxdg:DataGridControl x:Name=\"productsInStockGrid\"\n\t\t\t\t\t\t  Grid.Column=\"3\"\n\t\t\t\t\t\t  Grid.Row=\"1\"\n\t\t\t\t\t\t  GroupCount=\"1\"\n\t\t\t\t\t\t  ItemsSource=\"{Binding ProductsInStock}\">\n\t\t\t<mxdg:GridColumn FieldName=\"Id\" Width=\"50\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Name\" Width=\"*\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Color\" Width=\"*\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Size\" Width=\"70\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Category\" Width=\"*\" SortDirection=\"Descending\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Cost\" Width=\"70\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Quantity\" Width=\"70\" CellTemplate=\"{StaticResource quantityTemplate}\" />\n\t\t</mxdg:DataGridControl>\n\t</Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridDragDropPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing Avalonia.Media;\nusing DemoCenter.DemoData.CsvClasses;\nusing Eremex.AvaloniaUI.Controls.DataControl;\nusing Eremex.AvaloniaUI.Controls.DataGrid;\nusing System.Globalization;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridDragDropPageView : UserControl\n    {\n        public DataGridDragDropPageView()\n        {\n            InitializeComponent();            \n        }        \n    }\n\n    public class SmallQuantityToVisibilityConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value != null && (int)value < 15)\n                return true;\n            return false;\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n\n    public class SmallQuantityToColorConverter : IMultiValueConverter\n    {\n        public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (values.Count != 3)\n                return Brushes.Transparent;\n\n            if (values[0] is int quantity && quantity < 15 && values[2] is SolidColorBrush brush)\n            {\n                return new SolidColorBrush(brush.Color, 0.3);\n            }\n            return values[1];\n        } \n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridExportView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:data=\"clr-namespace:DemoCenter.DemoData\"\n\t\t\t xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n\t\t\t xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n\t\t\t xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n\t\t\t xmlns:viewModels=\"using:DemoCenter.ViewModels\"\n\t\t\t xmlns:exports=\"using:Eremex.DocumentProcessing.Exports\"\n\t\t\t xmlns:views=\"using:DemoCenter.Views\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n\t\t\t mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridExportView\">\n\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Border x:Name=\"DemoControl\">\n\t\t\t<mxdg:DataGridControl x:Name=\"dataGrid\" ItemsSource=\"{Binding ApparelProducts}\" AllowEditing=\"False\" GroupCount=\"1\" AutoExpandAllGroups=\"True\" BorderThickness=\"0,0,1,0\">\n\t\t\t\t\n\t\t\t\t<mxdg:DataGridControl.Bands>\n\t\t\t\t\t<mxdg:GridBand BandName=\"BasicInformation\" Header=\"Basic Information\" />\n\t\t\t\t\t<mxdg:GridBand BandName=\"Appearance\"/>\n\t\t\t\t\t<mxdg:GridBand BandName=\"PricingAndStock\" Header=\"Pricing &amp; Stock\"/>\n\t\t\t\t\t<mxdg:GridBand BandName=\"AdditionalInformation\" Header=\"Additional Information\"/>\n\t\t\t\t</mxdg:DataGridControl.Bands>\n\n\t\t\t\t<mxdg:GridColumn FieldName=\"Name\" Width=\"200\" BandName=\"BasicInformation\" />\n\t\t\t\t<mxdg:GridColumn FieldName=\"Brand\" Width=\"2*\" SortIndex=\"0\" BandName=\"BasicInformation\"/>\n\t\t\t\t<mxdg:GridColumn FieldName=\"SubCategory\" Width=\"3*\" Header=\"Category\" BandName=\"BasicInformation\"/>\n\t\t\t\t<mxdg:GridColumn FieldName=\"Style\" Width=\"2*\" BandName=\"Appearance\" />\n\t\t\t\t<mxdg:GridColumn FieldName=\"Size\" Width=\"Auto\" BandName=\"Appearance\"/>\n\t\t\t\t<mxdg:GridColumn FieldName=\"Color\" Width=\"2*\" BandName=\"Appearance\"/>\n\t\t\t\t<mxdg:GridColumn FieldName=\"Price\" Width=\"2*\" BandName=\"PricingAndStock\">\n\t\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"c\" />\n\t\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t\t</mxdg:GridColumn>\n\t\t\t\t<mxdg:GridColumn FieldName=\"Stock\" Width=\"2*\" BandName=\"PricingAndStock\"/>\n\t\t\t\t<mxdg:GridColumn FieldName=\"ReleaseDate\" Width=\"3*\" BandName=\"AdditionalInformation\"/>\n\t\t\t\t<mxdg:GridColumn FieldName=\"IsBestSeller\" Header=\"Best Seller\" Width=\"Auto\" BandName=\"AdditionalInformation\"/>\n\t\t\t\t\n\t\t\t</mxdg:DataGridControl>\n\t\t</Border>\n\n\t\t<Border Grid.Column=\"1\">\n\t\t\t<StackPanel>\n\t\t\t\t<mxe:GroupBox Header=\"Xlsx Export Properties\" Classes=\"PropertiesGroup\">\n\t\t\t\t\t<Grid RowDefinitions=\"Auto, Auto, Auto\">\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Column Headers\" IsChecked=\"{Binding XlsExportColumnHeaders}\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Band Headers\" IsChecked=\"{Binding XlsExportBandHeaders}\" Classes=\"PropertyEditor\" Grid.Row=\"1\"/>\n\t\t\t\t\t\t<Button Content=\"Export\" Margin=\"0,8,0,0\" Command=\"{Binding ExportCommand}\" CommandParameter=\"{x:Static viewModels:ExportType.Xlsx}\" HorizontalAlignment=\"Stretch\" Grid.Row=\"2\" />\n\t\t\t\t\t</Grid>\n\t\t\t\t</mxe:GroupBox>\n\n\t\t\t\t<mxe:GroupBox Header=\"Pdf/Image Export Properties\" Classes=\"PropertiesGroup\">\n\t\t\t\t\t<Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto, Auto, Auto\">\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Column Headers\" IsChecked=\"{Binding PdfExportColumnHeaders}\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Band Headers\" IsChecked=\"{Binding PdfExportBandHeaders}\" Classes=\"PropertyEditor\" Grid.Row=\"1\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Fit To Page Width\" IsChecked=\"{Binding FitToPageWidth}\" Classes=\"PropertyEditor\" Grid.Row=\"2\"/>\n\t\t\t\t\t\t<Label Content=\"Page Orientation\" Margin=\"0,8,0,0\" FontWeight=\"SemiBold\" Grid.Row=\"3\"/>\n\t\t\t\t\t\t<StackPanel Margin=\"16,0,0,0\" Grid.Row=\"4\">\n\t\t\t\t\t\t\t<RadioButton Content=\"Landscape\" IsChecked=\"{Binding Landscape}\" GroupName=\"G1\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t\t<RadioButton Content=\"Portrait\" IsChecked=\"{Binding !Landscape}\" GroupName=\"G1\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t</StackPanel>\n\t\t\t\t\t\t<Button Content=\"Export To Pdf\" Margin=\"0,8,0,0\" Command=\"{Binding ExportCommand}\" CommandParameter=\"{x:Static viewModels:ExportType.Pdf}\" HorizontalAlignment=\"Stretch\" Grid.Row=\"5\" />\n\t\t\t\t\t\t<mx:MxSplitButton Content=\"Export To Image\" Margin=\"0,8,0,0\" Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Jpeg}\" HorizontalAlignment=\"Stretch\" Grid.Row=\"6\">\n\t\t\t\t\t\t\t<mx:MxSplitButton.DropDownControl>\n\t\t\t\t\t\t\t\t<mxb:PopupMenu>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Jpeg\" Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Jpeg}\"/>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Png\" Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Png}\"/>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Svg\" Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Svg}\"/>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Webp\" Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Webp}\"/>\n\t\t\t\t\t\t\t\t</mxb:PopupMenu>\n\t\t\t\t\t\t\t</mx:MxSplitButton.DropDownControl>\n\t\t\t\t\t\t</mx:MxSplitButton>\n\t\t\t\t\t</Grid>\n\t\t\t\t</mxe:GroupBox>\n\t\t\t</StackPanel>\n\t\t</Border>\n\t</Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridExportView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing DemoCenter.Helpers;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.DataControl;\nusing Eremex.DocumentProcessing.Exports;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridExportView : UserControl\n    {\n        public DataGridExportView()\n        {\n            InitializeComponent();\n        }\n\n        private DataGridExportViewModel ViewModel { get; set; }\n\n        protected override void OnDataContextChanged(EventArgs e)\n        {\n            base.OnDataContextChanged(e);\n\n            if (ViewModel != null)\n            {\n                ViewModel.RequestExport -= OnRequestExport;\n                ViewModel.RequestExportImage -= OnRequestExportImage;\n            }\n\n            ViewModel = (DataGridExportViewModel)DataContext;\n            if (ViewModel != null)\n            {\n                ViewModel.RequestExport += OnRequestExport;\n                ViewModel.RequestExportImage += OnRequestExportImage;\n            }\n        }\n\n        private void OnRequestExport(ExportType type)\n        {\n            if (type == ExportType.Xlsx)\n            {\n                var options = new XlsxExportOptions() { ShowColumnHeaders = ViewModel.XlsExportColumnHeaders, ShowBands = ViewModel.XlsExportBandHeaders };\n                DemoExportHelper.Export(dataGrid, options, (stream, control, options) => control.ExportToXlsx(stream, options));\n            } \n            else if(type == ExportType.Pdf)\n            {\n                var options = CreateExportOptions<PageExportOptions>();\n                DemoExportHelper.Export(dataGrid, options, (stream, control, options) => control.ExportToPdf(stream, options));\n            }\n        }\n\n        private void OnRequestExportImage(MxImageFormat format)\n        {\n            var options = CreateExportOptions<ImageExportOptions>();\n            options.Format = format;\n            DemoExportHelper.ExportImage(dataGrid, options, (control, options, dir, fileFormat) => control.ExportToImages(dir, fileFormat, options));\n        }\n\n        private T CreateExportOptions<T>() where T : PageExportOptions\n        {\n            var options = Activator.CreateInstance<T>();\n            options.ShowColumnHeaders = ViewModel.PageExportColumnHeaders;\n            options.ShowBands = ViewModel.PageExportBandHeaders;\n            options.FitToPageWidth = ViewModel.FitToPageWidth;\n            options.Landscape = ViewModel.Landscape;\n            return options;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridFilteringView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n\t\t\t xmlns:data=\"clr-namespace:DemoCenter.DemoData\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridFilteringView\">\n    \n    <Grid ColumnDefinitions=\"*, 250\">\n        <mxdg:DataGridControl x:Name=\"dataGrid\" ItemsSource=\"{Binding Employees}\" ShowGroupPanel=\"False\" AllowEditing=\"False\" SearchPanelDisplayMode=\"HotKey\"\n                              BorderThickness=\"1,0\" IsSearchPanelVisible=\"True\" ShowAutoFilterRow=\"True\" ShowConditionInAutoFilterRow=\"True\" ColumnFilterButtonDisplayMode=\"Always\" ColumnFilterPopupMode=\"CheckedList\">\n\t\t\t<mxdg:GridColumn FieldName=\"FirstName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"LastName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"HireDate\" Header=\"Hire Date\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:DateEditorProperties/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"Experience\" Width=\"110\" MinWidth=\"90\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:SpinEditorProperties Increment=\"0.5\" Minimum=\"0\"/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"Position\" Width=\"*\" MinWidth=\"100\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:ComboBoxEditorProperties ItemsSource=\"{Binding Source={x:Static data:EmployeesData.Positions}}\" />\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"EmploymentType\" Width=\"*\" MinWidth=\"150\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:ComboBoxEditorProperties ItemsSource=\"{mx:EnumItemsSource EnumType=data:EmploymentType}\"/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"City\" Width=\"*\" MinWidth=\"100\" />\n\t\t\t<mxdg:GridColumn FieldName=\"BirthDate\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:DateEditorProperties/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n        </mxdg:DataGridControl>\n\n        <Border Grid.Column=\"1\" BorderThickness=\"0,0,1,0\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n            <StackPanel>\n                <mxe:GroupBox Header=\"Filter Properties\" VerticalAlignment=\"Top\" Classes=\"PropertiesGroup\">\n                    <StackPanel>\n                        <mxe:CheckEditor Content=\"Allow Column Filtering\" IsChecked=\"{Binding #dataGrid.AllowColumnFiltering}\" Classes=\"LayoutItem\"/>\n                        <DockPanel IsEnabled=\"{Binding #dataGrid.AllowColumnFiltering}\">\n                            <Label Content=\"Column Filter Popup Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:FilterPopupMode}\"\n                                                EditorValue=\"{Binding #dataGrid.ColumnFilterPopupMode}\"\n                                                DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <Label Content=\"Column Filter Icon Display Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:ColumnFilterButtonDisplayMode}\"\n                                                EditorValue=\"{Binding #dataGrid.ColumnFilterButtonDisplayMode}\"\n                                                Classes=\"LayoutItem\"/>\n                        </DockPanel>\n                        <mxe:CheckEditor Content=\"Show Auto Filter Row\" IsChecked=\"{Binding #dataGrid.ShowAutoFilterRow}\" Classes=\"LayoutItem\" Margin=\"6,6,6,0\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Show Condition In Auto Filter Row\" IsChecked=\"{Binding #dataGrid.ShowConditionInAutoFilterRow}\" Classes=\"LayoutItem\" Margin=\"6,6,6,0\"/>\n                        <DockPanel>\n                            <Label Content=\"Filter Panel Display Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:FilterPanelDisplayMode}\"\n                                                EditorValue=\"{Binding #dataGrid.FilterPanelDisplayMode}\"\n                                                Classes=\"LayoutItem\"/>\n                        </DockPanel>\n                    </StackPanel>\n                </mxe:GroupBox>\n\n                <mxe:GroupBox Header=\"Search Properties\" VerticalAlignment=\"Top\" Classes=\"PropertiesGroup\">\n                    <StackPanel>\n                        <mxe:CheckEditor Content=\"Highlight Search Results\" IsChecked=\"{Binding #dataGrid.SearchPanelHighlightResults}\" Classes=\"LayoutItem\"/>\n                        <DockPanel>\n                            <Label Content=\"Search Panel Display Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:SearchPanelDisplayMode}\"\n                                                EditorValue=\"{Binding #dataGrid.SearchPanelDisplayMode}\"\n                                                Classes=\"LayoutItem\"/>\n                        </DockPanel>\n                    </StackPanel>\n                </mxe:GroupBox>\n            </StackPanel>\n        </Border>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridFilteringView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Eremex.AvaloniaUI.Controls.DataGrid;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridFilteringView : UserControl\n    {\n        public DataGridFilteringView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridFixedColumnsView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:data=\"clr-namespace:DemoCenter.DemoData\"\n\t\t\t xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n\t\t\t xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:views=\"using:DemoCenter.Views\"\n\t\t\t mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridFixedColumnsView\">\n    \n    <Grid ColumnDefinitions=\"*, 250\">\n\t    <Border x:Name=\"DemoControl\">\n            <mxdg:DataGridControl x:Name=\"dataGrid\" ItemsSource=\"{Binding Employees}\" ShowColumnMenuFixedItem=\"True\" BorderThickness=\"0,0,1,0\">\n                <mxdg:DataGridControl.Styles>\n                    <Style Selector=\"mxdg|DataGridControl /template/ ScrollViewer#PART_ScrollViewer\">\n                        <Setter Property=\"AllowAutoHide\" Value=\"{Binding AutoHideScrollbars}\"/>\n                    </Style>\n                </mxdg:DataGridControl.Styles>\n                \n                <mxdg:GridColumn FieldName=\"FirstName\" FixedMode=\"Left\"/>\n                <mxdg:GridColumn FieldName=\"LastName\" FixedMode=\"Left\"/>\n                <mxdg:GridColumn FieldName=\"BirthDate\" Width=\"200\"/>\n                <mxdg:GridColumn FieldName=\"HireDate\" Width=\"200\"/>\n                <mxdg:GridColumn FieldName=\"Experience\"/>\n                <mxdg:GridColumn FieldName=\"Position\" Width=\"200\">\n                    <mxdg:GridColumn.EditorProperties>\n                        <mxe:ComboBoxEditorProperties ItemsSource=\"{Binding Source={x:Static data:EmployeesData.Positions}}\" IsTextEditable=\"False\"/>\n                    </mxdg:GridColumn.EditorProperties>\n                </mxdg:GridColumn>\n                <mxdg:GridColumn FieldName=\"EmploymentType\" Width=\"200\"/>\n                <mxdg:GridColumn FieldName=\"Married\"/>\n                <mxdg:GridColumn FieldName=\"City\" Width=\"200\"/>\n                <mxdg:GridColumn FieldName=\"Phone\" FixedMode=\"Right\"/>\n            </mxdg:DataGridControl>\n\t    </Border>\n\n        <Border Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <StackPanel>\n                    <mxe:CheckEditor Content=\"Allow 'Fixed' Menu for Columns\" IsChecked=\"{Binding #dataGrid.ShowColumnMenuFixedItem}\" Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Fixed Column Separator Width\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"1\" Maximum=\"20\" Value=\"{Binding #dataGrid.FixedColumnSeparatorWidth, Converter={views:SeparatorWidthConverter}}\"/>\n                    <mxe:CheckEditor Content=\"Extend Scrollbar to Fixed Columns\" IsChecked=\"{Binding #dataGrid.ExtendScrollbarToFixedColumns}\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Content=\"Auto Hide Scrollbars\" IsChecked=\"{Binding AutoHideScrollbars}\" Classes=\"PropertyEditor\"/>\n                </StackPanel>\n            </mxe:GroupBox>\n        </Border>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridFixedColumnsView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing System.Globalization;\n\nnamespace DemoCenter.Views;\n\npublic partial class DataGridFixedColumnsView : UserControl\n{\n    public DataGridFixedColumnsView()\n    {\n        InitializeComponent();\n    }\n}\n\npublic class SeparatorWidthConverter : MarkupExtension, IValueConverter\n{\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {   \n        return value;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        return Math.Round((double)value);\n    }\n\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridGroupingPageView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:views=\"using:DemoCenter.Views\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridGroupingPageView\">\n    <UserControl.Resources>\n        <views:NullValueConverter x:Key=\"nullValueConverter\"/>\n        <DataTemplate x:Key=\"quarterTemplate\">\n            <ProgressBar Foreground=\"{DynamicResource Fill/Accent/Highlighting/Item/Pressed}\"\n                         MinWidth=\"0\"\n                         Background=\"Transparent\"\n                         CornerRadius=\"2\"\n                         VerticalAlignment=\"Stretch\"\n                         Margin=\"1\"\n                         Minimum=\"0\" Maximum=\"100\" ShowProgressText=\"True\" Value=\"{Binding Value, Converter={StaticResource nullValueConverter}}\" />\n        </DataTemplate>\n        <DataTemplate x:Key=\"totalTemplate\">\n            <ProgressBar Foreground=\"{DynamicResource Fill/Accent/Highlighting/Text}\"\n                         MinWidth=\"0\"\n                         Background=\"Transparent\"\n                         CornerRadius=\"2\"\n                         VerticalAlignment=\"Stretch\"\n                         Opacity=\"1\"\n                         Margin=\"1\"\n                         Minimum=\"0\" Maximum=\"100\" ShowProgressText=\"True\" Value=\"{Binding Value, Converter={StaticResource nullValueConverter}}\" />\n        </DataTemplate>\n    </UserControl.Resources>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <Border x:Name=\"DemoControl\">\n            <mxdg:DataGridControl x:Name=\"dataGrid\" ItemsSource=\"{Binding Sales}\" AutoGenerateColumns=\"True\" AutoExpandAllGroups=\"True\" AllowEditing=\"False\" GroupCount=\"1\" BorderThickness=\"0,0,1,0\">\n                <mxdg:GridColumn FieldName=\"Year\" SortIndex=\"0\" SortDirection=\"Descending\"/>\n                <mxdg:GridColumn FieldName=\"Employee\" SortIndex=\"1\" Width=\"200\"/>\n                <mxdg:GridColumn FieldName=\"Quarter1\" Width=\"*\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n                <mxdg:GridColumn FieldName=\"Quarter2\" Width=\"*\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n                <mxdg:GridColumn FieldName=\"Quarter3\" Width=\"*\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n                <mxdg:GridColumn FieldName=\"Quarter4\" Width=\"*\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n                <mxdg:GridColumn FieldName=\"Total\" Width=\"*\" CellTemplate=\"{StaticResource totalTemplate}\"/>\n            </mxdg:DataGridControl>\n        </Border>\n\n        <Border Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <StackPanel>\n                    <mxe:CheckEditor Content=\"Show Group Panel\" IsChecked=\"{Binding #dataGrid.ShowGroupPanel}\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Content=\"Show Grouped Columns\" IsChecked=\"{Binding #dataGrid.ShowGroupedColumns}\" Classes=\"PropertyEditor\"/>\n                </StackPanel>\n            </mxe:GroupBox>\n        </Border>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridGroupingPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Media;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridGroupingPageView : UserControl\n    {\n        public DataGridGroupingPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridLargeDataView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n\t\t\t xmlns:views=\"using:DemoCenter.Views\"\n\t\t\t mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridLargeDataView\">\n\t<UserControl.Resources>\n\t\t<views:EnumRadioButtonConverter x:Key=\"enumRadioButtonConverter\"/>\n\t</UserControl.Resources>\n\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Border x:Name=\"DemoControl\">\n\t\t\t<mxdg:DataGridControl ItemsSource=\"{Binding Items}\" ColumnsSource=\"{Binding Columns}\" AutoGenerateColumns=\"True\" BorderThickness=\"0,0,1,0\"\n                                  CustomUnboundColumnData=\"DataGridControl_CustomUnboundColumnData\" PropertyChanged=\"DataGridControl_PropertyChanged\">\n                <mxdg:DataGridControl.ColumnTemplate>\n                    <views:DataGridLargeDataViewColumnTemplate/>\n                </mxdg:DataGridControl.ColumnTemplate>\n\t\t\t</mxdg:DataGridControl>\n\t\t</Border>\n\t\t<Border Grid.Column=\"1\">\n\t\t\t<StackPanel>\n\t\t\t\t<mxe:GroupBox Header=\"Item Count\" Classes=\"PropertiesGroup\">\n\t\t\t\t\t<StackPanel>\n\t\t\t\t\t\t<RadioButton Content=\"100 000\" GroupName=\"ItemsCount\" Classes=\"PropertyEditor\"\n\t\t\t\t\t\t\t\t\t IsChecked=\"{Binding SelectedItemsCount, Converter={StaticResource enumRadioButtonConverter}, ConverterParameter=Small}\"/>\n\t\t\t\t\t\t<RadioButton Content=\"500 000\" GroupName=\"ItemsCount\" Classes=\"PropertyEditor\"\n\t\t\t\t\t\t\t\t\t IsChecked=\"{Binding SelectedItemsCount, Converter={StaticResource enumRadioButtonConverter}, ConverterParameter=Medium}\"/>\n\t\t\t\t\t\t<RadioButton Content=\"1 000 000\" GroupName=\"ItemsCount\" Classes=\"PropertyEditor\"\n\t\t\t\t\t\t\t\t\t IsChecked=\"{Binding SelectedItemsCount, Converter={StaticResource enumRadioButtonConverter}, ConverterParameter=Large}\"/>\n\t\t\t\t\t</StackPanel>\n\t\t\t\t</mxe:GroupBox>\n\n                <mxe:GroupBox Header=\"Column Count\" Classes=\"PropertiesGroup\">\n                    <StackPanel>\n                        <RadioButton Content=\"100\" GroupName=\"ColumnsCount\" Classes=\"PropertyEditor\"\n\t\t\t\t\t\t\t\t\t IsChecked=\"{Binding SelectedColumnsCount, Converter={StaticResource enumRadioButtonConverter}, ConverterParameter=Small}\"/>\n                        <RadioButton Content=\"500\" GroupName=\"ColumnsCount\" Classes=\"PropertyEditor\"\n\t\t\t\t\t\t\t\t\t IsChecked=\"{Binding SelectedColumnsCount, Converter={StaticResource enumRadioButtonConverter}, ConverterParameter=Medium}\"/>\n                        <RadioButton Content=\"1 000\" GroupName=\"ColumnsCount\" Classes=\"PropertyEditor\"\n\t\t\t\t\t\t\t\t\t IsChecked=\"{Binding SelectedColumnsCount, Converter={StaticResource enumRadioButtonConverter}, ConverterParameter=Large}\"/>\n                    </StackPanel>\n                </mxe:GroupBox>\n\n\t\t\t\t<Button Content=\"Generate\" Command=\"{Binding GenerateCommand}\" Classes=\"LayoutItem\" HorizontalAlignment=\"Center\"/>\n\t\t\t</StackPanel>\n\t\t</Border>\n\t</Grid>\n\t\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridLargeDataView.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Templates;\nusing DemoCenter.DemoData;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.DataGrid;\nusing Eremex.AvaloniaUI.Controls.Editors;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridLargeDataView : UserControl\n    {\n        Random random = new Random();\n\n        Dictionary<Tuple<int, string>, object> valuesCache = new Dictionary<Tuple<int, string>, object>();\n\n        public DataGridLargeDataView()\n        {\n            InitializeComponent();\n        }\n\n        private void DataGridControl_PropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)\n        {\n            if(e.Property == DataGridControl.ItemsSourceProperty)\n                valuesCache.Clear();\n        }\n\n        void DataGridControl_CustomUnboundColumnData(object sender, DataGridUnboundColumnDataEventArgs e)\n        {   \n            var key = Tuple.Create(((LargeDataItem)e.Item).Id, e.Column.FieldName);\n            if (e.IsGettingData)\n            {\n                if (!valuesCache.TryGetValue(key, out var value))\n                {\n                    value = GenerateColumnValue(e.Column);\n                    valuesCache[key] = value;\n                }\n                e.Value = value;\n            }\n            else\n            {\n                valuesCache[key] = e.Value;\n            }\n        }\n\n        object GenerateColumnValue(GridColumn column)\n        {\n\n            if (column.UnboundDataType == typeof(int))\n            {\n                return random.Next(1000);\n            }\n            else if (column.UnboundDataType == typeof(DateTime))\n            {\n                return DateTime.Today.AddDays(-random.Next(1000));\n            }\n            else if (column.UnboundDataType == typeof(bool))\n            {\n                return random.Next(2) % 2 == 0;\n            }\n            else\n            {\n                return EmployeesData.EmployeeNames[random.Next(EmployeesData.EmployeeNames.Count)];\n            }\n        }\n    }\n\n    public class DataGridLargeDataViewColumnTemplate : ITemplate<object, GridColumn>\n    {\n        public GridColumn Build(object param)\n        {\n            var largeDataColumn = (LargeDataColumn)param;\n            var gridColumn = new GridColumn() \n            { \n                FieldName = largeDataColumn.FieldName,\n                Header = largeDataColumn.Header\n            };\n            if (!largeDataColumn.FieldName.Contains(\"Id\"))\n            {\n                gridColumn.UnboundDataType = largeDataColumn.DataType;\n\n                if (largeDataColumn.FieldName.Contains(\"ComboBox\"))\n                    gridColumn.EditorProperties = new ComboBoxEditorProperties() { ItemsSource = EmployeesData.EmployeeNames };\n                else if (largeDataColumn.FieldName.Contains(\"Numeric\"))\n                    gridColumn.EditorProperties = new SpinEditorProperties() { MaskType = MaskType.Numeric, Mask = \"c\" };\n            }\n            return gridColumn;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridLiveDataPageView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxdcv=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl.Visuals;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:local=\"using:DemoCenter.Views\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridLiveDataPageView\">\n    <UserControl.Styles>\n        <Style Selector=\"local|LiveDataColumnHeaderControl\">\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate>\n                        <StackPanel>\n                            <TextBlock Text=\"{TemplateBinding DisplayText}\" FontSize=\"18\" HorizontalAlignment=\"Right\" Margin=\"0,4,0,0\"/>\n                            <TextBlock Text=\"{TemplateBinding Header}\" HorizontalAlignment=\"Right\" FontWeight=\"Bold\" Margin=\"0,2,0,4\"/>\n                        </StackPanel>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <Style Selector=\"local|LiveDataBorder\">\n            <Setter Property=\"Value\" Value=\"{Binding Value}\"/>\n            <Setter Property=\"BasicBrush\" Value=\"{DynamicResource Icons/Fill/Yellow}\"/>\n        </Style>\n    </UserControl.Styles>\n\n    <mxdg:DataGridControl ItemsSource=\"{Binding Processes}\" ShowGroupPanel=\"False\" NavigationMode=\"Row\" AutoScrollToFocusedRow=\"False\">\n        <mxdg:GridColumn FieldName=\"Name\" Width=\"400\">\n            <mxdg:GridColumn.HeaderTemplate>\n                <DataTemplate>\n                    <local:LiveDataColumnHeaderControl Value=\"{x:Null}\" Header=\"Name\"/>\n                </DataTemplate>\n            </mxdg:GridColumn.HeaderTemplate>\n        </mxdg:GridColumn>\n\n        <mxdg:GridColumn FieldName=\"CpuLoad\" Width=\"*\" HeaderHorizontalAlignment=\"Right\">\n            <mxdg:GridColumn.HeaderTemplate>\n                <DataTemplate>\n                    <local:LiveDataColumnHeaderControl Value=\"{Binding $parent[mxdg:DataGridControl].DataContext.TotalCpuLoad}\" MaxValue=\"100\" Header=\"CPU\"/>\n                </DataTemplate>\n            </mxdg:GridColumn.HeaderTemplate>\n            <mxdg:GridColumn.CellTemplate>\n                <DataTemplate>\n                    <local:LiveDataBorder Threshold=\"10\">\n                        <mxe:TextEditor x:Name=\"PART_Editor\" EditorValue=\"{Binding Value, Converter={x:Static local:LiveDataValueToStringConverter.Instance}, ConverterParameter=%}\" HorizontalContentAlignment=\"Right\"/>\n                    </local:LiveDataBorder>\n                </DataTemplate>\n            </mxdg:GridColumn.CellTemplate>\n        </mxdg:GridColumn>\n\n        <mxdg:GridColumn FieldName=\"MemoryLoad\" Width=\"*\" HeaderHorizontalAlignment=\"Right\">\n            <mxdg:GridColumn.HeaderTemplate>\n                <DataTemplate>\n                    <local:LiveDataColumnHeaderControl Value=\"{Binding $parent[mxdg:DataGridControl].DataContext.TotalMemoryLoad}\" MaxValue=\"65536\" Header=\"Memory\"/>\n                </DataTemplate>\n            </mxdg:GridColumn.HeaderTemplate>\n            <mxdg:GridColumn.CellTemplate>\n                <DataTemplate>\n                    <local:LiveDataBorder Threshold=\"1024\">\n                        <mxe:TextEditor x:Name=\"PART_Editor\" EditorValue=\"{Binding Value, Converter={x:Static local:LiveDataValueToStringConverter.Instance}, ConverterParameter=' MB'}\" HorizontalContentAlignment=\"Right\"/>\n                    </local:LiveDataBorder>\n                </DataTemplate>\n            </mxdg:GridColumn.CellTemplate>\n        </mxdg:GridColumn>\n\n        <mxdg:GridColumn FieldName=\"DiskLoad\" Width=\"*\" HeaderHorizontalAlignment=\"Right\">\n            <mxdg:GridColumn.HeaderTemplate>\n                <DataTemplate>\n                    <local:LiveDataColumnHeaderControl Value=\"{Binding $parent[mxdg:DataGridControl].DataContext.TotalDiskLoad}\" MaxValue=\"100\" Header=\"Disk\"/>\n                </DataTemplate>\n            </mxdg:GridColumn.HeaderTemplate>\n            <mxdg:GridColumn.CellTemplate>\n                <DataTemplate>\n                    <local:LiveDataBorder Threshold=\"1\">\n                        <mxe:TextEditor x:Name=\"PART_Editor\" EditorValue=\"{Binding Value, Converter={x:Static local:LiveDataValueToStringConverter.Instance}, ConverterParameter=' MB/s'}\" HorizontalContentAlignment=\"Right\"/>\n                    </local:LiveDataBorder>\n                </DataTemplate>\n            </mxdg:GridColumn.CellTemplate>\n        </mxdg:GridColumn>\n\n        <mxdg:GridColumn FieldName=\"NetworkLoad\" Width=\"*\" HeaderHorizontalAlignment=\"Right\">\n            <mxdg:GridColumn.HeaderTemplate>\n                <DataTemplate>\n                    <local:LiveDataColumnHeaderControl Value=\"{Binding $parent[mxdg:DataGridControl].DataContext.TotalNetworkLoad}\" MaxValue=\"100\" Header=\"Network\"/>\n                </DataTemplate>\n            </mxdg:GridColumn.HeaderTemplate>\n            <mxdg:GridColumn.CellTemplate>\n                <DataTemplate>\n                    <local:LiveDataBorder Threshold=\"1\">\n                        <mxe:TextEditor x:Name=\"PART_Editor\" EditorValue=\"{Binding Value, Converter={x:Static local:LiveDataValueToStringConverter.Instance}, ConverterParameter=' Mbps'}\" HorizontalContentAlignment=\"Right\"/>\n                    </local:LiveDataBorder>\n                </DataTemplate>\n            </mxdg:GridColumn.CellTemplate>\n        </mxdg:GridColumn>\n\n        <mxdg:GridColumn FieldName=\"GpuLoad\" Width=\"*\" HeaderHorizontalAlignment=\"Right\">\n            <mxdg:GridColumn.HeaderTemplate>\n                <DataTemplate>\n                    <local:LiveDataColumnHeaderControl Value=\"{Binding $parent[mxdg:DataGridControl].DataContext.TotalGpuLoad}\" MaxValue=\"100\" Header=\"GPU\"/>\n                </DataTemplate>\n            </mxdg:GridColumn.HeaderTemplate>\n            <mxdg:GridColumn.CellTemplate>\n                <DataTemplate>\n                    <local:LiveDataBorder Threshold=\"2.5\">\n                        <mxe:TextEditor x:Name=\"PART_Editor\" EditorValue=\"{Binding Value, Converter={x:Static local:LiveDataValueToStringConverter.Instance}, ConverterParameter=%}\" HorizontalContentAlignment=\"Right\"/>\n                    </local:LiveDataBorder>\n                </DataTemplate>\n            </mxdg:GridColumn.CellTemplate>\n        </mxdg:GridColumn>\n    </mxdg:DataGridControl>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridLiveDataPageView.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Interactivity;\nusing Avalonia.Media;\nusing DemoCenter.ViewModels;\nusing System.Globalization;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridLiveDataPageView : UserControl\n    {\n        DataGridLiveDataPageViewModel ViewModel => (DataGridLiveDataPageViewModel)DataContext;\n\n        public DataGridLiveDataPageView()\n        {\n            InitializeComponent();\n        }\n\n        protected override void OnLoaded(RoutedEventArgs e)\n        {\n            base.OnLoaded(e);\n            ViewModel.RunUpdate();\n        }\n\n        protected override void OnUnloaded(RoutedEventArgs e)\n        {\n            ViewModel.StopUpdate();\n            base.OnUnloaded(e);\n        }\n    }\n\n    public class LiveDataColumnHeaderControl : TemplatedControl\n    {\n        public static readonly StyledProperty<double?> ValueProperty = \n            AvaloniaProperty.Register<LiveDataColumnHeaderControl, double?>(nameof(Value));\n\n        public static readonly StyledProperty<double> MaxValueProperty = \n            AvaloniaProperty.Register<LiveDataColumnHeaderControl, double>(nameof(MaxValue), 1);\n\n        public static readonly StyledProperty<object> HeaderProperty = \n            AvaloniaProperty.Register<LiveDataColumnHeaderControl, object>(nameof(Header));\n\n        public static readonly DirectProperty<LiveDataColumnHeaderControl, string> DisplayTextProperty = \n            AvaloniaProperty.RegisterDirect<LiveDataColumnHeaderControl, string>(\n                nameof(DisplayText),\n                o => o.DisplayText);\n\n        static LiveDataColumnHeaderControl()\n        {\n            ValueProperty.Changed.AddClassHandler<LiveDataColumnHeaderControl>((x, e) => x.UpdateDisplayText());\n            MaxValueProperty.Changed.AddClassHandler<LiveDataColumnHeaderControl>((x, e) => x.UpdateDisplayText());\n        }\n\n        string displayText;\n\n        public double? Value\n        {\n            get => GetValue(ValueProperty);\n            set => SetValue(ValueProperty, value);\n        }\n\n        public double MaxValue\n        {\n            get => GetValue(MaxValueProperty);\n            set => SetValue(MaxValueProperty, value);\n        }\n\n        public object Header\n        {\n            get => GetValue(HeaderProperty);\n            set => SetValue(HeaderProperty, value);\n        }\n\n        public string DisplayText\n        {\n            get { return displayText; }\n            private set { SetAndRaise(DisplayTextProperty, ref displayText, value); }\n        }\n\n        void UpdateDisplayText()\n        {\n            if (Value == null)\n                DisplayText = string.Empty;\n            if (Value == 0)\n                DisplayText = string.Format(\"{0:p0}\", 0);\n            else\n                DisplayText = string.Format(\"{0:p1}\", Value / MaxValue);\n        }\n    }\n\n    public class LiveDataBorder : Border\n    {\n        public static readonly StyledProperty<object> ValueProperty =\n            AvaloniaProperty.Register<LiveDataBorder, object>(nameof(Value));\n\n        public static readonly StyledProperty<double> ThresholdProperty =\n            AvaloniaProperty.Register<LiveDataBorder, double>(nameof(Threshold));\n\n        public static readonly StyledProperty<SolidColorBrush> BasicBrushProperty =\n            AvaloniaProperty.Register<LiveDataBorder, SolidColorBrush>(nameof(BasicBrush));\n\n\n        static LiveDataBorder()\n        {\n            ValueProperty.Changed.AddClassHandler<LiveDataBorder>((x, e) => x.UpdateBackground());\n            ThresholdProperty.Changed.AddClassHandler<LiveDataBorder>((x, e) => x.UpdateBackground());\n            BasicBrushProperty.Changed.AddClassHandler<LiveDataBorder>((x, e) => x.UpdateBackground());\n        }\n\n        public object Value\n        {\n            get => GetValue(ValueProperty);\n            set => SetValue(ValueProperty, value);\n        }\n\n        public double Threshold\n        {\n            get => GetValue(ThresholdProperty);\n            set => SetValue(ThresholdProperty, value);\n        }\n\n        public SolidColorBrush BasicBrush\n        {\n            get => GetValue(BasicBrushProperty);\n            set => SetValue(BasicBrushProperty, value);\n        }\n\n        void UpdateBackground()\n        {\n            Background = GetBackground();\n        }\n\n        IBrush GetBackground()\n        {\n            if (BasicBrush == null || Value is not double value)\n                return Brushes.Transparent;\n\n            var opacity = 0.4d;\n            if (value > Threshold)\n                opacity = 0.8;\n            else if (value > 0)\n                opacity = 0.6;\n            return new SolidColorBrush(BasicBrush.Color) { Opacity = opacity };\n        }\n    }\n\n    public class LiveDataValueToStringConverter : IValueConverter\n    {\n        public static IValueConverter Instance { get; } = new LiveDataValueToStringConverter();\n\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value is double result)\n            {   \n                if (result == 0)\n                    return string.Format(\"0{0}\", parameter);\n                return string.Format(\"{0:f1}{1}\", result, parameter);\n            }\n            return null;\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            return BindingOperations.DoNothing;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridMultipleSelectionPageView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n\t\t\t xmlns:data=\"clr-namespace:DemoCenter.DemoData\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridMultipleSelectionPageView\">\n\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<mxdg:DataGridControl x:Name=\"dataGrid\" \n\t\t\t\t\t\t\t  ItemsSource=\"{Binding Employees}\" \n\t\t\t\t\t\t\t  SelectionMode=\"Multiple\" \n\t\t\t\t\t\t\t  SelectedItems=\"{Binding SelectedEmployees}\"\n\t\t\t\t\t\t\t  ShowGroupPanel=\"False\" \n\t\t\t\t\t\t\t  AllowEditing=\"False\" \n\t\t\t\t\t\t\t  BorderThickness=\"1,0\">\n\t\t\t<mxdg:GridColumn FieldName=\"FirstName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"LastName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"HireDate\" Header=\"Hire Date\" Width=\"*\" MinWidth=\"80\" />\t\t\t\n\t\t\t<mxdg:GridColumn FieldName=\"Experience\" Width=\"90\" MinWidth=\"80\" />\t\t\n\t\t\t<mxdg:GridColumn FieldName=\"Position\" Width=\"*\" MinWidth=\"150\" />\n\t\t\t<mxdg:GridColumn FieldName=\"EmploymentType\" Width=\"*\" MinWidth=\"150\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"City\" Width=\"*\" MinWidth=\"150\" />\n\t\t\t<mxdg:GridColumn FieldName=\"BirthDate\" Width=\"*\" MinWidth=\"80\" />\n\t\t</mxdg:DataGridControl>\n\n\t\t<Border Grid.Column=\"1\" BorderThickness=\"0,0,1,0\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n\t\t\t<mxe:GroupBox Header=\"Selected Employees\" VerticalAlignment=\"Top\" Classes=\"PropertiesGroup\">\n\t\t\t\t<ListBox ItemsSource=\"{Binding SelectedEmployees}\" VerticalAlignment=\"Top\">\n\t\t\t\t\t<ListBox.DisplayMemberBinding>\n\t\t\t\t\t\t<MultiBinding StringFormat=\"{}{0} {1}\">\n\t\t\t\t\t\t\t<Binding Path=\"FirstName\" />\n\t\t\t\t\t\t\t<Binding Path=\"LastName\" />\n\t\t\t\t\t\t</MultiBinding>\n\t\t\t\t\t</ListBox.DisplayMemberBinding>\n\t\t\t\t</ListBox>\n\t\t\t</mxe:GroupBox>\n\t\t</Border>\n\t</Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridMultipleSelectionPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Eremex.AvaloniaUI.Controls.DataGrid;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridMultipleSelectionPageView : UserControl\n    {\n        public DataGridMultipleSelectionPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridPageView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridPageView\">\n    <TextBlock VerticalAlignment=\"Center\"\n               HorizontalAlignment=\"Center\"\n               FontSize=\"16\"\n               Text=\"See product pages for details.\"/>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridPageView : UserControl\n    {\n        public DataGridPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridRowAutoHeightView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridRowAutoHeightView\">\n    \n    <mxdg:DataGridControl ItemsSource=\"{Binding Cars}\" AllowEditing=\"False\" ShowGroupPanel=\"False\">\n        <mxdg:DataGridControl.Styles>\n            <Style Selector=\"mxdg|DataGridControl /template/ ScrollViewer#PART_ScrollViewer\">\n                <Setter Property=\"ScrollViewer.AllowAutoHide\" Value=\"False\"/>\n            </Style>\n        </mxdg:DataGridControl.Styles>\n        <mxdg:GridColumn FieldName=\"Image\" Width=\"120\" AllowResizing=\"False\">\n            <mxdg:GridColumn.CellTemplate>\n                <DataTemplate>\n                    <Image Source=\"{Binding Value}\"/>\n                </DataTemplate>\n            </mxdg:GridColumn.CellTemplate>\n        </mxdg:GridColumn>\n        <mxdg:GridColumn FieldName=\"Trademark\" Width=\"3*\"/>\n        <mxdg:GridColumn FieldName=\"TransmissionType\" Width=\"3*\"/>\n        <mxdg:GridColumn FieldName=\"MPG\" Width=\"*\"/>\n        <mxdg:GridColumn FieldName=\"HP\" Width=\"*\"/>\n        <mxdg:GridColumn FieldName=\"Description\" Width=\"300\" MinWidth=\"200\" MaxWidth=\"400\" AllowColumnFiltering=\"False\">\n            <mxdg:GridColumn.EditorProperties>\n                <mxe:TextEditorProperties TextWrapping=\"Wrap\"/>\n            </mxdg:GridColumn.EditorProperties>\n        </mxdg:GridColumn>\n        <mxdg:GridColumn FieldName=\"Price\" Width=\"2*\">\n            <mxdg:GridColumn.EditorProperties>\n                <mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n            </mxdg:GridColumn.EditorProperties>\n        </mxdg:GridColumn>\n    </mxdg:DataGridControl>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridRowAutoHeightView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridRowAutoHeightView : UserControl\n    {\n        public DataGridRowAutoHeightView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridValidationView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.DataGridValidationView\">\n    \n    <Grid ColumnDefinitions=\"*, 250\">\n        <mxdg:DataGridControl x:Name=\"dataGrid\" ItemsSource=\"{Binding Employees}\" ValidateCellValue=\"OnValidateCellValue\" ShowGroupPanel=\"False\" BorderThickness=\"1,0\">\n\t\t\t<mxdg:GridColumn FieldName=\"FirstName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"LastName\" Width=\"*\" MinWidth=\"80\"/>\n\t\t\t<mxdg:GridColumn FieldName=\"HireDate\" Header=\"Hire Date\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:DateEditorProperties/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n\t\t\t<mxdg:GridColumn FieldName=\"Experience\" x:Name=\"experienceColumn\"  Width=\"90\" MinWidth=\"80\" />\n\t\t\t<mxdg:GridColumn FieldName=\"City\" Width=\"*\" MinWidth=\"150\" />\n\t\t\t<mxdg:GridColumn FieldName=\"Phone\" Width=\"*\" MinWidth=\"150\" />\n\t\t\t<mxdg:GridColumn FieldName=\"BirthDate\" x:Name=\"birthDateColumn\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t<mxe:DateEditorProperties/>\n\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t</mxdg:GridColumn>\n        </mxdg:DataGridControl>\n\n        <Border Grid.Column=\"1\" BorderThickness=\"0,0,1,0\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n\t\t\t<mxe:GroupBox Header=\"Properties\" VerticalAlignment=\"Top\" Classes=\"PropertiesGroup\">\n\t\t\t\t<StackPanel>\n\t\t\t\t\t<mxe:CheckEditor Content=\"Show ItemsSource Errors\" IsChecked=\"{Binding #dataGrid.ShowItemsSourceErrors}\" Classes=\"LayoutItem\"/>\n\n\t\t\t\t\t<Label Content=\"Validate User Input\" Classes=\"LayoutItem\" FontWeight=\"SemiBold\" />\n\t\t\t\t\t<StackPanel Margin=\"16,0,0,0\">\n\t\t\t\t\t\t<mxe:CheckEditor x:Name=\"chkValidateHireDate\" Content=\"HireDate > BirthDate\" Classes=\"LayoutItem\" IsChecked=\"True\" />\n\t\t\t\t\t\t<mxe:CheckEditor x:Name=\"chkValidateExperience\" Content=\"Experience >= 1\" Classes=\"LayoutItem\" IsChecked=\"True\" />\n\t\t\t\t\t</StackPanel>\n\t\t\t\t</StackPanel>\n\t\t\t</mxe:GroupBox>\n        </Border>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DataGrid/DataGridValidationView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.DataGrid;\nusing Eremex.AvaloniaUI.Controls.Editors;\n\nnamespace DemoCenter.Views\n{\n    public partial class DataGridValidationView : UserControl\n    {\n        public DataGridValidationView()\n        {\n            InitializeComponent();\n        }\n\n        private void OnValidateCellValue(object sender, DataGridValidateCellValueEventArgs e)\n        {\n            if(e.Column.FieldName == nameof(EmployeeValidationInfo.HireDate) && chkValidateHireDate.IsChecked == true)\n            {\n                var birthDate = (DateTime)dataGrid.GetCellValue(e.RowIndex, birthDateColumn);\n                if ((DateTime)e.Value < birthDate)\n                    e.ErrorContent = \"Hire Date cannot be less than Birth Date\";\n            }\n            else if(e.Column.FieldName == nameof(EmployeeValidationInfo.Experience) && chkValidateExperience.IsChecked == true) \n            {\n                if ((int)e.Value < 1)\n                    e.ErrorContent = \"Experience cannot be less than one year\";\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DesktopOnlyView.axaml",
    "content": "<UserControl\n    x:Class=\"DemoCenter.Views.DesktopOnlyView\"\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n    xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n    xmlns:mxb=\"clr-namespace:Eremex.AvaloniaUI.Controls.Bars;assembly=Eremex.Avalonia.Controls\"\n    xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Controls.Common;assembly=Eremex.Avalonia.Controls\"\n    xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n    xmlns:mxpg=\"clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls\"\n    xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n    xmlns:mxu=\"clr-namespace:Eremex.AvaloniaUI.Controls.Utils;assembly=Eremex.Avalonia.Controls\"\n    xmlns:vm=\"using:DemoCenter.ViewModels\"\n    xmlns:p=\"using:DemoCenter\"\n\n    mc:Ignorable=\"d\"\n    d:DesignHeight=\"600\"\n    d:DesignWidth=\"800\"\n    x:DataType=\"vm:DesktopOnlyViewModel\">\n    <Design.DataContext>\n        <vm:DesktopOnlyViewModel />\n    </Design.DataContext>\n\n    <UserControl.Styles>\n        <Style Selector=\"mxe|HyperlinkEditor.resourceLink\">\n            <Setter Property=\"AllowAutoNavigate\" Value=\"True\" />\n            <Setter Property=\"Padding\" Value=\"0\" />\n            <Setter Property=\"Margin\" Value=\"0\" />\n            <Setter Property=\"MinHeight\" Value=\"0\" />\n            <Setter Property=\"FontSize\" Value=\"16\" />\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource Icons/Outline/Blue}\" />\n        </Style>\n        <Style Selector=\"mxe|HyperlinkEditor.resourceLink /template/ TextBlock#PART_RealEditor\">\n            <Setter Property=\"TextDecorations\" Value=\"Underline\" />\n        </Style>\n    </UserControl.Styles>\n\n    <Grid\n        HorizontalAlignment=\"Center\"\n        VerticalAlignment=\"Center\"\n        ColumnDefinitions=\"*, Auto\"\n        RowDefinitions=\"Auto, Auto\"\n        TextElement.FontSize=\"16\">\n        <TextBlock Text=\"{x:Static p:Resources.WASMOnlyText1}\" />\n        <mxe:HyperlinkEditor\n            Grid.Column=\"1\"\n            Classes=\"resourceLink\"\n            NavigationUrl=\"https://github.com/Eremex/controls-demo/tree/main/DemoCenter\"\n            Text=\"Demo Center\" />\n        <TextBlock\n            Grid.Row=\"1\"\n            Grid.ColumnSpan=\"2\"\n            HorizontalAlignment=\"Center\"\n            FontSize=\"16\"\n            Text=\"{x:Static p:Resources.WASMOnlyText2}\"\n            />\n    </Grid>\n\n</UserControl>"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DesktopOnlyView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class DesktopOnlyView : UserControl\n    {\n        public DesktopOnlyView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DockManager/IdeLayoutPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.IdeLayoutPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             xmlns:mxd=\"https://schemas.eremexcontrols.net/avalonia/docking\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:views=\"clr-namespace:DemoCenter.Views\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxpg=\"https://schemas.eremexcontrols.net/avalonia/propertygrid\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"900\"\n             x:DataType=\"vm:IdeLayoutPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:IdeLayoutPageViewModel />\n\t</Design.DataContext>\n\n\t<UserControl.Resources>\n\t\t<views:SolutionItemImageSelector x:Key=\"ImageSelector\"\n\t\t                                 ClosedFolderImage=\"{x:Static mxi:Basic.Folder }\"\n\t\t                                 OpenedFolderImage=\"{x:Static mxi:Basic.Folder_Open }\"\n\t\t                                 FileImage=\"{x:Static mxi:Basic.Doc }\"\n\t\t                                 CSharpFileImage=\"{x:Static mxi:Code.Doc_CSharp }\"\n\t\t                                 ProjectImage=\"{x:Static mxi:Code.Folder_CSharp }\"\n\t\t                                 DependenciesImage=\"{x:Static mxi:Code.Storage}\"/>\n\t\t<views:IdeLayoutDocumentTabGlyphImageConverter x:Key=\"TabImageConverter\"\n\t\t                                               FileImage=\"{x:Static mxi:Basic.Doc }\"\n\t\t                                               CSharpFileImage=\"{x:Static mxi:Code.Doc_CSharp }\"/>\n\t\t<DataTemplate x:Key=\"DockPaneTabHeaderTemplate\">\n\t\t\t<Border Background=\"Transparent\"\n\t\t\t        ToolTip.Tip=\"{Binding $self.(mxd:DockManager.DockItem)?.Header}\"\n\t\t\t        ToolTip.ShowDelay=\"500\">\n\t\t\t\t<Image Source=\"{Binding $self.(mxd:DockManager.DockItem)?.TabGlyph}\"\n\t\t\t\t       Width=\"16\"\n\t\t\t\t       Height=\"16\">\n\t\t\t\t</Image>\n\t\t\t</Border>\n\t\t</DataTemplate>\n\t</UserControl.Resources>\n\t<UserControl.Styles>\n\t\t<Style Selector=\"mxd|DockPane.Tab\">\n\t\t\t<Setter Property=\"ShowTabGlyphMode\" Value=\"Hidden\"/>\n\t\t\t<Setter Property=\"TabHeaderTemplate\" Value=\"{StaticResource DockPaneTabHeaderTemplate}\"/>\n\t\t</Style>\n\t</UserControl.Styles>\n\t<mxb:ToolbarManager>\n\t\t<Grid ColumnDefinitions=\"*\" RowDefinitions=\"Auto * Auto\">\n\t\t\t<mxb:ToolbarContainerControl>\n\t\t\t\t<mxb:Toolbar x:Name=\"MainMenu\" DisplayMode=\"MainMenu\" ShowCustomizationButton=\"False\" ToolbarName=\"Main Menu\">\n\t\t\t\t\t<mxb:ToolbarMenuItem Header=\"File\">\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"New\"\n\t\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Doc_Add }\" />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Open\"\n\t\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Folder_Open }\" />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Save\" Glyph=\"{x:Static mxi:Basic.Save }\" />\n\t\t\t\t\t\t<mxb:ToolbarSeparatorItem />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Print\" Glyph=\"{x:Static mxi:Basic.Print }\" />\n\t\t\t\t\t</mxb:ToolbarMenuItem>\n\t\t\t\t\t<mxb:ToolbarMenuItem Header=\"Edit\">\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Undo\" Glyph=\"{x:Static mxi:Basic.Undo }\" />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Redo\" Glyph=\"{x:Static mxi:Basic.Redo }\" />\n\t\t\t\t\t\t<mxb:ToolbarSeparatorItem />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Cut\"\n\t\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Cut }\" />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Copy\"\n\t\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Copy }\" />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Paste\"\n\t\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Paste }\" />\n\t\t\t\t\t\t<mxb:ToolbarSeparatorItem />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Select All\" />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Clear all\"\n\t\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Remove }\" />\n\t\t\t\t\t</mxb:ToolbarMenuItem>\n\t\t\t\t\t<mxb:ToolbarMenuItem Header=\"Options\">\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Check for Updates\" />\n\t\t\t\t\t\t<mxb:ToolbarSeparatorItem />\n\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"About\" />\n\t\t\t\t\t</mxb:ToolbarMenuItem>\n\t\t\t\t</mxb:Toolbar>\n\t\t\t\t<mxb:Toolbar x:Name=\"FileToolbar\" ShowCustomizationButton=\"False\" ToolbarName=\"File\">\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"New\"\n\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Doc_Add }\" />\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Open\"\n\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Folder_Open }\" />\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Save\" Glyph=\"{x:Static mxi:Basic.Save }\" />\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Print\" Glyph=\"{x:Static mxi:Basic.Print }\"\n\t\t\t\t\t                       Alignment=\"Far\" />\n\t\t\t\t</mxb:Toolbar>\n\t\t\t\t<mxb:Toolbar x:Name=\"EditToolbar\" ShowCustomizationButton=\"False\" ToolbarName=\"Edit\">\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Cut\"\n\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Cut }\" />\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Copy\"\n\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Copy }\" />\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Paste\"\n\t\t\t\t\t                       Glyph=\"{x:Static mxi:Basic.Paste }\" />\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Undo\" Glyph=\"{x:Static mxi:Basic.Undo }\"\n\t\t\t\t\t                       Alignment=\"Far\" />\n\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Redo\" Glyph=\"{x:Static mxi:Basic.Redo }\"\n\t\t\t\t\t                       Alignment=\"Far\" />\n\t\t\t\t</mxb:Toolbar>\n\t\t\t</mxb:ToolbarContainerControl>\n\t\t\t<mxd:DockManager Grid.Column=\"0\" Grid.Row=\"1\"\n\t\t\t                 BorderThickness=\"0\" \n\t\t\t                 ItemsSource=\"{Binding Documents}\"\n\t\t\t                 ItemContentTemplate=\"{views:IdeLayoutDocumentContentTemplate}\">\n\t\t\t\t<mxd:DockManager.ItemTemplate>\n\t\t\t\t\t<DataTemplate DataType=\"vm:IdeLayoutDocumentViewModel\">\n\t\t\t\t\t\t<mxd:DocumentPane Header=\"{Binding Header}\"\n\t\t\t\t\t\t                  IsActive=\"{Binding IsActive}\"\n\t\t\t\t\t\t                  CloseCommand=\"{Binding CloseCommand}\"\n\t\t\t\t\t\t                  Glyph=\"{Binding Header, Converter={StaticResource TabImageConverter}}\"\n\t\t\t\t\t\t                  DocumentSwitcherFooterDescription=\"{Binding Uri}\"\n\t\t\t\t\t\t                  GlyphSize=\"16,16\"/>\n\t\t\t\t\t</DataTemplate>\n\t\t\t\t</mxd:DockManager.ItemTemplate>\n\t\t\t\t<mxd:DockGroup>\n\t\t\t\t\t<mxd:DockGroup Orientation=\"Vertical\">\n\t\t\t\t\t\t<mxd:DockGroup DockHeight=\"3*\">\n\t\t\t\t\t\t\t<mxd:TabbedGroup DockWidth=\"2*\" TabStripPlacement=\"Left\" TabHeaderOrientation=\"Horizontal\">\n\t\t\t\t\t\t\t\t<mxd:DockPane Header=\"Explorer\" \n\t\t\t\t\t\t\t\t              TabGlyph=\"{x:Static mxi:Basic.Docs}\"\n\t\t\t\t\t\t\t\t              Classes=\"Tab\">\n\t\t\t\t\t\t\t\t\t<mxtl:TreeListControl ItemsSource=\"{Binding SolutionNodes}\"\n\t\t\t\t\t\t\t\t\t                      ParentFieldName=\"ParentId\"\n\t\t\t\t\t\t\t\t\t                      KeyFieldName=\"Id\"\n\t\t\t\t\t\t\t\t\t                      ExpandStateFieldName=\"IsExpanded\"\n\t\t\t\t\t\t\t\t\t                      ShowHorizontalLines=\"False\"\n\t\t\t\t\t\t\t\t\t                      ShowColumnHeaders=\"False\"\n\t\t\t\t\t\t\t\t\t                      AllowEditing=\"False\"\n\t\t\t\t\t\t\t\t\t                      NodeImageSelector=\"{StaticResource ImageSelector}\"\n\t\t\t\t\t\t\t\t\t                      ShowNodeImages=\"True\"\n\t\t\t\t\t\t\t\t\t                      FocusedItem=\"{Binding FocusedSolutionItem}\"\n\t\t\t\t\t\t\t\t\t                      NodeClick=\"TreeListControlBase_OnNodeClick\"\n\t\t\t\t\t\t\t\t\t                      CustomColumnSort=\"TreeListControl_OnCustomColumnSort\">\n\t\t\t\t\t\t\t\t\t\t<mxtl:TreeListColumn FieldName=\"Name\" Width=\"*\" SortMode=\"Custom\" SortDirection=\"Ascending\" />\n\t\t\t\t\t\t\t\t\t</mxtl:TreeListControl>\n\t\t\t\t\t\t\t\t</mxd:DockPane>\n\t\t\t\t\t\t\t\t<mxd:DockPane Header=\"Search\"\n\t\t\t\t\t\t\t\t              TabGlyph=\"{x:Static mxi:Basic.Search}\"\n\t\t\t\t\t\t\t\t              Classes=\"Tab\">\n\t\t\t\t\t\t\t\t\t<Grid RowDefinitions=\"Auto *\">\n\t\t\t\t\t\t\t\t\t\t<StackPanel Classes=\"LayoutGroup Vertical\">\n\t\t\t\t\t\t\t\t\t\t\t<mxe:ButtonEditor Watermark=\"Search\" >\n\t\t\t\t\t\t\t\t\t\t\t\t<mxe:ButtonEditor.Buttons>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mxe:ButtonSettings ToolTip.Tip=\"Match case\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t                    Glyph=\"{x:Static mxi:Filter.Starts_with }\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t                    ButtonKind=\"Toggle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mxe:ButtonSettings ToolTip.Tip=\"Match whole word\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t                    Glyph=\"{x:Static mxi:Painting.Report_text_column }\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t                    ButtonKind=\"Toggle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</mxe:ButtonEditor.Buttons>\n\t\t\t\t\t\t\t\t\t\t\t</mxe:ButtonEditor>\n\t\t\t\t\t\t\t\t\t\t\t<mxe:ButtonEditor Watermark=\"Replace\"/>\n\t\t\t\t\t\t\t\t\t\t</StackPanel>\t\n\t\t\t\t\t\t\t\t\t\t<TextBlock Grid.Row=\"1\"\n\t\t\t\t\t\t\t\t\t\t           Text=\"No search results available\"\n\t\t\t\t\t\t\t\t\t\t           TextWrapping=\"Wrap\"\n\t\t\t\t\t\t\t\t\t\t           TextAlignment=\"Center\"\n\t\t\t\t\t\t\t\t\t\t           HorizontalAlignment=\"Center\"\n\t\t\t\t\t\t\t\t\t\t           VerticalAlignment=\"Center\"/>\n\t\t\t\t\t\t\t\t\t</Grid>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t</mxd:DockPane>\n\t\t\t\t\t\t\t\t<mxd:DockPane Header=\"Debug\"\n\t\t\t\t\t\t\t\t              TabGlyph=\"{x:Static mxi:Code.CSharp_Play}\"\n\t\t\t\t\t\t\t\t              Classes=\"Tab\">\n\t\t\t\t\t\t\t\t\t<Grid RowDefinitions=\"200 *\">\n\t\t\t\t\t\t\t\t\t\t<Button Content=\"Debug and Run\"\n\t\t\t\t\t\t\t\t\t\t        HorizontalAlignment=\"Center\"\n\t\t\t\t\t\t\t\t\t\t        VerticalAlignment=\"Center\"\n\t\t\t\t\t\t\t\t\t\t        IsEnabled=\"False\"/>\n\t\t\t\t\t\t\t\t\t\t<TextBlock Grid.Row=\"1\" TextAlignment=\"Center\"\n\t\t\t\t\t\t\t\t\t\t           Text=\"To customize Debug and Run, edit a launch.json file\"\n\t\t\t\t\t\t\t\t\t\t           TextWrapping=\"Wrap\"\n\t\t\t\t\t\t\t\t\t\t           VerticalAlignment=\"Top\"\n\t\t\t\t\t\t\t\t\t\t           HorizontalAlignment=\"Center\">\n\t\t\t\t\t\t\t\t\t\t</TextBlock>\n\t\t\t\t\t\t\t\t\t</Grid>\n\t\t\t\t\t\t\t\t</mxd:DockPane>\n\t\t\t\t\t\t\t\t<mxd:DockPane Header=\"Source Control\"\n\t\t\t\t\t\t\t\t              TabGlyph=\"{x:Static mxi:Basic.Docs}\"\n\t\t\t\t\t\t\t\t              Classes=\"Tab\">\n\t\t\t\t\t\t\t\t\t<TextBlock Text=\"Not a git repository (or any of the parent directories)\"\n\t\t\t\t\t\t\t\t\t           TextAlignment=\"Center\"\n\t\t\t\t\t\t\t\t\t           TextWrapping=\"Wrap\"\n\t\t\t\t\t\t\t\t\t           HorizontalAlignment=\"Center\"\n\t\t\t\t\t\t\t\t\t           VerticalAlignment=\"Center\" />\n\t\t\t\t\t\t\t\t</mxd:DockPane>\n\t\t\t\t\t\t\t</mxd:TabbedGroup>\n\n\t\t\t\t\t\t\t<mxd:DocumentGroup DockWidth=\"5*\">\n\t\t\t\t\t\t\t</mxd:DocumentGroup>\n\n\t\t\t\t\t\t</mxd:DockGroup>\n\n\t\t\t\t\t\t<mxd:TabbedGroup TabStripPlacement=\"Left\" TabHeaderOrientation=\"Horizontal\">\n\t\t\t\t\t\t\t<mxd:DockPane Header=\"Error List\"\n\t\t\t\t\t\t\t              TabGlyph=\"{x:Static mxi:Basic.Warning}\"\n\t\t\t\t\t\t\t              Classes=\"Tab\">\n\t\t\t\t\t\t\t\t<Grid RowDefinitions=\"Auto *\">\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarContainerControl DockType=\"Top\" AllowCustomizationMenu=\"False\">\n\t\t\t\t\t\t\t\t\t\t<mxb:Toolbar x:Name=\"ErrorListBar\" ShowCustomizationButton=\"False\" AllowDragToolbar=\"False\" ToolbarName=\"Error List\">\n\t\t\t\t\t\t\t\t\t\t\t<mxb:ToolbarCheckItem Header=\"0 Errors\" GlyphSize=\"16,16\" DisplayMode=\"Both\"\n\t\t\t\t\t\t\t\t\t\t\t                      Glyph=\"{x:Static mxi:Basic.Warning }\"\n\t\t\t\t\t\t\t\t\t\t\t                      IsChecked=\"true\" />\n\t\t\t\t\t\t\t\t\t\t\t<mxb:ToolbarCheckItem Header=\"0 Warnings\" GlyphSize=\"16,16\" DisplayMode=\"Both\"\n\t\t\t\t\t\t\t\t\t\t\t                      Glyph=\"{x:Static mxi:Basic.Warning}\"/>\n\t\t\t\t\t\t\t\t\t\t\t<mxb:ToolbarCheckItem Header=\"0 Messages\" GlyphSize=\"16,16\" DisplayMode=\"Both\"\n\t\t\t\t\t\t\t\t\t\t\t                      Glyph=\"{x:Static mxi:Basic.Info }\" />\n\t\t\t\t\t\t\t\t\t\t</mxb:Toolbar>\n\t\t\t\t\t\t\t\t\t</mxb:ToolbarContainerControl>\n\t\t\t\t\t\t\t\t\t<mxdg:DataGridControl Grid.Row=\"1\" ShowGroupPanel=\"False\">\n\t\t\t\t\t\t\t\t\t\t<mxdg:GridColumn FieldName=\"Code\"></mxdg:GridColumn>\n\t\t\t\t\t\t\t\t\t\t<mxdg:GridColumn FieldName=\"Description\" Width=\"*\"></mxdg:GridColumn>\n\t\t\t\t\t\t\t\t\t\t<mxdg:GridColumn FieldName=\"File\"></mxdg:GridColumn>\n\t\t\t\t\t\t\t\t\t\t<mxdg:GridColumn FieldName=\"Line\"></mxdg:GridColumn>\n\t\t\t\t\t\t\t\t\t</mxdg:DataGridControl>\n\t\t\t\t\t\t\t\t</Grid>\n\t\t\t\t\t\t\t</mxd:DockPane>\n\t\t\t\t\t\t\t<mxd:DockPane Header=\"Output\"\n\t\t\t\t\t\t\t              TabGlyph=\"{x:Static mxi:Basic.Info}\"\n\t\t\t\t\t\t\t              Classes=\"Tab\">\n\t\t\t\t\t\t\t\t<TextBlock Text=\"Build finished successfully\"\n\t\t\t\t\t\t\t\t           HorizontalAlignment=\"Center\"\n\t\t\t\t\t\t\t\t           VerticalAlignment=\"Center\"></TextBlock>\n\t\t\t\t\t\t\t</mxd:DockPane>\n\t\t\t\t\t\t</mxd:TabbedGroup>\n\t\t\t\t\t</mxd:DockGroup>\n\t\t\t\t\t<mxd:DockPane Header=\"Properties\" DockWidth=\"300\">\n\t\t\t\t\t\t<mxpg:PropertyGridControl SelectedObject=\"{Binding FocusedSolutionItem}\"/>\n\t\t\t\t\t</mxd:DockPane>\n\t\t\t\t</mxd:DockGroup>\n\t\t\t</mxd:DockManager>\n\t\t\t<mxb:ToolbarContainerControl Grid.Column=\"0\" Grid.Row=\"2\" DockType=\"Bottom\">\n\t\t\t\t<mxb:Toolbar DisplayMode=\"StatusBar\" x:Name=\"StatusBar\" ShowCustomizationButton=\"False\" ToolbarName=\"Status Bar\">\n\t\t\t\t\t<mxb:ToolbarTextItem Header=\"Ready\" ShowBorder=\"False\" />\n\t\t\t\t</mxb:Toolbar>\n\t\t\t</mxb:ToolbarContainerControl>\n\t\t</Grid>\n\t</mxb:ToolbarManager>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/DockManager/IdeLayoutPageView.axaml.cs",
    "content": "using System.Globalization;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.TreeList;\nusing System.Reflection;\nusing Avalonia;\nusing Avalonia.Controls.Templates;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing AvaloniaEdit;\nusing DemoCenter.Helpers;\n\nnamespace DemoCenter.Views\n{\n    public partial class IdeLayoutPageView : UserControl\n    {\n        public IdeLayoutPageView()\n        {\n            InitializeComponent();\n        }\n\n        private void TreeListControlBase_OnNodeClick(object sender, TreeListNodeClickEventArgs e)\n        {\n            if(e.IsLeftButtonPressed && e.ClickCount == 2 && e.Node.Content is SolutionFile solutionFile)\n            {\n                (DataContext as IdeLayoutPageViewModel)?.Open(solutionFile);\n            }\n        }\n\n        private void TreeListControl_OnCustomColumnSort(object sender, TreeListCustomColumnSortEventArgs e)\n        {\n            if(e.Node1.Content is SolutionNodeBase v1 && e.Node2.Content is SolutionNodeBase v2)\n            {\n                e.Result = SolutionNodeComparer.Instance.Compare(v1, v2);\n            }\n        }\n\n        private sealed class SolutionNodeComparer : IComparer<SolutionNodeBase>\n        {\n\n            public static readonly SolutionNodeComparer Instance = new();\n\n            public int Compare(SolutionNodeBase x, SolutionNodeBase y)\n            {\n                if(x is SolutionDependenciesNode) return -1;\n                if(y is SolutionDependenciesNode) return 1;\n\n                if(x is SolutionFile && y is SolutionFile)\n                {\n                    return string.Compare(x.Path, y.Path, StringComparison.Ordinal);\n                }\n\n                if(x is SolutionFolder && y is SolutionFolder)\n                {\n                    return string.Compare(x.Path, y.Path, StringComparison.Ordinal);\n                }\n\n                if(x is SolutionFolder) return -1;\n                if(y is SolutionFolder) return 1;\n\n                return 0;\n            }\n        }\n    }\n\n    public class SolutionItemImageSelector : ITreeListNodeImageSelector\n    {\n        public IImage OpenedFolderImage { get; set; }\n        public IImage ClosedFolderImage { get; set; }\n        public IImage FileImage { get; set; }\n        public IImage CSharpFileImage { get; set; }\n        public IImage ProjectImage { get; set; }\n        public IImage DependenciesImage { get; set; }\n\n        public IImage SelectImage(TreeListNode node)\n        {\n            return node?.Content switch\n            {\n                SolutionFolder => node.IsExpanded ? OpenedFolderImage : ClosedFolderImage,\n                SolutionFile file => file.Name.EndsWith(\".cs\") ? CSharpFileImage : FileImage,\n                SolutionDependenciesNode => DependenciesImage,\n                SolutionProjectNode => ProjectImage,\n                _ => null\n            };\n        }\n    }\n\n    public class IdeLayoutDocumentContentTemplate : MarkupExtension, IDataTemplate\n    {\n        public Control Build(object param)\n        {\n            var viewModel = (IdeLayoutDocumentViewModel)param;\n            var uriString = viewModel.Uri;\n\n            TextEditor codeViewEditor = new();\n            codeViewEditor.Tag = uriString;\n            codeViewEditor.ActualThemeVariantChanged += CodeViewEditorOnActualThemeVariantChanged;\n            codeViewEditor.DetachedFromVisualTree += CodeViewEditorOnDetachedFromVisualTree;\n            UpdateCodeViewEditor(codeViewEditor);\n\n            return codeViewEditor;\n        }\n\n        private void UpdateCodeViewEditor(TextEditor codeViewEditor)\n        {\n            string uriString = (string)codeViewEditor.Tag;\n            if(uriString == null)\n                return;\n            using var stream = Assembly.GetAssembly(typeof(App))?.GetManifestResourceStream(uriString);\n            if(uriString.EndsWith(\".cs\"))\n                codeViewEditor.SyntaxHighlighting =\n                    new ThemedSyntaxHighlighter(\"CSharp-Highlight\").HighlightingDefinition;\n            else if(uriString.EndsWith(\".axaml\"))\n                codeViewEditor.SyntaxHighlighting =\n                    new ThemedSyntaxHighlighter(\"Axaml-Highlight\").HighlightingDefinition;\n            else\n                codeViewEditor.SyntaxHighlighting = null;\n            codeViewEditor.Load(stream);\n        }\n\n        private void CodeViewEditorOnDetachedFromVisualTree(object sender, VisualTreeAttachmentEventArgs e)\n        {\n            if(sender is TextEditor te)\n            {\n                te.ActualThemeVariantChanged -= CodeViewEditorOnActualThemeVariantChanged;\n                te.DetachedFromVisualTree -= CodeViewEditorOnDetachedFromVisualTree;\n            }\n        }\n\n        private void CodeViewEditorOnActualThemeVariantChanged(object sender, EventArgs e)\n        {\n            UpdateCodeViewEditor((TextEditor)sender);\n        }\n\n        public bool Match(object data)\n        {\n            return data is IdeLayoutDocumentViewModel;\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            return this;\n        }\n    }\n\n    public class IdeLayoutDocumentTabGlyphImageConverter : MarkupExtension, IValueConverter\n    {\n        public IImage FileImage { get; set; }\n        public IImage CSharpFileImage { get; set; }\n        \n        public override object ProvideValue(IServiceProvider serviceProvider) => this;\n\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value is string path)\n            {\n                return path.EndsWith(\".cs\") ? CSharpFileImage : FileImage;\n            }\n            \n            return AvaloniaProperty.UnsetValue;\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    } \n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/ColorEditorPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.ColorEditorPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             xmlns:mxei=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors.Visuals;assembly=Eremex.Avalonia.Controls\"\n             d:DesignHeight=\"750\"\n             d:DesignWidth=\"900\"\n             x:DataType=\"vm:ColorEditorPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:ColorEditorPageViewModel />\n    </Design.DataContext> \n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n            <Grid RowDefinitions=\"Auto, 60, Auto\" ColumnDefinitions=\"Auto, 26, Auto\" HorizontalAlignment=\"Center\" Margin=\"30\">\n                <!-- <Label Classes=\"EditorHeader\" Content=\"POPUP COLOR EDITOR\"/> -->\n                <mxe:PopupColorEditor Grid.Row=\"2\" x:Name=\"PopupColorEditor\" VerticalAlignment=\"Top\"\n                                      ReadOnly=\"{Binding IsChecked, ElementName=ReadOnlySelector}\"\n                                      ShowAlphaChannel=\"{Binding IsChecked, ElementName=AlphaChannelSelector}\"\n                                      ColorsShowMode=\"{Binding ColorsShowMode}\"\n                                      Color=\"#FF00B7B8\"\n                                      CustomColors=\"{Binding CustomColors2, Mode=TwoWay}\">\n                    <mxe:PopupColorEditor.PopupFooterButtons>\n                        <Binding Path=\"IsChecked\" ElementName=\"ShowConfirmationButtonsSelector\">\n                            <Binding.Converter>\n                                <mx:BoolToObjectConverter>\n                                    <mx:BoolToObjectConverter.TrueValue>\n                                        <mxe:PopupFooterButtons>OkCancel</mxe:PopupFooterButtons>\n                                    </mx:BoolToObjectConverter.TrueValue>\n                                    <mx:BoolToObjectConverter.FalseValue>\n                                        <mxe:PopupFooterButtons>None</mxe:PopupFooterButtons>\n                                    </mx:BoolToObjectConverter.FalseValue>\n                                </mx:BoolToObjectConverter>\n                            </Binding.Converter>\n                        </Binding>\n                    </mxe:PopupColorEditor.PopupFooterButtons>\n                </mxe:PopupColorEditor>\n                <mxe:ColorEditor x:Name=\"ColorEditor\" VerticalAlignment=\"Top\"\n                                 ReadOnly=\"{Binding IsChecked, ElementName=ReadOnlySelector}\"\n                                 ShowAlphaChannel=\"{Binding IsChecked, ElementName=AlphaChannelSelector}\"\n                                 ColorsShowMode=\"{Binding ColorsShowMode}\"\n                                 ShowConfirmationButtons=\"{Binding IsChecked, ElementName=ShowConfirmationButtonsSelector}\"\n                                 Color=\"#FF37C47F\"\n                                 CustomColors=\"{Binding CustomColors1, Mode=TwoWay}\"/>\n            <Grid Grid.Column=\"2\" RowDefinitions=\"Auto, Auto\" ColumnDefinitions=\"Auto, *\" MinWidth=\"135\">\n                <Border Height=\"40\" Width=\"40\" VerticalAlignment=\"Top\" HorizontalAlignment=\"Left\"\n                        CornerRadius=\"{StaticResource EditorCornerRadius}\"\n                        BorderThickness=\"{StaticResource EditorBorderThickness}\"\n                        BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\"\n                        Background=\"{Binding Color, ElementName=ColorEditor, Converter={mxei:SolidColorBrushConverter}}\"/>\n                <Label Grid.Column=\"1\" Margin=\"{StaticResource leftGroupMargin}\" VerticalAlignment=\"Center\"\n                       Content=\"{Binding Color, ElementName=ColorEditor}\"/>\n            </Grid>\n            <Grid Grid.Row=\"2\" Grid.Column=\"2\" RowDefinitions=\"Auto, Auto\" ColumnDefinitions=\"Auto, *\" MinWidth=\"135\">\n                <Border Height=\"40\" Width=\"40\" VerticalAlignment=\"Top\" HorizontalAlignment=\"Left\"\n                        Background=\"{Binding Color, ElementName=PopupColorEditor, Converter={mxei:SolidColorBrushConverter}}\"\n                        CornerRadius=\"{StaticResource EditorCornerRadius}\"\n                        BorderThickness=\"{StaticResource EditorBorderThickness}\"\n                        BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\"/>\n                <Label Grid.Column=\"1\" Margin=\"{StaticResource leftGroupMargin}\" VerticalAlignment=\"Center\"\n                       Content=\"{Binding Color, ElementName=PopupColorEditor}\"/>\n            </Grid>\n        </Grid>\n        </ContentControl>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <StackPanel>\n                    <mxe:CheckEditor x:Name=\"AlphaChannelSelector\" Content=\"Use Alpha Channel\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"ReadOnlySelector\" Content=\"Read Only\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"StandardColorsSelector\" Content=\"Show Standard Colors\" IsChecked=\"{Binding ShowStandardColors, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"CustomColorsSelector\" Content=\"Show Custom Colors\" IsChecked=\"{Binding ShowCustomColors, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"ShowConfirmationButtonsSelector\" Content=\"Show Confirmation Buttons\"\n                                     IsEnabled=\"{Binding IsChecked, ElementName=CustomColorsSelector}\" Classes=\"PropertyEditor\"/>\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/ColorEditorPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class ColorEditorPageView : UserControl\n    {\n        public ColorEditorPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/ComboBoxEditorPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.ComboBoxEditorPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"800\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:ComboBoxEditorPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:ComboBoxEditorPageViewModel />\n    </Design.DataContext>\n\n    <UserControl.Styles>\n        <Style Selector=\"Label.ViewName\">\n            <Setter Property=\"VerticalAlignment\" Value=\"Bottom\"/>\n            <Setter Property=\"Margin\" Value=\"6,0,6,4\"/>\n        </Style>\n    </UserControl.Styles>\n    <UserControl.Resources>\n        <DataTemplate x:Key=\"ElementItemTemplate\">\n            <Grid>\n                <Grid.ColumnDefinitions>\n                    <ColumnDefinition Width=\"Auto\"/>\n                    <ColumnDefinition Width=\"*\"/>\n                </Grid.ColumnDefinitions>\n                <Image Width=\"16\" Height=\"16\" Source=\"{Binding Icon}\"/>\n                <TextBlock VerticalAlignment=\"Center\" TextTrimming=\"CharacterEllipsis\" Grid.Column=\"1\" Margin=\"6,0,0,0\" Text=\"{Binding Name}\"/>\n            </Grid>\n        </DataTemplate>\n    </UserControl.Resources>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n        <Grid RowDefinitions=\"Auto, Auto, 80, Auto, 80, Auto, 80, Auto\" Width=\"250\"\n              Margin=\"30\"\n              HorizontalAlignment=\"Center\">\n\n            <Label Content=\"Simple view (string data source)\" Grid.Row=\"0\" Classes=\"ViewName\"/>\n            <mxe:ComboBoxEditor x:Name=\"SimpleViewComboBox\"\n                                ItemsSource=\"{x:Static data:CsvSources.YachtNames}\"\n                                EditorValue=\"{Binding YachtValue, Mode=TwoWay}\"\n                                IsTextEditable=\"True\"\n                                Grid.Row=\"1\"\n                                Classes=\"LayoutItem\"/>\n            <Label Content=\"Text editing enabled\" Grid.Row=\"2\" Classes=\"ViewName\"/>\n            <mxe:ComboBoxEditor x:Name=\"EditableViewComboBox\"\n                                ItemsSource=\"{Binding Elements}\"\n                                Grid.Row=\"3\"\n                                SelectedItem=\"{Binding SelectedElement}\"\n                                ItemTemplate=\"{StaticResource ElementItemTemplate}\"\n                                AutoComplete=\"{Binding #AutoCompleteSelector.IsChecked}\"\n                                FilterCondition=\"{Binding EditableViewFilterCondition}\"\n                                DisplayMember=\"Name\"\n                                IsTextEditable=\"True\"\n                                Classes=\"LayoutItem\"/>\n            <Label Content=\"Text editing disabled\" Grid.Row=\"4\" Classes=\"ViewName\"/>\n            <mxe:ComboBoxEditor x:Name=\"NonEditableComboBox\"\n                                ItemsSource=\"{Binding Elements}\"\n                                Grid.Row=\"5\"\n                                SelectedItem=\"{Binding SelectedElement}\"\n                                ItemTemplate=\"{StaticResource ElementItemTemplate}\"\n                                ApplyItemTemplateToEditBox=\"{Binding #ShowApplyItemTemplateToEditBoxSelector.IsChecked}\"\n                                DisplayMember=\"Name\"\n                                ReadOnly=\"{Binding #ReadOnlySelector.IsChecked}\"\n                                ShowPredefinedSelectItem=\"{Binding #ShowUnselectSelector.IsChecked}\"\n                                Classes=\"LayoutItem\"/>\n            <Label Content=\"Multi-select mode\" Grid.Row=\"6\" Classes=\"ViewName\"/>\n            <mxe:ComboBoxEditor x:Name=\"MultiSelectComboBox\"\n                                ItemsSource=\"{Binding Mechs}\"\n                                DisplayMember=\"Name\"\n                                Grid.Row=\"7\"\n                                SelectedItems=\"{Binding SelectedMechs}\"\n                                SelectionMode=\"Multiple\"\n                                ShowPredefinedSelectItem=\"{Binding #ShowSelectAllSelector.IsChecked}\"\n                                SeparatorString=\"{Binding SelectedSeparator}\"\n                                Classes=\"LayoutItem\"/>            \n        </Grid>\n        </ContentControl>\n            <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Simple view\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <Label Content=\"Selected Item\" Classes=\"TopPropertyLabel\" Grid.Row=\"0\"/>\n                    <mxe:TextEditor Grid.Row=\"1\" EditorValue=\"{Binding #SimpleViewComboBox.SelectedItem}\" ReadOnly=\"True\" Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Editor Value\" Classes=\"PropertyLabel\" Grid.Row=\"2\"/>\n                    <mxe:TextEditor Grid.Row=\"3\" EditorValue=\"{Binding #SimpleViewComboBox.EditorValue}\" ReadOnly=\"True\" Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"Text editing enabled\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"AutoCompleteSelector\" Content=\"Auto-Complete\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"1\" Content=\"Filter\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor Grid.Row=\"2\" x:Name=\"FilerSelector\" EditorValue=\"{Binding #EditableViewComboBox.FilterCondition, Mode=TwoWay}\"\n                                        ItemsSource=\"{mx:EnumItemsSource EnumType=mxe:FilterCondition}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"3\" Content=\"Display Member\" Classes=\"PropertyLabel\"/>\n                    <mxe:TextEditor Grid.Row=\"4\" EditorValue=\"Name\" IsEnabled=\"False\" Classes=\"PropertyEditor\"/>\n                </Grid>                    \n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"None-editable view\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor Grid.Row=\"0\" x:Name=\"ShowApplyItemTemplateToEditBoxSelector\" Content=\"Apply ItemTemplate\" IsChecked=\"True\"  Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"1\" x:Name=\"ShowUnselectSelector\" Content=\"Show 'Unselect' in Popup\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"2\" x:Name=\"ReadOnlySelector\" Content=\"Read Only\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"3\" Content=\"Editor Value\" Classes=\"PropertyLabel\"/>\n                    <ContentControl Grid.Row=\"4\" Content=\"{Binding #NonEditableComboBox.EditorValue}\" \n                                    ContentTemplate=\"{StaticResource ElementItemTemplate}\"\n                                    Classes=\"ContentViewer\" />\n                </Grid>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"Multi-select mode\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"ShowSelectAllSelector\" Content=\"Show 'Select All' in Popup\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"1\" Content=\"Separator\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor Grid.Row=\"2\" x:Name=\"SeparatorSelector\" EditorValue=\"{Binding SelectedSeparator, Mode=TwoWay}\"\n                                        ItemsSource=\"{Binding Separators}\" Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>          \n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/ComboBoxEditorPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class ComboBoxEditorPageView : UserControl\n    {\n        public ComboBoxEditorPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/DateEditorPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.DateEditorPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"550\"\n             d:DesignWidth=\"1000\"\n             x:DataType=\"vm:DateEditorPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:DateEditorPageViewModel />\n\t</Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n                        <Grid RowDefinitions=\"Auto, Auto\" ColumnDefinitions=\"Auto, 26, Auto\"\n                              Margin=\"30\"\n                          IsEnabled=\"{Binding #IsEnabledSelector.IsChecked}\">\n                        <Label Content=\"Date Editor\" Classes=\"EditorHeader\"/>\n                        <mxe:DateEditor x:Name=\"DateEditor\" HorizontalAlignment=\"Stretch\"\n                                        FirstDayOfWeek=\"Monday\"\n                                        ShowToday=\"{Binding #ShowTodaySelector.IsChecked}\" \n                                        NullValueButtonPosition=\"{Binding NullValueButtonPosition}\"\n                                        IsTextEditable=\"{Binding #IsTextEditableSelector.IsChecked}\"\n                                        MinValue=\"{Binding Minimum}\"\n                                        DateTime=\"{Binding Current, Mode=TwoWay}\"\n                                        MaxValue=\"{Binding Maximum}\"\n                                        Mask=\"{Binding SelectedTextFormat}\"\n                                        Margin=\"0,8\"\n                                        Width=\"256\"\n                                        VerticalAlignment=\"Top\"\n                                        Grid.Row=\"1\"/>\n                        <Label Content=\"Calendar\" Grid.Row=\"0\" Grid.Column=\"2\" Classes=\"EditorHeader\"/>\n                        <mxe:CalendarControl FirstDayOfWeek=\"Monday\"\n                                             IsTodayHighlighted=\"{Binding #ShowTodaySelector.IsChecked}\"\n                                             DisplayDateStart=\"{Binding Minimum}\"\n                                             DisplayDateEnd=\"{Binding Maximum}\"\n                                             SelectedDate=\"{Binding Current, Mode=TwoWay}\"\n                                             Margin=\"0,8\"\n                                             Grid.Column=\"2\"\n                                             Grid.Row=\"1\"/>\n                    </Grid>\n            </ContentControl>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Enabled\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"1\" x:Name=\"IsTextEditableSelector\" Content=\"Is Text Editable\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"2\" x:Name=\"ShowTodaySelector\" Content=\"Highlight Today Date\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"3\" x:Name=\"ShowNullValueButtonSelector\" Content=\"Show Clear Button in Popup\" IsChecked=\"{Binding ShowNullButton, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"4\" Content=\"Date\" Classes=\"PropertyLabel\"/>\n                    <mxe:TextEditor Grid.Row=\"5\" x:Name=\"DateTimeValueViewer\" MaskType=\"DateTime\" Mask=\"d\" ReadOnly=\"True\" EditorValue=\"{Binding #DateEditor.DateTime}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"6\" Content=\"Maximum\" Classes=\"PropertyLabel\" />\n                    <mxe:DateEditor Grid.Row=\"7\" x:Name=\"MaximumValueEditor\" DateTime=\"{Binding Maximum, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"8\" Content=\"Minimum\" Classes=\"PropertyLabel\" />\n                    <mxe:DateEditor Grid.Row=\"9\" x:Name=\"MinimumValueEditor\" DateTime=\"{Binding Minimum, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"10\" Content=\"Mask\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor Grid.Row=\"11\" x:Name=\"ProgressTextFormatSelector\" HorizontalContentAlignment=\"Left\"\n                                            ItemsSource=\"{Binding Formats}\" IsTextEditable=\"False\"\n                                            SelectedItem=\"{Binding SelectedTextFormat, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/DateEditorPageView.axaml.cs",
    "content": "using System;\nusing System.Globalization;\n\nusing Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class DateEditorPageView : UserControl\n    {\n        public DateEditorPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/EditorsGroupView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.EditorsGroupView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Controls.Common;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxpg=\"clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxdg=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataGrid;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxb=\"clr-namespace:Eremex.AvaloniaUI.Controls.Bars;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxu=\"clr-namespace:Eremex.AvaloniaUI.Controls.Utils;assembly=Eremex.Avalonia.Controls\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:view=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"800\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:EditorsGroupViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:EditorsGroupViewModel />\n\t</Design.DataContext>\n\n    <TextBlock VerticalAlignment=\"Center\"\n               HorizontalAlignment=\"Center\"\n               FontSize=\"16\"\n               Text=\"See product pages for details.\"/>  \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/EditorsGroupView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class EditorsGroupView : UserControl\n    {\n        public EditorsGroupView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/EditorsOverviewPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.EditorsOverviewPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"800\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:EditorsOverviewPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:EditorsOverviewPageViewModel />\n\t</Design.DataContext>\n\n    <UserControl.Styles>\n        <Style Selector=\"Label.EditorName\">\n            <Setter Property=\"VerticalAlignment\" Value=\"Bottom\"/>\n            <Setter Property=\"Margin\" Value=\"6,0,6,4\"/>\n        </Style>\n    </UserControl.Styles>\n    <UserControl.Resources>\n        <DataTemplate x:Key=\"ElementItemTemplate\">\n            <Grid>\n                <Grid.ColumnDefinitions>\n                    <ColumnDefinition Width=\"Auto\"/>\n                    <ColumnDefinition Width=\"*\"/>\n                </Grid.ColumnDefinitions>\n                <Image Width=\"16\" Height=\"16\" Source=\"{Binding Icon}\"/>\n                <TextBlock VerticalAlignment=\"Center\" Grid.Column=\"1\" Margin=\"6,0,0,0\" Text=\"{Binding Path=Name}\"/>\n            </Grid>\n        </DataTemplate>\n    </UserControl.Resources>\n   \n    <Grid Width=\"640\" Height=\"640\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Top\" x:Name=\"DemoControl\">\n        <Grid RowDefinitions=\"*, Auto, *, Auto, *, Auto, *, Auto\" ColumnDefinitions=\"150, 150, 40, 150, 150\" ShowGridLines=\"False\">\n            <Border Grid.Column=\"2\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\" Grid.RowSpan=\"7\" Margin=\"20, -30, -10, -10\" \n                    Background=\"{DynamicResource Fill/Neutral/Secondary/Enabled}\"\n                    CornerRadius=\"6,200,200,6\" />\n            <Label Content=\"TextEditor\" Grid.Column=\"1\" Classes=\"EditorName\"/>\n            <mxe:TextEditor Grid.Row=\"1\" Grid.Column=\"1\" Classes=\"LayoutItem\" Watermark=\"Search text\"/>\n            \n            <Label Content=\"ButtonEditor\" Grid.Column=\"3\" Classes=\"EditorName\"/>\n            <mxe:ButtonEditor Grid.Row=\"1\" Grid.Column=\"3\" EditorValue=\"Capacitor\" Classes=\"LayoutItem secondary\">\n                <mxe:ButtonEditor.Buttons>\n                    <mxe:ButtonSettings ToolTip.Tip=\"Undo\" Glyph=\"{x:Static mxi:Basic.Undo}\"/>\n                    <mxe:ButtonSettings ToolTip.Tip=\"Redo\" Glyph=\"{x:Static mxi:Basic.Redo}\"/>\n                </mxe:ButtonEditor.Buttons>\n            </mxe:ButtonEditor>\n\n            <Label Content=\"ComboBoxEditor\" Grid.Column=\"0\" Grid.Row=\"2\" Classes=\"EditorName\"/>\n            <mxe:ComboBoxEditor Grid.Column=\"0\" Grid.Row=\"3\" ApplyItemTemplateToEditBox=\"True\"\n                                ItemsSource=\"{Binding Elements}\"\n                                SelectedItem=\"{Binding SelectedItem}\"\n                                ItemTemplate=\"{StaticResource ElementItemTemplate}\"\n                                Classes=\"LayoutItem\"/>\n\n            <Label Content=\"SpinEditor\" Grid.Column=\"4\" Grid.Row=\"2\" Classes=\"EditorName\"/>\n            <mxe:SpinEditor Grid.Column=\"4\" Grid.Row=\"3\" Value=\"120\" Prefix=\"R=\" Suffix=\"Ohm\" Classes=\"LayoutItem secondary\"/>\n\n            <Label Content=\"PopupColorEditor\" Grid.Column=\"0\" Grid.Row=\"4\" Classes=\"EditorName\"/>\n            <mxe:PopupColorEditor Grid.Column=\"0\" Grid.Row=\"5\" Color=\"#FF37C47F\" Classes=\"LayoutItem\"/>\n\n            <Label Content=\"DateEditor\" Grid.Column=\"4\" Grid.Row=\"4\" Classes=\"EditorName\"/>\n            <mxe:DateEditor Grid.Column=\"4\" Grid.Row=\"5\" DateTime=\"{Binding SelectedDate}\" Classes=\"LayoutItem secondary\"/>\n\n            <Label Content=\"SegmentedEditor\" Grid.Column=\"3\" Grid.Row=\"6\" Classes=\"EditorName\"/>\n            <mxe:SegmentedEditor Grid.Column=\"3\" Grid.Row=\"7\" ItemsSource=\"{mx:EnumItemsSource EnumType=data:GraphicView, ShowImages=True, ShowNames=False, ImageSize='16,16'}\"\n                                 EditorValue=\"{Binding GraphicView}\"\n                                 Classes=\"LayoutItem  secondary\"/>\n\n            <Label Content=\"HyperlinkEditor\" Grid.Column=\"1\" Grid.Row=\"6\" Classes=\"EditorName\"/>\n            <mxe:HyperlinkEditor Grid.Column=\"1\" Grid.Row=\"7\" EditorValue=\"www.eremex.ru\" Command=\"{Binding ShowPageCommand}\" \n                                 CommandParameter=\"www.eremex.ru\" Classes=\"LayoutItem\"/>\n\n            <Label Grid.Row=\"4\" Grid.Column=\"1\" Grid.ColumnSpan=\"3\" Content=\"See product pages for details\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" FontSize=\"16\" Margin=\"0,16,0,0\"/>\n            <Label Grid.Row=\"2\" Grid.Column=\"3\" Grid.ColumnSpan=\"2\" Content=\"Secondary view\" \n                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" FontSize=\"24\"\n                   Foreground=\"{DynamicResource Fill/Neutral/Primary/Enabled}\"/>\n        </Grid>\n    </Grid>    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/EditorsOverviewPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class EditorsOverviewPageView : UserControl\n    {\n        public EditorsOverviewPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/EnumSourcePageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.EnumSourcePageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:view=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"600\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:EnumSourcePageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:EnumSourcePageViewModel />\n\t</Design.DataContext>\n\n\n\t<ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\" BorderThickness=\"0\">\n\t\t<Grid RowDefinitions=\"Auto, 20, Auto\" Margin=\"30\" HorizontalAlignment=\"Center\" Width=\"560\">\n\t\t\t<mxe:GroupBox Header=\"ComboBox Editor\">\n\t\t\t\t<Grid ColumnDefinitions=\"3*, 20, *\" RowDefinitions=\"*, Auto\">\n\t\t\t\t\t<mxe:ComboBoxEditor x:Name=\"ComboBoxSelector\" ItemsSource=\"{mx:EnumItemsSource EnumType=data:GraphicPosition, ShowImages=True, ImageSize='32,32'}\"\n\t\t\t\t\t\t\t\t\t\tEditorValue=\"{Binding GraphicPosition}\" VerticalAlignment=\"Center\" Grid.RowSpan=\"2\"/>\n\t\t\t\t\t<Image Grid.Column=\"2\" Width=\"96\" Height=\"96\" Source=\"{Binding SelectedItem.Image, ElementName=ComboBoxSelector}\"/>\n\t\t\t\t\t<Label Grid.Row=\"1\" Grid.Column=\"2\" Content=\"{Binding SelectedItem.Name, ElementName=ComboBoxSelector}\" FontWeight=\"Bold\" Classes=\"LayoutItem\" HorizontalAlignment=\"Center\"/>\n\t\t\t\t</Grid>\n\t\t\t</mxe:GroupBox>\n\t\t\t<mxe:GroupBox Grid.Row=\"2\" Header=\"Segmented Editor\">\n\t\t\t\t<Grid ColumnDefinitions=\"3*, 20, *\" RowDefinitions=\"*, Auto\">\n\t\t\t\t\t<mxe:SegmentedEditor x:Name=\"SegmentedEditorSelector\" EditorValue=\"{Binding GraphicView}\"\n\t\t\t\t\t\t\t\t\t\t ItemsSource=\"{mx:EnumItemsSource EnumType=data:GraphicView, ShowImages=True, ShowNames=False, ImageSize='32,32', NameToDescriptionConverter={view:EnumDescriptionConverter}}\"\n\t\t\t\t\t\t\t\t\t\t VerticalAlignment=\"Center\" Grid.RowSpan=\"2\"/>\n\t\t\t\t\t<Image Grid.Column=\"2\" Width=\"96\" Height=\"96\" Source=\"{Binding SelectedItem.Image, ElementName=SegmentedEditorSelector}\"/>\n\t\t\t\t\t<Label Grid.Row=\"1\" Grid.Column=\"2\" Content=\"{Binding SelectedItem.Name, ElementName=SegmentedEditorSelector}\" FontWeight=\"Bold\" Classes=\"LayoutItem\" HorizontalAlignment=\"Center\"/>\n\t\t\t\t</Grid>\n\t\t\t</mxe:GroupBox>\n\t\t</Grid>\n\t</ContentControl>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/EnumSourcePageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing DemoCenter.DemoData;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DemoCenter.Views\n{\n    public partial class EnumSourcePageView : UserControl\n    {\n        public EnumSourcePageView()\n        {\n            InitializeComponent();\n        }\n    }\n\n    public class EnumDescriptionConverter : MarkupExtension, IValueConverter\n    {\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            return this;\n        }\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            var type = value?.GetType();\n            var text = value?.ToString();\n            if (type == null || !type.IsEnum || string.IsNullOrEmpty(text))\n                return null;\n            return $\"{type.Name}_{text}\";\n        }\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/HyperlinkEditorPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.HyperlinkEditorPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"500\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:HyperlinkEditorPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:HyperlinkEditorPageViewModel />\n    </Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\" BorderThickness=\"0\">\n            <Grid RowDefinitions=\"40, 40, 40, Auto\"\n              ColumnDefinitions=\"20, Auto, *\"\n              HorizontalAlignment=\"Center\"\n              Margin=\"30\">           \n            <Label Classes=\"LayoutItem\" Content=\"Web Page Link:\" VerticalAlignment=\"Center\" Grid.Column=\"1\"/>\n            <mxe:HyperlinkEditor Text=\"Eremex link\" EditorValue=\"www.eremex.ru\" NavigationUrlFormat=\"https://{0}\" VerticalAlignment=\"Center\" \n                                 AllowAutoNavigate=\"True\" Classes=\"LayoutItem\" Grid.Column=\"2\"/>\n\n            <Label Classes=\"LayoutItem\" Content=\"Demo Link:\" Grid.Row=\"1\" VerticalAlignment=\"Center\" Grid.Column=\"1\"/>\n            <mxe:HyperlinkEditor EditorValue=\"ComboBox Editor module\" ShowNavigationUrlToolTip=\"False\" Command=\"{Binding ShowDemoCommand}\" VerticalAlignment=\"Center\"\n                                 CommandParameter=\"ComboBox Editor\" Classes=\"LayoutItem\" Grid.Column=\"2\" Grid.Row=\"1\"/>\n            \n            <mxdg:DataGridControl x:Name=\"materialsGrid\"\n                                  Grid.Row=\"3\"\n                                  Grid.ColumnSpan=\"3\"\n                                  Width=\"580\"\n                                  ShowGroupPanel=\"False\"\n                                  AllowSorting=\"False\"\n                                  AllowEditing=\"False\"\n                                  BorderThickness=\"1\"\n                                  ItemsSource=\"{Binding Yachts}\">\n                <mxdg:GridColumn FieldName=\"Name\" Width=\"*\"/>\n                <mxdg:GridColumn FieldName=\"CruisingRange\" Header=\"Cruising Range\" Width=\"*\">\n                    <mxdg:GridColumn.EditorProperties>\n                        <mxe:SpinEditorProperties Increment=\"100\" Suffix=\"miles\" HorizontalContentAlignment=\"Right\"/>\n                    </mxdg:GridColumn.EditorProperties>\n                </mxdg:GridColumn>\n                <mxdg:GridColumn FieldName=\"Flag\" Width=\"*\"/>\n                <mxdg:GridColumn FieldName=\"Details\" Width=\"Auto\" \n                                 AllowEditing=\"True\" >\n                    <mxdg:GridColumn.EditorProperties>\n                        <mxe:HyperlinkEditorProperties DisplayMember=\"Header\" NavigationUrlMember=\"Link\" AllowAutoNavigate=\"True\" />\n                    </mxdg:GridColumn.EditorProperties>\n                </mxdg:GridColumn>\n            </mxdg:DataGridControl>\n        </Grid>\n        </ContentControl>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/HyperlinkEditorPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.VisualTree;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views\n{\n    public partial class HyperlinkEditorPageView : UserControl\n    {\n\n        HyperlinkEditorPageViewModel ViewModel { get; set; }\n        public HyperlinkEditorPageView()\n        {\n            InitializeComponent();\n        }\n\n        protected override void OnDataContextChanged(EventArgs e)\n        {\n            base.OnDataContextChanged(e);\n            UnsubscribeEvents(ViewModel);\n            ViewModel = DataContext as HyperlinkEditorPageViewModel;\n            SubscribeEvents(ViewModel);\n        }\n\n        private void SubscribeEvents(HyperlinkEditorPageViewModel viewModel)\n        {\n            if (viewModel == null)\n                return;\n            viewModel.SelectDemo += OnViewModelSelectDemo;\n        }\n\n        private void UnsubscribeEvents(HyperlinkEditorPageViewModel viewModel)\n        {\n            if (viewModel == null)\n                return;\n            viewModel.SelectDemo -= OnViewModelSelectDemo;\n        }\n\n        private void OnViewModelSelectDemo(string moduleName)\n        {\n            if(this.GetVisualAncestors().FirstOrDefault(x => x is MainView) is MainView view)\n                (view.DataContext as MainViewModel)?.SelectProduct(moduleName);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/MemoEditorPageView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:viewModels=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.MemoEditorPageView\">\n    <Design.DataContext>\n\t\t<viewModels:MemoEditorPageViewModel />\n\t</Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n                        <Grid RowDefinitions=\"Auto, Auto\" ColumnDefinitions=\"Auto, 26, Auto\"\n                              Margin=\"30\"\n                          IsEnabled=\"{Binding #IsEnabledSelector.IsChecked}\">\n                        <Label Content=\"Memo Editor\" Classes=\"EditorHeader\"/>\n                        <mxe:MemoEditor x:Name=\"DateEditor\" HorizontalAlignment=\"Stretch\"\n                                        IsTextEditable=\"{Binding #IsTextEditableSelector.IsChecked}\"\n                                        MemoTextWrapping=\"{Binding #WordWrapCheck.IsChecked}\"\n                                        ShowSizeGrip=\"{Binding #ShowSizeGripCheck.IsChecked}\"\n                                        ShowIcon=\"{Binding #ShowIconCheck.IsChecked }\"\n                                        MemoHorizontalScrollBarVisibility=\"{Binding HorizontalScrollbarVisibility}\"\n                                        MemoVerticalScrollBarVisibility=\"{Binding VerticalScrollbarVisibility}\"\n                                        Margin=\"0,8\"\n                                        Width=\"256\"\n                                        PopupMinWidth=\"200\"\n                                        PopupWidth=\"300\"\n                                        PopupMinHeight=\"200\"\n                                        PopupHeight=\"350\"\n                                        PopupMaxHeight=\"3920\"\n                                        VerticalAlignment=\"Top\"\n                                        EditorValue=\"{Binding Text}\"\n                                        Grid.Row=\"1\"/>\n                    </Grid>\n            </ContentControl>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <StackPanel>\n                    <mxe:CheckEditor x:Name=\"WordWrapCheck\" Content=\"Word Wrap\" IsChecked=\"False\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"IsTextEditableSelector\" Content=\"Is Text Editable\" IsChecked=\"False\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"ShowSizeGripCheck\" Content=\"Popup Sizeable\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor x:Name=\"ShowIconCheck\" Content=\"Show Icon\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                </StackPanel>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"ScrollBars\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <Label Content=\"Horizontal\" Classes=\"TopPropertyLabel\"/>\n                    <mxe:ComboBoxEditor x:Name=\"HorizontalScrollbarVisibilityCombo\" Grid.Row=\"1\"\n                                        ItemsSource=\"{Binding ScrollbarVisibilityItems}\" IsTextEditable=\"False\"\n                                        SelectedItem=\"{Binding HorizontalScrollbarVisibility, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Vertical\" Grid.Row=\"2\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor x:Name=\"VerticalScrollbarVisibilityCombo\" Grid.Row=\"3\"\n                                        ItemsSource=\"{Binding ScrollbarVisibilityItems}\" IsTextEditable=\"False\"\n                                        SelectedItem=\"{Binding VerticalScrollbarVisibility, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/MemoEditorPageView.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Eremex.AvaloniaUI.Controls.Editors;\n\nnamespace DemoCenter.Views;\n\npublic partial class MemoEditorPageView : UserControl\n{\n    public MemoEditorPageView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/SegmentedEditorPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.SegmentedEditorPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:view=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"600\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:SegmentedEditorPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:SegmentedEditorPageViewModel />\n    </Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\" BorderThickness=\"0\">\n            <Border>\n                <Border.Background>\n                    <MultiBinding Converter=\"{view:SegmentedEditorViewBackgroundConverter}\">\n                        <Binding Path=\"EditorValue\" ElementName=\"ViewTypesSelector\"/>\n                        <DynamicResourceExtension ResourceKey=\"TransparentBrush\"/>\n                        <DynamicResourceExtension ResourceKey=\"Fill/Neutral/Secondary/Enabled\"/>\n                    </MultiBinding>\n                </Border.Background>\n                <Grid RowDefinitions=\"Auto, 30, Auto, 30, Auto, Auto\" ColumnDefinitions=\"300, *, 200\" Width=\"560\" Margin=\"30\">\n                    <mxe:SegmentedEditor x:Name=\"GraphicViewSelector\" EditorValue=\"{Binding GraphicView}\"\n                                         ItemsSource=\"{mx:EnumItemsSource EnumType=data:GraphicView, ShowImages=True, ShowNames=False, ImageSize='32,32', NameToDescriptionConverter={view:EnumDescriptionConverter}}\"\n                                         Grid.ColumnSpan=\"3\"/>\n                    <Border x:Name=\"ImageBorder\" Grid.Row=\"2\" Grid.ColumnSpan=\"3\" BorderThickness=\"{StaticResource EditorBorderThickness}\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n                        <Image Grid.Column=\"2\" HorizontalAlignment=\"Stretch\" Width=\"96\" Height=\"96\" Source=\"{Binding SelectedItem.Image, ElementName=GraphicViewSelector}\"/>\n                    </Border>\n                    <Label Content=\"Horizontal Alignment:\" Grid.Row=\"4\" Classes=\"LayoutItem\"/>\n                    <mxe:SegmentedEditor x:Name=\"HorizontalAlignmentSelector\" Grid.Row=\"5\" EditorValue=\"{Binding HorizontalAlignment, ElementName=ImageBorder, Mode=TwoWay}\"\n                                         ItemsSource=\"{mx:EnumItemsSource EnumType=HorizontalAlignment}\" Classes=\"LayoutItem\"/>\n                    <Label Content=\"View Type:\" Grid.Row=\"4\" Grid.Column=\"2\" Classes=\"LayoutItem\"/>\n                    <mxe:SegmentedEditor x:Name=\"ViewTypesSelector\" Grid.Row=\"5\" Grid.Column=\"2\"\n                                         Classes=\"LayoutItem\"\n                                         EditorValue=\"{Binding SelectedViewType, Mode=TwoWay}\"\n                                         ItemsSource=\"{Binding ViewTypes}\"/>\n                </Grid>\n            </Border>\n        </ContentControl>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/SegmentedEditorPageView.axaml.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Globalization;\nusing System.Linq;\n\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Media;\n\nusing DemoCenter.DemoData;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views\n{\n    public partial class SegmentedEditorPageView : UserControl\n    {\n        SegmentedEditorPageViewModel ViewModel { get; set; }\n        public SegmentedEditorPageView()\n        {\n            InitializeComponent();\n        }\n\n        protected override void OnDataContextChanged(EventArgs e)\n        {\n            base.OnDataContextChanged(e);\n            UnsubscribeEvents(ViewModel);\n            ViewModel = DataContext as SegmentedEditorPageViewModel;\n            SubscribeEvents(ViewModel);\n        }\n\n        private void SubscribeEvents(SegmentedEditorPageViewModel viewModel)\n        {\n            if (viewModel == null)\n                return;\n            viewModel.PropertyChanged += OnViewModelPropertyChanged;\n        }\n\n        private void UnsubscribeEvents(SegmentedEditorPageViewModel viewModel)\n        {\n            if (viewModel == null)\n                return;\n            viewModel.PropertyChanged -= OnViewModelPropertyChanged;\n        }\n\n        private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)\n        {\n            if (e.PropertyName == \"SelectedViewType\" && ViewModel?.SelectedViewType != null)\n            {\n                var type = ViewModel?.SelectedViewType.ToLower();\n                if(type == \"primary\")\n                {\n                    ViewTypesSelector.Classes.Remove(\"secondary\");\n                    HorizontalAlignmentSelector.Classes.Remove(\"secondary\");\n                    GraphicViewSelector.Classes.Remove(\"secondary\");\n                } else if (type == \"secondary\" && !ViewTypesSelector.Classes.Contains(\"secondary\"))\n                {\n                    ViewTypesSelector.Classes.Add(\"secondary\");\n                    HorizontalAlignmentSelector.Classes.Add(\"secondary\");\n                    GraphicViewSelector.Classes.Add(\"secondary\");\n                }\n            }\n        }\n    }\n\n    public class SegmentedEditorViewBackgroundConverter : MarkupExtension, IMultiValueConverter\n    {\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            return this;\n        }\n        public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (values[0] == null || values[0] == AvaloniaProperty.UnsetValue || values.Count != 3)\n                return null;\n            var type = (string)values[0];\n            return (string.Equals(type, \"secondary\", StringComparison.InvariantCultureIgnoreCase)) ? values[2] : values[1];\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/SpinEditorPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.SpinEditorPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"500\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:SpinEditorPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:SpinEditorPageViewModel />\n\t</Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n            <Grid  RowDefinitions=\"Auto, 60, Auto\"\n              HorizontalAlignment=\"Center\"\n              Margin=\"30\">\n                <Grid ColumnDefinitions=\"Auto, 26, Auto\" HorizontalAlignment=\"Center\">\n                    <mxe:SpinEditor x:Name=\"SpinEditor\" Width=\"200\" Value=\"7\"\n                                Maximum=\"{Binding #MaximumValueEditor.Value}\"\n                                Minimum=\"{Binding #MinimumValueEditor.Value}\"\n                                Increment=\"{Binding #IncrementValueEditor.Value}\"\n                                IsEnabled=\"{Binding #IsEnabledSelector.IsChecked}\"\n                                ShowEditorButtons=\"{Binding #ShowButtonsSelector.IsChecked}\"\n                                Mask=\"{Binding #MaskEditor.EditorValue}\"/>\n\n                    <mxe:SpinEditor Grid.Column=\"2\" x:Name=\"PrefixSuffixSpinEditor\" Width=\"200\" Value=\"8.5\"\n                            Maximum=\"{Binding #MaximumValueEditor.Value}\"\n                            Minimum=\"{Binding #MinimumValueEditor.Value}\"\n                            Increment=\"{Binding #IncrementValueEditor.Value}\"\n                            Prefix=\"V=\" Suffix=\"m/s\"\n                            IsEnabled=\"{Binding #IsEnabledSelector.IsChecked}\"\n                            ShowEditorButtons=\"{Binding #ShowButtonsSelector.IsChecked}\"\n                            Mask=\"{Binding #MaskEditor.EditorValue}\"/>\n                </Grid>\n            \n            <mxdg:DataGridControl x:Name=\"materialsGrid\"\n                                  Grid.Row=\"2\"\n                                  Width=\"540\"\n                                  ShowGroupPanel=\"False\"\n                                  AllowSorting=\"False\"\n                                  BorderThickness=\"1\"\n                                  EditorButtonShowMode=\"ShowAlways\"\n                                  ItemsSource=\"{Binding Yachts}\">\n                <mxdg:GridColumn FieldName=\"Name\" Width=\"*\" AllowEditing=\"False\" />\n                <mxdg:GridColumn FieldName=\"Length\" Header=\"Length, ft\" Width=\"*\">\n                    <mxdg:GridColumn.EditorProperties>\n                        <mxe:SpinEditorProperties HorizontalContentAlignment=\"Right\"/>\n                    </mxdg:GridColumn.EditorProperties>\n                </mxdg:GridColumn>\n                <mxdg:GridColumn FieldName=\"MaxSpeed\" Width=\"*\" >\n                    <mxdg:GridColumn.EditorProperties>\n                        <mxe:SpinEditorProperties DisplayFormatString=\"{}{0:N1}\" Suffix=\"knots\" HorizontalContentAlignment=\"Right\" Increment=\"0.5\"/>\n                    </mxdg:GridColumn.EditorProperties>\n                </mxdg:GridColumn>\n                <mxdg:GridColumn FieldName=\"CruisingRange\" Width=\"*\" >\n                    <mxdg:GridColumn.EditorProperties>\n                        <mxe:SpinEditorProperties Increment=\"100\" Suffix=\"miles\" HorizontalContentAlignment=\"Right\"/>\n                    </mxdg:GridColumn.EditorProperties>\n                </mxdg:GridColumn>\n            </mxdg:DataGridControl>\n        </Grid>\n        </ContentControl>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Enabled\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"1\" x:Name=\"ShowButtonsSelector\" Content=\"Show Buttons\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"2\" Content=\"Value\" Classes=\"PropertyLabel\"/>\n                    <mxe:TextEditor Grid.Row=\"3\" EditorValue=\"{Binding #SpinEditor.Value}\" Classes=\"PropertyEditor\" HorizontalContentAlignment=\"Right\"/>\n                    <Label Grid.Row=\"4\" Content=\"Maximum\" Classes=\"PropertyLabel\"/>\n                    <mxe:SpinEditor Grid.Row=\"5\" x:Name=\"MaximumValueEditor\" Value=\"15\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"6\" Content=\"Minimum\" Classes=\"PropertyLabel\" />\n                    <mxe:SpinEditor Grid.Row=\"7\" x:Name=\"MinimumValueEditor\" Value=\"-15\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"8\" Content=\"Increment\" Classes=\"PropertyLabel\"/>\n                    <mxe:SpinEditor Grid.Row=\"9\" x:Name=\"IncrementValueEditor\" Value=\"1\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"10\" Content=\"Mask\" Classes=\"PropertyLabel\"/>\n                    <mxe:TextEditor Grid.Row=\"11\" x:Name=\"MaskEditor\" EditorValue=\"##.##\" Classes=\"PropertyEditor\" HorizontalContentAlignment=\"Right\"/>\n                </Grid>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"Commands\" Classes=\"PropertiesGroup\">\n                <Grid ColumnDefinitions=\"*, 16, *\">\n                    <Button Command=\"{Binding #SpinEditor.DecreaseCommand}\" ToolTip.Tip=\"Decrease\" Margin=\"0,12\" HorizontalAlignment=\"Stretch\">\n                        <Image Source=\"{x:Static mxi:_12.Chevron_Left}\" Width=\"16\" Height=\"16\"/>\n                    </Button>\n                    <Button Grid.Column=\"2\"  Command=\"{Binding #SpinEditor.IncreaseCommand}\" ToolTip.Tip=\"Increase\" Margin=\"0,12\" HorizontalAlignment=\"Stretch\">\n                        <Image Source=\"{x:Static mxi:_12.Chevron_Right}\" Width=\"16\" Height=\"16\"/>\n                    </Button>\n                </Grid>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/SpinEditorPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class SpinEditorPageView : UserControl\n    {\n        public SpinEditorPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/TextEditingPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.TextEditingPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:view=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:TextEditingPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:TextEditingPageViewModel />\n\t</Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*,250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n            <Grid RowDefinitions=\"Auto, 30, Auto, 30, Auto, 30, Auto, 30, Auto, 30, Auto\" Width=\"250\"\n              Margin=\"30\"\n              IsEnabled=\"{Binding IsChecked, ElementName=IsEnabledSelector}\">\n            \n            <mxe:TextEditor EditorValue=\"10.04.2024\" SelectionStart=\"4\" SelectionEnd=\"10\" MaskType=\"DateTime\"/>\n            <mxe:ButtonEditor Grid.Row=\"2\" EditorValue=\"ButtonEditor sample\">\n                <mxe:ButtonEditor.Buttons>\n                    <mxe:ButtonSettings ToolTip.Tip=\"Undo\" Glyph=\"{x:Static mxi:Basic.Undo}\"\n                                        Command=\"{Binding AddLogLineCommand}\" CommandParameter=\"Undo\"/>\n                    <mxe:ButtonSettings ToolTip.Tip=\"Redo\" Glyph=\"{x:Static mxi:Basic.Redo}\"\n                                        Command=\"{Binding AddLogLineCommand}\" CommandParameter=\"Redo\"/>\n                    <mxe:ButtonSettings ToolTip.Tip=\"Delete\" Glyph=\"{x:Static mxi:Basic.Remove}\"\n                                        Command=\"{Binding AddLogLineCommand}\" CommandParameter=\"Delete\"/>\n                </mxe:ButtonEditor.Buttons>\n            </mxe:ButtonEditor>\n            <mxe:ButtonEditor Grid.Row=\"4\" EditorValue=\"Text editing locker\">\n                <mxe:ButtonEditor.Buttons>\n                    <mxe:ButtonSettings ButtonKind=\"Toggle\" \n                                        Glyph=\"{Binding $parent.IsTextEditable, Converter={view:LockButtonImageConverter}}\"\n                                        IsChecked=\"{Binding !$parent.IsTextEditable}\"/>\n                </mxe:ButtonEditor.Buttons>\n            </mxe:ButtonEditor>  \n            <mxe:ButtonEditor Grid.Row=\"6\" EditorValue=\"{Binding SelectedEditor}\"\n                              IsTextEditable=\"False\"\n                              ReadOnly=\"True\"\n                              HorizontalContentAlignment=\"Center\">\n                <mxe:ButtonEditor.Buttons>\n                    <mxe:ButtonSettings ToolTip.Tip=\"Previous\" Glyph=\"{x:Static mxi:_12.Chevron_Left}\"\n                                        Command=\"{Binding ShowPreviousCommand}\" CommandParameter=\"Previous\" IsLeft=\"True\"/>\n                    <mxe:ButtonSettings ToolTip.Tip=\"Next\" Glyph=\"{x:Static mxi:_12.Chevron_Right}\"\n                                        Command=\"{Binding ShowNextCommand}\" CommandParameter=\"Next\"/>\n                </mxe:ButtonEditor.Buttons>\n            </mxe:ButtonEditor>\n            <mxe:ButtonEditor Grid.Row=\"8\" EditorValue=\"Click built-in 'x' button to clear text\" Watermark=\"Enter text to show built-in 'x' button\" \n                              NullValueButtonPosition=\"EditorBox\"/>\n            <mxe:TextEditor x:Name=\"EmptyTextEditor\" Grid.Row=\"10\" Watermark=\"Watermark text\" ValidationInfo=\"{Binding ValidationInfo}\"/>\n\n        </Grid>\n        </ContentControl>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Enabled\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"1\" x:Name=\"ShowErrorSelector\" Content=\"Show Error\" IsChecked=\"{Binding ShowError}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"2\" Content=\"Error Show Mode\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor Grid.Row=\"3\" x:Name=\"ErrorShowModeSelector\" EditorValue=\"{Binding ErrorShowMode, ElementName=EmptyTextEditor, Mode=TwoWay}\" \n                                        ItemsSource=\"{mx:EnumItemsSource EnumType=mxe:EditorErrorShowMode}\" Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"Button Click Log\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"*, Auto\">\n                    <mxe:TextEditor EditorValue=\"{Binding LogContent}\" ReadOnly=\"True\" Height=\"150\" VerticalContentAlignment=\"Top\" Classes=\"PropertyEditor\" Margin=\"0,12,0,0\"/>\n                    <Button Grid.Row=\"1\" Content=\"Clear\" Command=\"{Binding ClearLogCommand}\" HorizontalAlignment=\"Center\" Classes=\"LayoutItem\"/>\n                </Grid>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Editors/TextEditingPageView.axaml.cs",
    "content": "using System.Globalization;\n\nusing Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Eremex.AvaloniaUI.Icons;\n\nnamespace DemoCenter.Views\n{\n    public partial class TextEditingPageView : UserControl\n    {\n        public TextEditingPageView()\n        {\n            InitializeComponent();\n        }\n    }\n\n    public class LockButtonImageConverter : MarkupExtension, IValueConverter\n    {\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            return this;\n        }\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value == null)\n                return null;\n            return (bool)value ? Basic.Lock_True : Basic.Lock_False;\n        }\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Export/DemoExportHelper.cs",
    "content": "﻿using System.Diagnostics;\nusing Avalonia.Controls;\nusing Avalonia.Threading;\nusing Avalonia.VisualTree;\nusing Eremex.AvaloniaUI.Controls;\nusing Eremex.AvaloniaUI.Controls.Common;\nusing Eremex.AvaloniaUI.Controls.DataControl;\nusing Eremex.DocumentProcessing.Exports;\n\nnamespace DemoCenter.Helpers\n{\n    public static class DemoExportHelper\n    {\n        public static void Export<C, T>(C control, T options, Action<Stream, C, T> action) where T : ExportOptions where C : Control\n        {\n            var owner = control.GetVisualRoot() as Window;\n\n            try\n            {\n                var exportProgressControl = new ExportProgressControl();\n\n                MxWindow window = CreateProgressWindow();\n                window.Content = exportProgressControl;\n                window.Show(owner);\n\n                var directory = CreateTempDirectory();\n                string tmpFileName = Path.Combine(directory, typeof(C).Name + GetFileExtension());\n                using FileStream fileStream = new FileStream(tmpFileName, FileMode.Create);\n\n                options.ExportProgress += OnExportProgress;\n                action(fileStream, control, options);\n                options.ExportProgress -= OnExportProgress;\n\n                window.Close();\n\n                if (MxMessageBox.Show(owner, Resources.ExportProgressPromptMessage, Resources.ExportProgressTitle, MessageBoxButtons.YesNo, MessageBoxIcon.None) == MessageBoxResult.Yes)\n                    OpenFile(tmpFileName);\n\n                void OnExportProgress(object sender, ExportProgressEventArgs e)\n                {\n                    exportProgressControl.Value = e.ProgressPercentage;\n                    Dispatcher.UIThread.RunJobs();\n                }\n\n            }\n            catch (Exception e)\n            {\n                MxMessageBox.Show(owner, e.Message, \"Error\", MessageBoxButtons.Ok, MessageBoxIcon.Error);\n            }\n\n            string GetFileExtension()\n            {\n                return options switch { XlsxExportOptions => \".xlsx\", PageExportOptions => \".pdf\", _ => throw new NotImplementedException() };\n            }\n       }\n\n        public static void ExportImage<C>(C control, ImageExportOptions options, Action<C, ImageExportOptions, string, string> exec) where C : Control\n        {\n            var owner = control.GetVisualRoot() as Window;\n\n            try\n            {\n                var exportProgressControl = new ExportProgressControl();\n\n                MxWindow window = CreateProgressWindow();\n                window.Content = exportProgressControl;\n                window.Show(owner);\n\n                var directory = CreateTempDirectory();\n                var fileFormat = GetFileFormat();\n                var pageNumber = 1;\n\n                options.PageRange = pageNumber.ToString();\n                options.ExportProgress += OnExportProgress;\n                exec(control, options, directory, fileFormat);\n                options.ExportProgress -= OnExportProgress;\n\n                window.Close();\n\n                if (MxMessageBox.Show(owner, Resources.ExportProgressPromptMessage, Resources.ExportProgressTitle, MessageBoxButtons.YesNo, MessageBoxIcon.None) == MessageBoxResult.Yes)\n                {\n                    var fileName = Path.Combine(directory, string.Format(fileFormat, pageNumber));\n                    OpenFile(fileName);\n                }\n\n                void OnExportProgress(object sender, ExportProgressEventArgs e)\n                {\n                    exportProgressControl.Value = e.ProgressPercentage;\n                    Dispatcher.UIThread.RunJobs();\n                }\n\n            }\n            catch (Exception e)\n            {\n                MxMessageBox.Show(owner, e.Message, \"Error\", MessageBoxButtons.Ok, MessageBoxIcon.Error);\n            }\n\n            string GetFileFormat()\n            {\n                return $\"Page{{0:D2}}.{GetFileExtension(options.Format)}\";\n            }\n\n            static string GetFileExtension(MxImageFormat format)\n            {\n                return Enum.GetName(typeof(MxImageFormat), format).ToLower();\n            }\n        }\n\n        private static string CreateTempDirectory()\n        {\n            string tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()).ToUpper();\n            Directory.CreateDirectory(tempDir);\n            return tempDir;\n        }\n\n        private static MxWindow CreateProgressWindow()\n        {\n            return new MxWindow()\n            {\n                Title = Resources.ExportProgressTitle,\n                Width = 300,\n                Height = 160,\n                WindowStartupLocation = WindowStartupLocation.CenterScreen,\n                ShowInTaskbar = false,\n                ShowCloseButton = false,\n                ShowMinimizeButton = false,\n                ShowMaximizeButton = false,\n                CanResize = false\n            };\n        }\n\n        private static void OpenFile(string fileName)\n        {\n            if (OperatingSystem.IsWindows())\n                Process.Start(new ProcessStartInfo() { FileName = fileName, UseShellExecute = true });\n            else if (OperatingSystem.IsLinux())\n                Process.Start(\"xdg-open\", fileName);\n            else if (OperatingSystem.IsMacOS())\n                Process.Start(\"open\", fileName);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Export/ExportProgressControl.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n\t\t\t xmlns:local=\"using:DemoCenter\"\n             x:Class=\"DemoCenter.ExportProgressControl\" x:Name=\"root\">\n\t<StackPanel Orientation=\"Vertical\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"> \n\t\t<TextBlock Text=\"{x:Static local:Resources.ExportProgressMessage}\" />\n\t\t<ProgressBar Margin=\"0,6\" Value=\"{Binding #root.Value}\" Height=\"16\" Maximum=\"100\" />\n\t</StackPanel>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Export/ExportProgressControl.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Newtonsoft.Json.Linq;\n\nnamespace DemoCenter;\n\npublic partial class ExportProgressControl : UserControl\n{\n    public static readonly StyledProperty<double> ValueProperty = AvaloniaProperty.Register<ExportProgressControl, double>(nameof(Value));\n\n    public double Value\n    {\n        get => GetValue(ValueProperty);\n        set => SetValue(ValueProperty, value);\n    }\n\n    public ExportProgressControl()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlCameraView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlCameraView\">\n  <Grid ColumnDefinitions=\"* 250\">\n        <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\" x:Name=\"DemoControl\" MaterialsSource=\"{Binding Materials}\" Camera=\"{Binding SelectedCamera.Camera}\" Grid.Column=\"0\">\n            <mx3d:Graphics3DControl.Models>\n                <mx3d:GeometryModel3D x:Name=\"Cube\" MeshesSource=\"{Binding Meshes}\">\n                    <mx3d:GeometryModel3D.MeshTemplate>\n                        <DataTemplate x:DataType=\"vm:MeshViewModel\">\n                            <mx3d:MeshGeometry3D Name=\"{Binding Name}\" Vertices=\"{Binding Vertices}\" Indices=\"{Binding Indices}\" MaterialKey=\"{Binding MaterialKey}\" />\n                        </DataTemplate>\n                    </mx3d:GeometryModel3D.MeshTemplate>\n                </mx3d:GeometryModel3D>\n            </mx3d:Graphics3DControl.Models>\n            \n            <mx3d:Graphics3DControl.Gizmo>\n                <mx3d:Gizmo x:Name=\"Gizmo\" />\n            </mx3d:Graphics3DControl.Gizmo>\n        </mx3d:Graphics3DControl>\n        \n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Camera\" Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <ListBox ItemsSource=\"{Binding Cameras}\" SelectedItem=\"{Binding SelectedCamera}\" Classes=\"PropertyEditor\">\n                        <ListBox.ItemTemplate>\n                            <DataTemplate x:DataType=\"vm:CameraItem\">\n                                <Label Content=\"{Binding Name}\" />\n                            </DataTemplate>\n                        </ListBox.ItemTemplate>\n                    </ListBox>\n\n                    <Label Content=\"Perspective Field Of View\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0.1\" Maximum=\"2.1\" Value=\"{Binding SelectedCamera.FieldOfView}\" IsEnabled=\"{Binding SelectedCamera.IsPerspective}\" Classes=\"PropertyEditor\" />\n\n                    <Button Command=\"{Binding ElementName=DemoControl, Path=LookCameraAtSceneCommand}\" HorizontalAlignment=\"Stretch\" Classes=\"LayoutItem\">Up\n                        <Button.CommandParameter>\n                            <mx3d:CameraPosition>Up</mx3d:CameraPosition>\n                        </Button.CommandParameter>\n                    </Button>\n                    <Button Command=\"{Binding ElementName=DemoControl, Path=LookCameraAtSceneCommand}\" HorizontalAlignment=\"Stretch\" Classes=\"LayoutItem\">Down\n                        <Button.CommandParameter>\n                            <mx3d:CameraPosition>Down</mx3d:CameraPosition>\n                        </Button.CommandParameter>\n                    </Button>\n                    <Button Command=\"{Binding ElementName=DemoControl, Path=LookCameraAtSceneCommand}\" HorizontalAlignment=\"Stretch\" Classes=\"LayoutItem\">Front\n                        <Button.CommandParameter>\n                            <mx3d:CameraPosition>Front</mx3d:CameraPosition>\n                        </Button.CommandParameter>\n                    </Button>\n\n                    <Button Command=\"{Binding ElementName=DemoControl, Path=LookCameraAtSceneCommand}\" HorizontalAlignment=\"Stretch\" Classes=\"LayoutItem\">Rear\n                        <Button.CommandParameter>\n                            <mx3d:CameraPosition>Rear</mx3d:CameraPosition>\n                        </Button.CommandParameter>\n                    </Button>\n\n                    <Button Command=\"{Binding ElementName=DemoControl, Path=LookCameraAtSceneCommand}\" HorizontalAlignment=\"Stretch\" Classes=\"LayoutItem\">Left\n                        <Button.CommandParameter>\n                            <mx3d:CameraPosition>Left</mx3d:CameraPosition>\n                        </Button.CommandParameter>\n                    </Button>\n\n                    <Button Command=\"{Binding ElementName=DemoControl, Path=LookCameraAtSceneCommand}\" HorizontalAlignment=\"Stretch\" Classes=\"LayoutItem\">Right\n                        <Button.CommandParameter>\n                            <mx3d:CameraPosition>Right</mx3d:CameraPosition>\n                        </Button.CommandParameter>\n                    </Button>\n\n                    <Button Command=\"{Binding ElementName=DemoControl, Path=LookCameraAtSceneCommand}\" HorizontalAlignment=\"Stretch\" Classes=\"LayoutItem\">IsoXYZ\n                        <Button.CommandParameter>\n                            <mx3d:CameraPosition>IsoXYZ</mx3d:CameraPosition>\n                        </Button.CommandParameter>\n                    </Button>\n\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlCameraView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlCameraView : UserControl\n{\n    public Graphics3DControlCameraView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlHighlightingView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:views=\"using:DemoCenter.Views\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlHighlightingView\"\n             x:DataType=\"vm:Graphics3DControlHighlightingViewModel\">\n    <UserControl.Resources>\n        <views:MeshSelector x:Key=\"MeshSelector\" />\n    </UserControl.Resources>\n    <Grid ColumnDefinitions=\"* 270\">\n        <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\"\n                                x:Name=\"DemoControl\"\n                                ShowHints=\"True\"\n                                ModelsSource=\"{Binding Models}\"\n                                HighlightMode=\"Mesh\"\n                                SelectionMode=\"Mesh\"\n                                HighlightedElement=\"{Binding HighlightedElement, Mode=TwoWay}\"\n                                SelectedElement=\"{Binding SelectedElement, Mode=TwoWay}\"\n                                Grid.Column=\"0\">\n        </mx3d:Graphics3DControl>\n        <StackPanel Orientation=\"Vertical\" Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid ColumnDefinitions=\"Auto *\" RowDefinitions=\"Auto Auto Auto Auto\">\n                    <Label Grid.Column=\"0\" Grid.Row=\"0\" Content=\"Highlight Mode\" VerticalAlignment=\"Center\" />\n                    <mxe:ComboBoxEditor Grid.Column=\"1\" Grid.Row=\"0\"\n                                        ItemsSource=\"{mx:EnumItemsSource EnumType=mx3d:ElementSelectionMode}\"\n                                        EditorValue=\"{Binding ElementName=DemoControl, Path=HighlightMode}\"\n                                        Margin=\"6\" VerticalAlignment=\"Center\" />\n                    <Label Grid.Column=\"0\" Grid.Row=\"1\" Content=\"Selection Mode\" VerticalAlignment=\"Center\"/>\n                    <mxe:ComboBoxEditor Grid.Column=\"1\" Grid.Row=\"1\"\n                                        ItemsSource=\"{mx:EnumItemsSource EnumType=mx3d:ElementSelectionMode}\"\n                                        EditorValue=\"{Binding ElementName=DemoControl, Path=SelectionMode}\"\n                                        Margin=\"6\" VerticalAlignment=\"Center\" />\n                    <Label Grid.Row=\"2\" Grid.Column=\"0\" Content=\"Highlight Color\" VerticalAlignment=\"Center\"/>\n                    <mxe:PopupColorEditor Grid.Row=\"2\" Grid.Column=\"1\"\n                                          Color=\"{Binding ElementName=DemoControl, Path=HighlightColor}\"\n                                          Margin=\"6\" VerticalAlignment=\"Center\" />\n                    <Label Grid.Row=\"3\" Grid.Column=\"0\" Content=\"Selection Color\" VerticalAlignment=\"Center\"/>\n                    <mxe:PopupColorEditor Grid.Row=\"3\" Grid.Column=\"1\"\n                                          Color=\"{Binding ElementName=DemoControl, Path=SelectionColor}\"\n                                          Margin=\"6\" VerticalAlignment=\"Center\" />\n                </Grid>\n            </mxe:GroupBox>\n            <mxe:GroupBox Header=\"Models\" Classes=\"PropertiesGroup\">\n                <mxtl:TreeViewControl ItemsSource=\"{Binding Models}\" \n                                      ChildrenSelector=\"{StaticResource MeshSelector}\" \n                                      AllowEditing=\"False\"\n                                      AutoExpandAllNodes=\"True\"\n                                      ShowExpandButtons=\"False\"\n                                      SelectionMode=\"Single\"\n                                      FocusedItem=\"{Binding SelectedElement, Mode=TwoWay}\"\n                                      DataFieldName=\"Hint\">\n                    <mxtl:TreeViewControl.CellTemplate>\n                        <DataTemplate>\n                            <TextBlock Text=\"{Binding Row.Hint}\"\n                                       VerticalAlignment=\"Center\"\n                                       Margin=\"0 0 4 0\">\n                                <TextBlock.FontWeight>\n                                    <MultiBinding Converter=\"{views:ModelFontWeightConverter}\">\n                                        <Binding Path=\"Row\" />\n                                        <Binding ElementName=\"DemoControl\" Path=\"HighlightedElement\" />\n                                        <Binding ElementName=\"DemoControl\" Path=\"SelectedElement\" />\n                                    </MultiBinding>\n                                </TextBlock.FontWeight>\n                                <TextBlock.Foreground>\n                                    <MultiBinding Converter=\"{views:ModelHighlightConverter}\">\n                                        <Binding Path=\"Row\" />\n                                        <Binding ElementName=\"DemoControl\" Path=\"HighlightedElement\" />\n                                        <Binding ElementName=\"DemoControl\" Path=\"HighlightColor\" />\n                                        <Binding ElementName=\"DemoControl\" Path=\"SelectedElement\" />\n                                        <Binding ElementName=\"DemoControl\" Path=\"SelectionColor\" />\n                                    </MultiBinding>\n                                </TextBlock.Foreground>\n                            </TextBlock>\n                        </DataTemplate>\n                    </mxtl:TreeViewControl.CellTemplate>\n                </mxtl:TreeViewControl>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlHighlightingView.axaml.cs",
    "content": "﻿using System.Collections;\nusing System.Globalization;\nusing Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Media;\nusing Eremex.AvaloniaUI.Controls.TreeList;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlHighlightingView : UserControl\n{\n    public Graphics3DControlHighlightingView()\n    {\n        InitializeComponent();\n    }\n}\n\npublic class MeshSelector : ITreeListChildrenSelector\n{\n    public IEnumerable SelectChildren(object item)\n    {\n        if (item is GeometryModel3D model)\n            return model.Meshes;\n        return null;\n    }\n    public bool HasChildren(object item) => item is GeometryModel3D;\n}\n\npublic class ModelFontWeightConverter : MarkupExtension, IMultiValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider) => this;\n    public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (values.Count == 3 && values[0] is SelectableElement element && (element is GeometryModel3D || element == values[1] || element == values[2]))\n                return FontWeight.Bold;\n        return FontWeight.Normal;\n    }\n}\n\npublic class ModelHighlightConverter : MarkupExtension, IMultiValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider) => this;\n    public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (values.Count == 5 && values[0] is SelectableElement element)\n        {\n            if (Equals(values[3], element) && values[4] is Color color2)\n                return new SolidColorBrush(color2);\n            if (Equals(values[1], element) && values[2] is Color color1)\n                return new SolidColorBrush(color1);\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlLightsView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlLightsView\"\n             x:CompileBindings=\"True\"\n             x:DataType=\"vm:Graphics3DControlLightsViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\"\n                                x:Name=\"DemoControl\"\n                                ShowHints=\"True\"\n                                ModelsSource=\"{Binding Models}\"\n                                MaterialsSource=\"{Binding Materials}\"\n                                LightsSource=\"{Binding Lights}\"\n                                Grid.Column=\"0\">\n            <mx3d:Graphics3DControl.LightTemplate>\n                <DataTemplate x:DataType=\"vm:LightViewModel\">\n                    <mx3d:PointLight Color=\"{Binding Color}\" Radius=\"{Binding Radius}\" Position=\"{Binding Position}\" ColorIntensity=\"{Binding ColorIntensity}\" />\n                </DataTemplate>\n            </mx3d:Graphics3DControl.LightTemplate>\n        </mx3d:Graphics3DControl>\n        <mxe:GroupBox Header=\"Lights\" Classes=\"PropertiesGroup\" Grid.Column=\"1\">\n            <ItemsControl ItemsSource=\"{Binding Lights}\">\n                <ItemsControl.ItemTemplate>\n                    <DataTemplate x:DataType=\"vm:LightViewModel\">\n                        <Grid RowDefinitions=\"Auto Auto Auto\" ColumnDefinitions=\"Auto *\">\n                            <Label Content=\"{Binding Name}\" FontWeight=\"Bold\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"2\" Classes=\"LayoutItem\"/>\n                            <Label Content=\"Radius\" Grid.Column=\"0\" Grid.Row=\"1\" Classes=\"LayoutItem\" />\n                            <Slider Grid.Column=\"1\" Grid.Row=\"1\" Minimum=\"0.1\" Maximum=\"20\" Value=\"{Binding Radius}\" />\n                            <Label Content=\"Color Intensity\" Grid.Column=\"0\" Grid.Row=\"2\" Classes=\"LayoutItem\" />\n                            <Slider Grid.Column=\"1\" Grid.Row=\"2\" Minimum=\"0\" Maximum=\"10\" Value=\"{Binding ColorIntensity}\" />\n                        </Grid>\n                    </DataTemplate>\n                </ItemsControl.ItemTemplate>\n            </ItemsControl>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlLightsView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlLightsView : UserControl\n{\n    public Graphics3DControlLightsView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlLinesView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:views=\"using:DemoCenter.Views\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlLinesView\"\n             x:DataType=\"vm:Graphics3DControlLinesViewModel\">\n    <UserControl.Resources>\n        <views:Vector3ToColorConverter x:Key=\"Vector3ToColorConverter\"/>\n    </UserControl.Resources>\n    <Grid ColumnDefinitions=\"* Auto\">\n        <mx3d:Graphics3DControl Grid.Column=\"0\" Classes=\"DemoGraphics3DControl\" x:Name=\"DemoControl\" ModelsSource=\"{Binding Models}\">\n            <mx3d:Graphics3DControl.Materials>\n                <mx3d:SimplePbrMaterial x:Name=\"Material\" />\n            </mx3d:Graphics3DControl.Materials>\n        </mx3d:Graphics3DControl>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Line Width\" Classes=\"PropertyLabel\"/>\n                <Slider Minimum=\"1\" Maximum=\"10\" Value=\"{Binding LineWidth}\" />\n\n                <Label Content=\"Albedo\" Classes=\"PropertyLabel\"/>\n                <mxe:ColorEditor Color=\"{Binding ElementName=Material, Path=Albedo, Converter={StaticResource Vector3ToColorConverter}}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlLinesView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlLinesView : UserControl\n{\n    public Graphics3DControlLinesView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlOverviewView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlOverviewView\"\n             x:DataType=\"vm:Graphics3DControlOverviewViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mxe:SplitContainerControl Grid.Column=\"0\" Panel1Length=\"2*\" Orientation=\"Vertical\" HorizontalAlignment=\"Stretch\" CollapsePanel=\"Panel2\" IsCollapsed=\"True\">\n            <mxe:SplitContainerControl.Panel1>\n                <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\" x:Name=\"DemoControl\" Logger=\"{Binding Logger}\" ModelsSource=\"{Binding Models}\">\n                    <mx3d:Graphics3DControl.Gizmo>\n                        <mx3d:Gizmo x:Name=\"Gizmo\" />\n                    </mx3d:Graphics3DControl.Gizmo>\n                    <mx3d:Graphics3DControl.Materials>\n                        <mx3d:SimplePbrMaterial Metallic=\"0.6\" />\n                    </mx3d:Graphics3DControl.Materials>\n                </mx3d:Graphics3DControl>\n            </mxe:SplitContainerControl.Panel1>\n            <mxe:SplitContainerControl.Panel2>\n                <TextBox Text=\"{Binding Logger.Text}\" IsReadOnly=\"True\" />\n            </mxe:SplitContainerControl.Panel2>\n        </mxe:SplitContainerControl>\n        \n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\"  Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <mxe:CheckEditor Content=\"Multisampling\" IsChecked=\"{Binding ElementName=DemoControl, Path=EnableMultisampling}\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Content=\"Show Hints\" IsChecked=\"{Binding ElementName=DemoControl, Path=ShowHints}\" Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Cull Mode\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mx3d:CullMode}\"\n                                        EditorValue=\"{Binding ElementName=DemoControl, Path=CullMode}\"\n                                        Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Composition Mode\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mx3d:CompositionMode}\"\n                                        EditorValue=\"{Binding ElementName=DemoControl, Path=CompositionMode}\"\n                                        Classes=\"PropertyEditor\"/>\n                    \n                    <Label Content=\"Gamma\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0.1\" Maximum=\"12\" Value=\"{Binding ElementName=DemoControl, Path=Gamma}\" />\n\n                    <Label Content=\"Exposure\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0.1\" Maximum=\"12\" Value=\"{Binding ElementName=DemoControl, Path=Exposure}\" />\n                </StackPanel>\n            </mxe:GroupBox>\n            \n            <mxe:GroupBox Header=\"Axes and Grid\"  Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <mxe:CheckEditor x:Name=\"ShowAxes\" Content=\"Show Axes\" IsChecked=\"{Binding ElementName=DemoControl, Path=ShowAxes}\" Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Axes Thickness\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"1\" Maximum=\"10\" Value=\"{Binding ElementName=DemoControl, Path=AxisThickness}\" IsEnabled=\"{Binding ElementName=ShowAxes, Path=IsChecked}\" />\n                    <mxe:CheckEditor x:Name=\"ShowGrid\" Content=\"Show Grid\" IsChecked=\"{Binding ElementName=DemoControl, Path=ShowGrid}\" Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Grid Thickness\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"1\" Maximum=\"10\" Value=\"{Binding ElementName=DemoControl, Path=GridThickness}\" IsEnabled=\"{Binding ElementName=ShowGrid, Path=IsChecked}\" />\n                </StackPanel>\n            </mxe:GroupBox>\n\n            <mxe:GroupBox Header=\"Gizmo\" Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <mxe:CheckEditor Content=\"Show Gizmo\" IsChecked=\"{Binding ElementName=Gizmo, Path=IsVisible}\" Classes=\"PropertyEditor\"/>\n                    <Label Content=\"Horizontal Alignment\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=HorizontalAlignment}\"\n                                        EditorValue=\"{Binding ElementName=Gizmo, Path=HorizontalAlignment}\"\n                                        Classes=\"PropertyEditor\"\n                                        IsEnabled=\"{Binding ElementName=Gizmo, Path=IsVisible}\" />\n                    <Label Content=\"Vertical Alignment\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=VerticalAlignment}\"\n                                        EditorValue=\"{Binding ElementName=Gizmo, Path=VerticalAlignment}\"\n                                        Classes=\"PropertyEditor\"\n                                        IsEnabled=\"{Binding ElementName=Gizmo, Path=IsVisible}\" />\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlOverviewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlOverviewView : UserControl\n{\n    public Graphics3DControlOverviewView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlPointsView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlPointsView\"\n             x:DataType=\"vm:Graphics3DControlPointsViewModel\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mx3d:Graphics3DControl Grid.Column=\"0\" Classes=\"DemoGraphics3DControl\" x:Name=\"DemoControl\">\n            <mx3d:GeometryModel3D x:Name=\"Model3D\" MeshesSource=\"{Binding Meshes}\" />\n            <mx3d:Graphics3DControl.Materials>\n                <mx3d:TexturedPbrMaterial Emission=\"{Binding EmissionImage}\" Key=\"material\" />\n            </mx3d:Graphics3DControl.Materials>\n            <mx3d:Graphics3DControl.Camera>\n                <mx3d:PerspectiveCamera MinDistance=\"0.1\" MaxDistance=\"4\" NearClipPlane=\"0.1\" />\n            </mx3d:Graphics3DControl.Camera>\n        </mx3d:Graphics3DControl>\n        \n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\"  Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Point Size\" Classes=\"PropertyLabel\"/>\n                <Slider Minimum=\"1\" Maximum=\"5\" Value=\"{Binding PointSize}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlPointsView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlPointsView : UserControl\n{\n    public Graphics3DControlPointsView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlRobotArmView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlRobotArmView\"\n             x:DataType=\"vm:Graphics3DControlRobotArmViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* 250\">\n        <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\" Grid.Column=\"0\" x:Name=\"DemoControl\" ModelsSource=\"{Binding Models}\">\n            <mx3d:Graphics3DControl.Camera>\n                <mx3d:PerspectiveCamera MinDistance=\"2\" />\n            </mx3d:Graphics3DControl.Camera>\n        </mx3d:Graphics3DControl>\n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Control\" Classes=\"PropertiesGroup\">\n            <StackPanel Orientation=\"Vertical\">\n                <Label Content=\"Claws\" Classes=\"PropertyLabel\"/>\n                <Slider Minimum=\"-1.5\" Maximum=\"0.5\" Value=\"{Binding Claws}\" />\n                <Label Content=\"Wrist\" Classes=\"PropertyLabel\"/>\n                <Slider Minimum=\"-3.14\" Maximum=\"3.14\" Value=\"{Binding Wrist}\" />\n                <Label Content=\"Arm 2\" Classes=\"PropertyLabel\"/>\n                <Slider Minimum=\"-2.4\" Maximum=\"2.4\" Value=\"{Binding Arm2}\" />\n                <Label Content=\"Arm 1\" Classes=\"PropertyLabel\"/>\n                <Slider Minimum=\"-1\" Maximum=\"1\" Value=\"{Binding Arm1X}\" />\n                <Slider Minimum=\"-1\" Maximum=\"1\" Value=\"{Binding Arm1Y}\" />\n                <Slider Minimum=\"-3.14\" Maximum=\"3.14\" Value=\"{Binding Arm1Z}\" />\n            </StackPanel>\n        </mxe:GroupBox>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlRobotArmView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlRobotArmView : UserControl\n{\n    public Graphics3DControlRobotArmView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlSimpleMaterialsView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:views=\"using:DemoCenter.Views\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlSimpleMaterialsView\"\n             x:DataType=\"vm:Graphics3DControlSimpleMaterialsViewModel\">\n    <UserControl.Resources>\n        <views:Vector3ToColorConverter x:Key=\"Vector3ToColorConverter\"/>\n    </UserControl.Resources>\n    <Grid ColumnDefinitions=\"* Auto\">\n        <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\" x:Name=\"DemoControl\" ShowHints=\"False\" Skybox=\"{Binding Skybox}\" ModelsSource=\"{Binding Models}\" Grid.Column=\"0\">\n            <mx3d:Graphics3DControl.Materials>\n                <mx3d:SimplePbrMaterial x:Name=\"Material\" />\n            </mx3d:Graphics3DControl.Materials>\n        </mx3d:Graphics3DControl>\n        \n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Material Properties\"  Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <Grid ColumnDefinitions=\"100 150\" RowDefinitions=\"Auto Auto\">\n                        <Label Grid.Row=\"0\" Grid.Column=\"0\" Content=\"Albedo\" VerticalAlignment=\"Center\" Margin=\"0 12 0 0\" />\n                        <mxe:PopupColorEditor Grid.Row=\"0\" Grid.Column=\"1\" Margin=\"0 12 0 0\" Color=\"{Binding ElementName=Material, Path=Albedo, Converter={StaticResource Vector3ToColorConverter}}\" VerticalAlignment=\"Center\" />\n                        <Label Grid.Row=\"1\" Grid.Column=\"0\" Content=\"Emission\" Margin=\"0 12 0 0\" VerticalAlignment=\"Center\" />\n                        <mxe:PopupColorEditor Grid.Row=\"1\" Grid.Column=\"1\" Margin=\"0 12 0 0\" Color=\"{Binding ElementName=Material, Path=Emission, Converter={StaticResource Vector3ToColorConverter}}\" VerticalAlignment=\"Center\" />\n                    </Grid>\n                    <Label Content=\"Metallic\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0\" Maximum=\"1\" Value=\"{Binding ElementName=Material, Path=Metallic}\" />\n                    <Label Content=\"Roughness\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0\" Maximum=\"1\" Value=\"{Binding ElementName=Material, Path=Roughness}\" />\n                    <Label Content=\"Ambient Occlusion\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0\" Maximum=\"1\" Value=\"{Binding ElementName=Material, Path=AmbientOcclusion}\" />\n                </StackPanel>\n            </mxe:GroupBox>\n            \n            <mxe:GroupBox Header=\"Ambient\"  Classes=\"PropertiesGroup\">\n                <ListBox x:Name=\"SkyboxSelector\" SelectionChanged=\"SelectingItemsControl_OnSelectionChanged\" >\n                    <ListBox.Items>\n                        <Label>Default</Label>\n                        <Grid ColumnDefinitions=\"100 150\" Margin=\"0 6 0 6\">\n                            <Label Grid.Row=\"0\" Grid.Column=\"0\" Content=\"Color\" VerticalAlignment=\"Center\" />\n                            <mxe:PopupColorEditor x:Name=\"AmbientColorEditor\" Grid.Row=\"0\" Grid.Column=\"1\" Color=\"White\" VerticalAlignment=\"Center\" EditorValueChanged=\"AmbientColorEditor_OnEditorValueChanged\" />\n                        </Grid>\n                    </ListBox.Items>\n                </ListBox>\n            </mxe:GroupBox>\n            \n            <mxe:GroupBox Header=\"Tone Mapping\"  Classes=\"PropertiesGroup\">\n                <StackPanel Orientation=\"Vertical\">\n                    <Label Content=\"Gamma\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0.1\" Maximum=\"12\" Value=\"{Binding ElementName=DemoControl, Path=Gamma}\" />\n\n                    <Label Content=\"Exposure\" Classes=\"PropertyLabel\"/>\n                    <Slider Minimum=\"0.1\" Maximum=\"12\" Value=\"{Binding ElementName=DemoControl, Path=Exposure}\" />\n                </StackPanel>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlSimpleMaterialsView.axaml.cs",
    "content": "﻿using System.Globalization;\nusing System.Numerics;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing Avalonia.Interactivity;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Editors;\nusing Eremex.AvaloniaUI.Controls3D;\nusing Vector = Avalonia.Vector;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlSimpleMaterialsView : UserControl\n{\n    Graphics3DControlSimpleMaterialsViewModel ViewModel => DataContext as Graphics3DControlSimpleMaterialsViewModel;\n    \n    public Graphics3DControlSimpleMaterialsView()\n    {\n        InitializeComponent();\n    }\n    void SelectingItemsControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e)\n    {\n        if (SkyboxSelector.SelectedIndex == 0)\n        {\n            ViewModel.Skybox = null;\n            AmbientColorEditor.IsEnabled = false;\n        }\n        else\n        {\n            ViewModel.Skybox = new Skybox { IsVisible = false };\n            AmbientColorEditor.IsEnabled = true;\n            UpdateSkyboxColor();\n        }\n    }\n    void AmbientColorEditor_OnEditorValueChanged(object sender, EditorValueChangedEventArgs e) => UpdateSkyboxColor();\n    void UpdateSkyboxColor()\n    {\n        if (ViewModel.Skybox is not null && AmbientColorEditor.Color.HasValue)\n        {\n            var image = CreateImage(AmbientColorEditor.Color.Value);\n            ViewModel.Skybox.Left = image;\n            ViewModel.Skybox.Right = image;\n            ViewModel.Skybox.Top = image;\n            ViewModel.Skybox.Bottom = image;\n            ViewModel.Skybox.Front = image;\n            ViewModel.Skybox.Rear = image;\n        }\n    }\n    Bitmap CreateImage(Color color)\n    {\n        var bitmap = new RenderTargetBitmap(new PixelSize(100, 100), new Vector(96, 96));\n        using var context = bitmap.CreateDrawingContext();\n        context.FillRectangle(new SolidColorBrush(color), new Rect(0, 0, 100, 100));\n        return bitmap;\n    }\n    protected override void OnLoaded(RoutedEventArgs e)\n    {\n        base.OnLoaded(e);\n        SkyboxSelector.SelectedIndex = 0;\n    }\n}\n\npublic class Vector3ToColorConverter : IValueConverter\n{\n    static byte ToByte(float value) => (byte)(value * byte.MaxValue);\n    static float ToFloat(byte value) => (float)value / byte.MaxValue;\n    \n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (value is Vector3 vector)\n            return new Color(byte.MaxValue, ToByte(vector.X), ToByte(vector.Y), ToByte(vector.Z));\n        return null;\n    }\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (value is Color color)\n            return new Vector3(ToFloat(color.R), ToFloat(color.G), ToFloat(color.B));\n        return null;\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlSkyboxView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlSkyboxView\"\n             x:DataType=\"vm:Graphics3DControlSkyboxViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* Auto\">\n        <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\"\n                                x:Name=\"DemoControl\"\n                                ShowHints=\"False\"\n                                MaterialsSource=\"{Binding Materials}\"\n                                Grid.Column=\"0\"\n                                Skybox=\"{Binding SelectedSkybox}\">\n            <mx3d:GeometryModel3D>\n                <mx3d:MeshGeometry3D Vertices=\"{Binding Vertices}\" Indices=\"{Binding Indices}\" MaterialKey=\"{Binding MaterialKey}\" />\n            </mx3d:GeometryModel3D>\n        </mx3d:Graphics3DControl>\n        \n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Skyboxes\"  Classes=\"PropertiesGroup\">\n                <ListBox ItemsSource=\"{Binding Skyboxes}\" SelectedItem=\"{Binding SelectedSkybox}\">\n                    <ListBox.ItemTemplate>\n                        <DataTemplate x:DataType=\"mx3d:Skybox\">\n                            <Image Source=\"{Binding Front}\" Width=\"80\" Height=\"80\" Margin=\"8\" />\n                        </DataTemplate>\n                    </ListBox.ItemTemplate>\n                </ListBox>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlSkyboxView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing Eremex.AvaloniaUI.Controls3D;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlSkyboxView : UserControl\n{\n    public Graphics3DControlSkyboxView()\n    {\n        InitializeComponent();\n    }\n    protected override void OnLoaded(RoutedEventArgs e)\n    {\n        base.OnLoaded(e);\n        DemoControl.LookCameraAtScene(CameraPosition.Front);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlStlView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlStlView\"\n             x:DataType=\"vm:Graphics3DControlStlViewModel\">\n    <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\"\n                            x:Name=\"DemoControl\"\n                            Gamma=\"6\"\n                            Exposure=\"2\"\n                            ModelsSource=\"{Binding Models}\"\n                            MaterialsSource=\"{Binding Materials}\"\n                            Skybox=\"{Binding Skybox}\">\n        <mx3d:Graphics3DControl.Camera>\n            <mx3d:PerspectiveCamera DefaultCameraPosition=\"Up\" />\n        </mx3d:Graphics3DControl.Camera>\n    </mx3d:Graphics3DControl>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlStlView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlStlView : UserControl\n{\n    public Graphics3DControlStlView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlTexturedMaterialsView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlTexturedMaterialsView\"\n             x:DataType=\"vm:Graphics3DControlTexturedMaterialsViewModel\"\n             x:CompileBindings=\"True\">\n    <Grid ColumnDefinitions=\"* Auto\">\n        <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\" x:Name=\"DemoControl\" ShowHints=\"False\" MaterialsSource=\"{Binding Materials}\" Grid.Column=\"0\">\n            <mx3d:GeometryModel3D>\n                <mx3d:MeshGeometry3D Vertices=\"{Binding Vertices}\" Indices=\"{Binding Indices}\" MaterialKey=\"{Binding SelectedMaterial.Key}\" />\n            </mx3d:GeometryModel3D>\n        </mx3d:Graphics3DControl>\n        \n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Materials\"  Classes=\"PropertiesGroup\">\n                <ListBox ItemsSource=\"{Binding Materials}\" SelectedItem=\"{Binding SelectedMaterial}\">\n                    <ListBox.ItemTemplate>\n                        <DataTemplate x:DataType=\"mx3d:TexturedPbrMaterial\">\n                            <Image Source=\"{Binding Albedo}\" Width=\"80\" Height=\"80\" Margin=\"8\" />\n                        </DataTemplate>\n                    </ListBox.ItemTemplate>\n                </ListBox>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlTexturedMaterialsView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlTexturedMaterialsView : UserControl\n{\n    public Graphics3DControlTexturedMaterialsView()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlTransformationView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mx3d=\"https://schemas.eremexcontrols.net/avalonia/controls3d\"\n             x:Class=\"DemoCenter.Views.Graphics3DControlTransformationView\"\n             x:DataType=\"vm:Graphics3DControlTransformationViewModel\">\n    <mx3d:Graphics3DControl Classes=\"DemoGraphics3DControl\"\n                            x:Name=\"DemoControl\"\n                            ModelsSource=\"{Binding Models}\"\n                            MaterialsSource=\"{Binding Materials}\"\n                            HighlightMode=\"Model\" />\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Graphics3DControl/Graphics3DControlTransformationView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views;\n\npublic partial class Graphics3DControlTransformationView : UserControl\n{\n    private Graphics3DControlTransformationViewModel ViewModel => DataContext as Graphics3DControlTransformationViewModel;\n        \n    public Graphics3DControlTransformationView()\n    {\n        InitializeComponent();\n    }\n    protected override void OnLoaded(RoutedEventArgs e)\n    {\n        base.OnLoaded(e);\n        ViewModel?.Start();\n    }\n    protected override void OnUnloaded(RoutedEventArgs e)\n    {\n        base.OnUnloaded(e);\n        ViewModel?.Stop();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/MainView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n\t\t\t xmlns:mxdcv=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl.Visuals;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Controls.Common;assembly=Eremex.Avalonia.Controls\"\n             xmlns:aEdit=\"clr-namespace:AvaloniaEdit;assembly=AvaloniaEdit\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:views=\"clr-namespace:DemoCenter.Views\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"1000\" d:DesignHeight=\"620\"\n             x:Class=\"DemoCenter.Views.MainView\"\n             x:DataType=\"vm:MainViewModel\">\n    <Design.DataContext>\n        <vm:MainViewModel />\n    </Design.DataContext>\n    <UserControl.Resources>\n        <StreamGeometry x:Key=\"SunPath\">\n            M8.53332 0.00112641C8.80885 0.0194951 9.01732 0.257748 8.99895 0.533278L8.86562 2.53328C8.84725 2.80881 8.609 3.01728 8.33346 2.99891C8.05793 2.98054 7.84946 2.74229 7.86783 2.46676L8.00116 0.466759C8.01953 0.191229 8.25779 -0.0172423 8.53332 0.00112641Z\n            M7.66665 13.0011C7.94218 13.0195 8.15065 13.2577 8.13228 13.5333L7.99895 15.5333C7.98058 15.8088 7.74233 16.0173 7.4668 15.9989C7.19127 15.9805 6.9828 15.7423 7.00116 15.4668L7.1345 13.4668C7.15287 13.1912 7.39112 12.9828 7.66665 13.0011Z\n            M4.00004 8.00003C4.00004 5.79089 5.7909 4.00003 8.00004 4.00003C10.2092 4.00003 12 5.79089 12 8.00003C12 10.2092 10.2092 12 8.00004 12C5.7909 12 4.00004 10.2092 4.00004 8.00003ZM8.00004 5.00003C6.34318 5.00003 5.00004 6.34318 5.00004 8.00003C5.00004 9.65689 6.34318 11 8.00004 11C9.65689 11 11 9.65689 11 8.00003C11 6.34318 9.65689 5.00003 8.00004 5.00003Z\n            M13.9861 3.42658C14.1939 3.24474 14.215 2.92885 14.0331 2.72104C13.8513 2.51322 13.5354 2.49216 13.3276 2.674L11.8191 3.99393C11.6113 4.17577 11.5902 4.49165 11.7721 4.69947C11.9539 4.90729 12.2698 4.92835 12.4776 4.74651L13.9861 3.42658Z\n            M4.18089 12.0061C4.38871 11.8243 4.40977 11.5084 4.22793 11.3006C4.04609 11.0928 3.7302 11.0717 3.52239 11.2536L2.01389 12.5735C1.80607 12.7553 1.78501 13.0712 1.96686 13.279C2.1487 13.4869 2.46458 13.5079 2.6724 13.3261L4.18089 12.0061Z\n            M15.9989 8.53328C15.9805 8.80881 15.7423 9.01728 15.4668 8.99891L13.4668 8.86558C13.1912 8.84721 12.9828 8.60896 13.0011 8.33343C13.0195 8.0579 13.2577 7.84942 13.5333 7.86779L15.5333 8.00113C15.8088 8.0195 16.0173 8.25775 15.9989 8.53328Z\n            M2.99891 7.66661C2.98054 7.94214 2.74229 8.15061 2.46676 8.13224L0.46676 7.99891C0.191229 7.98054 -0.0172423 7.74229 0.00112642 7.46676C0.0194952 7.19123 0.257748 6.98276 0.533279 7.00113L2.53328 7.13446C2.80881 7.15283 3.01728 7.39108 2.99891 7.66661Z\n            M12.5735 13.9861C12.7554 14.1939 13.0712 14.215 13.2791 14.0332C13.4869 13.8513 13.5079 13.5354 13.3261 13.3276L12.0062 11.8191C11.8243 11.6113 11.5084 11.5903 11.3006 11.7721C11.0928 11.9539 11.0717 12.2698 11.2536 12.4776L12.5735 13.9861Z\n            M3.99396 4.18091C4.1758 4.38873 4.49168 4.40979 4.6995 4.22795C4.90732 4.04611 4.92838 3.73023 4.74654 3.52241L3.4266 2.01391C3.24476 1.8061 2.92888 1.78504 2.72106 1.96688C2.51325 2.14872 2.49219 2.4646 2.67403 2.67242L3.99396 4.18091Z\n        </StreamGeometry>\n        <StreamGeometry x:Key=\"MoonPath\">M5.86202 0.458762C5.9851 0.697922 5.98434 1.0123 5.80073 1.26681C5.29679 1.96532 5 2.82244 5 3.75035C5 6.09757 6.90279 8.00035 9.25 8.00035C9.63503 8.00035 10.0074 7.94928 10.3609 7.85382C10.6637 7.77208 10.9581 7.88213 11.1385 8.08169C11.326 8.28909 11.41 8.62218 11.2361 8.93215C10.2095 10.762 8.24968 12.0003 6 12.0003C2.68629 12.0003 0 9.31406 0 6.00035C0 2.99175 2.2139 0.501137 5.10156 0.0672336C5.45254 0.0144957 5.73419 0.210389 5.86202 0.458762ZM4.67216 1.17846C2.55533 1.75995 1 3.69889 1 6.00035C1 8.76177 3.23858 11.0003 6 11.0003C7.66194 11.0003 9.13506 10.1897 10.0447 8.94053C9.78532 8.97994 9.51992 9.00035 9.25 9.00035C6.35051 9.00035 4 6.64985 4 3.75035C4 2.81653 4.24419 1.93875 4.67216 1.17846Z</StreamGeometry>\n        <views:PagesChildrenSelector x:Key=\"childNodesSelector\" />\n        <mx:BoolToObjectConverter x:Key=\"FontWeightConverter\">\n            <mx:BoolToObjectConverter.TrueValue>\n                <FontWeight>Bold</FontWeight>\n            </mx:BoolToObjectConverter.TrueValue>\n            <mx:BoolToObjectConverter.FalseValue>\n                <FontWeight>Normal</FontWeight>\n            </mx:BoolToObjectConverter.FalseValue>\n        </mx:BoolToObjectConverter>\n    </UserControl.Resources>\n    <UserControl.Styles>\n        <Style Selector=\"ContentControl.Badge\">\n            <Setter Property=\"CornerRadius\" Value=\"2\"/>\n            <Setter Property=\"DockPanel.Dock\" Value=\"Right\"/>\n            <Setter Property=\"Margin\" Value=\"4,4,0,4\"/>\n            <Setter Property=\"Padding\" Value=\"4,0\"/>\n            <Setter Property=\"MinWidth\" Value=\"18\"/>\n            <Setter Property=\"VerticalContentAlignment\" Value=\"Center\"/>\n        </Style>\n\n        <Style Selector=\"mxe|HyperlinkEditor.resourceLink\">\n            <Setter Property=\"AllowAutoNavigate\" Value=\"True\"/>\n            <Setter Property=\"Margin\" Value=\"0,6,0,0\"/>\n            <Setter Property=\"Padding\" Value=\"0\"/>\n            <Setter Property=\"MinHeight\" Value=\"0\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource Icons/Outline/Blue}\"/>\n        </Style>\n        <Style Selector=\"mxe|HyperlinkEditor.resourceLink /template/ TextBlock#PART_RealEditor\">\n            <Setter Property=\"TextDecorations\" Value=\"Underline\" />\n        </Style>       \n    </UserControl.Styles>\n    <Border Background=\"{DynamicResource Fill/Neutral/Secondary/Enabled}\" Padding=\"8\">\n        <Grid ColumnDefinitions=\"244, 0, *\" RowDefinitions=\"*, Auto\">\n            <mxtl:TreeViewControl x:Name=\"pageSelector\"\n                                  ItemsSource=\"{Binding Products}\"\n                                  SearchPanelDisplayMode=\"Always\"\n                                  DataFieldName=\"Name\"\n                                  RowLevelIndent=\"16\"\n                                  FilterMode=\"ShowBranchesWithMatches\"\n                                  AllowDynamicDataLoading=\"False\"\n                                  ShowRootIndent=\"False\"\n                                  ShowExpandButtons=\"False\"\n                                  ChildrenSelector=\"{StaticResource childNodesSelector}\"\n                                  FocusedItem=\"{Binding CurrentProductItem, Mode=TwoWay}\"\n                                  FocusedNodeChanged=\"OnPageSelectorFocusedNodeChanged\"\n                                  Margin=\"0,0,8,0\">\n                <mxtl:TreeViewControl.CellTemplate>\n                    <DataTemplate>\n                        <DockPanel Margin=\"8,0,4,0\" >\n                            <ContentControl Content=\"Desktop only\"\n                                            Classes=\"Badge\"\n                                            Background=\"{DynamicResource Icons/Fill/Gray}\"\n                                            Foreground=\"{DynamicResource Icons/Outline/Gray}\">\n                                <ContentControl.IsVisible>\n                                    <MultiBinding Converter=\"{x:Static BoolConverters.And}\">\n                                        <Binding Path=\"!Row.ShowInWeb\"/>\n                                        <Binding Path=\"Row.IsWebApp\"/>\n                                    </MultiBinding>\n                                </ContentControl.IsVisible>\n                            </ContentControl>\n                            <ContentControl Content=\"Updated\"\n                                            Classes=\"Badge\"\n                                            IsVisible=\"{Binding Row.IsUpdated}\"\n                                            Background=\"{DynamicResource Icons/Fill/Yellow}\"\n                                            Foreground=\"{DynamicResource Icons/Outline/Yellow}\"/>\n                            <ContentControl Content=\"New\"\n                                            Classes=\"Badge\"\n                                            IsVisible=\"{Binding Row.IsNew}\"\n                                            Background=\"{DynamicResource Icons/Fill/Red}\"\n                                            Foreground=\"{DynamicResource Icons/Outline/Red}\"/>\n                            <TextBlock Text=\"{Binding Row.Name}\"\n                                       VerticalAlignment=\"Center\"\n                                       TextBlock.TextTrimming=\"CharacterEllipsis\"\n                                       mxc:TextBlockHelper.ShowTooltipWhenTrimming=\"True\"\n                                       FontWeight=\"{Binding Row.HasChildren, Converter={StaticResource FontWeightConverter}}\" Margin=\"0,0,4,0\"/>\n                        </DockPanel>\n                    </DataTemplate>\n                </mxtl:TreeViewControl.CellTemplate>           \n                <mxtl:TreeViewControl.Styles>\n\t\t\t\t\t<Style Selector=\"mxdcv|SearchPanel\">\n\t\t\t\t\t\t<Setter Property=\"Padding\" Value=\"0, 0, 0, 10\" />\n                        <Setter Property=\"SearchDelay\" Value=\"0\" />\n\t\t\t\t\t</Style>\n                    <Style Selector=\"mxdcv|SearchPanel /template/ mxe|ButtonEditor:activeMode\">\n                        <Setter Property=\"Background\" Value=\"{DynamicResource Fill/Neutral/Primary/Enabled}\"/>\n                    </Style>\n                    <Style Selector=\"mxdcv|SearchPanel /template/ mxe|ButtonEditor:activeMode /template/ TextBox:pointerover /template/ Border#PART_BorderElement\">\n                        <Setter Property=\"Background\" Value=\"{DynamicResource Fill/Neutral/Primary/Hover}\" />\n                        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource Outline/Neutral/Transparent/Light}\"/>\n                    </Style>\n\n                    <Style Selector=\"mxdcv|SearchPanel /template/ mxe|ButtonEditor:activeMode /template/ TextBox:focus /template/ Border#PART_BorderElement\">\n                        <Setter Property=\"Background\" Value=\"{DynamicResource Fill/Neutral/Primary/Enabled}\" />\n                        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource Outline/Accent/Focus}\"/>\n                        <Setter Property=\"BorderThickness\" Value=\"{StaticResource EditorBorderThickness}\" />\n                    </Style>\n                </mxtl:TreeViewControl.Styles>\n            </mxtl:TreeViewControl>\n            <Border Grid.Row=\"1\" CornerRadius=\"6\" BorderThickness=\"1\" Margin=\"0,8,8,0\" \n                    BorderBrush=\"{DynamicResource Outline/Neutral/On Secondary/Light}\"\n                    Background=\"{DynamicResource Fill/Neutral/Primary/Hover}\">\n                <Grid RowDefinitions=\"* * *\" ColumnDefinitions=\"* *\" Margin=\"6\">\n                    <TextBlock Grid.Row=\"0\" Grid.Column=\"0\" Text=\"Resources:\" FontWeight=\"Bold\" Margin=\"0 6 0 0\" />\n                    <mxe:HyperlinkEditor Grid.Row=\"0\" Grid.Column=\"1\" Text=\"Documentation\" NavigationUrl=\"https://eremexcontrols.net\" Classes=\"resourceLink\"/>\n                    <TextBlock Grid.Row=\"1\" Grid.Column=\"0\" Text=\"Support:\" FontWeight=\"Bold\" Margin=\"0 6 0 0\" />\n                    <mxe:HyperlinkEditor Grid.Row=\"1\" Grid.Column=\"1\" Text=\"Telegram (En)\" NavigationUrl=\"https://t.me/emxControlsEn\" Classes=\"resourceLink\"/>\n                    <mxe:HyperlinkEditor Grid.Row=\"2\" Grid.Column=\"1\" Text=\"Telegram (Ru)\" NavigationUrl=\"https://t.me/emxControls\" Classes=\"resourceLink\"/>\n                </Grid>\n            </Border>\n            <mx:MxTabControl Grid.Column=\"2\" Grid.RowSpan=\"2\" Padding=\"0\">\n                <mx:MxTabItem Header=\"Demo\" IsSelected=\"{Binding IsDemoSelected, Mode=TwoWay}\">\n                    <Grid RowDefinitions=\"*, Auto\">\n                        <ContentControl Content=\"{Binding CurrentProductItemViewModel}\"/>\n                        <Border Grid.Row=\"1\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n                            <TextBlock Text=\"{Binding CurrentProductItem.Description}\"\n                                       VerticalAlignment=\"Center\"\n                                       TextWrapping=\"Wrap\"\n                                       Foreground=\"{DynamicResource Text/Neutral/Primary}\"\n                                       Margin=\"16,8\" MinHeight=\"34\"\n                                       IsVisible=\"{Binding CurrentProductItem.Description, Converter={x:Static StringConverters.IsNotNullOrEmpty}}\"/>\n                        </Border>\n                    </Grid>\n                </mx:MxTabItem>\n                <mx:MxTabItem Header=\"Code\" IsVisible=\"{Binding AllowCode}\">\n                    <Grid RowDefinitions=\"Auto, *\" ColumnDefinitions=\"260, *, 260\">\n                        <mxe:ComboBoxEditor ItemsSource=\"{Binding SourceFiles}\" SelectedItem=\"{Binding SourceFile, Mode=TwoWay}\" Margin=\"8\" />\n                        <mxdcv:SearchPanel Grid.Column=\"2\" SearchText=\"{Binding SelectedCode, Mode=TwoWay}\" SearchDelay=\"0\" Margin=\"8\" Padding=\"0\" BorderThickness=\"0\"  />\n                        <Border BorderThickness=\"0,1,0,0\" Grid.ColumnSpan=\"3\" Grid.Row=\"1\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n                            <aEdit:TextEditor x:Name=\"CodeViewEditor\" IsReadOnly=\"True\" WordWrap=\"True\"\n                                              SearchResultsBrush=\"{DynamicResource Fill/Accent/Highlighting/Text}\"\n                                              Margin=\"16,8,16,2\"\n                                              ActualThemeVariantChanged=\"CodeViewEditor_OnActualThemeVariantChanged\"/>\n                        </Border>\n                    </Grid>\n                </mx:MxTabItem>\n            </mx:MxTabControl>\n            <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Top\" HorizontalAlignment=\"Right\" Grid.Column=\"2\">\n\t\t\t\t<mxe:SegmentedEditor ItemsSource=\"{Binding Locales}\" DisplayMember=\"LocaleName\" ValueMember=\"Locale\" EditorValue=\"{Binding SelectedLocale}\" Height=\"28\" Width=\"120\"\n                                     Margin=\"0,-1,10,0\">\n\t\t\t\t\t\n\t\t\t\t</mxe:SegmentedEditor>\n\n\t\t\t\t\t<mxe:SegmentedEditor ItemsSource=\"{Binding ThemeVariants}\" Height=\"28\" Width=\"56\" \n                                     Margin=\"0,-1,0,0\"\n                                     ValueMember=\"ThemeVariant\"\n                                     EditorValue=\"{Binding SelectedThemeVariant}\">\n                    <mxe:SegmentedEditor.ItemTemplate>\n                        <DataTemplate>\n                            <PathIcon Width=\"16\" Height=\"16\" Foreground=\"{DynamicResource Text/Neutral/Secondary}\"\n                                      ToolTip.Tip=\"{Binding ThemeVariantName}\">\n                                <PathIcon.Data>\n                                    <MultiBinding Converter=\"{views:ThemeVariantToIconDataConverter}\">\n                                        <Binding Path=\"ThemeVariant\"/>\n                                        <DynamicResourceExtension ResourceKey=\"SunPath\"/>\n                                        <DynamicResourceExtension ResourceKey=\"MoonPath\"/>\n                                    </MultiBinding>\n                                </PathIcon.Data>\n                            </PathIcon>\n                        </DataTemplate>\n                    </mxe:SegmentedEditor.ItemTemplate>\n                    <mxe:SegmentedEditor.Styles>\n                        <Style Selector=\"ListBoxItem\">\n                            <Setter Property=\"MinHeight\" Value=\"0\"/>\n                        </Style>\n                    </mxe:SegmentedEditor.Styles>\n                </mxe:SegmentedEditor>\n            </StackPanel>\n        </Grid>\n    </Border>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/MainView.axaml.cs",
    "content": "using System.Collections;\nusing System.ComponentModel;\nusing System.Globalization;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing DemoCenter.Helpers;\nusing DemoCenter.ProductsData;\nusing DemoCenter.ViewModels;\n\nusing Eremex.AvaloniaUI.Controls.TreeList;\n\nnamespace DemoCenter.Views;\n\npublic partial class MainView : UserControl\n{\n    string loadedResource;\n    IDisposable titleSubscriber;\n\n    public MainView()\n    {\n        InitializeComponent();\n        pageSelector.AddHandler(TextBox.KeyDownEvent, OnPageSelectorKeyDown, RoutingStrategies.Tunnel);\n    }\n\n    MainViewModel ViewModel { get; set; }\n\n    protected override void OnDataContextChanged(EventArgs e)\n    {\n        base.OnDataContextChanged(e);\n        UnsubscribeEvents(ViewModel);\n        ViewModel = DataContext as MainViewModel;\n        SubscribeEvents(ViewModel);\n    }\n\n    private void SubscribeEvents(MainViewModel viewModel)\n    {\n        if(viewModel == null)\n            return;\n        titleSubscriber = this.Bind(TitleProperty, new Binding() { Source = viewModel, Path = \"Title\" });\n        UpdateDocument();\n        viewModel.PropertyChanged += OnMainViewModelPropertyChanged;\n    }\n\n    private void UnsubscribeEvents(MainViewModel viewModel)\n    {\n        if(viewModel == null)\n            return;\n        titleSubscriber?.Dispose();\n        titleSubscriber = null;\n        viewModel.PropertyChanged -= OnMainViewModelPropertyChanged;\n    }\n\n    private void OnMainViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)\n    {\n        if (e.PropertyName == nameof(MainViewModel.SelectedThemeVariant) && ViewModel?.SelectedThemeVariant != null && Application.Current is App application)\n            application.RequestedThemeVariant = ViewModel.SelectedThemeVariant;\n        else if (e.PropertyName == nameof(MainViewModel.SourceFile))\n            UpdateDocument();\n        else if (e.PropertyName == nameof(MainViewModel.SelectedCode))\n        {\n            CodeViewEditor.SearchPanel?.Open();\n            CodeViewEditor.SearchPanel.SearchPattern = ViewModel.SelectedCode ?? string.Empty;\n        }\n    }\n\n    private void UpdateDocument()\n    {\n        if(ViewModel == null || string.IsNullOrEmpty(ViewModel.SourceFile))\n            return;\n        var name = App.EmbeddedResources.FirstOrDefault(x =>\n            x.EndsWith(ViewModel.SourceFile, StringComparison.InvariantCultureIgnoreCase));\n        if(string.IsNullOrEmpty(name))\n        {\n            CodeViewEditor.Clear();\n            return;\n        }\n\n        if(loadedResource != name)\n            using(var stream = System.Reflection.Assembly.GetAssembly(typeof(App))?.GetManifestResourceStream(name))\n            {\n                if(name.EndsWith(\".cs\"))\n                    CodeViewEditor.SyntaxHighlighting =\n                        new ThemedSyntaxHighlighter(\"CSharp-Highlight\").HighlightingDefinition;\n                else if(name.EndsWith(\".axaml\"))\n                    CodeViewEditor.SyntaxHighlighting =\n                        (new ThemedSyntaxHighlighter(\"Axaml-Highlight\")).HighlightingDefinition;\n                else\n                    CodeViewEditor.SyntaxHighlighting = null;\n                CodeViewEditor.Load(stream);\n                CodeViewEditor.ScrollToHome();\n                loadedResource = name;\n            }\n    }\n\n    public static readonly StyledProperty<string> TitleProperty =\n        AvaloniaProperty.Register<MainView, string>(nameof(Title));\n\n    public string Title\n    {\n        get { return GetValue(TitleProperty); }\n        set { SetValue(TitleProperty, value); }\n    }\n\n    private void OnPageSelectorKeyDown(object sender, KeyEventArgs e)\n    {\n        if(e.Key == Key.Up)\n        {\n            if (pageSelector.FocusedNode == null)\n                return;\n\n            if(pageSelector.FocusedNode.ParentNode.Nodes.Where(x => x.IsVisible).First() == pageSelector.FocusedNode)\n            {\n                var parentNode = pageSelector.FocusedNode.ParentNode;\n                var visibleParentNodes = pageSelector.Nodes.Where((x) => x.IsVisible).ToList();\n\n                int parentNodeIndex = visibleParentNodes.IndexOf(parentNode);\n                if (parentNodeIndex > 0)\n                {\n                    parentNodeIndex--;\n\n                    visibleParentNodes[parentNodeIndex].IsExpanded = true;\n                    pageSelector.FocusedNode = visibleParentNodes[parentNodeIndex].Nodes.Where(x => x.IsVisible).Last();\n\n                    parentNode.IsExpanded = false;\n                }\n                e.Handled = true;\n            }\n        }\n    }\n\n    private void OnPageSelectorFocusedNodeChanged(object sender, TreeListFocusedNodeChangedEventArgs e)\n    {\n        if (e.Node != null && e.Node.ParentNode == null)\n        {\n            if (!e.Node.IsExpanded)\n            {\n                pageSelector.CollapseAllNodes();\n                e.Node.IsExpanded = true;\n            }\n\n            pageSelector.FocusedNode = e.Node.Nodes.Where(x => x.IsVisible).First();\n        }\n    }\n\n    private void CodeViewEditor_OnActualThemeVariantChanged(object sender, EventArgs e)\n    {\n        loadedResource = null;\n        UpdateDocument();\n    }\n}\n\ninternal class PagesChildrenSelector : ITreeListChildrenSelector\n{\n    bool ITreeListChildrenSelector.HasChildren(object item) => (item as GroupInfo)?.Pages?.Any() == true;\n\n    IEnumerable ITreeListChildrenSelector.SelectChildren(object item)\n    {\n        if(item is GroupInfo groupInfo)\n            return groupInfo.Pages;\n        return null;\n    }\n}\n\npublic class ThemeVariantToIconDataConverter : MarkupExtension, IMultiValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n    public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (values[0] == null || values[0] == AvaloniaProperty.UnsetValue || values.Count != 3)\n            return null;\n        var variant = (ThemeVariant)values[0]!;\n        if(variant == ThemeVariant.Light)\n            return values[1];\n        if(variant == ThemeVariant.Dark)\n            return values[2];\n        return null;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/MainWindow.axaml",
    "content": "<common:MxWindow xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:vm=\"using:DemoCenter.ViewModels\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:views=\"clr-namespace:DemoCenter.Views\"\n        xmlns:common=\"clr-namespace:Eremex.AvaloniaUI.Controls.Common;assembly=Eremex.Avalonia.Controls\"\n        MinWidth=\"1000\"\n        MinHeight=\"620\"    \n        Width=\"1450\"\n        Height=\"940\"  \n        mc:Ignorable=\"d\"\n        d:DesignWidth=\"800\" \n        d:DesignHeight=\"450\"\n        WindowStartupLocation=\"CenterScreen\"\n        x:Class=\"DemoCenter.Views.MainWindow\"\n        Icon=\"/Assets/EMXControls.ico\"\n        Title=\"{Binding Title, ElementName=mainView}\">\n        <views:MainView x:Name=\"mainView\" />\n</common:MxWindow>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/MainWindow.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Eremex.AvaloniaUI.Controls.Common;\n\nnamespace DemoCenter.Views;\n\npublic partial class MainWindow : MxWindow\n{\n    public MainWindow()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/PropertyGrid/PropertyGridDataEditorsView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.PropertyGridDataEditorsView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mxpg=\"https://schemas.eremexcontrols.net/avalonia/propertygrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:data=\"clr-namespace:DemoCenter.DemoData\"\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n\n    <Border BorderThickness=\"0\">\n        <Grid ColumnDefinitions=\"*, 2*, *, 250\">\n            <mxpg:PropertyGridControl x:Name=\"propertyGrid\" SelectedObject=\"{Binding SelectedObject}\" \n                                      Margin=\"16\" BorderThickness=\"1\" Grid.Column=\"1\">\n                <mxpg:PropertyGridCategoryRow Caption=\"General\">\n                    <mxpg:PropertyGridRow FieldName=\"FirstName\"  Caption=\"First Name\"/>\n                    <mxpg:PropertyGridRow FieldName=\"LastName\" Caption=\"Last Name\"/>\n                    <mxpg:PropertyGridRow FieldName=\"BirthDate\" Caption=\"Date of Birth\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Married\"/>\n                </mxpg:PropertyGridCategoryRow>\n\n                <mxpg:PropertyGridCategoryRow Caption=\"Employee Details\">\n                    <mxpg:PropertyGridRow FieldName=\"Position\">\n                        <mxpg:PropertyGridRow.EditorProperties>\n                            <mxe:ComboBoxEditorProperties ItemsSource=\"{Binding Source={x:Static data:EmployeesData.Positions}}\" IsTextEditable=\"False\"/>\n                        </mxpg:PropertyGridRow.EditorProperties>\n                    </mxpg:PropertyGridRow>\n                    <mxpg:PropertyGridRow FieldName=\"EmploymentType\" Caption=\"Employment Type\">\n                        <mxpg:PropertyGridRow.CellTemplate>\n                            <DataTemplate>\n                                <mxe:SegmentedEditor EditorValue=\"{Binding Value}\" ItemsSource=\"{mx:EnumItemsSource EnumType=data:EmploymentType}\"/>\n                            </DataTemplate>\n                        </mxpg:PropertyGridRow.CellTemplate>\n                    </mxpg:PropertyGridRow>\n                    <mxpg:PropertyGridRow FieldName=\"HireDate\" Caption=\"Hire Date\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Experience\"/>\n                </mxpg:PropertyGridCategoryRow>\n\n                <mxpg:PropertyGridCategoryRow Caption=\"Contact Details\">\n                    <mxpg:PropertyGridRow FieldName=\"City\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Phone\"/>\n                </mxpg:PropertyGridCategoryRow>\n            </mxpg:PropertyGridControl>\n\n            <Border Grid.Column=\"3\" BorderThickness=\"1,0,0,0\" BorderBrush=\"{DynamicResource Outline/Neutral/Transparent/Medium}\">\n                <mxe:GroupBox Header=\"Properties\"  Classes=\"PropertiesGroup\">\n                    <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                        <mxe:CheckEditor Content=\"Allow Editing\" IsChecked=\"{Binding #propertyGrid.AllowEditing}\" Classes=\"PropertyEditor\"/>\n                        <Label Grid.Row=\"1\" Content=\"Editor Show Mode\" IsEnabled=\"{Binding #propertyGrid.AllowEditing}\" Classes=\"PropertyLabel\"/>\n                        <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxpg:EditorShowMode}\"\n                                            EditorValue=\"{Binding #propertyGrid.EditorShowMode}\"\n                                            IsEnabled=\"{Binding #propertyGrid.AllowEditing}\"\n                                            Grid.Row=\"2\"\n                                            Grid.ColumnSpan=\"2\"\n                                            Classes=\"PropertyEditor\"/>\n                        <Label Grid.Row=\"3\" Content=\"Editor Button Show Mode\" IsEnabled=\"{Binding #propertyGrid.AllowEditing}\" Classes=\"PropertyLabel\"/>\n                        <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxpg:EditorButtonShowMode}\"\n                                            EditorValue=\"{Binding #propertyGrid.EditorButtonShowMode}\"\n                                            IsEnabled=\"{Binding #propertyGrid.AllowEditing}\"\n                                            Grid.Row=\"4\"\n                                            Grid.ColumnSpan=\"2\" \n                                            Classes=\"PropertyEditor\"/>\n                    </Grid>\n                </mxe:GroupBox>\n            </Border>\n        </Grid>\n    </Border>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/PropertyGrid/PropertyGridDataEditorsView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class PropertyGridDataEditorsView : UserControl\n    {\n        public PropertyGridDataEditorsView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/PropertyGrid/PropertyGridGroupView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.PropertyGridGroupView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Controls.Common;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxei=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors.Visuals;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxpg=\"clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxb=\"clr-namespace:Eremex.AvaloniaUI.Controls.Bars;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxu=\"clr-namespace:Eremex.AvaloniaUI.Controls.Utils;assembly=Eremex.Avalonia.Controls\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:PropertyGridGroupViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:PropertyGridGroupViewModel />\n\t</Design.DataContext>\n\n    <TextBlock VerticalAlignment=\"Center\"\n               HorizontalAlignment=\"Center\"\n               FontSize=\"16\"\n               Text=\"See product pages for details.\"/>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/PropertyGrid/PropertyGridGroupView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class PropertyGridGroupView : UserControl\n    {\n        public PropertyGridGroupView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/PropertyGrid/PropertyGridTabItemsView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxpg=\"https://schemas.eremexcontrols.net/avalonia/propertygrid\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.PropertyGridTabItemsView\">\n    <UserControl.Resources>\n        <DataTemplate x:Key=\"spinEditorTemplate1\">\n            <mxe:SpinEditor x:Name=\"PART_Editor\" HorizontalContentAlignment=\"Stretch\"/>\n        </DataTemplate>\n        <DataTemplate x:Key=\"spinEditorTemplate2\">\n            <mxe:SpinEditor x:Name=\"PART_Editor\" HorizontalContentAlignment=\"Stretch\" Increment=\"0.1\"/>\n        </DataTemplate>\n    </UserControl.Resources>\n\n    <UserControl.Styles>\n        <Style Selector=\"ContentControl.Animation\">\n            <Style.Animations>\n                <Animation Duration=\"0:0:1\" IterationCount=\"1\">\n                    <KeyFrame Cue=\"40%\">\n                        <Setter Property=\"RotateTransform.Angle\" Value=\"20\"/>\n                    </KeyFrame>\n                    <KeyFrame Cue=\"60%\">\n                        <Setter Property=\"ScaleTransform.ScaleX\" Value=\"1.5\"/>\n                    </KeyFrame>\n                    <KeyFrame Cue=\"80%\">\n                        <Setter Property=\"RotateTransform.Angle\" Value=\"90\"/>\n                    </KeyFrame>\n                </Animation>\n            </Style.Animations>\n        </Style>\n    </UserControl.Styles>\n\n\n    <Grid ColumnDefinitions=\"3*, 2*\">\n        <Border>\n            <ContentControl x:Name=\"contentControl\" Content=\"ContentControl\" Classes=\"Animation\"\n                            Width=\"150\" Height=\"50\" BorderBrush=\"LightPink\" BorderThickness=\"5\" FontFamily=\"Arial\"\n                            Background=\"{DynamicResource Fill/Accent/Primary/Enabled}\"\n                            Foreground=\"{DynamicResource Text/On Accent/Primary}\"\n                            HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\n                            HorizontalContentAlignment=\"Center\" VerticalContentAlignment=\"Center\"/>\n        </Border>\n\n        <mxpg:PropertyGridControl x:Name=\"propertyGrid\" SelectedObject=\"{Binding}\" AllowImmediateEditorValuePosting=\"True\" BorderThickness=\"1,0,0,0\" Grid.Column=\"1\">\n            <mxpg:PropertyGridRow FieldName=\"Content\"/>\n\n            <mxpg:PropertyGridTabRow Caption=\"Appearance\">\n                <mxpg:PropertyGridTabRowItem Header=\"Text\">\n                    <mxpg:PropertyGridRow FieldName=\"Foreground\"/>\n                    <mxpg:PropertyGridRow FieldName=\"FontFamily\">\n                        <mxpg:PropertyGridRow.EditorProperties>\n                            <mxe:ComboBoxEditorProperties IsTextEditable=\"False\" ItemsSource=\"{Binding Source={x:Static FontManager.Current}, Path=SystemFonts}\" ValueMember=\"Name\" DisplayMember=\"Name\"/>\n                        </mxpg:PropertyGridRow.EditorProperties>\n                    </mxpg:PropertyGridRow>\n                    <mxpg:PropertyGridRow FieldName=\"FontSize\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"FontWeight\"/>\n                    <mxpg:PropertyGridRow FieldName=\"FontStyle\"/>\n                </mxpg:PropertyGridTabRowItem>\n\n                <mxpg:PropertyGridTabRowItem Header=\"Border\">\n                    <mxpg:PropertyGridRow FieldName=\"Background\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Opacity\" CellTemplate=\"{StaticResource spinEditorTemplate2}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"BorderThickness\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"BorderBrush\"/>\n                </mxpg:PropertyGridTabRowItem>\n            </mxpg:PropertyGridTabRow>\n\n            <mxpg:PropertyGridTabRow Caption=\"Layout\">\n                <mxpg:PropertyGridTabRowItem Header=\"Layout\">\n                    <mxpg:PropertyGridRow FieldName=\"Left\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Top\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Right\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Bottom\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Width\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"Height\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                </mxpg:PropertyGridTabRowItem>\n\n                <mxpg:PropertyGridTabRowItem Header=\"Alignment\">\n                    <mxpg:PropertyGridRow FieldName=\"HorizontalAlignment\"/>\n                    <mxpg:PropertyGridRow FieldName=\"VerticalAlignment\"/>\n                    <mxpg:PropertyGridRow FieldName=\"HorizontalContentAlignment\"/>\n                    <mxpg:PropertyGridRow FieldName=\"VerticalContentAlignment\"/>\n                </mxpg:PropertyGridTabRowItem>\n\n                <mxpg:PropertyGridTabRowItem Header=\"Transforms\">\n                    <mxpg:PropertyGridRow FieldName=\"ScaleX\" CellTemplate=\"{StaticResource spinEditorTemplate2}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"ScaleY\" CellTemplate=\"{StaticResource spinEditorTemplate2}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"MirrorX\"/>\n                    <mxpg:PropertyGridRow FieldName=\"MirrorY\"/>\n                    <mxpg:PropertyGridRow FieldName=\"RotateAngle\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"RotateCenterX\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                    <mxpg:PropertyGridRow FieldName=\"RotateCenterY\" CellTemplate=\"{StaticResource spinEditorTemplate1}\"/>\n                </mxpg:PropertyGridTabRowItem>\n            </mxpg:PropertyGridTabRow>\n        </mxpg:PropertyGridControl>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/PropertyGrid/PropertyGridTabItemsView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing DemoCenter.Views.PropertyGrid.Utils;\n\nnamespace DemoCenter.Views\n{\n    public partial class PropertyGridTabItemsView : UserControl\n    {\n        public PropertyGridTabItemsView()\n        {\n            InitializeComponent();\n\n            DataContext = new ContentControlPropertiesWrapper(contentControl);\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/PropertyGrid/Utils/ContentControlPropertiesWrapper.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing Avalonia.Media;\nusing Avalonia.Media.Immutable;\n\nnamespace DemoCenter.Views.PropertyGrid.Utils\n{\n    public class ContentControlPropertiesWrapper\n    {\n        ContentControl contentControl;\n\n        double rotateAngle;\n        double rotateCenterX;\n        double rotateCenterY;\n        double scaleX = 1;\n        double scaleY = 1;\n        bool mirrorX;\n        bool mirrorY;\n\n        public ContentControlPropertiesWrapper(ContentControl contentControl)\n        {\n            this.contentControl = contentControl;\n        }\n\n        public string Content\n        {\n            get => contentControl.Content as string;\n            set => contentControl.Content = value;\n        }\n\n        public Color Foreground\n        {\n            get\n            {\n                if (contentControl.Foreground is SolidColorBrush solidColorBrush)\n                    return solidColorBrush.Color;\n                return Colors.Transparent;\n            }\n            set => contentControl.Foreground = new SolidColorBrush(value);\n        }\n\n        public string FontFamily\n        {\n            get => contentControl.FontFamily.Name;\n            set => contentControl.FontFamily = new FontFamily(value);\n        }\n\n        public double FontSize\n        {\n            get => contentControl.FontSize;\n            set => contentControl.FontSize = value;\n        }\n\n        public FontWeight FontWeight\n        {\n            get => contentControl.FontWeight;\n            set => contentControl.FontWeight = value;\n        }\n\n        public FontStyle FontStyle\n        {\n            get => contentControl.FontStyle;\n            set => contentControl.FontStyle = value;\n        }\n\n        public Color Background\n        {\n            get\n            {\n                if (contentControl.Background is ImmutableSolidColorBrush solidColorBrush)\n                    return solidColorBrush.Color;\n                return Colors.Transparent;\n            }\n            set => contentControl.Background = new SolidColorBrush(value).ToImmutable();\n        }\n\n        public Color BorderBrush\n        {\n            get\n            {\n                if (contentControl.BorderBrush is ImmutableSolidColorBrush solidColorBrush)\n                    return solidColorBrush.Color;\n                return Colors.Transparent;\n            }\n            set => contentControl.BorderBrush = new SolidColorBrush(value).ToImmutable();\n        }\n\n        public double BorderThickness\n        {\n            get => contentControl.BorderThickness.Left;\n            set => contentControl.BorderThickness = new Thickness(value);\n        }\n\n        public double Opacity\n        {\n            get => contentControl.Opacity;\n            set => contentControl.Opacity = value;\n        }\n\n        public double Left\n        {\n            get => contentControl.Margin.Left;\n            set => contentControl.Margin = new Thickness(value, contentControl.Margin.Top, contentControl.Margin.Right, contentControl.Margin.Bottom);\n        }\n\n        public double Top\n        {\n            get => contentControl.Margin.Top;\n            set => contentControl.Margin = new Thickness(contentControl.Margin.Left, value, contentControl.Margin.Right, contentControl.Margin.Bottom);\n        }\n\n        public double Right\n        {\n            get => contentControl.Margin.Right;\n            set => contentControl.Margin = new Thickness(contentControl.Margin.Left, contentControl.Margin.Top, value, contentControl.Margin.Bottom);\n        }\n\n        public double Bottom\n        {\n            get => contentControl.Margin.Bottom;\n            set => contentControl.Margin = new Thickness(contentControl.Margin.Left, contentControl.Margin.Top, contentControl.Margin.Right, value);\n        }\n\n        public HorizontalAlignment HorizontalAlignment\n        {\n            get => contentControl.HorizontalAlignment;\n            set => contentControl.HorizontalAlignment = value;\n        }\n\n        public VerticalAlignment VerticalAlignment\n        {\n            get => contentControl.VerticalAlignment;\n            set => contentControl.VerticalAlignment = value;\n        }\n\n        public HorizontalAlignment HorizontalContentAlignment\n        {\n            get => contentControl.HorizontalContentAlignment;\n            set => contentControl.HorizontalContentAlignment = value;\n        }\n\n        public VerticalAlignment VerticalContentAlignment\n        {\n            get => contentControl.VerticalContentAlignment;\n            set => contentControl.VerticalContentAlignment = value;\n        }\n\n        public double Width\n        {\n            get => contentControl.Width;\n            set => contentControl.Width = value;\n        }\n\n        public double Height\n        {\n            get => contentControl.Height;\n            set => contentControl.Height = value;\n        }\n\n        public double RotateAngle\n        {\n            get => rotateAngle;\n            set\n            {\n                rotateAngle = value;\n                UpdateRenderTransform();\n            }\n        }\n\n        public double RotateCenterX\n        {\n            get => rotateCenterX;\n            set\n            {\n                rotateCenterX = value;\n                UpdateRenderTransform();\n            }\n        }\n\n        public double RotateCenterY\n        {\n            get => rotateCenterY;\n            set\n            {\n                rotateCenterY = value;\n                UpdateRenderTransform();\n            }\n        }\n\n        public double ScaleX\n        {\n            get => scaleX;\n            set\n            {\n                scaleX = value;\n                UpdateRenderTransform();\n            }\n        }\n\n        public double ScaleY\n        {\n            get => scaleY;\n            set\n            {\n                scaleY = value;\n                UpdateRenderTransform();\n            }\n        }\n\n        public bool MirrorX\n        {\n            get => mirrorX;\n            set\n            {\n                mirrorX = value;\n                UpdateRenderTransform();\n            }\n        }\n\n        public bool MirrorY\n        {\n            get => mirrorY;\n            set\n            {\n                mirrorY = value;\n                UpdateRenderTransform();\n            }\n        }\n\n        void UpdateRenderTransform()\n        {\n            var transformGroup = new TransformGroup();\n            transformGroup.Children.Add(new RotateTransform(rotateAngle, rotateCenterX, rotateCenterY));\n            transformGroup.Children.Add(new ScaleTransform(scaleX * (mirrorX ? -1 : 1), scaleY * (mirrorY ? -1 : 1)));\n            contentControl.RenderTransform = transformGroup;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Ribbon/FontStyleGalleryItemForegroundConverter.cs",
    "content": "using System.Globalization;\nusing Avalonia;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Media;\n\nnamespace DemoCenter.Views;\n\npublic class FontStyleGalleryItemForegroundConverter : MarkupExtension, IValueConverter\n{\n    public override object ProvideValue(IServiceProvider serviceProvider)\n    {\n        return this;\n    }\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        if (value is IBrush b)\n        {\n            return b;\n        }\n\n        return AvaloniaProperty.UnsetValue;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        throw new NotImplementedException();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Ribbon/WordPadExampleView.axaml",
    "content": "﻿<UserControl\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n             xmlns:mxr=\"https://schemas.eremexcontrols.net/avalonia/ribbon\"\n             xmlns:icons=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:views=\"clr-namespace:DemoCenter.Views\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.WordPadExampleView\">\n    <UserControl.Resources>\n        <views:FontStyleGalleryItemForegroundConverter x:Key=\"ForegroundConverter\" />\n    </UserControl.Resources>\n    <UserControl.DataTemplates>\n        <DataTemplate DataType=\"vm:FontStyleGalleryItem\">\n            <TextBlock Text=\"{Binding Header}\"\n                       FontSize=\"{Binding FontSize}\"\n                       FontWeight=\"{Binding FontWeight}\"\n                       FontStyle=\"{Binding  FontStyle}\"\n                       Foreground=\"{Binding Foreground, Converter={StaticResource ForegroundConverter}}\"\n                       HorizontalAlignment=\"Center\"\n                       VerticalAlignment=\"Center\"\n                       TextTrimming=\"CharacterEllipsis\" />\n        </DataTemplate>\n    </UserControl.DataTemplates>\n    <mxb:ToolbarManager IsWindowManager=\"True\">\n        <mxr:RibbonControl ApplicationButtonContent=\"File\" ApplicationButtonKeyTip=\"F\">\n            <mxr:RibbonControl.ApplicationButtonDropDownControl>\n                <mxb:PopupMenu MinWidth=\"250\" ContentRightIndent=\"30\">\n                    <mxb:ToolbarButtonItem Header=\"New\" Glyph=\"{x:Static icons:Basic.Doc}\" GlyphSize=\"32,32\" HotKey=\"Ctrl+N\"/>\n                    <mxb:ToolbarButtonItem Header=\"Open\" Glyph=\"{x:Static icons:Basic.Folder_Open}\" GlyphSize=\"32,32\" HotKey=\"Ctrl+O\"/>\n                    <mxb:ToolbarButtonItem Header=\"Save\" Glyph=\"{x:Static icons:Basic.Save}\" GlyphSize=\"32,32\"  HotKey=\"Ctrl+S\"/>\n                    <mxb:ToolbarButtonItem Header=\"Save All\" Glyph=\"{x:Static icons:Basic.Save_All}\" GlyphSize=\"32,32\"/>\n                    <mxb:ToolbarButtonItem Header=\"Exit\" Glyph=\"{x:Static icons:Basic.Cancel}\" ShowSeparator=\"True\" GlyphSize=\"32,32\"  HotKey=\"Ctrl+X\"/>\n                </mxb:PopupMenu>\n            </mxr:RibbonControl.ApplicationButtonDropDownControl>\n            <mxr:RibbonControl.QuickAccessToolbarItems>\n                <mxb:ToolbarButtonItem Header=\"Cut\" KeyTip=\"CT\"\n                                       Glyph=\"{x:Static icons:Basic.Cut}\"\n                                       HotKey=\"Ctrl+X\"\n                                       Hint=\"Remove the selection and put it on the Clipboard, so you can paste it somewhere else\" />\n                <mxb:ToolbarButtonItem Header=\"Copy\" KeyTip=\"CP\"\n                                       HotKey=\"Ctrl+C\"\n                                       Glyph=\"{x:Static icons:Basic.Copy}\" Hint=\"Put a copy of the selection on the Clipboard, so you can paste it somewhere else\" />\n                <mxb:ToolbarButtonItem Header=\"Paste\" KeyTip=\"P\"\n                                       HotKey=\"Ctrl+V\"\n                                       Glyph=\"{x:Static icons:Basic.Paste}\" Hint=\"Add content on the Clipboard to your document\" />\n            </mxr:RibbonControl.QuickAccessToolbarItems>\n            <mxr:RibbonControl.PageHeaderItems>\n                <mxb:ToolbarEditorItem EditorWidth=\"100\">\n                    <mxb:ToolbarEditorItem.EditorProperties>\n                        <mxe:ButtonEditorProperties>\n                            <mxe:ButtonEditorProperties.Buttons>\n                                <mxe:ButtonSettings Glyph=\"{x:Static icons:Basic.Search}\" GlyphSize=\"12, 12\"/>\n                            </mxe:ButtonEditorProperties.Buttons>\n                        </mxe:ButtonEditorProperties>\n                    </mxb:ToolbarEditorItem.EditorProperties>\n                </mxb:ToolbarEditorItem>\n            </mxr:RibbonControl.PageHeaderItems>\n            <mxr:RibbonPage Header=\"Home\" KeyTip=\"M\">\n                <mxr:RibbonPageGroup Header=\"File\" IsHeaderButtonVisible=\"True\">\n                    <mxb:ToolbarButtonItem Header=\"New\" KeyTip=\"N\" Glyph=\"{x:Static icons:Basic.Docs_Add}\"\n                                           mxr:RibbonControl.DisplayMode=\"Large\"\n                                           Hint=\"Create a new, blank document\"\n                                           DropDownArrowVisibility=\"ShowSplitArrow\">\n                        <mxb:ToolbarButtonItem.DropDownControl>\n                            <mxb:PopupMenu>\n                                <mxb:ToolbarButtonItem Header=\"New Document\" KeyTip=\"ND\" Glyph=\"{x:Static icons:Basic.Doc_Add}\" />\n                                <mxb:ToolbarButtonItem Header=\"New Excel Document\" KeyTip=\"NX\"\n                                                       Glyph=\"{x:Static icons:Basic.Doc_Excel}\" />\n                            </mxb:PopupMenu>\n                        </mxb:ToolbarButtonItem.DropDownControl>\n                    </mxb:ToolbarButtonItem>\n                    <mxb:ToolbarButtonItem Header=\"Open\" KeyTip=\"O\"\n                                           HotKey=\"Ctrl+O\"\n                                           mxr:RibbonControl.DisplayMode=\"Small\"\n                                           Hint=\"Open the document\"\n                                           Glyph=\"{x:Static icons:Basic.Folder_Open}\" />\n                    <mxb:ToolbarButtonItem Header=\"Save\" KeyTip=\"S\"\n                                           HotKey=\"Ctrl+S\"\n                                           mxr:RibbonControl.DisplayMode=\"Small\"\n                                           Hint=\"Save the active document\"\n                                           Glyph=\"{x:Static icons:Basic.Save}\" />\n                    <mxb:ToolbarButtonItem Header=\"Exit\" KeyTip=\"E\"\n                                           mxr:RibbonControl.DisplayMode=\"Small\"\n                                           Hint=\"Exit Application\"\n                                           Glyph=\"{x:Static icons:Basic.Cancel}\" />\n                </mxr:RibbonPageGroup>\n                <mxr:RibbonPageGroup Header=\"Clipboard\" IsHeaderButtonVisible=\"True\">\n                    <mxb:ToolbarButtonItem Header=\"Paste\" KeyTip=\"PA\" Glyph=\"{x:Static icons:Basic.Paste}\"\n                                           mxr:RibbonControl.DisplayMode=\"Large\"\n                                           Hint=\"Add content on the Clipboard to your document\"\n                                           DropDownArrowVisibility=\"ShowSplitArrow\">\n                        <mxb:ToolbarButtonItem.DropDownControl>\n                            <mxb:PopupMenu>\n                                <mxb:ToolbarButtonItem Header=\"Paste Special\" KeyTip=\"PS\" Glyph=\"{x:Static icons:Office.Paste_Picture}\" />\n                                <mxb:ToolbarButtonItem Header=\"Set Default Paste...\" KeyTip=\"SP\" />\n                            </mxb:PopupMenu>\n                        </mxb:ToolbarButtonItem.DropDownControl>\n                    </mxb:ToolbarButtonItem>\n                    <mxb:ToolbarButtonItem Header=\"Cut\" KeyTip=\"CT\"\n                                           Glyph=\"{x:Static icons:Basic.Cut}\" \n                                           HotKey=\"Ctrl+V\"\n                                           mxr:RibbonControl.DisplayMode=\"Small\"\n                                           Hint=\"Remove the selection and put it on the Clipboard, so you can paste it somewhere else\"/>\n                    <mxb:ToolbarButtonItem Header=\"Copy\" KeyTip=\"CP\"\n                                           mxr:RibbonControl.DisplayMode=\"Small\"\n                                           Glyph=\"{x:Static icons:Basic.Copy}\" \n                                           HotKey=\"Ctrl+C\"\n                                           Hint=\"Put a copy of the selection on the Clipboard, so you can paste it somewhere else\"/>\n                </mxr:RibbonPageGroup>\n                <mxr:RibbonPageGroup Header=\"Font\" IsHeaderButtonVisible=\"True\">\n                    <mxb:ToolbarItemGroup>\n                        <mxb:ToolbarEditorItem Header=\"Font\" KeyTip=\"FN\" EditorWidth=\"100\"\n                                               EditorValue=\"{Binding SelectedFont, Mode=TwoWay}\">\n                            <mxb:ToolbarEditorItem.EditorProperties>\n                                <mxe:ComboBoxEditorProperties ItemsSource=\"{Binding Fonts}\" />\n                            </mxb:ToolbarEditorItem.EditorProperties>\n                        </mxb:ToolbarEditorItem>\n                    </mxb:ToolbarItemGroup>\n                    <mxb:ToolbarItemGroup>\n                        <mxb:ToolbarEditorItem Header=\"Font Size\" KeyTip=\"FS\" EditorWidth=\"60\" EditorValue=\"{Binding SelectedSize}\">\n                            <mxb:ToolbarEditorItem.EditorProperties>\n                                <mxe:ComboBoxEditorProperties ItemsSource=\"{Binding FontSizes}\" />\n                            </mxb:ToolbarEditorItem.EditorProperties>\n                        </mxb:ToolbarEditorItem>\n                    </mxb:ToolbarItemGroup>\n                    <mxb:ToolbarItemGroup ShowSeparator=\"True\">\n                        <mxb:ToolbarButtonItem Header=\"Increase Font Size\" KeyTip=\"FG\" Glyph=\"{x:Static icons:Office.Increase_FontSize}\" \n                                               Hint=\"Make your text a bit bigger\"/>\n                        <mxb:ToolbarButtonItem Header=\"Decrease Font Size\" KeyTip=\"FC\" Glyph=\"{x:Static icons:Office.Decrease_FontSize}\" \n                                               Hint=\"Make your text a bit smaller\"/>\n                    </mxb:ToolbarItemGroup>\n                    <mxb:ToolbarCheckItemGroup>\n                        <mxb:ToolbarCheckItem Header=\"Bold\" KeyTip=\"B\" Glyph=\"{x:Static icons:Basic.Font_Bold}\"\n                                              HotKey=\"Ctrl+B\"\n                                              Hint=\"Make your text bold\"/>\n                        <mxb:ToolbarCheckItem Header=\"Italic\" KeyTip=\"I\" Glyph=\"{x:Static icons:Basic.Font_Italic}\" \n                                              HotKey=\"Ctrl+I\"\n                                              Hint=\"Italicize your text\"/>\n                        <mxb:ToolbarCheckItem Header=\"Underline\" KeyTip=\"U\" Glyph=\"{x:Static icons:Basic.Font_Underline}\" \n                                              HotKey=\"Ctrl+U\"\n                                              Hint=\"Underline your text\"/>\n                    </mxb:ToolbarCheckItemGroup>\n                    <mxb:ToolbarCheckItemGroup CheckType=\"Single\">\n                        <mxb:ToolbarCheckItem Header=\"Subscript\" KeyTip=\"SB\" Glyph=\"{x:Static icons:Office.SubScript}\"\n                                              Hint=\"Type very small letters just below the line of text\"/>\n                        <mxb:ToolbarCheckItem Header=\"Superscript\" KeyTip=\"SS\" Glyph=\"{x:Static icons:Office.UpperScript}\" \n                                              Hint=\"Type very small letters just above the line of text\"/>\n                    </mxb:ToolbarCheckItemGroup>\n                    <mxb:ToolbarItemGroup ShowSeparator=\"True\">\n                        <mxb:ToolbarButtonItem Header=\"Text Color\" KeyTip=\"FC\"\n                                               Glyph=\"{x:Static icons:Office.Font_Color}\"\n                                               Hint=\"Change the color of your text\"\n                                               DropDownArrowVisibility=\"ShowArrow\">\n                        </mxb:ToolbarButtonItem>\n                        <mxb:ToolbarButtonItem Header=\"Text Highlight Color\" KeyTip=\"BC\" Glyph=\"{x:Static icons:Office.Fill}\"\n                                               Hint=\"Change the color behind the selected text\"\n                                               DropDownArrowVisibility=\"ShowArrow\" />\n                    </mxb:ToolbarItemGroup>\n                </mxr:RibbonPageGroup>\n                <mxr:RibbonPageGroup Header=\"Paragraph\" IsHeaderButtonVisible=\"True\">\n                    <mxb:ToolbarItemGroup ShowSeparator=\"True\">\n                        <mxb:ToolbarButtonItem Header=\"Bullets\" KeyTip=\"BB\" \n                                               Hint=\"Create a bulleted list\"\n                                              Glyph=\"{x:Static icons:Office.Bullets}\" />\n                        <mxb:ToolbarButtonItem Header=\"Numbering\" KeyTip=\"NM\"\n                                               Hint=\"Create a numbered list\"\n                                               Glyph=\"{x:Static icons:Office.Line_Numbering}\" />\n                        <mxb:ToolbarButtonItem Header=\"Multilevel list\" \n                                               KeyTip=\"ML\"\n                                               Hint=\"Create a multilevel list to organize items or create an outline\"\n                                               Glyph=\"{x:Static icons:Office.Multilevel_List}\" />\n                    </mxb:ToolbarItemGroup>\n                    <mxb:ToolbarItemGroup ShowSeparator=\"True\">\n                        <mxb:ToolbarButtonItem Header=\"Increase\" KeyTip=\"CR\" Glyph=\"{x:Static icons:Basic.Level_Increase}\" \n                                               Hint=\"Make your paragraph closer to the margin\"/>\n                        <mxb:ToolbarButtonItem Header=\"Decrease\" KeyTip=\"DC\" Glyph=\"{x:Static icons:Basic.Level_Reduce}\" \n                                               Hint=\"Make your paragraph farther away from the margin\"/>\n                    </mxb:ToolbarItemGroup>\n                    <mxb:ToolbarCheckItemGroup CheckType=\"Radio\">\n                        <mxb:ToolbarCheckItem Header=\"AlignLeft\" KeyTip=\"AL\" Glyph=\"{x:Static icons:Alignment.Align_Left}\" \n                                              HotKey=\"Ctrl+L\"\n                                              Hint=\"Align content with the left margin\"/>\n                        <mxb:ToolbarCheckItem Header=\"AlignCenter\" KeyTip=\"AC\"\n                                              Glyph=\"{x:Static icons:Alignment.Align_Horizontal_Centers}\"\n                                              HotKey=\"Ctrl+E\"\n                                              Hint=\"Center your content on the page\"/>\n                        <mxb:ToolbarCheckItem Header=\"AlignRight\" KeyTip=\"AR\" Glyph=\"{x:Static icons:Alignment.Align_Right}\" \n                                              HotKey=\"Ctrl+R\"\n                                              Hint=\"Align content with the right margin\"/>\n                    </mxb:ToolbarCheckItemGroup>\n                </mxr:RibbonPageGroup>\n                <mxr:RibbonPageGroup Header=\"Styles\" IsHeaderButtonVisible=\"True\">\n                    <mxr:RibbonGalleryItem StretchItemVertically=\"True\" MaxColumnCount=\"3\" ItemWidth=\"108\"\n                                           ItemHeight=\"74\"\n                                           Header=\"Styles\"\n                                           MaxDropDownColumnCount=\"4\"\n                                           ItemsSource=\"{Binding FontStyles}\">\n                        <mxr:RibbonGalleryItem.DropDownItems>\n                            <mxb:ToolbarButtonItem Header=\"Create a Style...\" Glyph=\"{x:Static icons:Office.Create_Style}\" />\n                            <mxb:ToolbarButtonItem Header=\"Clear Formatting\"\n                                                   Glyph=\"{x:Static icons:Office.Clear_Formatting}\" \n                                                   Hint=\"Remove all the formatting from the selection, leaving only the normal, unformatted text\"/>\n                            <mxb:ToolbarButtonItem Header=\"Apply Styles\" Glyph=\"{x:Static icons:Office.Apply_Style}\" />\n                        </mxr:RibbonGalleryItem.DropDownItems>\n                    </mxr:RibbonGalleryItem>\n                </mxr:RibbonPageGroup>\n                <mxr:RibbonPageGroup Header=\"Editing\" IsHeaderButtonVisible=\"False\">\n                    <mxb:ToolbarButtonItem Header=\"Find\" KeyTip=\"FN\" Glyph=\"{x:Static icons:Basic.Search}\"\n                                           Hint=\"Find text or other content in the document\"/>\n                    <mxb:ToolbarButtonItem Header=\"Replace\" KeyTip=\"RP\" Glyph=\"{x:Static icons:Office.Replace}\"\n                                           Hint=\"Search for text you'd like to change, and replace it with something else\"/>\n                    <mxb:ToolbarButtonItem Header=\"Clear\" KeyTip=\"CL\" Glyph=\"{x:Static icons:Office.Clear_Formatting}\" \n                                           Hint=\"Clear selection\"/>\n                </mxr:RibbonPageGroup>\n            </mxr:RibbonPage>\n            <mxr:RibbonPage Header=\"Layout\" KeyTip=\"L\">\n                <mxr:RibbonPageGroup Header=\"Paragraph\">\n                    <mxb:ToolbarTextItem Header=\"Indent\"\n                                         ShowBorder=\"False\" />\n                    <mxb:ToolbarEditorItem Glyph=\"{x:Static icons:Basic.Level_Increase}\"\n                                           Header=\"Left: \"\n                                           EditorWidth=\"100\"\n                                           EditorValue=\"0\">\n                            <mxb:ToolbarEditorItem.EditorProperties>\n                                <mxe:SpinEditorProperties Minimum=\"0\" MaskUseAsDisplayFormat=\"True\" Mask=\"##''\" HorizontalContentAlignment=\"Left\"/>\n                            </mxb:ToolbarEditorItem.EditorProperties>\n                    </mxb:ToolbarEditorItem>\n                    <mxb:ToolbarEditorItem Glyph=\"{x:Static icons:Basic.Level_Reduce}\"\n                                           Header=\"Right:\"\n                                           EditorWidth=\"100\"\n                                           EditorValue=\"0\">\n                        <mxb:ToolbarEditorItem.EditorProperties>\n                            <mxe:SpinEditorProperties Minimum=\"0\" MaskUseAsDisplayFormat=\"True\" Mask=\"##''\" HorizontalContentAlignment=\"Left\"/>\n                        </mxb:ToolbarEditorItem.EditorProperties>\n                    </mxb:ToolbarEditorItem>\n                    <mxb:ToolbarTextItem Header=\"Spacing\"\n                                         ShowBorder=\"False\"/>\n                    <mxb:ToolbarEditorItem Glyph=\"{x:Static icons:Basic.Level_Increase}\"\n                                           Header=\"Before:\"\n                                           EditorWidth=\"100\"\n                                           EditorValue=\"0\">\n                        <mxb:ToolbarEditorItem.EditorProperties>\n                            <mxe:SpinEditorProperties Minimum=\"0\" MaskUseAsDisplayFormat=\"True\" Mask=\"## pt\" HorizontalContentAlignment=\"Left\"/>\n                        </mxb:ToolbarEditorItem.EditorProperties>\n                    </mxb:ToolbarEditorItem>\n                    <mxb:ToolbarEditorItem Glyph=\"{x:Static icons:Basic.Level_Reduce}\"\n                                           Header=\"After:  \"\n                                           EditorWidth=\"100\"\n                                           EditorValue=\"8\">\n                        <mxb:ToolbarEditorItem.EditorProperties>\n                            <mxe:SpinEditorProperties Minimum=\"0\" MaskUseAsDisplayFormat=\"True\" Mask=\"## pt\" HorizontalContentAlignment=\"Left\"/>\n                        </mxb:ToolbarEditorItem.EditorProperties>\n                    </mxb:ToolbarEditorItem>\n                </mxr:RibbonPageGroup>\n            </mxr:RibbonPage>\n            <mxr:RibbonPage Header=\"View\" KeyTip=\"V\">\n                <mxr:RibbonPageGroup Header=\"Zoom\">\n                    <mxb:ToolbarButtonItem Header=\"Zoom In\"\n                                          KeyTip=\"ZI\"\n                                          Glyph=\"{x:Static icons:Scaling.Zoom_In}\"\n                                          Hint=\"Zoom in on the document\"/>\n                    <mxb:ToolbarButtonItem Header=\"Zoom Out\"\n                                           KeyTip=\"ZO\"\n                                           Glyph=\"{x:Static icons:Scaling.Zoom_Out}\"\n                                           Hint=\"Zoom in on the document\"/>\n                    <mxb:ToolbarButtonItem Header=\"100 %\"\n                                           KeyTip=\"ZJ\"\n                                           Glyph=\"{x:Static icons:Scaling.Zoom_Selected}\"\n                                           Hint=\"Zoom the document to 100% of the normal size\"/>\n                </mxr:RibbonPageGroup>\n                <mxr:RibbonPageGroup Header=\"Show or hide\">\n                    <mxb:ToolbarCheckItem Header=\"Rulers\"\n                                          KeyTip=\"RL\"\n                                          CheckBoxStyle=\"CheckBox\"\n                                          Hint=\"Show and hide ruler. You can use ruler to measure and line up text and objects in the document\"/>\n                    <mxb:ToolbarCheckItem Header=\"Status bar\"\n                                          KeyTip=\"SB\"\n                                          CheckBoxStyle=\"CheckBox\"\n                                          Hint=\"Show and hide status bar at the bottom of the window\"/>\n                </mxr:RibbonPageGroup>\n            </mxr:RibbonPage>\n            <mxr:RibbonPage Header=\"Help\" KeyTip=\"H\">\n                <mxr:RibbonPageGroup Header=\"Help\" IsHeaderButtonVisible=\"False\">\n                    <mxb:ToolbarButtonItem Header=\"Help\" KeyTip=\"LP\" Glyph=\"{x:Static icons:Basic.Info}\"\n                                           mxr:RibbonControl.DisplayMode=\"Large\" />\n                    <mxb:ToolbarButtonItem Header=\"Send Message\" KeyTip=\"SM\" Glyph=\"{x:Static icons:Basic.Horizontal_Doc_Text}\"\n                                           mxr:RibbonControl.DisplayMode=\"Large\" />\n                </mxr:RibbonPageGroup>\n            </mxr:RibbonPage>\n        </mxr:RibbonControl>\n    </mxb:ToolbarManager>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Ribbon/WordPadExampleView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing DemoCenter.ViewModels;\n\nnamespace DemoCenter.Views;\n\npublic partial class WordPadExampleView : UserControl\n{\n    public WordPadExampleView()\n    {\n        InitializeComponent();\n        DataContext = new WordPadExampleViewModel();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/PrimitivesPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.PrimitivesPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:PrimitivesPageViewModel\"\n             mc:Ignorable=\"d\">\n    <Design.DataContext>\n        <vm:PrimitivesPageViewModel />\n    </Design.DataContext>\n    <UserControl.Styles>\n        <Style Selector=\"Button.localStyle\">\n            <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\"/>\n        </Style>\n    </UserControl.Styles>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n            <Grid RowDefinitions=\"Auto, 20, Auto, 60, *\"\n                  ColumnDefinitions=\"*, 20, *\"\n                  HorizontalAlignment=\"Center\"\n                  MinWidth=\"400\"\n                  IsEnabled=\"{Binding IsChecked, ElementName=IsEnabledSelector}\">\n                <Button Content=\"Ordinary Button\" Classes=\"localStyle\" />\n                <Button Grid.Row=\"2\" Content=\"Accent Button\" Classes=\"accent localStyle\" />\n                <Button Grid.Column=\"2\" Content=\"Warning Button\" Classes=\"warning localStyle\" />\n                <Button Grid.Row=\"2\" Grid.Column=\"2\" Content=\"Warning Accent Button\" Classes=\"warning accent localStyle\" />\n                <mxe:GroupBox Header=\"Check boxes\" Grid.Row=\"4\" VerticalAlignment=\"Top\">\n                    <StackPanel>\n                        <CheckBox Content=\"Unchecked\"/>\n                        <CheckBox Content=\"Checked\" IsChecked=\"True\"/>\n                        <CheckBox Content=\"Indeterminate\" IsChecked=\"{x:Null}\" IsThreeState=\"True\"/>\n                        <CheckBox Content=\"Warning Unchecked\" Classes=\"warning\"/>\n                        <CheckBox Content=\"Warning Checked\" IsChecked=\"True\" Classes=\"warning\"/>\n                    </StackPanel>\n                </mxe:GroupBox>\n                <mxe:GroupBox Header=\"Radio Buttons\" Grid.Row=\"4\" Grid.Column=\"2\" VerticalAlignment=\"Top\">\n                    <StackPanel>\n                        <RadioButton Content=\"Item 1\" GroupName=\"G1\"/>\n                        <RadioButton Content=\"Item 2\" IsChecked=\"True\" GroupName=\"G1\" Margin=\"0,0,0,28\"/>\n\n                        <RadioButton Content=\"Warning Item 1\" IsChecked=\"True\" Classes=\"warning\" GroupName=\"G2\"/>\n                        <RadioButton Content=\"Warning Item 2\" Classes=\"warning\" GroupName=\"G2\"/>\n                    </StackPanel>\n                </mxe:GroupBox>\n            </Grid>            \n        </ContentControl>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Enabled\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/PrimitivesPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class PrimitivesPageView : UserControl\n    {\n        public PrimitivesPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/ProgressBarPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.ProgressBarPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"500\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:ProgressBarPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:ProgressBarPageViewModel />\n\t</Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n            <Grid RowDefinitions=\"Auto, 30, Auto\"\n                  HorizontalAlignment=\"Center\"\n                  MinWidth=\"400\">\n                <ProgressBar x:Name=\"HorizontalProgressBar\" HorizontalAlignment=\"Stretch\"\n                             IsIndeterminate=\"{Binding #IsIndeterminateSelector.IsChecked}\"\n                             ShowProgressText=\"{Binding #ShowProgressTextSelector.IsChecked}\"\n                             Minimum=\"{Binding #MinimumSelector.Value}\"\n                             Maximum=\"{Binding #MaximumSelector.Value}\"\n                             Value=\"{Binding #ValueSelector.Value}\"\n                             ProgressTextFormat=\"{Binding SelectedTextFormat}\"\n                             MinHeight=\"16\"/>\n                <ProgressBar x:Name=\"VerticalProgressBar\" Grid.Row=\"2\"\n                             Height=\"340\" HorizontalAlignment=\"Center\" Orientation=\"Vertical\"\n                             IsIndeterminate=\"{Binding #IsIndeterminateSelector.IsChecked}\"\n                             ShowProgressText=\"{Binding #ShowProgressTextSelector.IsChecked}\"\n                             Minimum=\"{Binding #MinimumSelector.Value}\"\n                             Maximum=\"{Binding #MaximumSelector.Value}\"\n                             Value=\"{Binding #ValueSelector.Value}\"\n                             ProgressTextFormat=\"{Binding SelectedTextFormat}\"\n                             MinWidth=\"16\"/>\n            </Grid>  \n        </ContentControl>\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"ShowProgressTextSelector\" Content=\"Show Progress Text\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"1\" x:Name=\"IsIndeterminateSelector\" Content=\"Indeterminate\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"2\" Content=\"Maximum\" Classes=\"PropertyLabel\"/>\n                    <mxe:SpinEditor Grid.Row=\"3\" x:Name=\"MaximumSelector\" Value=\"100\" HorizontalContentAlignment=\"Left\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"4\" Content=\"Value\" Classes=\"PropertyLabel\"/>\n                    <mxe:SpinEditor Grid.Row=\"5\" x:Name=\"ValueSelector\" Value=\"41\" HorizontalContentAlignment=\"Left\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"6\" Content=\"Minimum\" Classes=\"PropertyLabel\"/>\n                    <mxe:SpinEditor Grid.Row=\"7\" x:Name=\"MinimumSelector\" HorizontalContentAlignment=\"Left\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"8\" Content=\"Text Format\" Classes=\"PropertyLabel\"/>                        \n                    <mxe:ComboBoxEditor Grid.Row=\"9\" x:Name=\"ProgressTextFormatSelector\" HorizontalContentAlignment=\"Left\"\n                                        ItemsSource=\"{Binding Formats}\"\n                                        SelectedItem=\"{Binding SelectedTextFormat, Mode=TwoWay}\" Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/ProgressBarPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class ProgressBarPageView : UserControl\n    {\n        public ProgressBarPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/SliderPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.SliderPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"500\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:SliderPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:SliderPageViewModel />\n\t</Design.DataContext>\n\n    <Grid ColumnDefinitions=\"*, 250\">\n        <ContentControl x:Name=\"DemoControl\" Classes=\"DemoUserControl\">\n            <Grid RowDefinitions=\"Auto, 20, Auto, 80, Auto\" ColumnDefinitions=\"Auto, Auto, Auto, * Auto, Auto\"\n                  HorizontalAlignment=\"Center\"\n                  MinWidth=\"400\"\n                  IsEnabled=\"{Binding IsChecked, ElementName=IsEnabledSelector}\">\n\n                <Label Content=\"Slider:\" VerticalAlignment=\"Center\"/>\n                <Label Grid.Row=\"2\" Content=\"Color slider:\" VerticalAlignment=\"Center\"/>\n                <Slider Grid.Column=\"1\" Grid.ColumnSpan=\"5\"\n                        Value=\"80\"\n                        IsSnapToTickEnabled=\"{Binding IsChecked, ElementName=IsSnapToTickEnabledSelector}\"\n                        TickPlacement=\"{Binding TickPlacement}\"\n                        Ticks=\"0,25,50,75,100\"/>\n                <Slider Grid.Column=\"1\" Grid.Row=\"2\" Grid.ColumnSpan=\"5\"\n                        Value=\"120\"\n                        TickPlacement=\"{Binding TickPlacement}\"\n                        Theme=\"{StaticResource ColorSliderTheme}\"/>\n\n                <Slider x:Name=\"VerticalSlider\" Grid.Row=\"4\" Grid.Column=\"1\" TickPlacement=\"{Binding TickPlacement}\" TickFrequency=\"10\" Value=\"30\" Orientation=\"Vertical\" Height=\"200\"/>\n                <mxe:TextEditor Grid.Row=\"4\" Grid.Column=\"2\" MinWidth=\"50\"\n                    DisplayFormatString=\"{}{0:N1}\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Top\" ReadOnly=\"True\"\n                    EditorValue=\"{Binding Maximum, ElementName=VerticalSlider}\"/>\n                <mxe:TextEditor Grid.Row=\"4\" Grid.Column=\"2\" VerticalAlignment=\"Center\" MinWidth=\"50\"\n                                DisplayFormatString=\"{}{0:N1}\"\n                                ReadOnly=\"True\"\n                                EditorValue=\"{Binding Value, ElementName=VerticalSlider}\"/>\n                <mxe:TextEditor Grid.Row=\"4\" Grid.Column=\"2\" VerticalAlignment=\"Bottom\" MinWidth=\"50\"\n                                DisplayFormatString=\"{}{0:N1}\" HorizontalAlignment=\"Right\" ReadOnly=\"True\"\n                                EditorValue=\"{Binding Minimum, ElementName=VerticalSlider}\"/>\n\n                <Slider x:Name=\"VerticalColorSlider\" Value=\"250\" Orientation=\"Vertical\" Grid.Row=\"4\" Grid.Column=\"5\"\n                        TickPlacement=\"{Binding TickPlacement}\" Theme=\"{StaticResource ColorSliderTheme}\"\n                        Height=\"200\" />\n                <mxe:TextEditor Grid.Row=\"4\" Grid.Column=\"4\" VerticalAlignment=\"Center\" MinWidth=\"50\" DisplayFormatString=\"{}{0:N1}\"\n                                ReadOnly=\"True\" EditorValue=\"{Binding Value, ElementName=VerticalColorSlider}\"/>\n            </Grid>            \n        </ContentControl>\n\n        <!--Options-->\n        <StackPanel Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                    <mxe:CheckEditor x:Name=\"IsEnabledSelector\" Content=\"Is Enabled\" IsChecked=\"True\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Grid.Row=\"1\" x:Name=\"IsSnapToTickEnabledSelector\" Content=\"Snap to Tick\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"2\" Content=\"Tick Placement\" Classes=\"PropertyLabel\"/>\n                    <mxe:ComboBoxEditor Grid.Row=\"3\" EditorValue=\"{Binding TickPlacement, Mode=TwoWay}\" ItemsSource=\"{mx:EnumItemsSource EnumType=TickPlacement}\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"4\" Content=\"Minimum\" Classes=\"PropertyLabel\"/>\n                    <mxe:SpinEditor Grid.Row=\"5\" Value=\"{Binding Minimum, ElementName=VerticalSlider, Mode=TwoWay}\" HorizontalContentAlignment=\"Left\" Classes=\"PropertyEditor\"/>\n                    <Label Grid.Row=\"6\" Content=\"Maximum\" Classes=\"PropertyLabel\"/>\n                    <mxe:SpinEditor Grid.Row=\"7\" Value=\"{Binding Maximum, ElementName=VerticalSlider, Mode=TwoWay}\" HorizontalContentAlignment=\"Left\" Classes=\"PropertyEditor\"/>\n                </Grid>\n            </mxe:GroupBox>\n        </StackPanel>\n    </Grid>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/SliderPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class SliderPageView : UserControl\n    {\n        public SliderPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/StandardControlsGroupView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.StandardControlsGroupView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Controls.Common;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxpg=\"clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxb=\"clr-namespace:Eremex.AvaloniaUI.Controls.Bars;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxu=\"clr-namespace:Eremex.AvaloniaUI.Controls.Utils;assembly=Eremex.Avalonia.Controls\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"600\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:StandardControlsGroupViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:StandardControlsGroupViewModel />\n\t</Design.DataContext>\n\n    <TextBlock VerticalAlignment=\"Center\"\n               HorizontalAlignment=\"Center\"\n               FontSize=\"16\"\n               Text=\"See product pages for details.\"/>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/StandardControlsGroupView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class StandardControlsGroupView : UserControl\n    {\n        public StandardControlsGroupView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/StandardControlsOverviewPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.StandardControlsOverviewPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"600\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:StandardControlsOverviewPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:StandardControlsOverviewPageViewModel />\n\t</Design.DataContext>\n\n    <UserControl.Styles>\n        <Style Selector=\"Button\">\n            <Setter Property=\"HorizontalAlignment\" Value=\"Center\"/>\n        </Style>\n        <Style Selector=\"CheckBox\">\n            <Setter Property=\"HorizontalAlignment\" Value=\"Center\"/>\n        </Style>\n        <Style Selector=\"RadioButton\">\n            <Setter Property=\"HorizontalAlignment\" Value=\"Center\"/>\n        </Style>\n    </UserControl.Styles>\n\n\t<StackPanel HorizontalAlignment=\"Center\" MinWidth=\"400\" VerticalAlignment=\"Center\">\n        <mxe:GroupBox Header=\"Primary View\">\n            <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"*, 20, *\">\n                <Button Content=\"Button\" Classes=\"LayoutItem\" />\n                <Button Grid.Column=\"2\" Content=\"Warning Button\" Classes=\"warning LayoutItem\" />\n                <CheckBox Grid.Row=\"1\"/>\n                <CheckBox Grid.Row=\"2\" IsChecked=\"True\"/>\n                <CheckBox Grid.Row=\"3\" Classes=\"warning\"/>\n                <RadioButton Grid.Row=\"1\" Grid.Column=\"2\"/>\n                <RadioButton Grid.Row=\"2\" Grid.Column=\"2\" />\n                <RadioButton Grid.Row=\"3\" Grid.Column=\"2\" IsChecked=\"True\" Classes=\"warning\"/>\n                <Slider Grid.ColumnSpan=\"3\" Value=\"30\" Grid.Row=\"4\" Margin=\"0,20,0,0\"/>\n            </Grid>\n        </mxe:GroupBox>\n        <mxe:GroupBox Header=\"Secondary View\">\n            <Border CornerRadius=\"{StaticResource EditorCornerRadius}\" Background=\"{DynamicResource Fill/Neutral/Secondary/Enabled}\">\n                <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"*, 20, *\">\n                    <Button Content=\"Button\" Classes=\"secondary LayoutItem\" />\n                    <Button Grid.Column=\"2\" Content=\"Warning Button\" Classes=\"secondary warning LayoutItem\" />\n                    <CheckBox Grid.Row=\"1\" Classes=\"secondary\"/>\n                    <CheckBox Grid.Row=\"2\" IsChecked=\"True\" Classes=\"secondary\"/>\n                    <CheckBox Grid.Row=\"3\" Classes=\"secondary warning\"/>\n                    <RadioButton Grid.Row=\"1\" Grid.Column=\"2\" Classes=\"secondary\"/>\n                    <RadioButton Grid.Row=\"2\" Grid.Column=\"2\" Classes=\"secondary\"/>\n                    <RadioButton Grid.Row=\"3\" Grid.Column=\"2\" IsChecked=\"True\" Classes=\"secondary warning\"/>\n                    <Slider Grid.ColumnSpan=\"3\" Value=\"30\" Grid.Row=\"4\" Margin=\"0,20,0,0\" Classes=\"secondary\"/>\n                </Grid>             \n            </Border>\n        </mxe:GroupBox>\n\t</StackPanel>  \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/StandardControls/StandardControlsOverviewPageView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class StandardControlsOverviewPageView : UserControl\n    {\n        public StandardControlsOverviewPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Tools/SvgIconsBrowserView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n\t\t\t xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:icons=\"clr-namespace:Eremex.AvaloniaUI.Icons;assembly=Eremex.Avalonia.Icons\"\n             xmlns:res=\"clr-namespace:DemoCenter.Views.Resources\"\n             xmlns:vm=\"clr-namespace:DemoCenter.ViewModels\"\n             xmlns:mxlv=\"https://schemas.eremexcontrols.net/avalonia/listview\"\n             xmlns:aEdit=\"clr-namespace:AvaloniaEdit;assembly=AvaloniaEdit\"\n             xmlns:internal=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors.Internal;assembly=Eremex.Avalonia.Controls\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.SvgIconsBrowserView\">\n    <UserControl.Styles>\n        <Style Selector=\"mxlv|ListViewItemControl.Detail/template/Rectangle#PART_Border\">\n            <Setter Property=\"Margin\" Value=\"1\"/>\n            <Setter Property=\"StrokeThickness\" Value=\"0\"/>\n            <Setter Property=\"RadiusX\" Value=\"0\"/>\n            <Setter Property=\"RadiusY\" Value=\"0\"/>\n        </Style>\n        \n        <Style Selector=\"Border.SimpleBorder\">\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource Outline/Neutral/Transparent/Light}\"/>\n            <Setter Property=\"Margin\" Value=\"0,6,0,0\"/>\n        </Style>\n        \n        <Style Selector=\"internal|SplitContainerLayoutSplitter\">\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n        </Style>\n        \n        <Style Selector=\"Border.IconPathBorder\">\n            <Setter Property=\"CornerRadius\" Value=\"0\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource Outline/Neutral/Transparent/Light}\" />\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"Margin\" Value=\"2, 2, 0, 2\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource Fill/Neutral/Secondary/Enabled}\"/>\n            <Setter Property=\"Cursor\" Value=\"IBeam\"/>\n        </Style>\n        \n        <Style Selector=\"TextBlock.IconPath\">\n            <Setter Property=\"IsHitTestVisible\" Value=\"False\"/>\n            <Setter Property=\"Padding\" Value=\"4, 4\"/>\n            <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n            <Setter Property=\"Cursor\" Value=\"IBeam\"/>\n        </Style>\n        \n        <Style Selector=\"mxe|ButtonEditor.SearchText\">\n            <Setter Property=\"CornerRadius\" Value=\"0\"/>\n            <Setter Property=\"HorizontalAlignment\" Value=\"Right\"/>\n        </Style>\n        \n    </UserControl.Styles>\n    \n    <Design.DataContext>\n        <vm:SvgIconsBrowserViewModel/>\n    </Design.DataContext>\n    \n    <Grid RowDefinitions=\"Auto, *\" Margin=\"12\">\n        <mxe:ButtonEditor Width=\"250\" Classes=\"SearchText\" EditorValue=\"{Binding SearchText}\" NullValueButtonPosition=\"EditorBox\">\n            <mxe:ButtonEditor.Buttons>\n                <mxe:ButtonSettings Glyph=\"{x:Static icons:Basic.Search}\" BorderBrush=\"Transparent\" Background=\"Transparent\" BorderThickness=\"0\" IsEnabled=\"False\"/>\n            </mxe:ButtonEditor.Buttons>\n        </mxe:ButtonEditor>\n        <Grid Grid.Row=\"1\" RowDefinitions=\"*, Auto\">\n            <mxe:SplitContainerControl Orientation=\"Horizontal\" Panel1Length=\"30*\" Panel2Length=\"70*\">\n                <mxe:SplitContainerControl.Panel1>\n                    <Grid RowDefinitions=\"Auto, *\">\n                        <Label Content=\"{x:Static res:SvgIconsBrowserViewResources.CategoriesCaption}\"/>\n                        <Border Grid.Row=\"1\" Classes=\"SimpleBorder\">\n                            <mxlv:ListViewControl ItemLayoutMode=\"Stack\" ItemHeight=\"28\" \n                                                 ItemClass=\"Detail\" \n                                                 ItemsSource=\"{Binding Categories}\" \n                                                 FocusedItem=\"{Binding FocusedCategory, Mode=TwoWay}\">\n                                <mxlv:ListViewControl.SortInfo>\n                                    <mxlv:ListViewSortInfo FieldName=\"DisplayName\"/>\n                                </mxlv:ListViewControl.SortInfo>\n                                <mxlv:ListViewControl.ItemTemplate>\n                                    <DataTemplate DataType=\"vm:SvgIconCategoryViewModel\">\n                                        <Grid ColumnDefinitions=\"Auto, *\">\n                                            <CheckBox IsChecked=\"{Binding IsChecked}\" Margin=\"0,0,4,0\" VerticalAlignment=\"Center\"/>\n                                            <TextBlock Grid.Column=\"1\" Text=\"{Binding DisplayName}\" VerticalAlignment=\"Center\"/>\n                                        </Grid>\n                                    </DataTemplate>\n                                </mxlv:ListViewControl.ItemTemplate>\n                            </mxlv:ListViewControl>\n                        </Border>\n                    </Grid>\n                </mxe:SplitContainerControl.Panel1>\n                <mxe:SplitContainerControl.Panel2>\n                    <Grid RowDefinitions=\"Auto, *\">\n                        <Label Content=\" \"/>\n                        <Border Grid.Row=\"1\" Classes=\"SimpleBorder\">\n                            <mxlv:ListViewControl\n                                x:Name=\"IconsListControl\"\n                                                 GroupClass=\"Icon\"\n                                                 ItemsSource=\"{Binding Items}\"\n                                                 FocusedItem=\"{Binding FocusedItem, Mode=TwoWay}\"\n                                                 SearchText=\"{Binding SearchText}\"\n                                                 FilterItem=\"ListViewControl_OnFilterItem\"\n                                                 GroupCount=\"1\">\n                                <mxlv:ListViewControl.SortInfo>\n                                    <mxlv:ListViewSortInfo FieldName=\"CategoryName\"/>\n                                </mxlv:ListViewControl.SortInfo>\n                                <mxlv:ListViewControl.DataTemplates>\n                                    <DataTemplate DataType=\"vm:SvgIconViewModel\">\n                                        <Image Width=\"32\" Height=\"32\" Margin=\"16\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Source=\"{Binding Icon}\" ToolTip.Tip=\"{Binding Path}\"/>\n                                    </DataTemplate>\n                                </mxlv:ListViewControl.DataTemplates>\n                            </mxlv:ListViewControl>\n                        </Border>\n                    </Grid>\n                </mxe:SplitContainerControl.Panel2>\n            </mxe:SplitContainerControl>\n\t\t\t<Grid Grid.Row=\"1\" IsVisible=\"{Binding HintVisible}\">\n\t\t\t\t<mx:MxTabControl MinHeight=\"250\">\n\t\t\t\t\t<mx:MxTabControl.Items>\n\t\t\t\t\t\t<mx:MxTabItem Header=\"XAML\">\n\t\t\t\t\t\t\t<aEdit:TextEditor IsReadOnly=\"True\" WordWrap=\"True\" Name=\"xamlCodeEditor\" PointerPressed=\"OnAxamlPathEditorPointerPressed\"/>\n\t\t\t\t\t\t</mx:MxTabItem>\n\t\t\t\t\t\t<mx:MxTabItem Header=\"C#\">\n\t\t\t\t\t\t\t<aEdit:TextEditor IsReadOnly=\"True\" WordWrap=\"True\" Name=\"sharpCodeEditor\" PointerPressed=\"OnPathEditorPointerPressed\" />\n\t\t\t\t\t\t</mx:MxTabItem>\n\t\t\t\t\t</mx:MxTabControl.Items>\n\t\t\t\t</mx:MxTabControl>\n\t\t\t</Grid>\n        </Grid>\n    </Grid>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Tools/SvgIconsBrowserView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Input.Platform;\nusing Avalonia.VisualTree;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.Editors;\nusing Eremex.AvaloniaUI.Controls.ListView;\n\nnamespace DemoCenter.Views;\nusing Avalonia.Threading;\nusing DemoCenter.Helpers;\nusing System.Text;\n\npublic partial class SvgIconsBrowserView : UserControl\n{\n    public SvgIconsBrowserView()\n    {\n        InitializeComponent();\n    }\n\n    protected override void OnDataContextChanged(EventArgs e)\n    {\n        base.OnDataContextChanged(e);\n        if(ViewModel != null)\n            UnsubscribeEvents(ViewModel);\n        ViewModel = (SvgIconsBrowserViewModel)DataContext;\n        if(ViewModel != null)\n            SubscribeEvents(ViewModel);\n    }\n    private void UpdateDocument(AvaloniaEdit.TextEditor codeEditor, string templateName, string selectedIconString)\n    {\n        codeEditor.Clear();\n        if (string.IsNullOrWhiteSpace(selectedIconString))\n            return;\n        var name = App.EmbeddedResources.FirstOrDefault(x =>\n            x.EndsWith(templateName, StringComparison.InvariantCultureIgnoreCase));\n        UpdateHighlighter(codeEditor, name.EndsWith(\".axaml\"));\n        using (var stream = System.Reflection.Assembly.GetAssembly(typeof(App))?.GetManifestResourceStream(name))\n        {\n            StreamReader reader = new StreamReader(stream, Encoding.UTF8);\n            var templateText = reader.ReadToEnd();\n            codeEditor.Text = templateText.Replace(\"@@NAME@@\", selectedIconString);\n        }\n    }\n\n    private void UpdateHighlighter(AvaloniaEdit.TextEditor codeEditor, bool isXaml)\n    {\n        if (isXaml)\n            codeEditor.SyntaxHighlighting =\n                            (new ThemedSyntaxHighlighter(\"Axaml-Highlight\")).HighlightingDefinition;\n        else\n            codeEditor.SyntaxHighlighting =\n                            new ThemedSyntaxHighlighter(\"CSharp-Highlight\").HighlightingDefinition;\n    }\n\n    private void SubscribeEvents(SvgIconsBrowserViewModel vm)\n    {\n        vm.RequestUpdateData += VmOnRequestUpdateData;\n        vm.RequestScrollToCategory += VmOnRequestScrollToCategory;\n        vm.PropertyChanged += ViewModelPropertyChanged;\n        UpdateDocument();\n    }\n\n    private void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\n    {\n        if (e.PropertyName == \"FocusedItem\")\n        {\n            UpdateDocument();\n        }\n    }\n\n    private void UpdateDocument()\n    {\n        UpdateDocument(sharpCodeEditor, \"svgCodeExample.cs\", ViewModel.IconPath);\n        UpdateDocument(xamlCodeEditor, \"svgXamlExample.axaml\", ViewModel.IconAxamlPath);\n    }\n\n    private void VmOnRequestScrollToCategory(SvgIconCategoryViewModel obj)\n    {\n        var groupIndex = IconsListControl.GetGroupIndex(nameof(SvgIconViewModel.CategoryName), obj.DisplayName);\n        IconsListControl.ScrollTo(groupIndex);\n        Dispatcher.UIThread.Post(() => IconsListControl.FocusedItemIndex = groupIndex);\n    }\n\n    private void VmOnRequestUpdateData()\n    {\n        IconsListControl.RefreshData();\n    }\n\n    private void UnsubscribeEvents(SvgIconsBrowserViewModel vm)\n    {\n        vm.RequestUpdateData -= VmOnRequestUpdateData;\n        vm.RequestScrollToCategory -= VmOnRequestScrollToCategory;\n        vm.PropertyChanged -= ViewModelPropertyChanged;\n    }\n\n    private SvgIconsBrowserViewModel ViewModel { get; set; }\n    private void ListViewControl_OnFilterItem(object sender, ListViewFilterEventArgs e)\n    {\n        ((SvgIconsBrowserViewModel)DataContext)?.OnCustomFilter(e);\n    }\n\n    private async void OnPathEditorPointerPressed(object sender, PointerPressedEventArgs e)\n    {\n        await CopyToClipboard((Control)sender, ViewModel.IconPath);\n    }\n    \n    private async void OnAxamlPathEditorPointerPressed(object sender, PointerPressedEventArgs e)\n    {\n        await CopyToClipboard((Control)sender, ViewModel.IconAxamlPath);\n    }\n\n    async Task CopyToClipboard(Control owner, string text)\n    {\n        IClipboard clipboard = ((Window)this.GetVisualRoot())?.Clipboard;\n        await clipboard?.SetTextAsync(text);\n        ToolTip.SetTip(owner, \"Copied\");\n        ToolTip.SetIsOpen(owner, true);\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Tools/Templates/svgCodeExample.cs",
    "content": "﻿using Eremex.AvaloniaUI.Icons;\n\nnamespace DemoCenter.Views.Tools.Templates\n{\n    public class SvgCodeExample\n    {\n        public IImage UseIconFromCode()\n        {\n            return @@NAME@@;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/Tools/Templates/svgXamlExample.axaml",
    "content": "<Window\nxmlns=\"https://github.com/avaloniaui\"\nxmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n>\n\t<Grid>\n\t\t<Image Source=\"@@NAME@@\" />\n\t</Grid>\n</Window>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/FolderBrowserPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.FolderBrowserPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n\t\t\t xmlns:views=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:FolderBrowserPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:FolderBrowserPageViewModel />\n\t</Design.DataContext>\n\t<UserControl.Resources>\n\t\t<views:FileSystemImageSelector x:Key=\"imageSelector\" \n\t\t\t\t\t\t\t\t\t   ClosedFolderImage=\"{x:Static mxi:Basic.Folder}\" \n\t\t\t\t\t\t\t\t\t   OpenedFolderImage=\"{x:Static mxi:Basic.Folder_Open}\"\n\t\t\t\t\t\t\t\t\t   FileImage=\"{x:Static mxi:Basic.Doc}\" />\n\t\t<views:FileSystemItemChildrenSelector x:Key=\"childrenSelector\" />\n\t</UserControl.Resources>\n\n\t<Grid x:Name=\"DemoControl\">\n\t\t<mxtl:TreeListControl x:Name=\"folderBrowserTreeList\"\n\t\t\t\t\t\t\t  ItemsSource=\"{Binding Drives}\" \n\t\t\t\t\t\t\t  BorderThickness=\"0\" \n\t\t\t\t\t\t\t  ShowNodeImages=\"True\"\n\t\t\t\t\t\t\t  ChildrenSelector=\"{StaticResource childrenSelector}\" \n\t\t\t\t\t\t\t  NodeImageSelector=\"{StaticResource imageSelector}\" \n\t\t\t\t\t\t\t  AllowEditing=\"False\" >\n\t\t\t<mxtl:TreeListColumn FieldName=\"Name\" Width=\"7*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Type\" Width=\"*\"/>\n\t\t\t<mxtl:TreeListColumn FieldName=\"Size\" Width=\"*\">\n\t\t\t\t<mxtl:TreeListColumn.EditorProperties>\n\t\t\t\t\t<mxe:TextEditorProperties HorizontalContentAlignment=\"Center\" />\n\t\t\t\t</mxtl:TreeListColumn.EditorProperties>\n\t\t\t</mxtl:TreeListColumn>\n\t\t</mxtl:TreeListControl>\n\t</Grid>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/FolderBrowserPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing Avalonia.Media;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.TreeList;\nusing System.Collections;\n\nnamespace DemoCenter.Views\n{\n    public partial class FolderBrowserPageView : UserControl\n    {\n        public FolderBrowserPageView()\n        {\n            InitializeComponent();\n        }\n\n        protected override void OnLoaded(RoutedEventArgs e)\n        {\n            base.OnLoaded(e);\n            if (folderBrowserTreeList.Nodes.Count > 0)\n                folderBrowserTreeList.Nodes[0].IsExpanded = true;\n        }\n    }\n\n    public class FileSystemItemChildrenSelector : ITreeListChildrenSelector\n    {\n        public IEnumerable SelectChildren(object item)\n        {\n            if (item is FolderFileSystemItem folderItem)\n                return folderItem.Items;\n            return null;\n        }\n\n        public bool HasChildren(object item)\n        {\n            if (item is FolderFileSystemItem)\n                return true;\n            return false;\n        }\n    }\n\n    public class FileSystemImageSelector : ITreeListNodeImageSelector\n    {\n        public IImage OpenedFolderImage { get; set; }\n        public IImage ClosedFolderImage { get; set; }\n        public IImage FileImage { get; set; }\n\n        public IImage SelectImage(TreeListNode node)\n        {\n            if(node.Content is FolderFileSystemItem)\n                return node.IsExpanded && node.HasChildren ? OpenedFolderImage : ClosedFolderImage;\n            return FileImage;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListColumnBandsView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:mxtlv=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList.Visuals;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:views=\"using:DemoCenter.Views\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"DemoCenter.Views.TreeListColumnBandsView\">\n    <UserControl.Resources>\n        <views:NullValueConverter x:Key=\"nullValueConverter\"/>\n        <DataTemplate x:Key=\"quarterTemplate\">\n            <ProgressBar Foreground=\"{DynamicResource Fill/Accent/Highlighting/Item/Pressed}\"\n                         MinWidth=\"0\"\n                         Background=\"Transparent\"\n                         CornerRadius=\"2\"\n                         VerticalAlignment=\"Stretch\"\n                         Margin=\"1\"\n                         Maximum=\"100\"\n                         ShowProgressText=\"True\" \n                         Value=\"{Binding Value, Converter={StaticResource nullValueConverter}}\" />\n            </DataTemplate>\n    </UserControl.Resources>\n    \n    <Grid ColumnDefinitions=\"*, 250\">\n        <Border x:Name=\"DemoControl\">\n            <mxtl:TreeListControl x:Name=\"treeList\"\n                                  BorderThickness=\"0,0,1,0\"\n                                  ChildrenFieldName=\"Children\"\n                                  AllowEditing=\"False\"\n                                  ItemsSource=\"{Binding Sales}\"\n                                  AllowDynamicDataLoading=\"False\"\n                                  AutoExpandAllNodes=\"True\">\n                <mxtl:TreeListControl.Bands>\n\t\t\t\t\t<mxtl:TreeListBand Header=\"Year Sales\">\n\t\t\t\t\t\t<mxtl:TreeListBand BandName=\"Q1\" HeaderHorizontalAlignment=\"Center\"/>\n\t\t\t\t\t\t<mxtl:TreeListBand BandName=\"Q2\" HeaderHorizontalAlignment=\"Center\"/>\n\t\t\t\t\t\t<mxtl:TreeListBand BandName=\"Q3\" HeaderHorizontalAlignment=\"Center\"/>\n\t\t\t\t\t\t<mxtl:TreeListBand BandName=\"Q4\" HeaderHorizontalAlignment=\"Center\"/>\n                    </mxtl:TreeListBand>\n                </mxtl:TreeListControl.Bands>\n                \n                <mxtl:TreeListColumn FieldName=\"Name\" Header=\"Seller\" Width=\"130\"/>\n                \n                <mxtl:TreeListColumn FieldName=\"Q1Absolute\" Header=\"$\" Width=\"*\" BandName=\"Q1\">\n                    <mxtl:TreeListColumn.EditorProperties>\n                        <mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n                    </mxtl:TreeListColumn.EditorProperties>\n                </mxtl:TreeListColumn>\n                <mxtl:TreeListColumn FieldName=\"Q1Fraction\" Header=\"%\" Width=\"*\" BandName=\"Q1\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n                \n                <mxtl:TreeListColumn FieldName=\"Q2Absolute\" Header=\"$\" Width=\"*\" BandName=\"Q2\">\n                    <mxtl:TreeListColumn.EditorProperties>\n                        <mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n                    </mxtl:TreeListColumn.EditorProperties>\n                </mxtl:TreeListColumn>\n                <mxtl:TreeListColumn FieldName=\"Q2Fraction\" Header=\"%\" Width=\"*\" BandName=\"Q2\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n\n                <mxtl:TreeListColumn FieldName=\"Q3Absolute\" Header=\"$\" Width=\"*\" BandName=\"Q3\">\n                    <mxtl:TreeListColumn.EditorProperties>\n                        <mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n                    </mxtl:TreeListColumn.EditorProperties>\n                </mxtl:TreeListColumn>\n                <mxtl:TreeListColumn FieldName=\"Q3Fraction\" Header=\"%\" Width=\"*\" BandName=\"Q3\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n\n                <mxtl:TreeListColumn FieldName=\"Q4Absolute\" Header=\"$\" Width=\"*\" BandName=\"Q4\">\n                    <mxtl:TreeListColumn.EditorProperties>\n                        <mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n                    </mxtl:TreeListColumn.EditorProperties>\n                </mxtl:TreeListColumn>\n                <mxtl:TreeListColumn FieldName=\"Q4Fraction\" Header=\"%\" Width=\"*\" BandName=\"Q4\" CellTemplate=\"{StaticResource quarterTemplate}\"/>\n\n                <mxtl:TreeListColumn FieldName=\"Total\" Width=\"100\">\n                    <mxtl:TreeListColumn.EditorProperties>\n                        <mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n                    </mxtl:TreeListColumn.EditorProperties>\n                </mxtl:TreeListColumn>\n            </mxtl:TreeListControl>\n        </Border>\n        <Border Grid.Column=\"1\">\n            <mxe:GroupBox Header=\"Properties\" Classes=\"PropertiesGroup\">\n                <StackPanel>\n                    <mxe:CheckEditor Content=\"Show Bands\" IsChecked=\"{Binding #treeList.ShowBands}\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Content=\"Show Band Separators\" IsChecked=\"{Binding #treeList.ShowBandSeparators}\" Classes=\"PropertyEditor\"/>\n                    <mxe:CheckEditor Content=\"Allow Band Resizing\" IsChecked=\"{Binding #treeList.AllowBandResizing}\"\n\t\t\t\t\t\t\t\t\t IsEnabled=\"{Binding #treeList.ShowBands}\" Classes=\"PropertyEditor\"/>\n                </StackPanel>\n            </mxe:GroupBox>\n        </Border>\n\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListColumnBandsView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing System.Globalization;\n\nnamespace DemoCenter.Views;\n\npublic partial class TreeListColumnBandsView : UserControl\n{\n    public TreeListColumnBandsView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListDataEditorsPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.TreeListDataEditorsPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:mxtlv=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList.Visuals;assembly=Eremex.Avalonia.Controls\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n\t\t\t xmlns:views=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"900\"\n             x:DataType=\"vm:TreeListDataEditorsPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:TreeListDataEditorsPageViewModel />\n\t</Design.DataContext>\n\n\t<UserControl.Resources>\n\t\t<views:ProjectTaskImageSelector x:Key=\"imageSelector\"\n\t\t\t\t\t\t\t\t\t ProjectImage=\"{x:Static mxi:Basic.Docs}\"\n\t\t\t\t\t\t\t\t\t TaskImage=\"{x:Static mxi:Basic.Doc}\" />\n\t</UserControl.Resources>\n\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Border x:Name=\"DemoControl\">\n\t\t\t<mxtl:TreeListControl x:Name=\"treeList\"\n\t\t                      BorderThickness=\"0,0,1,0\"\n\t\t                      ChildrenFieldName=\"Tasks\"\n\t\t                      ItemsSource=\"{Binding Tasks}\"\n\t\t                      ShowNodeImages=\"True\"\n\t\t                      ShowingEditor=\"OnShowingEditor\"\n\t\t                      NodeImageSelector=\"{StaticResource imageSelector}\"\n\t\t                      AutoExpandAllNodes=\"True\">\n\t\t\t<mxtl:TreeListControl.Styles>\n\t\t\t\t<Style Selector=\"mxtlv|TreeListRowControl\">\n\t\t\t\t\t<Setter Property=\"TextBlock.FontWeight\">\n\t\t\t\t\t\t<Setter.Value>\n\t\t\t\t\t\t\t<Binding Path=\"HasTasks\">\n\t\t\t\t\t\t\t\t<Binding.Converter>\n\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter>\n\t\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter.TrueValue>\n\t\t\t\t\t\t\t\t\t\t\t<FontWeight>Bold</FontWeight>\n\t\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter.TrueValue>\n\t\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter.FalseValue>\n\t\t\t\t\t\t\t\t\t\t\t<FontWeight>Normal</FontWeight>\n\t\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter.FalseValue>\n\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter>\n\t\t\t\t\t\t\t\t</Binding.Converter>\n\t\t\t\t\t\t\t</Binding>\n\t\t\t\t\t\t</Setter.Value>\n\t\t\t\t\t</Setter>\n\t\t\t\t</Style>\n\t\t\t</mxtl:TreeListControl.Styles>\n\t\t\t<mxtl:TreeListColumn FieldName=\"Description\" Width=\"2*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Assignee\" Width=\"*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"HighPriority\" Header=\"High Priority\" AllowSorting=\"False\" Width=\"90\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Status\" Width=\"*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"EstimateTime\" Header=\"Estimate Time (h)\" Width=\"*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"DueDate\" Header=\"Due Date\" Width=\"*\" />\n\t\t</mxtl:TreeListControl>\n\t\t</Border>\n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Properties\" Classes=\"PropertiesGroup\">\n            <Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto\" ColumnDefinitions=\"3*, *\">\n                <mxe:CheckEditor Content=\"Allow Editing\" IsChecked=\"{Binding #treeList.AllowEditing}\" Classes=\"PropertyEditor\"/>\n                <Label Grid.Row=\"1\" Content=\"Editor Show Mode\" IsEnabled=\"{Binding #treeList.AllowEditing}\" Classes=\"PropertyLabel\"/>\n                <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:EditorShowMode}\"\n                                    EditorValue=\"{Binding #treeList.EditorShowMode}\"\n                                    IsEnabled=\"{Binding #treeList.AllowEditing}\"\n                                    Grid.Row=\"2\"\n                                    Grid.ColumnSpan=\"2\"\n                                    Classes=\"PropertyEditor\"/>\n                <Label Grid.Row=\"3\" Content=\"Editor Button Show Mode\" IsEnabled=\"{Binding #treeList.AllowEditing}\" Classes=\"PropertyLabel\"/>\n                <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:EditorButtonShowMode}\"\n                                    EditorValue=\"{Binding #treeList.EditorButtonShowMode}\"\n                                    IsEnabled=\"{Binding #treeList.AllowEditing}\"\n                                    Grid.Row=\"4\"\n                                    Grid.ColumnSpan=\"2\"\n                                    Classes=\"PropertyEditor\"/>\n            </Grid>\n        </mxe:GroupBox>\n\t</Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListDataEditorsPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.TreeList;\n\nnamespace DemoCenter.Views\n{\n    public partial class TreeListDataEditorsPageView : UserControl\n    {\n        public TreeListDataEditorsPageView()\n        {\n            InitializeComponent();\n        }\n\n        private void OnShowingEditor(object sender, TreeListShowingEditorEventArgs e)\n        {\n            if ((e.Column.FieldName == nameof(ProjectTask.Status) || e.Column.FieldName == nameof(ProjectTask.EstimateTime)) && e.Node.Content is ProjectTask task && task.HasTasks)\n                e.Cancel = true;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListExportView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.TreeListExportView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:mxtlv=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList.Visuals;assembly=Eremex.Avalonia.Controls\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxb=\"https://schemas.eremexcontrols.net/avalonia/bars\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n\t\t\t xmlns:views=\"using:DemoCenter.Views\"\n             xmlns:viewModels=\"using:DemoCenter.ViewModels\"\n\t\t\t xmlns:exports=\"using:Eremex.DocumentProcessing.Exports\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"900\"\n             x:DataType=\"viewModels:TreeListFilteringPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<viewModels:TreeListExportViewModel />\n\t</Design.DataContext>\n\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Border x:Name=\"DemoControl\">\n\t\t\t<mxtl:TreeListControl x:Name=\"treeList\" BorderThickness=\"0,0,1,0\" NavigationMode=\"Row\" ChildrenFieldName=\"Children\" HasChildrenFieldName=\"HasChildren\" AutoExpandAllNodes=\"True\" ItemsSource=\"{Binding InfrastructureItems}\">\n\t\t\t\t<mxtl:TreeListControl.Bands>\n\t\t\t\t\t<mxtl:TreeListBand BandName=\"DatesAndStatus\" Header=\"Dates &amp; Status\"/>\n\t\t\t\t\t<mxtl:TreeListBand BandName=\"TechnicalSpecificationsAndFinancials\" Header=\"Technical Specifications &amp; Financials\"/>\n\t\t\t\t</mxtl:TreeListControl.Bands>\n\t\t\t\t\n\t\t\t\t<mxtl:TreeListColumn FieldName=\"Name\" Width=\"1.4*\" />\n\t\t\t\t<mxtl:TreeListColumn FieldName=\"LastMaintenance\" BandName=\"DatesAndStatus\" Width=\"1.2*\" />\n\t\t\t\t<mxtl:TreeListColumn FieldName=\"IsOperational\" BandName=\"DatesAndStatus\" Width=\"*\" />\n\t\t\t\t<mxtl:TreeListColumn FieldName=\"Status\" BandName=\"DatesAndStatus\" Width=\"*\" />\n\n\t\t\t\t<mxtl:TreeListColumn FieldName=\"Utilization\" BandName=\"TechnicalSpecificationsAndFinancials\" Width=\"*\" >\n\t\t\t\t\t<mxtl:TreeListColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"P0\" />\n\t\t\t\t\t</mxtl:TreeListColumn.EditorProperties>\n\t\t\t\t</mxtl:TreeListColumn>\n\t\t\t\t<mxtl:TreeListColumn FieldName=\"MaintenanceCost\" BandName=\"TechnicalSpecificationsAndFinancials\" Width=\"1.2*\" >\n\t\t\t\t\t<mxtl:TreeListColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"C0\" />\n\t\t\t\t\t</mxtl:TreeListColumn.EditorProperties>\n\t\t\t\t</mxtl:TreeListColumn>\n\t\t\t\t<mxtl:TreeListColumn FieldName=\"PowerConsumption\" BandName=\"TechnicalSpecificationsAndFinancials\" Width=\"1.2*\" >\n\t\t\t\t\t<mxtl:TreeListColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"{}{0:F1} kW\" />\n\t\t\t\t\t</mxtl:TreeListColumn.EditorProperties>\n\t\t\t\t</mxtl:TreeListColumn>\n\t\t\t</mxtl:TreeListControl>\n\t\t</Border>\n\t\t\n\t\t<Border Grid.Column=\"1\">\n\t\t\t<StackPanel>\n\t\t\t\t<mxe:GroupBox Header=\"Xlsx Export Properties\" Classes=\"PropertiesGroup\">\n\t\t\t\t\t<Grid RowDefinitions=\"Auto, Auto, Auto\">\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Column Headers\" IsChecked=\"{Binding XlsExportColumnHeaders}\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Band Headers\" IsChecked=\"{Binding XlsExportBandHeaders}\" Classes=\"PropertyEditor\" Grid.Row=\"1\"/>\n\t\t\t\t\t\t<Button Content=\"Export\" Margin=\"0,8,0,0\" Command=\"{Binding ExportCommand}\" CommandParameter=\"{x:Static viewModels:ExportType.Xlsx}\" HorizontalAlignment=\"Stretch\" Grid.Row=\"2\" />\n\t\t\t\t\t</Grid>\n\t\t\t\t</mxe:GroupBox>\n\n\t\t\t\t<mxe:GroupBox Header=\"Pdf/Image Export Properties\" Classes=\"PropertiesGroup\">\n\t\t\t\t\t<Grid RowDefinitions=\"Auto, Auto, Auto, Auto, Auto, Auto, Auto\">\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Column Headers\" IsChecked=\"{Binding PdfExportColumnHeaders}\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Export Band Headers\" IsChecked=\"{Binding PdfExportBandHeaders}\" Classes=\"PropertyEditor\" Grid.Row=\"1\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Fit To Page Width\" IsChecked=\"{Binding FitToPageWidth}\" Classes=\"PropertyEditor\" Grid.Row=\"2\"/>\n\t\t\t\t\t\t<Label Content=\"Page Orientation\" Margin=\"0,8,0,0\" FontWeight=\"SemiBold\" Grid.Row=\"3\"/>\n\t\t\t\t\t\t<StackPanel Margin=\"16,0,0,0\" Grid.Row=\"4\">\n\t\t\t\t\t\t\t<RadioButton Content=\"Landscape\" IsChecked=\"{Binding Landscape}\" GroupName=\"G1\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t\t<RadioButton Content=\"Portrait\" IsChecked=\"{Binding !Landscape}\" GroupName=\"G1\" Classes=\"PropertyEditor\"/>\n\t\t\t\t\t\t</StackPanel>\n\t\t\t\t\t\t<Button Content=\"Export To Pdf\" Margin=\"0,8,0,0\" Command=\"{Binding ExportCommand}\" CommandParameter=\"{x:Static viewModels:ExportType.Pdf}\" HorizontalAlignment=\"Stretch\" Grid.Row=\"5\" />\n\t\t\t\t\t\t<mx:MxSplitButton Content=\"Export To Image\" Margin=\"0,8,0,0\" Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Jpeg}\" HorizontalAlignment=\"Stretch\" Grid.Row=\"6\">\n\t\t\t\t\t\t\t<mx:MxSplitButton.DropDownControl>\n\t\t\t\t\t\t\t\t<mxb:PopupMenu>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Jpeg\"  Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Jpeg}\"/>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Png\"  Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Png}\"/>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Svg\"  Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Svg}\"/>\n\t\t\t\t\t\t\t\t\t<mxb:ToolbarButtonItem Header=\"Webp\"  Command=\"{Binding ExportImageCommand}\" CommandParameter=\"{x:Static exports:MxImageFormat.Webp}\"/>\n\t\t\t\t\t\t\t\t</mxb:PopupMenu>\n\t\t\t\t\t\t\t</mx:MxSplitButton.DropDownControl>\n\t\t\t\t\t\t</mx:MxSplitButton>\n\t\t\t\t\t</Grid>\n\t\t\t\t</mxe:GroupBox>\n\t\t\t</StackPanel>\n\t\t</Border>\n\t</Grid>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListExportView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing DemoCenter.Helpers;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.DataControl;\nusing Eremex.DocumentProcessing.Exports;\n\nnamespace DemoCenter.Views\n{\n    public partial class TreeListExportView : UserControl\n    {\n        public TreeListExportView()\n        {\n            InitializeComponent();\n        }\n\n        private TreeListExportViewModel ViewModel { get; set; }\n\n        protected override void OnDataContextChanged(EventArgs e)\n        {\n            base.OnDataContextChanged(e);\n\n            if (ViewModel != null)\n            {\n                ViewModel.RequestExport -= OnRequestExport;\n                ViewModel.RequestExportImage -= OnRequestExportImage;\n\n            }\n            ViewModel = (TreeListExportViewModel)DataContext;\n            if (ViewModel != null) \n            {\n                ViewModel.RequestExport += OnRequestExport;\n                ViewModel.RequestExportImage += OnRequestExportImage;\n            }\n        }\n\n        private void OnRequestExport(ExportType type)\n        {\n            if (type == ExportType.Xlsx)\n            {\n                var options = new XlsxExportOptions() { ShowColumnHeaders = ViewModel.XlsExportColumnHeaders, ShowBands = ViewModel.XlsExportBandHeaders };\n                DemoExportHelper.Export(treeList, options, (stream, control, options) => control.ExportToXlsx(stream, options));\n            }\n            else if (type == ExportType.Pdf)\n            {\n                var options = CreateExportOptions<PageExportOptions>();\n                DemoExportHelper.Export(treeList, options, (stream, control, options) => control.ExportToPdf(stream, options));\n            }\n        }\n\n        private void OnRequestExportImage(MxImageFormat format)\n        {\n            var options = CreateExportOptions<ImageExportOptions>();\n            options.Format = format;\n            DemoExportHelper.ExportImage(treeList, options, (control, options, dir, fileFormat) => control.ExportToImages(dir, fileFormat, options));\n        }\n\n        private T CreateExportOptions<T>() where T : PageExportOptions\n        {\n            var options = Activator.CreateInstance<T>();\n            options.ShowColumnHeaders = ViewModel.PageExportColumnHeaders;\n            options.ShowBands = ViewModel.PageExportBandHeaders;\n            options.FitToPageWidth = ViewModel.FitToPageWidth;\n            options.Landscape = ViewModel.Landscape;\n            return options;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListFilteringPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.TreeListFilteringPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:mx=\"https://schemas.eremexcontrols.net/avalonia\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:mxtlv=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList.Visuals;assembly=Eremex.Avalonia.Controls\"\n\t\t\t xmlns:mxdc=\"clr-namespace:Eremex.AvaloniaUI.Controls.DataControl;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n\t\t\t xmlns:views=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"900\"\n             x:DataType=\"vm:TreeListFilteringPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:TreeListFilteringPageViewModel />\n\t</Design.DataContext>\n\n\t<UserControl.Resources>\n\t\t<views:NullValueConverter x:Key=\"nullValueConverter\"/>\n\t\t<views:ProjectTaskImageSelector x:Key=\"imageSelector\"\n\t\t\t\t\t\t\t\t\t ProjectImage=\"{x:Static mxi:Basic.Docs}\"\n\t\t\t\t\t\t\t\t\t TaskImage=\"{x:Static mxi:Basic.Doc}\" />\n\t</UserControl.Resources>\n\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Border x:Name=\"DemoControl\">\n            <mxtl:TreeListControl x:Name=\"treeList\"\n                                  BorderThickness=\"0,0,1,0\"\n                                  ChildrenFieldName=\"Tasks\"\n                                  AllowEditing=\"False\"\n                                  FilterMode=\"ShowMatchesWithAncestors\"\n                                  ItemsSource=\"{Binding Tasks}\"\n                                  ShowNodeImages=\"True\"\n                                  NodeImageSelector=\"{StaticResource imageSelector}\"\n                                  IsSearchPanelVisible=\"True\"\n                                  TreeColumnFieldName=\"Description\"\n                                  SearchPanelDisplayMode=\"HotKey\"\n                                  ShowAutoFilterRow=\"True\"\n\t\t\t\t\t\t\t\t  ShowConditionInAutoFilterRow=\"True\"\n                                  AutoExpandAllNodes=\"True\"\n                                  ColumnFilterButtonDisplayMode=\"Always\"\n                                  ColumnFilterPopupMode=\"CheckedList\">\n\t\t\t<mxtl:TreeListControl.Styles>\n\t\t\t\t<Style Selector=\"mxtlv|TreeListRowControl\">\n\t\t\t\t\t<Setter Property=\"TextBlock.FontWeight\">\n\t\t\t\t\t\t<Setter.Value>\n\t\t\t\t\t\t\t<Binding Path=\"HasTasks\">\n\t\t\t\t\t\t\t\t<Binding.Converter>\n\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter>\n\t\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter.TrueValue>\n\t\t\t\t\t\t\t\t\t\t\t<FontWeight>Bold</FontWeight>\n\t\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter.TrueValue>\n\t\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter.FalseValue>\n\t\t\t\t\t\t\t\t\t\t\t<FontWeight>Normal</FontWeight>\n\t\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter.FalseValue>\n\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter>\n\t\t\t\t\t\t\t\t</Binding.Converter>\n\t\t\t\t\t\t\t</Binding>\n\t\t\t\t\t\t</Setter.Value>\n\t\t\t\t\t</Setter>\n\t\t\t\t</Style>\n\t\t\t</mxtl:TreeListControl.Styles>\n\t\t\t<mxtl:TreeListColumn FieldName=\"HighPriority\" ColumnChooserHeader=\"High Priority\" AllowSorting=\"False\" AllowResizing=\"False\" Header=\" \" Width=\"38\">\n\t\t\t\t<mxtl:TreeListColumn.CellTemplate>\n\t\t\t\t\t<DataTemplate>\n\t\t\t\t\t\t<Border ToolTip.Tip=\"High Priority\" Background=\"Transparent\">\n\t\t\t\t\t\t\t<Image Width=\"16\" Height=\"16\" Stretch=\"None\" IsVisible=\"{Binding Value, Converter={StaticResource nullValueConverter}}\" \n\t\t\t\t\t\t\t       Source=\"{x:Static mxi:Basic.Error}\" />\n\t\t\t\t\t\t</Border>\n\t\t\t\t\t</DataTemplate>\n\t\t\t\t</mxtl:TreeListColumn.CellTemplate>\n\t\t\t</mxtl:TreeListColumn>\n\t\t\t<mxtl:TreeListColumn FieldName=\"Description\" Width=\"*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Assignee\" Width=\"120\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Status\" Width=\"85\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"EstimateTime\" Header=\"Estimate Time (h)\" Width=\"110\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"TimeSpent\" Header=\"Time Spent (h)\" Width=\"90\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Progress\" Header=\"Progress\" Width=\"110\">\n\t\t\t\t<mxtl:TreeListColumn.CellTemplate>\n\t\t\t\t\t<DataTemplate>\n\t\t\t\t\t\t<ProgressBar Foreground=\"{DynamicResource Fill/Accent/Highlighting/Item/Enabled}\" CornerRadius=\"2\" Margin=\"4,0\" Minimum=\"0\" Maximum=\"100\" MinWidth=\"10\" ShowProgressText=\"True\" Value=\"{Binding Value, Converter={StaticResource nullValueConverter}}\" />\n\t\t\t\t\t</DataTemplate>\n\t\t\t\t</mxtl:TreeListColumn.CellTemplate>\n\t\t\t</mxtl:TreeListColumn>\n\t\t\t<mxtl:TreeListColumn FieldName=\"DueDate\" Header=\"Due Date\" Width=\"90\" />\n\t\t</mxtl:TreeListControl>\n\t\t</Border>\n        <Border Grid.Column=\"1\">\n            <StackPanel>\n                <mxe:GroupBox Header=\"Filter Properties\" VerticalAlignment=\"Top\" Classes=\"PropertiesGroup\">\n                    <StackPanel>\n                        <Label Grid.Row=\"3\" Content=\"Filter Mode\" Classes=\"LayoutItem\"/>\n                        <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxtl:FilterMode}\"\n                                            EditorValue=\"{Binding #treeList.FilterMode}\"\n                                            Grid.Row=\"4\"\n                                            Grid.ColumnSpan=\"2\"\n                                            Classes=\"LayoutItem\"/>\n                        \n                        <mxe:CheckEditor Content=\"Allow Column Filtering\" IsChecked=\"{Binding #treeList.AllowColumnFiltering}\" Classes=\"LayoutItem\" Margin=\"6,6,6,0\"/>\n                        <DockPanel IsEnabled=\"{Binding #treeList.AllowColumnFiltering}\">\n                            <Label Content=\"Column Filter Popup Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:FilterPopupMode}\"\n                                                EditorValue=\"{Binding #treeList.ColumnFilterPopupMode}\"\n                                                DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n\n                            <Label Content=\"Column Filter Icon Display Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:ColumnFilterButtonDisplayMode}\"\n                                                EditorValue=\"{Binding #treeList.ColumnFilterButtonDisplayMode}\"\n                                                Classes=\"LayoutItem\"/>\n                        </DockPanel>\n                        <mxe:CheckEditor Content=\"Show Auto Filter Row\" IsChecked=\"{Binding #treeList.ShowAutoFilterRow}\" Classes=\"LayoutItem\" Margin=\"6,6,6,0\"/>\n\t\t\t\t\t\t<mxe:CheckEditor Content=\"Show Condition In Auto Filter Row\" IsChecked=\"{Binding #treeList.ShowConditionInAutoFilterRow}\" Classes=\"LayoutItem\" Margin=\"6,6,6,0\"/>\n                        <DockPanel>\n                            <Label Content=\"Filter Panel Display Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:FilterPanelDisplayMode}\"\n                                                EditorValue=\"{Binding #treeList.FilterPanelDisplayMode}\"\n                                                Classes=\"LayoutItem\"/>\n                        </DockPanel>\n                    </StackPanel>\n                </mxe:GroupBox>\n\n                <mxe:GroupBox Header=\"Search Properties\" VerticalAlignment=\"Top\" Classes=\"PropertiesGroup\">\n                    <StackPanel>\n                        <mxe:CheckEditor Content=\"Highlight Search Results\" IsChecked=\"{Binding #treeList.SearchPanelHighlightResults}\" Classes=\"LayoutItem\"/>\n                        <DockPanel>\n                            <Label Content=\"Search Panel Display Mode:\" DockPanel.Dock=\"Top\" Classes=\"LayoutItem\"/>\n                            <mxe:ComboBoxEditor ItemsSource=\"{mx:EnumItemsSource EnumType=mxdc:SearchPanelDisplayMode}\"\n                                                EditorValue=\"{Binding #treeList.SearchPanelDisplayMode}\"\n                                                Classes=\"LayoutItem\"/>\n                        </DockPanel>\n                    </StackPanel>\n                </mxe:GroupBox>\n            </StackPanel>\n        </Border>\n\t\t\n\t</Grid>\n    \n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListFilteringPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing Avalonia.Interactivity;\nusing Avalonia.Media;\nusing DemoCenter.DemoData;\nusing DemoCenter.ViewModels;\nusing Eremex.AvaloniaUI.Controls.TreeList;\nusing System.Collections;\nusing System.Globalization;\n\nnamespace DemoCenter.Views\n{\n    public partial class TreeListFilteringPageView : UserControl\n    {\n        public TreeListFilteringPageView()\n        {\n            InitializeComponent();\n        }\n    }\n\n    public class ProjectTaskImageSelector : ITreeListNodeImageSelector\n    {\n        public IImage ProjectImage { get; set; }\n        public IImage TaskImage { get; set; }\n\n        public IImage SelectImage(TreeListNode node)\n        {\n            if(node.Content is ProjectTask task && task.HasTasks)\n                return ProjectImage;\n            return TaskImage;\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListGroupView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.TreeListGroupView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxtl=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxc=\"clr-namespace:Eremex.AvaloniaUI.Controls.Common;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxei=\"clr-namespace:Eremex.AvaloniaUI.Controls.Editors.Visuals;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxpg=\"clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxb=\"clr-namespace:Eremex.AvaloniaUI.Controls.Bars;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxu=\"clr-namespace:Eremex.AvaloniaUI.Controls.Utils;assembly=Eremex.Avalonia.Controls\"\n             xmlns:data=\"using:DemoCenter.DemoData\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"800\"\n             x:DataType=\"vm:TreeListGroupViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n        <vm:TreeListGroupViewModel />\n\t</Design.DataContext>\n\n    <TextBlock VerticalAlignment=\"Center\"\n               HorizontalAlignment=\"Center\"\n               FontSize=\"16\"\n               Text=\"See product pages for details.\"/>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListGroupView.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace DemoCenter.Views\n{\n    public partial class TreeListGroupView : UserControl\n    {\n        public TreeListGroupView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListMultipleSelectionPageView.axaml",
    "content": "<UserControl x:Class=\"DemoCenter.Views.TreeListMultipleSelectionPageView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\t\t\t xmlns:mx=\"clr-namespace:Eremex.AvaloniaUI.Controls;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxtl=\"https://schemas.eremexcontrols.net/avalonia/treelist\"\n             xmlns:mxtlv=\"clr-namespace:Eremex.AvaloniaUI.Controls.TreeList.Visuals;assembly=Eremex.Avalonia.Controls\"\n             xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n             xmlns:mxi=\"https://schemas.eremexcontrols.net/avalonia/icons\"\n\t\t\t xmlns:views=\"using:DemoCenter.Views\"\n             xmlns:vm=\"using:DemoCenter.ViewModels\"\n             d:DesignHeight=\"450\"\n             d:DesignWidth=\"900\"\n             x:DataType=\"vm:TreeListMultipleSelectionPageViewModel\"\n             mc:Ignorable=\"d\">\n\t<Design.DataContext>\n\t\t<vm:TreeListMultipleSelectionPageViewModel />\n\t</Design.DataContext>\n\n\t<UserControl.Resources>\n\t\t<views:ProjectTaskImageSelector x:Key=\"imageSelector\"\n\t\t\t\t\t\t\t\t\t ProjectImage=\"{x:Static mxi:Basic.Docs}\"\n\t\t\t\t\t\t\t\t\t TaskImage=\"{x:Static mxi:Basic.Doc}\" />\n\t</UserControl.Resources>\n\n\t<Grid ColumnDefinitions=\"*, 250\">\n\t\t<Border x:Name=\"DemoControl\">\n\t\t\t<mxtl:TreeListControl x:Name=\"treeList\"\n\t\t                      BorderThickness=\"0,0,1,0\"\n\t\t                      ChildrenFieldName=\"Tasks\"\n\t\t                      ItemsSource=\"{Binding Tasks}\"\n\t\t                      ShowNodeImages=\"True\"\n\t\t\t\t\t\t\t  NavigationMode=\"Row\"\n\t\t\t\t\t\t\t  SelectionMode=\"Multiple\"\n\t\t\t\t\t\t\t  SelectedItems=\"{Binding SelectedTasks}\"\n\t\t                      NodeImageSelector=\"{StaticResource imageSelector}\"\n\t\t                      AutoExpandAllNodes=\"True\">\n\t\t\t<mxtl:TreeListControl.Styles>\n\t\t\t\t<Style Selector=\"mxtlv|TreeListRowControl\">\n\t\t\t\t\t<Setter Property=\"TextBlock.FontWeight\">\n\t\t\t\t\t\t<Setter.Value>\n\t\t\t\t\t\t\t<Binding Path=\"HasTasks\">\n\t\t\t\t\t\t\t\t<Binding.Converter>\n\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter>\n\t\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter.TrueValue>\n\t\t\t\t\t\t\t\t\t\t\t<FontWeight>Bold</FontWeight>\n\t\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter.TrueValue>\n\t\t\t\t\t\t\t\t\t\t<mx:BoolToObjectConverter.FalseValue>\n\t\t\t\t\t\t\t\t\t\t\t<FontWeight>Normal</FontWeight>\n\t\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter.FalseValue>\n\t\t\t\t\t\t\t\t\t</mx:BoolToObjectConverter>\n\t\t\t\t\t\t\t\t</Binding.Converter>\n\t\t\t\t\t\t\t</Binding>\n\t\t\t\t\t\t</Setter.Value>\n\t\t\t\t\t</Setter>\n\t\t\t\t</Style>\n\t\t\t</mxtl:TreeListControl.Styles>\n\t\t\t<mxtl:TreeListColumn FieldName=\"Description\" Width=\"2*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Assignee\" Width=\"*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"HighPriority\" Header=\"High Priority\" AllowSorting=\"False\" Width=\"90\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"Status\" Width=\"*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"EstimateTime\" Header=\"Estimate Time (h)\" Width=\"*\" />\n\t\t\t<mxtl:TreeListColumn FieldName=\"DueDate\" Header=\"Due Date\" Width=\"*\" />\n\t\t</mxtl:TreeListControl>\n\t\t</Border>\n        <mxe:GroupBox Grid.Column=\"1\" Header=\"Selected Assignees\" Classes=\"PropertiesGroup\">\n\t\t\t<ListBox ItemsSource=\"{Binding SelectedTasks}\" DisplayMemberBinding=\"{Binding Assignee}\" VerticalAlignment=\"Top\" />\n        </mxe:GroupBox> \n\t</Grid>\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/TreeList/TreeListMultipleSelectionPageView.axaml.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing DemoCenter.DemoData;\nusing Eremex.AvaloniaUI.Controls.TreeList;\n\nnamespace DemoCenter.Views\n{\n    public partial class TreeListMultipleSelectionPageView : UserControl\n    {\n        public TreeListMultipleSelectionPageView()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/UseCases/FinancialServices/MortgageCalculatorView.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\t\t\t xmlns:mxe=\"https://schemas.eremexcontrols.net/avalonia/editors\"\n\t\t\t xmlns:mxc=\"https://schemas.eremexcontrols.net/avalonia/charts\"\n\t\t\t xmlns:mxdg=\"https://schemas.eremexcontrols.net/avalonia/datagrid\"\n\t\t\t xmlns:vm=\"using:DemoCenter.ViewModels\"\n\t\t\t x:DataType=\"vm:MortgageCalculatorViewModel\"\n             x:Class=\"DemoCenter.Views.MortgageCalculatorView\">\n    \t<Design.DataContext>\n\t\t<vm:MortgageCalculatorViewModel/>\n\t</Design.DataContext>\n\n\t<Grid Margin=\"10\" ColumnDefinitions=\"Auto,*\">\n\t\t<StackPanel>\n\t\t\t<Border Margin=\"0,20, 0,20\" CornerRadius=\"20\" ClipToBounds=\"True\" Width=\"200\" Height=\"200\">\n\t\t\t\t<Image  Source=\"{Binding HousePreviewImage}\"></Image>\n\t\t\t</Border>\n\t\t\t<Label>\n\t\t\t\tPrincipal\n\t\t\t</Label>\n\t\t\t<StackPanel Orientation=\"Horizontal\">\n\t\t\t\t<Slider MinWidth=\"200\" Margin=\"0,0,10,0\" Minimum=\"100000\" Maximum=\"1000000\" Value=\"{Binding Principal}\"></Slider>\n\t\t\t\t<mxe:TextEditor ReadOnly=\"True\" MinWidth=\"100\" EditorValue=\"{Binding Principal}\" DisplayFormatString=\"c\" ></mxe:TextEditor>\n\t\t\t</StackPanel>\n\n\t\t\t<Label>\n\t\t\t\tAnnual interest rate\n\t\t\t</Label>\n\t\t\t<StackPanel Orientation=\"Horizontal\">\n\t\t\t\t<Slider MinWidth=\"200\" Margin=\"0,0,10,0\" Minimum=\"1\" Maximum=\"10\" Ticks=\"100\" Value=\"{Binding AnnualInterestRate}\"></Slider>\n\t\t\t\t<mxe:TextEditor ReadOnly=\"True\" MinWidth=\"100\" EditorValue=\"{Binding AnnualInterestRate}\" DisplayFormatString=\"{}{0:F2}%\"></mxe:TextEditor>\n\t\t\t</StackPanel>\n\n\t\t\t<Label>\n\t\t\t\tLoan Term\n\t\t\t</Label>\n\t\t\t<StackPanel Orientation=\"Horizontal\">\n\t\t\t\t<Slider MinWidth=\"200\" Margin=\"0,0,10,0\" Minimum=\"5\" Maximum=\"30\" Value=\"{Binding LoanTermYears}\"></Slider>\n\t\t\t\t<mxe:TextEditor ReadOnly=\"True\" MinWidth=\"100\" EditorValue=\"{Binding LoanTermYears}\" DisplayFormatString=\"{}{0:F0} years\"></mxe:TextEditor>\n\t\t\t</StackPanel>\n\n\t\t</StackPanel>\n\t\t<Grid Margin=\"20,20,10,10\"  Grid.Column=\"1\" RowDefinitions=\"*,*\">\n\t\t\t<mxdg:DataGridControl x:Name=\"dataGrid\" ItemsSource=\"{Binding AmortizationSchedule}\" ShowGroupPanel=\"False\"\n\t\t\t\t\t\t\t\t  AllowEditing=\"False\" NavigationMode=\"Row\"\n\t\t\t BorderThickness=\"1,1\">\n\t\t\t\t<mxdg:GridColumn FieldName=\"MonthNumber\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t</mxdg:GridColumn>\n\t\t\t\t<mxdg:GridColumn FieldName=\"PaymentAmount\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n\t\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\t\t\t\t</mxdg:GridColumn>\n\t\t\t\t<mxdg:GridColumn FieldName=\"PrincipalAmount\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n\t\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\n\t\t\t\t</mxdg:GridColumn>\n\t\t\t\t<mxdg:GridColumn FieldName=\"InterestAmount\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n\t\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\n\t\t\t\t</mxdg:GridColumn>\n\t\t\t\t<mxdg:GridColumn FieldName=\"RemainingBalance\" Width=\"*\" MinWidth=\"80\">\n\t\t\t\t\t<mxdg:GridColumn.EditorProperties>\n\t\t\t\t\t\t<mxe:TextEditorProperties DisplayFormatString=\"c\"/>\n\t\t\t\t\t</mxdg:GridColumn.EditorProperties>\n\n\t\t\t\t</mxdg:GridColumn>\n\t\t\t</mxdg:DataGridControl>\n\t\t\t<mxc:CartesianChart Margin=\"0,10,0,0\" Grid.Row=\"1\" x:Name=\"chartControl\" BorderThickness=\"1\" CornerRadius=\"0\" >\n\t\t\t\t\n\t\t\t\t<mxc:CartesianChart.Series>\n\t\t\t\t\t<mxc:CartesianSeries DataAdapter=\"{Binding InterestSeriesDataAdapter}\" SeriesName=\"Interest\">\n\t\t\t\t\t\t<mxc:CartesianStackedAreaSeriesView Color=\"#F9A825\" Transparency=\"0.2\" MarkerSize=\"2\" ShowMarkers=\"True\" />\n\t\t\t\t\t</mxc:CartesianSeries>\n\n\t\t\t\t\t<mxc:CartesianSeries DataAdapter=\"{Binding PrincipalSeriesDataAdapter}\" SeriesName=\"Principal\">\n\t\t\t\t\t\t<mxc:CartesianStackedAreaSeriesView Color=\"#2E7D32\" Transparency=\"0.2\" MarkerSize=\"2\" ShowMarkers=\"True\" />\n\t\t\t\t\t</mxc:CartesianSeries>\n\n\t\t\t\t\t<mxc:CartesianSeries DataAdapter=\"{Binding TotalMonthlyPaymentSeriesDataAdapter}\" SeriesName=\"Payment Amount\">\n\t\t\t\t\t\t<mxc:CartesianLineSeriesView Color=\"Brown\" MarkerSize=\"4\"/>\n\t\t\t\t\t</mxc:CartesianSeries>\n\t\t\t\t</mxc:CartesianChart.Series>\n\t\t\t\t\n\t\t\t\t<mxc:CartesianChart.AxesY>\n\t\t\t\t\t<mxc:AxisY ShowTitle=\"False\" Title=\"Monthly Payment\">\n\t\t\t\t\t\t<mxc:AxisY.ScaleOptions>\n\t\t\t\t\t\t\t<mxc:NumericScaleOptions LabelFormatter=\"{Binding CurrencyFormatter}\" CrosshairLabelFormatter=\"{Binding CurrencyFormatter}\" />\n\t\t\t\t\t\t</mxc:AxisY.ScaleOptions>\n\t\t\t\t\t</mxc:AxisY>\n\t\t\t\t</mxc:CartesianChart.AxesY>\n\t\t\t\t<mxc:CartesianChart.AxesX>\n\t\t\t\t\t<mxc:AxisX ShowTitle=\"True\" Title=\"Month\">\n\t\t\t\t\t\t<mxc:AxisX.ScaleOptions>\n\t\t\t\t\t\t\t<mxc:NumericScaleOptions CrosshairLabelFormatter=\"{Binding ArgumentFormatter}\" />\n\t\t\t\t\t\t</mxc:AxisX.ScaleOptions>\n\t\t\t\t\t</mxc:AxisX>\n\t\t\t\t</mxc:CartesianChart.AxesX>\n\t\t\t\t\n\t\t\t\t<mxc:CartesianChart.CrosshairOptions>\n\t\t\t\t\t<mxc:CrosshairOptions SeriesLabelMode=\"OneForAllSeries\" />\n\t\t\t\t</mxc:CartesianChart.CrosshairOptions>\n\t\t\t</mxc:CartesianChart>\n\n\t\t</Grid>\n\n\t</Grid>\n\t\n</UserControl>\n"
  },
  {
    "path": "DemoCenter/DemoCenter/Views/UseCases/FinancialServices/MortgageCalculatorView.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace DemoCenter.Views;\n\npublic partial class MortgageCalculatorView : UserControl\n{\n    public MortgageCalculatorView()\n    {\n        InitializeComponent();\n    }\n}"
  },
  {
    "path": "DemoCenter/DemoCenter/emxLicense.cs",
    "content": "﻿// This file is auto-generated. Please do not change it.\nusing System.Runtime.CompilerServices;\n\nusing Eremex.AvaloniaUI.Controls.License;\n\nnamespace DemoCenter;\npublic class LicenseProvider\n{\n#pragma warning disable CA2255 // The 'ModuleInitializer' attribute should not be used in libraries\n\t[ModuleInitializer]\n#pragma warning restore CA2255 // The 'ModuleInitializer' attribute should not be used in libraries\n    public static void RegisterLicense()\n\t{\n        ControlsLicenseManager.SetRuntimeLicenseOwner(new LicenseProvider(),\"\", \"A2F7867D\", \"1E C5 5D 3E FF F9 8D FC 78 9A 0F CB 86 79 2D 47 85 E2 D4 2C DB CB 74 72 88 3D 9F 58 9E DD 3A C2 10 E3 33 27 D1 6E C2 2E\", \"0D 56 4A E7 68 75 F5 89 B5 DA 23 5F D6 FD 0A DD C4 85 31 CD DF C3 58 E2 9D 97 DB 5C 4F 46 D2 54 38 49 BF 83 20 BA B0 A2\");\n\t}\n}"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/DemoCenter.Android.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0-android</TargetFramework>\n    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>\n    <Nullable>enable</Nullable>\n    <ApplicationId>net.Eremex.DemoCenter</ApplicationId>\n    <ApplicationVersion>1</ApplicationVersion>\n    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n    <AndroidPackageFormat>apk</AndroidPackageFormat>\n    <AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>\n\n\t  <TrimMode>partial</TrimMode>\n\t  <PublishTrimmed>False</PublishTrimmed>\n\t  <RunAOTCompilation>False</RunAOTCompilation>\n  </PropertyGroup>\n  <ItemGroup>\n    <AndroidResource Include=\"Icon.png\">\n      <Link>Resources\\drawable\\Icon.png</Link>\n    </AndroidResource>\n  </ItemGroup>\n\t\n\t<ItemGroup>\n    <PackageReference Include=\"Avalonia.Android\" />\n    <PackageReference Include=\"Xamarin.AndroidX.Core.SplashScreen\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\DemoCenter\\DemoCenter.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/MainActivity.cs",
    "content": "﻿using Android.Content.PM;\nusing Avalonia;\nusing Avalonia.Android;\nusing DemoCenter;\n\nnamespace testAndroid.Android;\n\n[Activity(\n    Label = \"DemoCenter.Android\",\n    Theme = \"@style/MyTheme.NoActionBar\",\n    Icon = \"@drawable/icon\",\n    MainLauncher = true,\n    ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]\npublic class MainActivity : AvaloniaMainActivity<App>\n{\n    protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)\n    {\n        return base.CustomizeAppBuilder(builder)\n            .WithInterFont();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Properties/AndroidManifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" android:installLocation=\"auto\">\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n\t<application android:label=\"testAndroid\" android:icon=\"@drawable/Icon\" />\n</manifest>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/AboutResources.txt",
    "content": "Images, layout descriptions, binary blobs and string dictionaries can be included \nin your application as resource files.  Various Android APIs are designed to \noperate on the resource IDs instead of dealing with images, strings or binary blobs \ndirectly.\n\nFor example, a sample Android app that contains a user interface layout (main.axml),\nan internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) \nwould keep its resources in the \"Resources\" directory of the application:\n\nResources/\n    drawable/\n        icon.png\n\n    layout/\n        main.axml\n\n    values/\n        strings.xml\n\nIn order to get the build system to recognize Android resources, set the build action to\n\"AndroidResource\".  The native Android APIs do not operate directly with filenames, but \ninstead operate on resource IDs.  When you compile an Android application that uses resources, \nthe build system will package the resources for distribution and generate a class called \"R\" \n(this is an Android convention) that contains the tokens for each one of the resources \nincluded. For example, for the above Resources layout, this is what the R class would expose:\n\npublic class R {\n    public class drawable {\n        public const int icon = 0x123;\n    }\n\n    public class layout {\n        public const int main = 0x456;\n    }\n\n    public class strings {\n        public const int first_string = 0xabc;\n        public const int second_string = 0xbcd;\n    }\n}\n\nYou would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main \nto reference the layout/main.axml file, or R.strings.first_string to reference the first \nstring in the dictionary file values/strings.xml."
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/drawable/splash_screen.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <item>\n    <color android:color=\"@color/splash_background\"/>\n  </item>\n\n  <item android:drawable=\"@drawable/icon\"\n        android:width=\"120dp\"\n        android:height=\"120dp\"\n        android:gravity=\"center\" />\n\n</layer-list>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/drawable-night-v31/avalonia_anim.xml",
    "content": "<animated-vector\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:aapt=\"http://schemas.android.com/aapt\">\n  <aapt:attr name=\"android:drawable\">\n    <vector\n      android:name=\"vector\"\n      android:width=\"128dp\"\n      android:height=\"128dp\"\n      android:viewportWidth=\"128\"\n      android:viewportHeight=\"128\">\n      <group\n        android:name=\"wrapper\"\n        android:translateX=\"21\"\n        android:translateY=\"21\">\n        <group android:name=\"group\">\n          <path\n            android:name=\"path\"\n            android:pathData=\"M 74.853 85.823 L 75.368 85.823 C 80.735 85.823 85.144 81.803 85.761 76.602 L 85.836 41.76 C 85.225 18.593 66.254 0 42.939 0 C 19.24 0 0.028 19.212 0.028 42.912 C 0.028 66.357 18.831 85.418 42.18 85.823 L 74.853 85.823 Z\"\n            android:strokeWidth=\"1\"/>\n          <path\n            android:name=\"path_1\"\n            android:pathData=\"M 43.059 14.614 C 29.551 14.614 18.256 24.082 15.445 36.743 C 18.136 37.498 20.109 39.968 20.109 42.899 C 20.109 45.831 18.136 48.301 15.445 49.055 C 18.256 61.716 29.551 71.184 43.059 71.184 C 47.975 71.184 52.599 69.93 56.628 67.723 L 56.628 70.993 L 71.344 70.993 L 71.344 44.072 C 71.357 43.714 71.344 43.26 71.344 42.899 C 71.344 27.278 58.68 14.614 43.059 14.614 Z M 29.51 42.899 C 29.51 35.416 35.576 29.35 43.059 29.35 C 50.541 29.35 56.607 35.416 56.607 42.899 C 56.607 50.382 50.541 56.448 43.059 56.448 C 35.576 56.448 29.51 50.382 29.51 42.899 Z\"\n            android:strokeWidth=\"1\"\n            android:fillType=\"evenOdd\"/>\n          <path\n            android:name=\"path_2\"\n            android:pathData=\"M 18.105 42.88 C 18.105 45.38 16.078 47.407 13.579 47.407 C 11.079 47.407 9.052 45.38 9.052 42.88 C 9.052 40.381 11.079 38.354 13.579 38.354 C 16.078 38.354 18.105 40.381 18.105 42.88 Z\"\n            android:strokeWidth=\"1\"/>\n        </group>\n      </group>\n    </vector>\n  </aapt:attr>\n  <target android:name=\"path\">\n    <aapt:attr name=\"android:animation\">\n      <objectAnimator\n        android:propertyName=\"fillColor\"\n        android:duration=\"1000\"\n        android:valueFrom=\"#00ffffff\"\n        android:valueTo=\"#161c2d\"\n        android:valueType=\"colorType\"\n        android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n    </aapt:attr>\n  </target>\n  <target android:name=\"path_1\">\n    <aapt:attr name=\"android:animation\">\n      <objectAnimator\n        android:propertyName=\"fillColor\"\n        android:duration=\"1000\"\n        android:valueFrom=\"#00ffffff\"\n        android:valueTo=\"#f9f9fb\"\n        android:valueType=\"colorType\"\n        android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n    </aapt:attr>\n  </target>\n  <target android:name=\"path_2\">\n    <aapt:attr name=\"android:animation\">\n      <objectAnimator\n        android:propertyName=\"fillColor\"\n        android:duration=\"1000\"\n        android:valueFrom=\"#00ffffff\"\n        android:valueTo=\"#f9f9fb\"\n        android:valueType=\"colorType\"\n        android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n    </aapt:attr>\n  </target>\n</animated-vector>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/drawable-v31/avalonia_anim.xml",
    "content": "<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:name=\"vector\"\n            android:width=\"128dp\"\n            android:height=\"128dp\"\n            android:viewportWidth=\"128\"\n            android:viewportHeight=\"128\">\n            <group\n                android:name=\"wrapper\"\n                android:translateX=\"21\"\n                android:translateY=\"21\">\n                <group android:name=\"group\">\n                    <path\n                        android:name=\"path\"\n                        android:pathData=\"M 74.853 85.823 L 75.368 85.823 C 80.735 85.823 85.144 81.803 85.761 76.602 L 85.836 41.76 C 85.225 18.593 66.254 0 42.939 0 C 19.24 0 0.028 19.212 0.028 42.912 C 0.028 66.357 18.831 85.418 42.18 85.823 L 74.853 85.823 Z\"\n                        android:fillColor=\"#00ffffff\"\n                        android:strokeWidth=\"1\"/>\n                    <path\n                        android:name=\"path_1\"\n                        android:pathData=\"M 43.059 14.614 C 29.551 14.614 18.256 24.082 15.445 36.743 C 18.136 37.498 20.109 39.968 20.109 42.899 C 20.109 45.831 18.136 48.301 15.445 49.055 C 18.256 61.716 29.551 71.184 43.059 71.184 C 47.975 71.184 52.599 69.93 56.628 67.723 L 56.628 70.993 L 71.344 70.993 L 71.344 44.072 C 71.357 43.714 71.344 43.26 71.344 42.899 C 71.344 27.278 58.68 14.614 43.059 14.614 Z M 29.51 42.899 C 29.51 35.416 35.576 29.35 43.059 29.35 C 50.541 29.35 56.607 35.416 56.607 42.899 C 56.607 50.382 50.541 56.448 43.059 56.448 C 35.576 56.448 29.51 50.382 29.51 42.899 Z\"\n                        android:fillColor=\"#00ffffff\"\n                        android:strokeWidth=\"1\"\n                        android:fillType=\"evenOdd\"/>\n                    <path\n                        android:name=\"path_2\"\n                        android:pathData=\"M 18.105 42.88 C 18.105 45.38 16.078 47.407 13.579 47.407 C 11.079 47.407 9.052 45.38 9.052 42.88 C 9.052 40.381 11.079 38.354 13.579 38.354 C 16.078 38.354 18.105 40.381 18.105 42.88 Z\"\n                        android:fillColor=\"#00ffffff\"\n                        android:strokeWidth=\"1\"/>\n                </group>\n            </group>\n        </vector>\n    </aapt:attr>\n    <target android:name=\"path_2\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"fillColor\"\n                android:startOffset=\"100\"\n                android:duration=\"900\"\n                android:valueFrom=\"#00ffffff\"\n                android:valueTo=\"#161c2d\"\n                android:valueType=\"colorType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n    <target android:name=\"path\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"fillColor\"\n                android:duration=\"500\"\n                android:valueFrom=\"#00ffffff\"\n                android:valueTo=\"#f9f9fb\"\n                android:valueType=\"colorType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n    <target android:name=\"path_1\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:propertyName=\"fillColor\"\n                android:startOffset=\"100\"\n                android:duration=\"900\"\n                android:valueFrom=\"#00ffffff\"\n                android:valueTo=\"#161c2d\"\n                android:valueType=\"colorType\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"/>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/values/colors.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <color name=\"splash_background\">#FFFFFF</color>\n</resources>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/values/styles.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n\n  <style name=\"MyTheme\">\n  </style>\n\n  <style name=\"MyTheme.NoActionBar\" parent=\"@style/Theme.AppCompat.DayNight.NoActionBar\">\n    <item name=\"android:windowActionBar\">false</item>\n    <item name=\"android:windowBackground\">@drawable/splash_screen</item>\n    <item name=\"android:windowNoTitle\">true</item>\n  </style>\n</resources>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/values-night/colors.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <color name=\"splash_background\">#212121</color>\n</resources>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Android/Resources/values-v31/styles.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n\n  <style name=\"MyTheme\">\n  </style>\n\n  <style name=\"MyTheme.NoActionBar\" parent=\"@style/Theme.AppCompat.NoActionBar\">\n    <item name=\"android:windowActionBar\">false</item>\n    <item name=\"android:windowBackground\">@null</item>\n    <item name=\"android:windowNoTitle\">true</item>\n    <item name=\"android:windowSplashScreenBackground\">@color/splash_background</item>\n    <item name=\"android:windowSplashScreenAnimatedIcon\">@drawable/avalonia_anim</item>\n    <item name=\"android:windowSplashScreenAnimationDuration\">1000</item>\n    <item name=\"postSplashScreenTheme\">@style/MyTheme.Main</item>\n\n  </style>\n  <style name=\"MyTheme.Main\"\n         parent =\"MyTheme.NoActionBar\">\n    <item name=\"android:windowIsTranslucent\">true</item>\n  </style>\n</resources>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Desktop/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n[assembly: InternalsVisibleTo(\"DemoCenter.Desktop.UI.Tests\")]"
  },
  {
    "path": "DemoCenter/DemoCenter.Desktop/DemoCenter.Desktop.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <!--If you are willing to use Windows/MacOS native APIs you will need to create 3 projects.\n    One for Windows with net7.0-windows TFM, one for MacOS with net7.0-macos and one with net7.0 TFM for Linux.-->\n    <Nullable>enable</Nullable>\n    <BuiltInComInteropSupport>true</BuiltInComInteropSupport>\n    <Configurations>Debug;Release;Release_WASM</Configurations>\n  </PropertyGroup>\n\n<PropertyGroup>\n    <CFBundleName>DemoCenter.Desktop</CFBundleName> \n    <CFBundleDisplayName>DemoCenter.Desktop</CFBundleDisplayName>\n    <CFBundleIdentifier>net.eremexcontrols</CFBundleIdentifier>\n    <CFBundleVersion>1.0.0</CFBundleVersion>\n    <CFBundlePackageType>APPL</CFBundlePackageType>\n    <CFBundleSignature>????</CFBundleSignature>\n    <CFBundleExecutable>DemoCenter.Desktop</CFBundleExecutable>\n    <CFBundleIconFile>DemoCenter.Desktop.icns</CFBundleIconFile>\n    <CFBundleShortVersionString>1.0.0</CFBundleShortVersionString>\n\n    <NSPrincipalClass>NSApplication</NSPrincipalClass>\n    <NSHighResolutionCapable>true</NSHighResolutionCapable>\n</PropertyGroup>\n\n  <PropertyGroup>\n    <ApplicationManifest>app.manifest</ApplicationManifest>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia.Desktop\" />\n    <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->\n    <PackageReference Condition=\"'$(Configuration)' == 'Debug'\" Include=\"Avalonia.Diagnostics\" />\n    <PackageReference Include=\"Dotnet.Bundle\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\DemoCenter\\DemoCenter.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Desktop/Program.cs",
    "content": "﻿using System;\nusing Avalonia;\nusing Avalonia.ReactiveUI;\n\nnamespace DemoCenter.Desktop;\n\nclass Program\n{\n    // Initialization code. Don't use any Avalonia, third-party APIs or any\n    // SynchronizationContext-reliant code before AppMain is called: things aren't initialized\n    // yet and stuff might break.\n    [STAThread]\n    public static void Main(string[] args) => BuildAvaloniaApp()\n        .StartWithClassicDesktopLifetime(args);\n\n    // Avalonia configuration, don't remove; also used by visual designer.\n    public static AppBuilder BuildAvaloniaApp()\n        => AppBuilder.Configure<App>()\n            .UsePlatformDetect()\n            .WithInterFont()\n            .LogToTrace()\n            .UseReactiveUI();\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Desktop/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <!-- This manifest is used on Windows only.\n       Don't remove it as it might cause problems with window transparency and embeded controls.\n       For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->\n  <assemblyIdentity version=\"1.0.0.0\" name=\"DemoCenter.Desktop\"/>\n\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- A list of the Windows versions that this application has been tested on\n           and is designed to work with. Uncomment the appropriate elements\n           and Windows will automatically select the most compatible environment. -->\n\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\n    </application>\n  </compatibility>\n</assembly>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Mobile.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32811.315\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DemoCenter\", \"DemoCenter\\DemoCenter.csproj\", \"{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{3DA99C4E-89E3-4049-9C22-0A7EC60D83D8}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t..\\.gitignore = ..\\.gitignore\n\t\t..\\.gitlab-ci.yml = ..\\.gitlab-ci.yml\n\t\t..\\Directory.Build.props = ..\\Directory.Build.props\n\t\t..\\Directory.Packages.props = ..\\Directory.Packages.props\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DemoCenter.Android\", \"DemoCenter.Android\\DemoCenter.Android.csproj\", \"{AB4E44C5-4448-457D-8FED-945AC31428DE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DemoCenter.iOS\", \"DemoCenter.iOS\\DemoCenter.iOS.csproj\", \"{BF68FEEB-95CE-4823-89C1-082B850563D5}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AB4E44C5-4448-457D-8FED-945AC31428DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AB4E44C5-4448-457D-8FED-945AC31428DE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AB4E44C5-4448-457D-8FED-945AC31428DE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AB4E44C5-4448-457D-8FED-945AC31428DE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BF68FEEB-95CE-4823-89C1-082B850563D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BF68FEEB-95CE-4823-89C1-082B850563D5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BF68FEEB-95CE-4823-89C1-082B850563D5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BF68FEEB-95CE-4823-89C1-082B850563D5}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {83CB65B8-011F-4ED7-BCD3-A6CFA935EF7E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "DemoCenter/DemoCenter.WASM.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32811.315\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DemoCenter\", \"DemoCenter\\DemoCenter.csproj\", \"{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{3DA99C4E-89E3-4049-9C22-0A7EC60D83D8}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t..\\.gitignore = ..\\.gitignore\n\t\t..\\.gitlab-ci.yml = ..\\.gitlab-ci.yml\n\t\t..\\Directory.Build.props = ..\\Directory.Build.props\n\t\t..\\Directory.Packages.props = ..\\Directory.Packages.props\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DemoCenter.Web\", \"DemoCenter.Web\\DemoCenter.Web.csproj\", \"{E939EFCA-559B-4666-91CA-66FBDB95C22E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E939EFCA-559B-4666-91CA-66FBDB95C22E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E939EFCA-559B-4666-91CA-66FBDB95C22E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E939EFCA-559B-4666-91CA-66FBDB95C22E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E939EFCA-559B-4666-91CA-66FBDB95C22E}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {83CB65B8-011F-4ED7-BCD3-A6CFA935EF7E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Web/DemoCenter.Web.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WebAssembly\">\r\n\t<PropertyGroup>\r\n\t\t<TargetFramework>net9.0-browser</TargetFramework>\r\n\t\t<AllowUnsafeBlocks>true</AllowUnsafeBlocks>\t\r\n                <WasmBuildNative>true</WasmBuildNative>\r\n                <Configurations>Debug;Release;Release_WASM</Configurations>\r\n\t</PropertyGroup>\r\n\t<ItemGroup>\r\n                <PackageReference Include=\"SkiaSharp.NativeAssets.WebAssembly\"/>\r\n\t\t<PackageReference Include=\"Avalonia.Browser\" />\r\n                <PackageReference Include=\"Avalonia.Themes.Fluent\" />\r\n\t</ItemGroup>\r\n\r\n\t<ItemGroup>\r\n\t\t<ProjectReference Include=\"..\\DemoCenter\\DemoCenter.csproj\" />\r\n\t</ItemGroup>\r\n</Project>\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Web/Program.cs",
    "content": "﻿using System.Runtime.Versioning;\r\nusing System.Threading.Tasks;\r\nusing Avalonia;\r\nusing Avalonia.Browser;\r\nusing Avalonia.Themes.Fluent;\r\nusing DemoCenter;\r\n\r\n[assembly: SupportedOSPlatform(\"browser\")]\r\n\r\ninternal partial class Program {\r\n\r\n\tprivate static Task Main(string[] args)\r\n\t\t=> BuildAvaloniaApp()\r\n\t\t\t.WithInterFont()\r\n            .WithFluent()\r\n            .StartBrowserAppAsync(\"out\");\r\n\r\n\tpublic static AppBuilder BuildAvaloniaApp()\r\n\t\t=> AppBuilder.Configure<App>();\r\n\r\n}\r\n\r\ninternal static class AppBuilderExtension\r\n{\r\n    public static AppBuilder WithFluent(this AppBuilder appBuilder) \r\n        => appBuilder.AfterSetup(builder => builder.Instance.Styles.Insert(0, new FluentTheme()));\r\n}"
  },
  {
    "path": "DemoCenter/DemoCenter.Web/Properties/launchSettings.json",
    "content": "﻿{\r\n  \"profiles\": {\r\n    \"DemoCenter.Web\": {\r\n      \"commandName\": \"Project\",\r\n      \"launchBrowser\": true,\r\n      \"environmentVariables\": {\r\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\r\n      },\r\n      \"applicationUrl\": \"https://localhost:5001;http://localhost:5000\",\r\n      \"inspectUri\": \"{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}\"\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Web/runtimeconfig.template.json",
    "content": "{\r\n  \"wasmHostProperties\": {\r\n    \"perHostConfig\": [\r\n      {\r\n        \"name\": \"browser\",\r\n        \"html-path\": \"index.html\",\r\n        \"Host\": \"browser\"\r\n      }\r\n    ]\r\n  }\r\n}"
  },
  {
    "path": "DemoCenter/DemoCenter.Web/wwwroot/app.css",
    "content": "﻿:root {\n    --sat: env(safe-area-inset-top);\n    --sar: env(safe-area-inset-right);\n    --sab: env(safe-area-inset-bottom);\n    --sal: env(safe-area-inset-left);\n}\n\n/* HTML styles for the splash screen */\n\n.highlight {\n    color: white;\n    font-size: 2.5rem;\n    display: block;\n}\n\n.purple {\n    color: #8b44ac;\n}\n\n.icon {\n    opacity: 0.05;\n    height: 35%;\n    width: 35%;\n    position: absolute;\n    background-repeat: no-repeat;\n    right: 0px;\n    bottom: 0px;\n    margin-right: 3%;\n    margin-bottom: 5%;\n    z-index: 5000;\n    background-position: right bottom;\n    pointer-events: none;\n}\n\n#avalonia-splash a {\n    color: whitesmoke;\n    text-decoration: none;\n}\n\n.center {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    height: 100vh;\n}\n\n#avalonia-splash {\n    position: relative;\n    height: 100%;\n    width: 100%;\n    color: whitesmoke;\n    background: #1b2a4e;\n    font-family: 'Inter';\n    background-position: center;\n    background-size: cover;\n    background-repeat: no-repeat;\n    justify-content: center;\n    align-items: center;\n}\n\n.splash-close {\n    animation: fadeout 0.25s linear forwards;\n}\n\n@keyframes fadeout {\n    0% {\n        opacity: 100%;\n    }\n\n    100% {\n        opacity: 0;\n        visibility: collapse;\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter.Web/wwwroot/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <title>Eremex Demo Center v.1.0</title>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <base href=\"/\" />\n    <link rel=\"modulepreload\" href=\"./main.js\" />\n    <link rel=\"modulepreload\" href=\"./_framework/dotnet.js\" />\n    <link rel=\"modulepreload\" href=\"./_framework/avalonia.js\" />\n    <link rel=\"stylesheet\" href=\"./app.css\" />\n</head>\n\n<body style=\"margin: 0px; overflow: hidden\">\n    <div id=\"out\">\n        <div id=\"avalonia-splash\">\n            <div class=\"center\">\n                <h2 class=\"purple\">\n                    Loading ...\n                </h2>\n            </div>\n        </div>\n    </div>\n    <script type='module' src=\"./main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "DemoCenter/DemoCenter.Web/wwwroot/main.js",
    "content": "﻿import { dotnet } from './_framework/dotnet.js'\n\nconst is_browser = typeof window != \"undefined\";\nif (!is_browser) throw new Error(`Expected to be running in a browser`);\n\nconst dotnetRuntime = await dotnet\n    .withDiagnosticTracing(false)\n    .withApplicationArgumentsFromQuery()\n    .create();\n\nconst config = dotnetRuntime.getConfig();\n\nawait dotnetRuntime.runMain(config.mainAssemblyName, [window.location.search]);\n"
  },
  {
    "path": "DemoCenter/DemoCenter.iOS/AppDelegate.cs",
    "content": "using Foundation;\nusing UIKit;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.iOS;\nusing Avalonia.Media;\nnamespace DemoCenter.iOS;\n\n// The UIApplicationDelegate for the application. This class is responsible for launching the \n// User Interface of the application, as well as listening (and optionally responding) to \n// application events from iOS.\n[Register(\"AppDelegate\")]\n#pragma warning disable CA1711 // Identifiers should not have incorrect suffix\npublic partial class AppDelegate : AvaloniaAppDelegate<App>\n#pragma warning restore CA1711 // Identifiers should not have incorrect suffix\n{\n    protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)\n    {\n        return base.CustomizeAppBuilder(builder)\n            .WithInterFont();\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter.iOS/DemoCenter.iOS.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0-ios</TargetFramework>\n    <SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia.iOS\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\DemoCenter\\DemoCenter.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.iOS/Entitlements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDisplayName</key>\n\t<string>testAndroid</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>companyName.testAndroid</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>MinimumOSVersion</key>\n\t<string>13.0</string>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.iOS/Main.cs",
    "content": "using UIKit;\n\nnamespace DemoCenter.iOS;\n\npublic class Application\n{\n    // This is the main entry point of the application.\n    static void Main(string[] args)\n    {\n        // if you want to use a different Application Delegate class from \"AppDelegate\"\n        // you can specify it here.\n        UIApplication.Main(args, null, typeof(AppDelegate));\n    }\n}\n"
  },
  {
    "path": "DemoCenter/DemoCenter.iOS/Resources/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"6214\" systemVersion=\"14A314h\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n\t<dependencies>\n\t\t<plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"6207\" />\n\t\t<capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\" />\n\t</dependencies>\n\t<objects>\n\t\t<placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" />\n\t\t<placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\" />\n\t\t<view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n\t\t\t<rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\" />\n\t\t\t<autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\" />\n\t\t\t<subviews>\n\t\t\t\t<label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"  Copyright (c) 2022 \" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\"\n\t\t\t\t\tminimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n\t\t\t\t\t<rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"21\" />\n\t\t\t\t\t<fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\" />\n\t\t\t\t\t<color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\" />\n\t\t\t\t\t<nil key=\"highlightedColor\" />\n\t\t\t\t</label>\n\t\t\t\t<label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"testAndroid\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\"\n\t\t\t\t\tminimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n\t\t\t\t\t<rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\" />\n\t\t\t\t\t<fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\" />\n\t\t\t\t\t<color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\" />\n\t\t\t\t\t<nil key=\"highlightedColor\" />\n\t\t\t\t</label>\n\t\t\t</subviews>\n\t\t\t<color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\" />\n\t\t\t<constraints>\n\t\t\t\t<constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\" />\n\t\t\t\t<constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\" />\n\t\t\t\t<constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\" />\n\t\t\t\t<constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\" />\n\t\t\t\t<constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\" />\n\t\t\t\t<constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\" />\n\t\t\t</constraints>\n\t\t\t<nil key=\"simulatedStatusBarMetrics\" />\n\t\t\t<freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\" />\n\t\t\t<point key=\"canvasLocation\" x=\"548\" y=\"455\" />\n\t\t</view>\n\t</objects>\n</document>\n"
  },
  {
    "path": "DemoCenter/DemoCenter.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 17\r\nVisualStudioVersion = 17.3.32811.315\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DemoCenter.Desktop\", \"DemoCenter.Desktop\\DemoCenter.Desktop.csproj\", \"{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}\"\r\nEndProject\r\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DemoCenter\", \"DemoCenter\\DemoCenter.csproj\", \"{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{3DA99C4E-89E3-4049-9C22-0A7EC60D83D8}\"\r\n\tProjectSection(SolutionItems) = preProject\r\n\t\t..\\.gitignore = ..\\.gitignore\r\n\t\t..\\.gitlab-ci.yml = ..\\.gitlab-ci.yml\r\n\t\t..\\Directory.Build.props = ..\\Directory.Build.props\r\n\t\t..\\Directory.Packages.props = ..\\Directory.Packages.props\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease_WASM|Any CPU = Release_WASM|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release_WASM|Any CPU.ActiveCfg = Release_WASM|Any CPU\r\n\t\t{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release_WASM|Any CPU.Build.0 = Release_WASM|Any CPU\r\n\t\t{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release_WASM|Any CPU.ActiveCfg = Release_WASM|Any CPU\r\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release_WASM|Any CPU.Build.0 = Release_WASM|Any CPU\r\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {83CB65B8-011F-4ED7-BCD3-A6CFA935EF7E}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "Directory.Build.props",
    "content": "<Project>\n  <PropertyGroup>\n    <Company>Eremex</Company>\n    <Copyright>©2010-2026 Eremex</Copyright>\n    <Product>Eremex Controls</Product>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\n    <GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>\n    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n    <LangVersion>10.0</LangVersion>\n    <AvaloniaVersion>11.3.8</AvaloniaVersion>\n    <AvaloniaSvgSkiaVersion>11.3.0.3</AvaloniaSvgSkiaVersion>\n    <SkiaSharpVersion>2.88.9</SkiaSharpVersion>\n    <MicrosoftCodeAnalysisVersion>4.3.0</MicrosoftCodeAnalysisVersion>\n    <EMXControlsVersion>1.3.62</EMXControlsVersion>\n    <Version>$(EMXControlsVersion)</Version>\n  </PropertyGroup>\n\n  <ItemGroup>\n\t<TrimmerRootAssembly Include=\"DemoCenter\" />\n  </ItemGroup>\n\n  <PropertyGroup>\n    <NoWarn>NU1803;</NoWarn>\n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "Directory.Packages.props",
    "content": "<Project>\n  <PropertyGroup>\n  </PropertyGroup>\n  <ItemGroup Label=\"ThirdParty\">\n    <PackageVersion Include=\"Avalonia.Fonts.Inter\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Themes.Fluent\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.iOS\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Android\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"StirlingLabs.assimp.native.linux-x64\" Version=\"5.2.5.4\" />\n    <PackageVersion Include=\"StirlingLabs.assimp.native.osx\" Version=\"5.2.5.4\" />\n    <PackageVersion Include=\"StirlingLabs.assimp.native.win-x64\" Version=\"5.2.5.4\" />\n    <PackageVersion Include=\"Xamarin.AndroidX.Core.SplashScreen\" Version=\"1.0.1.1\" />\n    <PackageVersion Include=\"Avalonia.Browser\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Desktop\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Diagnostics\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Microsoft.CodeAnalysis.CSharp.Scripting\" Version=\"$(MicrosoftCodeAnalysisVersion)\" />\n    <PackageVersion Include=\"Avalonia.ReactiveUI\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Svg.Controls.Skia.Avalonia\" Version=\"$(AvaloniaSvgSkiaVersion)\" />\n    <PackageVersion Include=\"Svg.Controls.Avalonia\" Version=\"$(AvaloniaSvgSkiaVersion)\" />\n    <PackageVersion Include=\"Avalonia.BuildServices\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.AvaloniaEdit\" Version=\"11.0.6\" />\n    <PackageVersion Include=\"AvaloniaEdit.TextMate\" Version=\"11.0.6\" />\n    <PackageVersion Include=\"TextMateSharp.Grammars\" Version=\"1.0.56\" />\n    <PackageVersion Include=\"Newtonsoft.Json\" Version=\"13.0.3\" />\n    <PackageVersion Include=\"XamlNameReferenceGenerator\" Version=\"1.3.4\" />\n    <PackageVersion Include=\"SkiaSharp\" Version=\"$(SkiaSharpVersion)\" />\n    <PackageVersion Include=\"SkiaSharp.NativeAssets.Linux\" Version=\"$(SkiaSharpVersion)\" />\n    <PackageVersion Include=\"SkiaSharp.NativeAssets.Win32\" Version=\"$(SkiaSharpVersion)\" />\n    <PackageVersion Include=\"SkiaSharp.NativeAssets.WebAssembly\" Version=\"$(SkiaSharpVersion)\" />\n    <PackageVersion Include=\"CommunityToolkit.Mvvm\" Version=\"8.2.2\" />\n    <PackageVersion Include=\"System.Resources.Extensions\" Version=\"6.0.0\" />\n    <PackageVersion Include=\"Eremex.Drawing\" Version=\"$(EMXControlsVersion)\" />\n    <PackageVersion Include=\"Eremex.Drawing.Skia\" Version=\"$(EMXControlsVersion)\" />\n    <PackageVersion Include=\"Eremex.DocumentProcessing\" Version=\"$(EMXControlsVersion)\" />\n    <PackageVersion Include=\"Eremex.Avalonia.Controls\" Version=\"$(EMXControlsVersion)\" />\n    <PackageVersion Include=\"Eremex.Avalonia.Controls3D\" Version=\"$(EMXControlsVersion)\" />\n    <PackageVersion Include=\"Eremex.Avalonia.Themes.DeltaDesign\" Version=\"$(EMXControlsVersion)\" />\n    <PackageVersion Include=\"FluentAssertions\" Version=\"6.12.0\" />\n    <PackageVersion Include=\"Avalonia.Headless\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Moq.AutoMock\" Version=\"3.2.0\" />\n    <PackageVersion Include=\"Moq\" Version=\"4.18.1\" />\n    <PackageVersion Include=\"Xunit.Combinatorial\" Version=\"1.6.24\" />\n    <PackageVersion Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.1.0\" />\n    <PackageVersion Include=\"xunit\" Version=\"2.5.2\" />\n    <PackageVersion Include=\"xunit.runner.visualstudio\" Version=\"2.5.3\" />\n    <PackageVersion Include=\"Xunit.StaFact\" Version=\"1.1.11\" />\n    <PackageVersion Include=\"stylecop.analyzers\" Version=\"1.1.118\" />\n    <PackageVersion Include=\"Microsoft.VisualStudio.Threading.Analyzers\" Version=\"17.7.30\" />\n    <PackageVersion Include=\"JunitXml.TestLogger\" Version=\"3.0.134\" />\n    <PackageVersion Include=\"NuGet.Common\" Version=\"6.7.0\" />\n    <PackageVersion Include=\"XunitContext\" Version=\"3.3.1\" />\n    <PackageVersion Include=\"Serilog\" Version=\"3.0.1\" />\n    <PackageVersion Include=\"Serilog.Sinks.Console\" Version=\"4.1.0\" />\n    <PackageVersion Include=\"Serilog.Sinks.File\" Version=\"5.0.0\" />\n    <PackageVersion Include=\"Serilog.Sinks.XUnit\" Version=\"3.0.5\" />\n    <PackageVersion Include=\"AssimpNetter\" Version=\"5.4.3.3\" />\n    <PackageVersion Include=\"Dotnet.Bundle\" Version=\"0.9.13\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "License.md",
    "content": "﻿EMXControls license is listed at https://eremexcontrols.net/articles/licensing/eula.html\n\nThis Demo project source code is licensed under the MIT License\n\nEREMEX JSC\nCopyright (c) 2008-2026\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/AvaloniaApp.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Headless;\nusing Avalonia.Threading;\n\nusing DemoCenter.Desktop.UI.Tests;\n\nnamespace DemoCenter.Desktop.UI.Tests\n{\n\tpublic static class AvaloniaApp\n\t{\n\t\tpublic static void Stop()\n\t\t{\n\t\t\tvar app = GetApp();\n\t\t\tif (app is IDisposable disposable)\n\t\t\t{\n\t\t\t\tDispatcher.UIThread.Post(disposable.Dispose);\n\t\t\t}\n\n\t\t\tif (app != null)\n\t\t\t\tDispatcher.UIThread.Post(() => app.Shutdown());\n\t\t}\n\n\t\tpublic static Window GetMainWindow() => GetApp()?.MainWindow;\n\n\t\tpublic static IClassicDesktopStyleApplicationLifetime GetApp() =>\n\t\t\t(IClassicDesktopStyleApplicationLifetime)Application.Current?.ApplicationLifetime;\n\n\t\tpublic static AppBuilder BuildAvaloniaApp() =>\n\t\t\tAppBuilder\n\t\t\t\t.Configure<App>()\n\t\t\t\t.UsePlatformDetect()\n\t\t\t\t.WithInterFont();\n\t}\n}\n"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/AvaloniaUiTestFramework.cs",
    "content": "﻿using System.Reflection;\n\nusing Avalonia;\n\nusing Xunit.Sdk;\n\n[assembly: TestFramework(\"DemoCenter.Desktop.UI.Tests.AvaloniaUiTestFramework\", \"DemoCenter.Desktop.UI.Tests\")]\n[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly, DisableTestParallelization = true, MaxParallelThreads = 1)]\n\nnamespace DemoCenter.Desktop.UI.Tests;\n\npublic class AvaloniaUiTestFramework : XunitTestFramework\n{\n\tclass Executor : XunitTestFrameworkExecutor\n\t{\n\t\tpublic Executor(\n\t\t\tAssemblyName assemblyName,\n\t\t\tISourceInformationProvider sourceInformationProvider,\n\t\t\tIMessageSink diagnosticMessageSink)\n\t\t\t: base(\n\t\t\t\tassemblyName,\n\t\t\t\tsourceInformationProvider,\n\t\t\t\tdiagnosticMessageSink) { }\n\n\t\tprotected override async void RunTestCases(IEnumerable<IXunitTestCase> testCases,\n\t\t\tIMessageSink executionMessageSink,\n\t\t\tITestFrameworkExecutionOptions executionOptions)\n\t\t{\n\t\t\texecutionOptions.SetValue(\"xunit.execution.DisableParallelization\", false);\n\t\t\tusing var assemblyRunner = new Runner(\n\t\t\t\tTestAssembly, testCases, DiagnosticMessageSink, executionMessageSink,\n\t\t\t\texecutionOptions);\n\t\t\tawait assemblyRunner.RunAsync();\n\t\t}\n\t}\n\n\tpublic AvaloniaUiTestFramework(IMessageSink messageSink) : base(messageSink)\n    {\n\t}\n\n\tprotected override ITestFrameworkExecutor CreateExecutor(AssemblyName assemblyName)\n\t\t=> new Executor(assemblyName, SourceInformationProvider, DiagnosticMessageSink);\n\n\tclass Runner : XunitTestAssemblyRunner\n\t{\n\t\tpublic Runner(\n\t\t\tITestAssembly testAssembly,\n\t\t\tIEnumerable<IXunitTestCase> testCases,\n\t\t\tIMessageSink diagnosticMessageSink,\n\t\t\tIMessageSink executionMessageSink,\n\t\t\tITestFrameworkExecutionOptions executionOptions)\n\t\t\t: base(\n\t\t\t\ttestAssembly,\n\t\t\t\ttestCases,\n\t\t\t\tdiagnosticMessageSink,\n\t\t\t\texecutionMessageSink,\n\t\t\t\texecutionOptions) { }\n\n\t\tpublic override void Dispose()\n\t\t{\n\t\t\tAvaloniaApp.Stop();\n\t\t\tbase.Dispose();\n\t\t}\n\n\t\tprotected override void SetupSyncContext(int maxParallelThreads)\n\t\t{\n\t\t\tvar tcs = new TaskCompletionSource<SynchronizationContext>();\n\t\t\tvar thread = new Thread(() =>\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t//AvaloniaApp.RegisterDependencies();\n\t\t\t\t\tAvaloniaApp\n\t\t\t\t\t\t.BuildAvaloniaApp()\n\t\t\t\t\t\t.AfterSetup(_ => { tcs.SetResult(SynchronizationContext.Current!); })\n\t\t\t\t\t\t.StartWithClassicDesktopLifetime(new string[0]);\n\t\t\t\t}\n\t\t\t\tcatch (Exception e)\n\t\t\t\t{\n\t\t\t\t\ttcs.SetException(e);\n\t\t\t\t}\n\t\t\t})\n\t\t\t{\n\t\t\t\tIsBackground = true\n\t\t\t};\n\t\t\tthread.Start();\n\t\t\tSynchronizationContext.SetSynchronizationContext(tcs.Task.Result);\n\t\t}\n\t}\n}"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/DemoCenter.Desktop.UI.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n    <PropertyGroup>\n        <TargetFramework>net9.0</TargetFramework>\n        <Nullable>disable</Nullable>\n        <TreatWarningsAsErrors>True</TreatWarningsAsErrors>\n        <IsPackable>false</IsPackable>\n        <RootNamespace>Eremex.Avalonia.Controls.UITests</RootNamespace>\n    </PropertyGroup>\n    <ItemGroup>\n      <AvaloniaXaml Remove=\"App.axaml\" />\n    </ItemGroup>\n    <ItemGroup>\n      <Compile Remove=\"App.axaml.cs\" />\n    </ItemGroup>\n    <ItemGroup>\n\t\t<PackageReference Include=\"Eremex.Avalonia.Controls\" />\n\t\t<PackageReference Include=\"Eremex.Avalonia.Themes.DeltaDesign\" />\n\n\t\t<PackageReference Include=\"Avalonia\" />\n        <PackageReference Include=\"Avalonia.Desktop\" />\n        <PackageReference Include=\"Avalonia.Themes.Fluent\" />\n        <PackageReference Include=\"Avalonia.Fonts.Inter\" />\n        <PackageReference Include=\"Avalonia.Headless\" />\n\n        <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->\n        <PackageReference Condition=\"'$(Configuration)' == 'Debug'\" Include=\"Avalonia.Diagnostics\" />\n        <PackageReference Include=\"CommunityToolkit.Mvvm\" />\n    </ItemGroup>\n    <ItemGroup>\n      <ProjectReference Include=\"..\\..\\DemoCenter\\DemoCenter\\DemoCenter.csproj\" />\n    </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/DemoCenter.Desktop.UI.Tests.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.10.35027.167\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DemoCenter.Desktop.UI.Tests\", \"DemoCenter.Desktop.UI.Tests.csproj\", \"{F4389A15-45E8-47A2-81D2-DB812DFE9AF3}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DemoCenter\", \"..\\..\\DemoCenter\\DemoCenter\\DemoCenter.csproj\", \"{8A970C82-5207-4A2C-8DFC-D5742EFFA7C2}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DemoCenter.Desktop\", \"..\\..\\DemoCenter\\DemoCenter.Desktop\\DemoCenter.Desktop.csproj\", \"{4B53BA51-9196-499B-9104-EA9E92A285AC}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{F4389A15-45E8-47A2-81D2-DB812DFE9AF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F4389A15-45E8-47A2-81D2-DB812DFE9AF3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F4389A15-45E8-47A2-81D2-DB812DFE9AF3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F4389A15-45E8-47A2-81D2-DB812DFE9AF3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8A970C82-5207-4A2C-8DFC-D5742EFFA7C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8A970C82-5207-4A2C-8DFC-D5742EFFA7C2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8A970C82-5207-4A2C-8DFC-D5742EFFA7C2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8A970C82-5207-4A2C-8DFC-D5742EFFA7C2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4B53BA51-9196-499B-9104-EA9E92A285AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4B53BA51-9196-499B-9104-EA9E92A285AC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4B53BA51-9196-499B-9104-EA9E92A285AC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4B53BA51-9196-499B-9104-EA9E92A285AC}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {AF3F39A4-1D40-44D8-8F98-98055D4EB764}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/ModulesShowTests.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Threading;\nusing DemoCenter.ViewModels;\nusing DemoCenter.Views;\nusing Eremex.Avalonia.TestUtls;\nusing Metsys.Bson;\n\nnamespace DemoCenter.Desktop.UI.Tests;\npublic class WindowsTests\n{\n    public WindowsTests()\n    {\n        MouseEventsHelper = new TestMouseEventsHelper();\n    }\n\n    protected async Task WaitEx(int ms)\n    {\n        Dispatcher.UIThread.RunJobs();\n        await Task.Delay(ms);\n    }\n\n    protected TestMouseEventsHelper MouseEventsHelper { get; }\n\n    protected void SendLeftMouseDown(Control control)\n    {\n        MouseEventsHelper.SendLeftMouseDown(control);\n    }\n\n    protected void SendLeftMouseUp(Control control)\n    {\n        MouseEventsHelper.SendLeftMouseUp(control);\n    }\n\n    [Fact]\n    public async Task ShowDemoWindow()\n    {\n        var window = new MainWindow\n        {\n            DataContext = new MainViewModel()\n        };\n        window.Show();\n        window.WindowState = Avalonia.Controls.WindowState.Maximized;\n        await WaitEx(1000);\n        window.Close();\n    }\n    \n    [Fact]\n    public async Task ShowAndClickDemoWindow()\n    {\n        var window = new MainWindow\n        {\n            DataContext = new MainViewModel()\n        };\n        window.Show();\n        window.WindowState = Avalonia.Controls.WindowState.Maximized;\n        await WaitEx(1000);\n        SendLeftMouseDown(window);\n        SendLeftMouseUp(window);\n\n        window.Close();\n    }\n    [Fact]\n    public async Task ShowAllModules()\n    {\n        MainViewModel mainViewModel = new MainViewModel();\n        var window = new MainWindow\n        {\n\n            DataContext = mainViewModel\n        };\n        window.Show();\n        window.WindowState = Avalonia.Controls.WindowState.Maximized;\n        await WaitEx(100);\n\n        foreach (var product in mainViewModel.FlatProducts) \n        {\n            try\n            {\n                mainViewModel.SelectProduct(product.Name);\n                await WaitEx(100);\n            }\n            catch (Exception ex)\n            {\n                    Assert.Fail(string.Format(\"problem in {0} {1}\", product.Name, ex));\n            }\n        }\n\n        window.Close();\n    }\n}"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/NativeInputHelper.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nusing Avalonia;\nusing Avalonia.Input;\n\nusing DisplayPtr = System.IntPtr;\n\nnamespace Eremex.AvaloniaUI.Controls.Tests.Editors;\n\npublic class TestInputHelper\n{\n\tprivate readonly INativeInputHelper inputHelper;\n\n\tpublic TestInputHelper()\n\t{\n\t\tif (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))\n\t\t{\n\t\t\tinputHelper = new WindowsNativeInputHelper();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tinputHelper = new LinuxNativeInputHelper();\n\t\t}\n\t}\n\n\tpublic void MouseMove(Point position)\n\t{\n\t\tinputHelper.MouseMove(position);\n\t}\n\n\tpublic void MouseDown(MouseButton mouseButton/*, Point position*/)\n\t{\n\t\tinputHelper.MouseDown(mouseButton, default);\n\t}\n\n\tpublic void MouseUp(MouseButton mouseButton/*, Point position*/)\n\t{\n\t\tinputHelper.MouseUp(mouseButton, default);\n\t}\n\n\tpublic void MouseClick(MouseButton mouseButton/*, Point position*/)\n\t{\n\t\tMouseDown(mouseButton);\n\t\tMouseUp(mouseButton);\n\t}\n\n\tpublic void KeyDown(Key key)\n\t{\n\t\tinputHelper.KeyDown(key);\n\t}\n\n\tpublic void KeyUp(Key key)\n\t{\n\t\tinputHelper.KeyUp(key);\n\t}\n\n\tpublic void KeyPress(Key key)\n\t{\n\t\tKeyDown(key);\n\t\tKeyUp(key);\n\t}\n\n\t//public void Delay(uint ms)\n\t//{\n\t//\tThread.Sleep((int)ms);\n\t//}\n\n\t//protected void ApplyAutoDelay()\n\t//{\n\t//\tif (AutoDelay > 0)\n\t//\t{\n\t//\t\tThread.Sleep((int)AutoDelay);\n\t//\t}\n\t//}\n}\n\npublic interface INativeInputHelper\n{\n\tvoid MouseMove(Point position);\n\tvoid MouseUp(MouseButton mouseButton, Point position);\n\tvoid MouseDown(MouseButton mouseButton, Point position);\n\tvoid KeyDown(Key key);\n\tvoid KeyUp(Key key);\n}\n\ninternal class WindowsNativeInputHelper : INativeInputHelper\n{\n\tpublic void KeyDown(Key key)\n\t{\n\t\tInvokeKeyboardEvent(key, false);\n\t}\n\n\tpublic void KeyUp(Key key)\n\t{\n\t\tInvokeKeyboardEvent(key, true);\n\t}\n\n\tpublic void MouseDown(MouseButton mouseButton, Point position)\n\t{\n\t\tInvokeMouseEvent(mouseButton, false);\n\t}\n\n\tpublic void MouseMove(Point position)\n\t{\n\t\tSetCursorPos((uint)position.X, (uint)position.Y);\n\t}\n\n\tpublic void MouseUp(MouseButton mouseButton, Point position)\n\t{\n\t\tInvokeMouseEvent(mouseButton, true);\n\t}\n\n\tprivate void InvokeKeyboardEvent(Key key, bool up)\n\t{\n\t\tvar input = new INPUT(new KEYBDINPUT(ConvertKey(key), up ? KEYBDINPUT.KEYEVENTF_KEYUP : 0));\n\t\tSendInput(1, new[] { input }, Marshal.SizeOf<INPUT>());\n\t}\n\n\tprivate void InvokeMouseEvent(MouseButton mouseButton, bool up)\n\t{\n\t\tuint mouseData = 0;\n\t\tuint dwFlags = 0;\n\t\tif (up)\n\t\t{\n\t\t\tswitch (mouseButton)\n\t\t\t{\n\t\t\t\tcase MouseButton.Left:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_LEFTUP;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.Right:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_RIGHTUP;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.Middle:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_MIDDLEUP;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.XButton1:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_XUP;\n\t\t\t\t\tmouseData = MOUSEINPUT.XBUTTON1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.XButton2:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_XUP;\n\t\t\t\t\tmouseData = MOUSEINPUT.XBUTTON2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (mouseButton)\n\t\t\t{\n\t\t\t\tcase MouseButton.Left:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_LEFTDOWN;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.Right:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_RIGHTDOWN;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.Middle:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_MIDDLEDOWN;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.XButton1:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_XDOWN;\n\t\t\t\t\tmouseData = MOUSEINPUT.XBUTTON1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase MouseButton.XButton2:\n\t\t\t\t\tdwFlags = MOUSEINPUT.MOUSEEVENTF_XDOWN;\n\t\t\t\t\tmouseData = MOUSEINPUT.XBUTTON2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar input = new INPUT(new MOUSEINPUT(mouseData, dwFlags));\n\t\tvar result = SendInput(1, new[] { input }, Marshal.SizeOf<INPUT>());\n\t\tif (result == 0)\n\t\t{\n\t\t\tthrow new ExternalException($\"SendInput return error: {Marshal.GetLastWin32Error()}\");\n\t\t}\n\n\t}\n\n\t//public override void KeyDown(Key key)\n\t//{\n\t//\tApplyAutoDelay();\n\t//\tvar metadata = key.GetKeycode();\n\t//\tvar keycode = (byte)metadata.Keycode;\n\t//\tvar scancode = (byte)metadata.ScanCode;\n\t//\tkeybd_event(keycode, scancode, 0, 0);\n\t//}\n\n\t//public override void KeyDown(char key)\n\t//{\n\t//\tApplyAutoDelay();\n\t//\tvar keycode = (byte)VkKeyScan(key);\n\t//\tkeybd_event(keycode, 0, 0, 0);\n\t//}\n\n\t//public override void KeyPress(Key key)\n\t//{\n\t//\tApplyAutoDelay();\n\t//\tvar metadata = key.GetKeycode();\n\t//\tvar keycode = (byte)metadata.Keycode;\n\t//\tvar scancode = (byte)metadata.ScanCode;\n\t//\tkeybd_event(keycode, scancode, 0, 0);\n\t//\tkeybd_event(keycode, scancode, 2, 0);\n\t//}\n\n\t//public override void KeyPress(char key)\n\t//{\n\t//\tApplyAutoDelay();\n\t//\tvar keycode = (byte)VkKeyScan(key);\n\t//\tkeybd_event(keycode, 0, 0, 0);\n\t//\tkeybd_event(keycode, 0, 2, 0);\n\t//}\n\n\t//public override void KeyUp(Key key)\n\t//{\n\t//\tApplyAutoDelay();\n\t//\tvar metadata = key.GetKeycode();\n\t//\tvar keycode = (byte)metadata.Keycode;\n\t//\tvar scancode = (byte)metadata.ScanCode;\n\t//\tkeybd_event(keycode, scancode, 2, 0);\n\t//}\n\n\t//public override void KeyUp(char key)\n\t//{\n\t//\tApplyAutoDelay();\n\t//\tvar keycode = (byte)VkKeyScan(key);\n\t//\tkeybd_event(keycode, 0, 2, 0);\n\t//}\n\n\t[DllImport(\"user32.dll\")]\n\t[return: MarshalAs(UnmanagedType.Bool)]\n\tprivate static extern bool SetCursorPos(uint x, uint y);\n\n\t//[StructLayout(LayoutKind.Sequential)]\n\t//public struct PointInter\n\t//{\n\t//\tpublic int X;\n\t//\tpublic int Y;\n\t//\tpublic static explicit operator Point(PointInter point) => new Point(point.X, point.Y);\n\t//}\n\n\t//[DllImport(\"user32.dll\")]\n\t//public static extern bool GetCursorPos(out PointInter lpPoint);\n\n\t[DllImport(\"user32.dll\", SetLastError = true)]\n\tstatic extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);\n\n\t[DllImport(\"user32.dll\")]\n\tprivate static extern short VkKeyScan(char ch);\n\n\t[DllImport(\"user32.dll\", SetLastError = true)]\n\tprivate static extern uint SendInput(uint cInputs, [MarshalAs(UnmanagedType.LPArray)] INPUT[] pInputs, int cbSize);\n\n\t[StructLayout(LayoutKind.Sequential)]\n\tpublic struct INPUT\n\t{\n\t\t[StructLayout(LayoutKind.Explicit)]\n\t\tprivate struct INPUTUnion\n\t\t{\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic MOUSEINPUT mi;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic KEYBDINPUT ki;\n\t\t\t//[FieldOffset(0)]\n\t\t\t//public MOUSEINPUT mi;\n\t\t}\n\n\t\tprivate const int INPUT_MOUSE = 0;\n\t\tprivate const int INPUT_KEYBOARD = 1;\n\t\tprivate const int INPUT_HARDWARE = 2;\n\n\t\tprivate readonly uint type;\n\t\tprivate readonly INPUTUnion union;\n\n\t\tpublic INPUT(KEYBDINPUT ki)\n\t\t{\n\t\t\ttype = INPUT_KEYBOARD;\n\t\t\tunion = new INPUTUnion() { ki = ki };\n\t\t}\n\n\t\tpublic INPUT(MOUSEINPUT mi)\n\t\t{\n\t\t\ttype = INPUT_MOUSE;\n\t\t\tunion = new INPUTUnion() { mi = mi };\n\t\t}\n\t}\n\n\t[StructLayout(LayoutKind.Sequential)]\n\tpublic struct KEYBDINPUT\n\t{\n\t\tpublic const uint KEYEVENTF_EXTENDEDKEY = 0x0001;\n\t\tpublic const uint KEYEVENTF_KEYUP = 0x0002;\n\t\tpublic const uint KEYEVENTF_SCANCODE = 0x0008;\n\t\tpublic const uint KEYEVENTF_UNICODE = 0x0004;\n\n\t\tprivate readonly VirtualKey wVk;\n\t\tprivate readonly ushort wScan;\n\t\tprivate readonly uint dwFlags;\n\t\tprivate readonly uint time;\n\t\tprivate readonly IntPtr dwExtraInfo;\n\n\t\tpublic KEYBDINPUT(VirtualKey wVk, uint dwFlags)\n\t\t{\n\t\t\tthis.wVk = wVk;\n\t\t\tthis.dwFlags = dwFlags;\n\t\t\twScan = 0;\n\t\t\ttime = 0;\n\t\t\tdwExtraInfo = IntPtr.Zero;\n\t\t}\n\t}\n\n\t[StructLayout(LayoutKind.Sequential)]\n\tpublic struct MOUSEINPUT\n\t{\n\t\tpublic const uint MOUSEEVENTF_MOVE = 0x0001;\n\t\tpublic const uint MOUSEEVENTF_LEFTDOWN = 0x0002;\n\t\tpublic const uint MOUSEEVENTF_LEFTUP = 0x0004;\n\t\tpublic const uint MOUSEEVENTF_RIGHTDOWN = 0x0008;\n\t\tpublic const uint MOUSEEVENTF_RIGHTUP = 0x0010;\n\t\tpublic const uint MOUSEEVENTF_MIDDLEDOWN = 0x0020;\n\t\tpublic const uint MOUSEEVENTF_MIDDLEUP = 0x0040;\n\t\tpublic const uint MOUSEEVENTF_XDOWN = 0x0080;\n\t\tpublic const uint MOUSEEVENTF_XUP = 0x0100;\n\t\tpublic const uint MOUSEEVENTF_WHEEL = 0x0800;\n\t\tpublic const uint MOUSEEVENTF_HWHEEL = 0x1000;\n\t\tpublic const uint MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000;\n\t\tpublic const uint MOUSEEVENTF_VIRTUALDESK = 0x4000;\n\t\tpublic const uint MOUSEEVENTF_ABSOLUTE = 0x8000;\n\t\tpublic const uint XBUTTON1 = 0x0001;\n\t\tpublic const uint XBUTTON2 = 0x0002;\n\n\t\tprivate readonly int dx;\n\t\tprivate readonly int dy;\n\t\tprivate readonly uint mouseData;\n\t\tprivate readonly uint dwFlags;\n\t\tprivate readonly uint time;\n\t\tprivate readonly IntPtr dwExtraInfo;\n\n\t\tpublic MOUSEINPUT(uint mouseData, uint dwFlags) : this()\n\t\t{\n\t\t\tthis.mouseData = mouseData;\n\t\t\tthis.dwFlags = dwFlags;\n\t\t}\n\t}\n\n\tprivate static VirtualKey ConvertKey(Key key)\n\t{\n\t\treturn key switch\n\t\t{\n\t\t\tKey.Cancel => VirtualKey.CANCEL,\n\t\t\tKey.Tab => VirtualKey.TAB,\n\t\t\tKey.Clear => VirtualKey.CLEAR,\n\t\t\tKey.Return => VirtualKey.RETURN,\n\t\t\tKey.Pause => VirtualKey.PAUSE,\n\t\t\tKey.Escape => VirtualKey.ESCAPE,\n\t\t\tKey.Space => VirtualKey.SPACE,\n\t\t\tKey.PageUp => VirtualKey.PRIOR,\n\t\t\tKey.PageDown => VirtualKey.NEXT,\n\t\t\tKey.End => VirtualKey.END,\n\t\t\tKey.Home => VirtualKey.HOME,\n\n\t\t\tKey.Left => VirtualKey.LEFT,\n\t\t\tKey.Up => VirtualKey.UP,\n\t\t\tKey.Right => VirtualKey.RIGHT,\n\t\t\tKey.Down => VirtualKey.DOWN,\n\t\t\tKey.Select => VirtualKey.SELECT,\n\t\t\tKey.Print => VirtualKey.PRINT,\n\t\t\tKey.Execute => VirtualKey.EXECUTE,\n\t\t\tKey.Insert => VirtualKey.INSERT,\n\t\t\tKey.Delete => VirtualKey.DELETE,\n\n\t\t\tKey.D0 => VirtualKey.D0,\n\t\t\tKey.D1 => VirtualKey.D1,\n\t\t\tKey.D2 => VirtualKey.D2,\n\t\t\tKey.D3 => VirtualKey.D3,\n\t\t\tKey.D4 => VirtualKey.D4,\n\t\t\tKey.D5 => VirtualKey.D5,\n\t\t\tKey.D6 => VirtualKey.D6,\n\t\t\tKey.D7 => VirtualKey.D7,\n\t\t\tKey.D8 => VirtualKey.D8,\n\t\t\tKey.D9 => VirtualKey.D9,\n\n\t\t\tKey.A => VirtualKey.A,\n\t\t\tKey.B => VirtualKey.B,\n\t\t\tKey.C => VirtualKey.C,\n\t\t\tKey.D => VirtualKey.D,\n\t\t\tKey.E => VirtualKey.E,\n\t\t\tKey.F => VirtualKey.F,\n\t\t\tKey.G => VirtualKey.G,\n\t\t\tKey.H => VirtualKey.H,\n\t\t\tKey.I => VirtualKey.I,\n\t\t\tKey.J => VirtualKey.J,\n\t\t\tKey.K => VirtualKey.K,\n\t\t\tKey.L => VirtualKey.L,\n\t\t\tKey.M => VirtualKey.M,\n\t\t\tKey.N => VirtualKey.N,\n\t\t\tKey.O => VirtualKey.O,\n\t\t\tKey.P => VirtualKey.P,\n\t\t\tKey.Q => VirtualKey.Q,\n\t\t\tKey.R => VirtualKey.R,\n\t\t\tKey.S => VirtualKey.S,\n\t\t\tKey.T => VirtualKey.T,\n\t\t\tKey.U => VirtualKey.U,\n\t\t\tKey.V => VirtualKey.V,\n\t\t\tKey.W => VirtualKey.W,\n\t\t\tKey.X => VirtualKey.X,\n\t\t\tKey.Y => VirtualKey.Y,\n\t\t\tKey.Z => VirtualKey.Z,\n\n\t\t\tKey.F1 => VirtualKey.F1,\n\t\t\tKey.F2 => VirtualKey.F2,\n\t\t\tKey.F3 => VirtualKey.F3,\n\t\t\tKey.F4 => VirtualKey.F4,\n\t\t\tKey.F5 => VirtualKey.F5,\n\t\t\tKey.F6 => VirtualKey.F6,\n\t\t\tKey.F7 => VirtualKey.F7,\n\t\t\tKey.F8 => VirtualKey.F8,\n\t\t\tKey.F9 => VirtualKey.F9,\n\t\t\tKey.F10 => VirtualKey.F10,\n\t\t\tKey.F11 => VirtualKey.F11,\n\t\t\tKey.F12 => VirtualKey.F12,\n\t\t\tKey.F13 => VirtualKey.F13,\n\t\t\tKey.F14 => VirtualKey.F14,\n\t\t\tKey.F15 => VirtualKey.F15,\n\t\t\tKey.F16 => VirtualKey.F16,\n\t\t\tKey.F17 => VirtualKey.F17,\n\t\t\tKey.F18 => VirtualKey.F18,\n\t\t\tKey.F19 => VirtualKey.F19,\n\t\t\tKey.F20 => VirtualKey.F20,\n\t\t\tKey.F21 => VirtualKey.F21,\n\t\t\tKey.F22 => VirtualKey.F22,\n\t\t\tKey.F23 => VirtualKey.F23,\n\t\t\tKey.F24 => VirtualKey.F24,\n\n\t\t\tKey.LeftShift => VirtualKey.LSHIFT,\n\t\t\tKey.RightShift => VirtualKey.RSHIFT,\n\t\t\tKey.LeftCtrl => VirtualKey.LCONTROL,\n\t\t\tKey.RightCtrl => VirtualKey.RCONTROL,\n\t\t\tKey.LeftAlt => VirtualKey.LMENU,\n\t\t\tKey.RightAlt => VirtualKey.RMENU,\n\n\t\t\t_ => throw new ArgumentException($\"Cannot convert button: <{key}>\", nameof(key))\n\t\t};\n\t}\n\n\tpublic enum VirtualKey : ushort\n\t{\n\t\tLBUTTON = 0x01,\n\t\tRBUTTON = 0x02,\n\t\tCANCEL = 0x03,\n\t\tMBUTTON = 0x04,   /* NOT contiguous with L & RBUTTON */\n\t\tXBUTTON1 = 0x05,    /* NOT contiguous with L & RBUTTON */\n\t\tXBUTTON2 = 0x06,    /* NOT contiguous with L & RBUTTON */\n\n\t\tBACK = 0x08,\n\t\tTAB = 0x09,\n\n\t\t/*\n\t\t *= 0x0A -= 0x0B : reserved\n\t\t */\n\n\t\tCLEAR = 0x0C,\n\t\tRETURN = 0x0D,\n\n\t\t/*\n\t\t *= 0x0E -= 0x0F : unassigned\n\t\t */\n\n\t\tSHIFT = 0x10,\n\t\tCONTROL = 0x11,\n\t\tMENU = 0x12,\n\t\tPAUSE = 0x13,\n\t\tCAPITAL = 0x14,\n\n\t\tKANA = 0x15,\n\t\tHANGEUL = 0x15,  /* old name - should be here for compatibility */\n\t\tHANGUL = 0x15,\n\t\tIME_ON = 0x16,\n\t\tJUNJA = 0x17,\n\t\tFINAL = 0x18,\n\t\tHANJA = 0x19,\n\t\tKANJI = 0x19,\n\t\tIME_OFF = 0x1A,\n\n\t\tESCAPE = 0x1B,\n\n\t\tCONVERT = 0x1C,\n\t\tNONCONVERT = 0x1D,\n\t\tACCEPT = 0x1E,\n\t\tMODECHANGE = 0x1F,\n\n\t\tSPACE = 0x20,\n\t\tPRIOR = 0x21,\n\t\tNEXT = 0x22,\n\t\tEND = 0x23,\n\t\tHOME = 0x24,\n\t\tLEFT = 0x25,\n\t\tUP = 0x26,\n\t\tRIGHT = 0x27,\n\t\tDOWN = 0x28,\n\t\tSELECT = 0x29,\n\t\tPRINT = 0x2A,\n\t\tEXECUTE = 0x2B,\n\t\tSNAPSHOT = 0x2C,\n\t\tINSERT = 0x2D,\n\t\tDELETE = 0x2E,\n\t\tHELP = 0x2F,\n\n\t\tD0 = 0x30,\n\t\tD1 = 0x31,\n\t\tD2 = 0x32,\n\t\tD3 = 0x33,\n\t\tD4 = 0x34,\n\t\tD5 = 0x35,\n\t\tD6 = 0x36,\n\t\tD7 = 0x37,\n\t\tD8 = 0x38,\n\t\tD9 = 0x39,\n\n\t\tA = 0x41,\n\t\tB = 0x42,\n\t\tC = 0x43,\n\t\tD = 0x44,\n\t\tE = 0x45,\n\t\tF = 0x46,\n\t\tG = 0x47,\n\t\tH = 0x48,\n\t\tI = 0x49,\n\t\tJ = 0x4a,\n\t\tK = 0x4b,\n\t\tL = 0x4c,\n\t\tM = 0x4d,\n\t\tN = 0x4e,\n\t\tO = 0x4f,\n\t\tP = 0x50,\n\t\tQ = 0x51,\n\t\tR = 0x52,\n\t\tS = 0x53,\n\t\tT = 0x54,\n\t\tU = 0x55,\n\t\tV = 0x56,\n\t\tW = 0x57,\n\t\tX = 0x58,\n\t\tY = 0x59,\n\t\tZ = 0x5a,\n\n\t\t//LWIN = 0x5B,\n\t\t//RWIN = 0x5C,\n\t\t//APPS = 0x5D,\n\n\t\tNUMPAD0 = 0x60,\n\t\tNUMPAD1 = 0x61,\n\t\tNUMPAD2 = 0x62,\n\t\tNUMPAD3 = 0x63,\n\t\tNUMPAD4 = 0x64,\n\t\tNUMPAD5 = 0x65,\n\t\tNUMPAD6 = 0x66,\n\t\tNUMPAD7 = 0x67,\n\t\tNUMPAD8 = 0x68,\n\t\tNUMPAD9 = 0x69,\n\t\tMULTIPLY = 0x6A,\n\t\tADD = 0x6B,\n\t\tSEPARATOR = 0x6C,\n\t\tSUBTRACT = 0x6D,\n\t\tDECIMAL = 0x6E,\n\t\tDIVIDE = 0x6F,\n\t\tF1 = 0x70,\n\t\tF2 = 0x71,\n\t\tF3 = 0x72,\n\t\tF4 = 0x73,\n\t\tF5 = 0x74,\n\t\tF6 = 0x75,\n\t\tF7 = 0x76,\n\t\tF8 = 0x77,\n\t\tF9 = 0x78,\n\t\tF10 = 0x79,\n\t\tF11 = 0x7A,\n\t\tF12 = 0x7B,\n\t\tF13 = 0x7C,\n\t\tF14 = 0x7D,\n\t\tF15 = 0x7E,\n\t\tF16 = 0x7F,\n\t\tF17 = 0x80,\n\t\tF18 = 0x81,\n\t\tF19 = 0x82,\n\t\tF20 = 0x83,\n\t\tF21 = 0x84,\n\t\tF22 = 0x85,\n\t\tF23 = 0x86,\n\t\tF24 = 0x87,\n\n\t\t//#define VK_NUMLOCK       = 0x90\n\t\t//#define VK_SCROLL        = 0x91\n\n\t\t//\t\t/*\n\t\t//\t\t * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.\n\t\t//\t\t * Used only as parameters to GetAsyncKeyState() and GetKeyState().\n\t\t//\t\t * No other API or message will distinguish left and right keys in this way.\n\t\t//\t\t */\n\t\tLSHIFT = 0xA0,\n\t\tRSHIFT = 0xA1,\n\t\tLCONTROL = 0xA2,\n\t\tRCONTROL = 0xA3,\n\t\tLMENU = 0xA4,\n\t\tRMENU = 0xA5,\n\t}\n}\n\ninternal class LinuxNativeInputHelper : INativeInputHelper\n{\n\tprivate static int ConvertBool(bool value)\n\t{\n\t\treturn value ? 1 : 0;\n\t}\n\n\tprivate static Button ConvertMouseButton(MouseButton button)\n\t{\n\t\treturn button switch\n\t\t{\n\t\t\tMouseButton.Left => Button.LEFT,\n\t\t\tMouseButton.Right => Button.RIGHT,\n\t\t\tMouseButton.Middle => Button.MIDDLE,\n\t\t\tMouseButton.XButton1 => Button.FOUR,\n\t\t\tMouseButton.XButton2 => Button.FIVE,\n\t\t\t_ => throw new ArgumentException($\"Cannot convert button: <{button}>\", nameof(button))\n\t\t};\n\t}\n\n\tprivate static KeySym ConvertKey(Key key)\n\t{\n\t\treturn key switch\n\t\t{\n\t\t\tKey.Cancel => KeySym.Cancel,\n\t\t\tKey.Tab => KeySym.Tab,\n\t\t\tKey.LineFeed => KeySym.Linefeed,\n\t\t\tKey.Clear => KeySym.Clear,\n\t\t\tKey.Return => KeySym.Return,\n\t\t\tKey.Pause => KeySym.Pause,\n\t\t\tKey.CapsLock => KeySym.Caps_Lock,\n\t\t\tKey.Escape => KeySym.Escape,\n\t\t\tKey.Space => KeySym.space,\n\t\t\tKey.PageUp => KeySym.Page_Up,\n\t\t\tKey.PageDown => KeySym.Page_Down,\n\t\t\tKey.End => KeySym.End,\n\t\t\tKey.Home => KeySym.Home,\n\n\t\t\tKey.Left => KeySym.Left,\n\t\t\tKey.Up => KeySym.Up,\n\t\t\tKey.Right => KeySym.Right,\n\t\t\tKey.Down => KeySym.Down,\n\t\t\tKey.Select => KeySym.Select,\n\t\t\tKey.Print => KeySym.Print,\n\t\t\tKey.Execute => KeySym.Execute,\n\t\t\tKey.Insert => KeySym.Insert,\n\t\t\tKey.Delete => KeySym.Delete,\n\n\t\t\tKey.D0 => KeySym.D0,\n\t\t\tKey.D1 => KeySym.D1,\n\t\t\tKey.D2 => KeySym.D2,\n\t\t\tKey.D3 => KeySym.D3,\n\t\t\tKey.D4 => KeySym.D4,\n\t\t\tKey.D5 => KeySym.D5,\n\t\t\tKey.D6 => KeySym.D6,\n\t\t\tKey.D7 => KeySym.D7,\n\t\t\tKey.D8 => KeySym.D8,\n\t\t\tKey.D9 => KeySym.D9,\n\n\t\t\tKey.A => KeySym.A,\n\t\t\tKey.B => KeySym.B,\n\t\t\tKey.C => KeySym.C,\n\t\t\tKey.D => KeySym.D,\n\t\t\tKey.E => KeySym.E,\n\t\t\tKey.F => KeySym.F,\n\t\t\tKey.G => KeySym.G,\n\t\t\tKey.H => KeySym.H,\n\t\t\tKey.I => KeySym.I,\n\t\t\tKey.J => KeySym.J,\n\t\t\tKey.K => KeySym.K,\n\t\t\tKey.L => KeySym.L,\n\t\t\tKey.M => KeySym.M,\n\t\t\tKey.N => KeySym.N,\n\t\t\tKey.O => KeySym.O,\n\t\t\tKey.P => KeySym.P,\n\t\t\tKey.Q => KeySym.Q,\n\t\t\tKey.R => KeySym.R,\n\t\t\tKey.S => KeySym.S,\n\t\t\tKey.T => KeySym.T,\n\t\t\tKey.U => KeySym.U,\n\t\t\tKey.V => KeySym.V,\n\t\t\tKey.W => KeySym.W,\n\t\t\tKey.X => KeySym.X,\n\t\t\tKey.Y => KeySym.Y,\n\t\t\tKey.Z => KeySym.Z,\n\n\t\t\tKey.F1 => KeySym.F1,\n\t\t\tKey.F2 => KeySym.F2,\n\t\t\tKey.F3 => KeySym.F3,\n\t\t\tKey.F4 => KeySym.F4,\n\t\t\tKey.F5 => KeySym.F5,\n\t\t\tKey.F6 => KeySym.F6,\n\t\t\tKey.F7 => KeySym.F7,\n\t\t\tKey.F8 => KeySym.F8,\n\t\t\tKey.F9 => KeySym.F9,\n\t\t\tKey.F10 => KeySym.F10,\n\t\t\tKey.F11 => KeySym.F11,\n\t\t\tKey.F12 => KeySym.F12,\n\t\t\tKey.F13 => KeySym.F13,\n\t\t\tKey.F14 => KeySym.F14,\n\t\t\tKey.F15 => KeySym.F15,\n\t\t\tKey.F16 => KeySym.F16,\n\t\t\tKey.F17 => KeySym.F17,\n\t\t\tKey.F18 => KeySym.F18,\n\t\t\tKey.F19 => KeySym.F19,\n\t\t\tKey.F20 => KeySym.F20,\n\t\t\tKey.F21 => KeySym.F21,\n\t\t\tKey.F22 => KeySym.F22,\n\t\t\tKey.F23 => KeySym.F23,\n\t\t\tKey.F24 => KeySym.F24,\n\n\t\t\tKey.LeftShift => KeySym.Shift_L,\n\t\t\tKey.RightShift => KeySym.Shift_R,\n\t\t\tKey.LeftCtrl => KeySym.Control_L,\n\t\t\tKey.RightCtrl => KeySym.Control_R,\n\t\t\tKey.LeftAlt => KeySym.Alt_L,\n\t\t\tKey.RightAlt => KeySym.Alt_L,\n\n\t\t\t_ => throw new ArgumentException($\"Cannot convert button: <{key}>\", nameof(key))\n\t\t};\n\t}\n\n\tpublic void MouseMove(Point position)\n\t{\n\t\tInvokeMouseMove((int)position.X, (int)position.Y);\n\t}\n\n\tpublic void MouseUp(MouseButton mouseButton, Point position)\n\t{\n\t\tInvokeClick(false, ConvertMouseButton(mouseButton));\n\t}\n\n\tpublic void MouseDown(MouseButton mouseButton, Point position)\n\t{\n\t\tInvokeClick(false, ConvertMouseButton(mouseButton));\n\t}\n\n\tprivate void InvokeMouseMove(int x, int y)\n\t{\n\t\tvar display = MainDisplay;\n\t\tXWarpPointer(display, Window.None, XDefaultRootWindow(display), 0, 0, 0, 0, x, y);\n\t\tXSync(display, ConvertBool(false));\n\t}\n\n\tprivate void InvokeClick(bool down, Button button)\n\t{\n\t\tvar display = MainDisplay;\n\t\tXTestFakeButtonEvent(display, button, ConvertBool(down), CurrentTime);\n\t\tXSync(display, ConvertBool(false));\n\t}\n\n\tpublic void KeyDown(Key key)\n\t{\n\t\tInvokeKeyPress(ConvertKey(key), true, 0);\n\t}\n\n\tpublic void KeyUp(Key key)\n\t{\n\t\tInvokeKeyPress(ConvertKey(key), false, 0);\n\t}\n\n\t[StructLayout(LayoutKind.Sequential)]\n\tpublic struct Window\n\t{\n\t\tpublic static Window None { get; } = new Window(0);\n\n\t\tprivate readonly uint handle;\n\n\t\tprivate Window(uint handle)\n\t\t{\n\t\t\tthis.handle = handle;\n\t\t}\n\t}\n\n\t//[StructLayout(LayoutKind.Sequential)]\n\t//public struct DisplayPtr\n\t//{\n\t//\t//public static DisplayPtr None { get; } = new DisplayPtr(IntPtr.Zero);\n\n\t//\tprivate readonly IntPtr pointer;\n\n\t//\tprivate DisplayPtr(IntPtr pointer)\n\t//\t{\n\t//\t\tthis.pointer = pointer;\n\t//\t}\n\t//}\n\n\t[StructLayout(LayoutKind.Sequential)]\n\tpublic struct X11KeyCode\n\t{\n\t\tprivate readonly uint code;\n\t}\n\n\tpublic enum Button : uint\n\t{\n\t\tLEFT = 1,\n\t\tMIDDLE = 2,\n\t\tRIGHT = 3,\n\t\tFOUR = 4,\n\t\tFIVE = 5,\n\t}\n\n\tprivate const string LIBX11_NAME = \"libX11.so.6\";\n\n\tprivate const int CurrentTime = 0;\n\n#pragma warning disable CA2101\n\t[DllImport(LIBX11_NAME)]\n\tpublic static extern DisplayPtr XOpenDisplay([MarshalAs(UnmanagedType.LPUTF8Str)] string display_name);\n#pragma warning restore CA2101\n\n\t[DllImport(LIBX11_NAME)]\n\tpublic static extern int XCloseDisplay(DisplayPtr display);\n\n\t[DllImport(LIBX11_NAME)]\n\tpublic static extern Window XDefaultRootWindow(DisplayPtr display);\n\n\t[DllImport(LIBX11_NAME)]\n\tpublic static extern int XWarpPointer(DisplayPtr display, Window src_w, Window dest_w, int src_x, int src_y, uint src_width, uint src_height, int dest_x, int dest_y);\n\n\t[DllImport(LIBX11_NAME)]\n\tpublic static extern int XSync(DisplayPtr display, int discard);\n\n\t[DllImport(\"libXtst.so.6\")]\n\tpublic static extern int XTestFakeButtonEvent(DisplayPtr display, Button button, int is_press, ulong delay);\n\n\t[DllImport(\"libXtst.so.6\")]\n\tpublic static extern int XTestFakeKeyEvent(DisplayPtr display, X11KeyCode code, int is_press, ulong delay);\n\n\t[DllImport(LIBX11_NAME)]\n\tpublic static extern X11KeyCode XKeysymToKeycode(DisplayPtr display, KeySym keysym);\n\n\tprivate DisplayPtr mainDisplay;\n\n\tprivate DisplayPtr MainDisplay\n\t{\n\t\tget\n\t\t{\n\t\t\t///* Close the display if displayName has changed */\n\t\t\t//if (hasDisplayNameChanged)\n\t\t\t//{\n\t\t\t//\tXCloseMainDisplay();\n\t\t\t//\thasDisplayNameChanged = 0;\n\t\t\t//}\n\n\t\t\tif (mainDisplay == IntPtr.Zero)\n\t\t\t{\n\t\t\t\t/* First try the user set displayName */\n\t\t\t\tmainDisplay = XOpenDisplay(null);\n\t\t\t\tif (mainDisplay == IntPtr.Zero)\n\t\t\t\t{\n\t\t\t\t\tmainDisplay = XOpenDisplay(\":0.0\");\n\t\t\t\t}\n\n\t\t\t\tif (mainDisplay == IntPtr.Zero)\n\t\t\t\t{\n\t\t\t\t\tthrow new InvalidOperationException(\"Could not open main display\");\n\t\t\t\t}\n\t\t\t\t//else if (!registered)\n\t\t\t\t//{\n\t\t\t\t//\tatexit(&XCloseMainDisplay);\n\t\t\t\t//\tregistered = 1;\n\t\t\t\t//}\n\t\t\t}\n\t\t\treturn mainDisplay;\n\t\t}\n\t}\n\n\t//char* getMousePosition()\n\t//{\n\t//\tXInitThreads();\n\n\t//\tint x, y; /* This is all we care about. Seriously. */\n\t//\tWindow garb1, garb2; /* Why you can't specify NULL as a parameter */\n\t//\tint garb_x, garb_y;  /* is beyond me. */\n\t//\tunsigned int more_garbage;\n\n\t//\tDisplay* display = XGetMainDisplay();\n\t//\tXQueryPointer(display, XDefaultRootWindow(display), &garb1, &garb2,\n\t//\t\t\t\t&x, &y, &garb_x, &garb_y, &more_garbage);\n\n\t//\tstring res = to_string(x) + \"x\" + to_string(y);\n\t//\tchar* ret = strdup(res.c_str());\n\n\t//\treturn ret;\n\t//}\n\n\t//KeySym keyCodeForChar(char c)\n\t//{\n\t//\tKeySym code;\n\n\t//\tchar buf[2];\n\t//\tbuf[0] = c;\n\t//\tbuf[1] = '\\0';\n\n\t//\tcode = XStringToKeysym(buf);\n\t//\tif (code == NoSymbol)\n\t//\t{\n\t//\t\t/* Some special keys are apparently not handled properly by\n\t//\t\t* XStringToKeysym() on some systems, so search for them instead in our\n\t//\t\t* mapping table. */\n\t//\t\tsize_t i;\n\t//\t\tconst size_t specialCharacterCount =\n\t//\t\t\tsizeof(XSpecialCharacterTable) / sizeof(XSpecialCharacterTable[0]);\n\t//\t\tfor (i = 0; i < specialCharacterCount; ++i)\n\t//\t\t{\n\t//\t\t\tif (c == XSpecialCharacterTable[i].name)\n\t//\t\t\t{\n\t//\t\t\t\tcode = XSpecialCharacterTable[i].code;\n\t//\t\t\t\tbreak;\n\t//\t\t\t}\n\t//\t\t}\n\t//\t}\n\n\t//\treturn code;\n\t//}\n\n\tprivate void InvokeXKeyEvent(KeySym key, bool down)\n\t{\n\t\tvar display = MainDisplay;\n\t\tvar keyCode = XKeysymToKeycode(display, key);\n\t\tXTestFakeKeyEvent(display, keyCode, ConvertBool(down), CurrentTime);\n\t\tXSync(display, ConvertBool(false));\n\t}\n\n\tprivate void InvokeKeyPress(KeySym code, bool down, int flags)\n\t{\n\t\t//if (flags & Mod4Mask) xKeyEvent(display, XK_Super_L, is_press);\n\t\t//if (flags & Mod1Mask) xKeyEvent(display, XK_Alt_L, is_press);\n\t\t//if (flags & ControlMask) xKeyEvent(display, XK_Control_L, is_press);\n\t\t//if (flags & ShiftMask) xKeyEvent(display, XK_Shift_L, is_press);\n\n\t\tInvokeXKeyEvent(code, down);\n\t}\n\n\tpublic enum KeySym : uint\n\t{\n\t\t/*\n\t\t * TTY function keys, cleverly chosen to map to ASCII, for convenience of\n\t\t * programming, but could have been arbitrary (at the cost of lookup\n\t\t * tables in client code).\n\t\t */\n\n\t\tBackSpace = 0xff08,  /* Back space, back char */\n\t\tTab = 0xff09,\n\t\tLinefeed = 0xff0a,  /* Linefeed, LF */\n\t\tClear = 0xff0b,\n\t\tReturn = 0xff0d,  /* Return, enter */\n\t\tPause = 0xff13,  /* Pause, hold */\n\t\tScroll_Lock = 0xff14,\n\t\tSys_Req = 0xff15,\n\t\tEscape = 0xff1b,\n\t\tDelete = 0xffff,  /* Delete, rubout */\n\n\t\t/* Cursor control & motion */\n\n\t\tHome = 0xff50,\n\t\tLeft = 0xff51, /* Move left, left arrow */\n\t\tUp = 0xff52, /* Move up, up arrow */\n\t\tRight = 0xff53, /* Move right, right arrow */\n\t\tDown = 0xff54, /* Move down, down arrow */\n\t\tPrior = 0xff55, /* Prior, previous */\n\t\tPage_Up = 0xff55,\n\t\tNext = 0xff56, /* Next */\n\t\tPage_Down = 0xff56,\n\t\tEnd = 0xff57, /* EOL */\n\t\tBegin = 0xff58, /* BOL */\n\n\t\t/* Misc functions */\n\n\t\tSelect = 0xff60,  /* Select, mark */\n\t\tPrint = 0xff61,\n\t\tExecute = 0xff62,  /* Execute, run, do */\n\t\tInsert = 0xff63,  /* Insert, insert here */\n\t\tUndo = 0xff65,\n\t\tRedo = 0xff66,  /* Redo, again */\n\t\tMenu = 0xff67,\n\t\tFind = 0xff68,  /* Find, search */\n\t\tCancel = 0xff69,  /* Cancel, stop, abort, exit */\n\t\tHelp = 0xff6a,  /* Help */\n\t\tBreak = 0xff6b,\n\t\tMode_switch = 0xff7e,  /* Character set switch */\n\t\tscript_switch = 0xff7e,  /* Alias for mode_switch */\n\t\tNum_Lock = 0xff7f,\n\n\t\t/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */\n\n\t\t/*\n\t\t * Auxiliary functions; note the duplicate definitions for left and right\n\t\t * function keys;  Sun keyboards and a few other manufacturers have such\n\t\t * function key groups on the left and/or right sides of the keyboard.\n\t\t * We've not found a keyboard with more than 35 function keys total.\n\t\t */\n\n\t\tF1 = 0xffbe,\n\t\tF2 = 0xffbf,\n\t\tF3 = 0xffc0,\n\t\tF4 = 0xffc1,\n\t\tF5 = 0xffc2,\n\t\tF6 = 0xffc3,\n\t\tF7 = 0xffc4,\n\t\tF8 = 0xffc5,\n\t\tF9 = 0xffc6,\n\t\tF10 = 0xffc7,\n\t\tF11 = 0xffc8,\n\t\tL1 = 0xffc8,\n\t\tF12 = 0xffc9,\n\t\tL2 = 0xffc9,\n\t\tF13 = 0xffca,\n\t\tL3 = 0xffca,\n\t\tF14 = 0xffcb,\n\t\tL4 = 0xffcb,\n\t\tF15 = 0xffcc,\n\t\tL5 = 0xffcc,\n\t\tF16 = 0xffcd,\n\t\tL6 = 0xffcd,\n\t\tF17 = 0xffce,\n\t\tL7 = 0xffce,\n\t\tF18 = 0xffcf,\n\t\tL8 = 0xffcf,\n\t\tF19 = 0xffd0,\n\t\tL9 = 0xffd0,\n\t\tF20 = 0xffd1,\n\t\tL10 = 0xffd1,\n\t\tF21 = 0xffd2,\n\t\tR1 = 0xffd2,\n\t\tF22 = 0xffd3,\n\t\tR2 = 0xffd3,\n\t\tF23 = 0xffd4,\n\t\tR3 = 0xffd4,\n\t\tF24 = 0xffd5,\n\t\tR4 = 0xffd5,\n\t\tF25 = 0xffd6,\n\t\tR5 = 0xffd6,\n\t\tF26 = 0xffd7,\n\t\tR6 = 0xffd7,\n\t\tF27 = 0xffd8,\n\t\tR7 = 0xffd8,\n\t\tF28 = 0xffd9,\n\t\tR8 = 0xffd9,\n\t\tF29 = 0xffda,\n\t\tR9 = 0xffda,\n\t\tF30 = 0xffdb,\n\t\tR10 = 0xffdb,\n\t\tF31 = 0xffdc,\n\t\tR11 = 0xffdc,\n\t\tF32 = 0xffdd,\n\t\tR12 = 0xffdd,\n\t\tF33 = 0xffde,\n\t\tR13 = 0xffde,\n\t\tF34 = 0xffdf,\n\t\tR14 = 0xffdf,\n\t\tF35 = 0xffe0,\n\t\tR15 = 0xffe0,\n\n\t\t/* Modifiers */\n\n\t\tShift_L = 0xffe1,  /* Left shift */\n\t\tShift_R = 0xffe2,  /* Right shift */\n\t\tControl_L = 0xffe3,  /* Left control */\n\t\tControl_R = 0xffe4,  /* Right control */\n\t\tCaps_Lock = 0xffe5,  /* Caps lock */\n\t\tShift_Lock = 0xffe6,  /* Shift lock */\n\n\t\tMeta_L = 0xffe7, /* Left meta */\n\t\tMeta_R = 0xffe8, /* Right meta */\n\t\tAlt_L = 0xffe9, /* Left alt */\n\t\tAlt_R = 0xffea, /* Right alt */\n\t\tSuper_L = 0xffeb, /* Left super */\n\t\tSuper_R = 0xffec, /* Right super */\n\t\tHyper_L = 0xffed, /* Left hyper */\n\t\tHyper_R = 0xffee, /* Right hyper */\n\n\t\t/* XK_LATIN1 */\n\t\tspace = 0x0020, /* U+0020 SPACE */\n\t\texclam = 0x0021, /* U+0021 EXCLAMATION MARK */\n\t\tquotedbl = 0x0022, /* U+0022 QUOTATION MARK */\n\t\tnumbersign = 0x0023, /* U+0023 NUMBER SIGN */\n\t\tdollar = 0x0024, /* U+0024 DOLLAR SIGN */\n\t\tpercent = 0x0025, /* U+0025 PERCENT SIGN */\n\t\tampersand = 0x0026, /* U+0026 AMPERSAND */\n\t\tapostrophe = 0x0027, /* U+0027 APOSTROPHE */\n\t\tquoteright = 0x0027, /* deprecated */\n\t\tparenleft = 0x0028, /* U+0028 LEFT PARENTHESIS */\n\t\tparenright = 0x0029, /* U+0029 RIGHT PARENTHESIS */\n\t\tasterisk = 0x002a, /* U+002A ASTERISK */\n\t\tplus = 0x002b, /* U+002B PLUS SIGN */\n\t\tcomma = 0x002c, /* U+002C COMMA */\n\t\tminus = 0x002d, /* U+002D HYPHEN-MINUS */\n\t\tperiod = 0x002e, /* U+002E FULL STOP */\n\t\tslash = 0x002f, /* U+002F SOLIDUS */\n\t\tD0 = 0x0030, /* U+0030 DIGIT ZERO */\n\t\tD1 = 0x0031, /* U+0031 DIGIT ONE */\n\t\tD2 = 0x0032, /* U+0032 DIGIT TWO */\n\t\tD3 = 0x0033, /* U+0033 DIGIT THREE */\n\t\tD4 = 0x0034, /* U+0034 DIGIT FOUR */\n\t\tD5 = 0x0035, /* U+0035 DIGIT FIVE */\n\t\tD6 = 0x0036, /* U+0036 DIGIT SIX */\n\t\tD7 = 0x0037, /* U+0037 DIGIT SEVEN */\n\t\tD8 = 0x0038, /* U+0038 DIGIT EIGHT */\n\t\tD9 = 0x0039, /* U+0039 DIGIT NINE */\n\t\tcolon = 0x003a, /* U+003A COLON */\n\t\tsemicolon = 0x003b, /* U+003B SEMICOLON */\n\t\tless = 0x003c, /* U+003C LESS-THAN SIGN */\n\t\tequal = 0x003d, /* U+003D EQUALS SIGN */\n\t\tgreater = 0x003e, /* U+003E GREATER-THAN SIGN */\n\t\tquestion = 0x003f, /* U+003F QUESTION MARK */\n\t\tat = 0x0040, /* U+0040 COMMERCIAL AT */\n\t\tA = 0x0041, /* U+0041 LATIN CAPITAL LETTER A */\n\t\tB = 0x0042, /* U+0042 LATIN CAPITAL LETTER B */\n\t\tC = 0x0043, /* U+0043 LATIN CAPITAL LETTER C */\n\t\tD = 0x0044, /* U+0044 LATIN CAPITAL LETTER D */\n\t\tE = 0x0045, /* U+0045 LATIN CAPITAL LETTER E */\n\t\tF = 0x0046, /* U+0046 LATIN CAPITAL LETTER F */\n\t\tG = 0x0047, /* U+0047 LATIN CAPITAL LETTER G */\n\t\tH = 0x0048, /* U+0048 LATIN CAPITAL LETTER H */\n\t\tI = 0x0049, /* U+0049 LATIN CAPITAL LETTER I */\n\t\tJ = 0x004a, /* U+004A LATIN CAPITAL LETTER J */\n\t\tK = 0x004b, /* U+004B LATIN CAPITAL LETTER K */\n\t\tL = 0x004c, /* U+004C LATIN CAPITAL LETTER L */\n\t\tM = 0x004d, /* U+004D LATIN CAPITAL LETTER M */\n\t\tN = 0x004e, /* U+004E LATIN CAPITAL LETTER N */\n\t\tO = 0x004f, /* U+004F LATIN CAPITAL LETTER O */\n\t\tP = 0x0050, /* U+0050 LATIN CAPITAL LETTER P */\n\t\tQ = 0x0051, /* U+0051 LATIN CAPITAL LETTER Q */\n\t\tR = 0x0052, /* U+0052 LATIN CAPITAL LETTER R */\n\t\tS = 0x0053, /* U+0053 LATIN CAPITAL LETTER S */\n\t\tT = 0x0054, /* U+0054 LATIN CAPITAL LETTER T */\n\t\tU = 0x0055, /* U+0055 LATIN CAPITAL LETTER U */\n\t\tV = 0x0056, /* U+0056 LATIN CAPITAL LETTER V */\n\t\tW = 0x0057, /* U+0057 LATIN CAPITAL LETTER W */\n\t\tX = 0x0058, /* U+0058 LATIN CAPITAL LETTER X */\n\t\tY = 0x0059, /* U+0059 LATIN CAPITAL LETTER Y */\n\t\tZ = 0x005a, /* U+005A LATIN CAPITAL LETTER Z */\n\t\tbracketleft = 0x005b, /* U+005B LEFT SQUARE BRACKET */\n\t\tbackslash = 0x005c, /* U+005C REVERSE SOLIDUS */\n\t\tbracketright = 0x005d, /* U+005D RIGHT SQUARE BRACKET */\n\t\tasciicircum = 0x005e, /* U+005E CIRCUMFLEX ACCENT */\n\t\tunderscore = 0x005f, /* U+005F LOW LINE */\n\t\tgrave = 0x0060, /* U+0060 GRAVE ACCENT */\n\t\tquoteleft = 0x0060, /* deprecated */\n\t\ta = 0x0061, /* U+0061 LATIN SMALL LETTER A */\n\t\tb = 0x0062, /* U+0062 LATIN SMALL LETTER B */\n\t\tc = 0x0063, /* U+0063 LATIN SMALL LETTER C */\n\t\td = 0x0064, /* U+0064 LATIN SMALL LETTER D */\n\t\te = 0x0065, /* U+0065 LATIN SMALL LETTER E */\n\t\tf = 0x0066, /* U+0066 LATIN SMALL LETTER F */\n\t\tg = 0x0067, /* U+0067 LATIN SMALL LETTER G */\n\t\th = 0x0068, /* U+0068 LATIN SMALL LETTER H */\n\t\ti = 0x0069, /* U+0069 LATIN SMALL LETTER I */\n\t\tj = 0x006a, /* U+006A LATIN SMALL LETTER J */\n\t\tk = 0x006b, /* U+006B LATIN SMALL LETTER K */\n\t\tl = 0x006c, /* U+006C LATIN SMALL LETTER L */\n\t\tm = 0x006d, /* U+006D LATIN SMALL LETTER M */\n\t\tn = 0x006e, /* U+006E LATIN SMALL LETTER N */\n\t\to = 0x006f, /* U+006F LATIN SMALL LETTER O */\n\t\tp = 0x0070, /* U+0070 LATIN SMALL LETTER P */\n\t\tq = 0x0071, /* U+0071 LATIN SMALL LETTER Q */\n\t\tr = 0x0072, /* U+0072 LATIN SMALL LETTER R */\n\t\ts = 0x0073, /* U+0073 LATIN SMALL LETTER S */\n\t\tt = 0x0074, /* U+0074 LATIN SMALL LETTER T */\n\t\tu = 0x0075, /* U+0075 LATIN SMALL LETTER U */\n\t\tv = 0x0076, /* U+0076 LATIN SMALL LETTER V */\n\t\tw = 0x0077, /* U+0077 LATIN SMALL LETTER W */\n\t\tx = 0x0078, /* U+0078 LATIN SMALL LETTER X */\n\t\ty = 0x0079, /* U+0079 LATIN SMALL LETTER Y */\n\t\tz = 0x007a, /* U+007A LATIN SMALL LETTER Z */\n\t\tbraceleft = 0x007b, /* U+007B LEFT CURLY BRACKET */\n\t\tbar = 0x007c, /* U+007C VERTICAL LINE */\n\t\tbraceright = 0x007d, /* U+007D RIGHT CURLY BRACKET */\n\t\tasciitilde = 0x007e /* U+007E TILDE */\n\t}\n}"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/TestMouseEventsHelper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Threading;\n\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Input.Raw;\nusing Avalonia.Threading;\nusing Avalonia.VisualTree;\n\nusing Xunit;\nusing Xunit.Abstractions;\n\nnamespace Eremex.Avalonia.TestUtls;\n\npublic class TestMouseEventsHelper\n{\n\tprivate readonly ITestOutputHelper testOutputHelper;\n\tpublic TestMouseEventsHelper() : this(null) { }\n\tpublic TestMouseEventsHelper(ITestOutputHelper testOutputHelper = null)\n\t{\n\t\tthis.testOutputHelper = testOutputHelper;\n\t}\n\t\t\n\tprivate void CheckVisualTree(TopLevel win, Control target, Point position)\n\t{\n\t\t// если контрол задизаблен, то GetInputElementsAt не вернет его, так как он не пройдет HitTestFilter\n\t\tif (target == null || win == target || !target.IsEnabled)\n\t\t\treturn;\n\t\tbool found = false;\n\t\t// RawPointerEventArgs e = V11TestUtils.CreateRawPointerEventArgs(win, RawPointerEventType.Move, position, RawInputModifiers.None);\n\t\t// PropertyInfo pInfo = e.GetType().GetProperty(\"Position\", BindingFlags.Public | BindingFlags.Instance);\n\t\t// var hitPoint = (Point)pInfo!.GetValue(e)!;\n\t\tvar hitPoint = position;\n\t\t\n\t\tfor(int i = 0; i < 30; i++) \n\t\t{\n\t\t\tif(i > 0) \n\t\t\t{\n\t\t\t\tDebug.WriteLine(\"Wait For Actualize RenderTree\");\n\t\t\t}\n\n\t\t\tIInputElement item = win.InputHitTest(hitPoint);\n\n\t\t\tVisual vis = item as Visual;\n\t\t\twhile(vis != null) \n\t\t\t{\n\t\t\t\tif(vis == target) \n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tvis = vis.GetVisualParent();\n\t\t\t}\n\n\t\t\tif(found)\n\t\t\t\tbreak;\n\t\t\twin.UpdateLayout();\n\t\t\tDispatcher.UIThread.RunJobs();\n\t\t\tThread.Sleep(50);\n\t\t}\n\n\t\tif (found)\n\t\t\treturn;\n\t\ttestOutputHelper?.WriteLine(\"CheckVisualTree: \" + target.ToString() + \" -> \" + win.ToString() + \" Fails\");\n\t\tAssert.True(found);\n\t}\n\n\tpublic void SendMouseEvent(TopLevel win, Control target, RawPointerEventType eventType, Point position, RawInputModifiers modifiers)\n\t{\n\t\tCheckVisualTree(win, target, position);\n\t\t\n\t\tvar e = V11TestUtils.CreateRawPointerEventArgs(win, eventType, position, modifiers);\n\t\tMethodInfo mi = GetHandleInput(win);\n\t\tmi.Invoke(win, new object[]{ e});\n\t}\n\n\tpublic void SendLeftMouseDown(TopLevel win, Control target, Point position, KeyModifiers modifiers)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.LeftButtonDown, position, ToRawInputModifiers(modifiers));\n\t}\n\n\tprivate RawInputModifiers ToRawInputModifiers(KeyModifiers modifiers)\n\t{\n\t\tvar res = RawInputModifiers.None;\n\t\tif (modifiers.HasFlag(KeyModifiers.Control))\n\t\t{\n\t\t\tres |= RawInputModifiers.Control;\n\t\t}\n\t\t\n\t\tif (modifiers.HasFlag(KeyModifiers.Shift))\n\t\t{\n\t\t\tres |= RawInputModifiers.Shift;\n\t\t}\n\t\t\n\t\tif (modifiers.HasFlag(KeyModifiers.Alt))\n\t\t{\n\t\t\tres |= RawInputModifiers.Alt;\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tpublic void SendLeftMouseDown(TopLevel win, Control target, Point position)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.LeftButtonDown, position, RawInputModifiers.None);\n\t}\n\n\tpublic void SendRightMouseDown(TopLevel win, Control target, Point position, ITestOutputHelper testOutputHelper)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.RightButtonDown, position, RawInputModifiers.None);\n\t}\n\t\n\tpublic void SendRightMouseDown(Control control)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tSendRightMouseDown(root, GetMousePoint(root, control));\n\t}\n\n\tpublic void SendRightMouseUp(TopLevel win, Control target, Point position)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.RightButtonUp, position, RawInputModifiers.None);\n\t}\n\t\n\tpublic void SendRightMouseUp(Control control)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tSendRightMouseUp(root, control, GetMousePoint(root, control));\n\t}\n\n\tpublic void SendNcLeftMouseDown(TopLevel win, Control target, Point position)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.NonClientLeftButtonDown, position, RawInputModifiers.None);\n\t}\n\n\tpublic void SendLeftMouseUp(TopLevel win, Control target, Point position)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.LeftButtonUp, position, RawInputModifiers.None);\n\t}\n\t\n\tpublic void SendLeftMouseUp(Control target, Point position, KeyModifiers modifiers = KeyModifiers.None)\n\t{\n\t\tTopLevel root = CheckVisualRoot(target);\n\t\tSendMouseEvent(root, target, RawPointerEventType.LeftButtonUp, GetMousePoint(root, target, position), ToRawInputModifiers(modifiers));\n\t}\n\t\n\tpublic void SendLeftMouseUp(TopLevel win, Control target, Point position, KeyModifiers modifiers)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.LeftButtonUp, position, ToRawInputModifiers(modifiers));\n\t}\n\n\tpublic void SendLeftMouseDown(TopLevel win, Point position)\n\t{\n\t\tSendMouseEvent(win, null, RawPointerEventType.LeftButtonDown, position, RawInputModifiers.None);\n\t}\n\n\tpublic void SendRightMouseDown(TopLevel win, Point position)\n\t{\n\t\tSendMouseEvent(win, null, RawPointerEventType.RightButtonDown, position, RawInputModifiers.None);\n\t}\n\n\tpublic void SendRightMouseUp(TopLevel win, Point position)\n\t{\n\t\tSendMouseEvent(win, null, RawPointerEventType.RightButtonUp, position, RawInputModifiers.None);\n\t}\n\n\tpublic void SendNcLeftMouseDown(TopLevel win, Point position)\n\t{\n\t\tSendMouseEvent(win, null, RawPointerEventType.NonClientLeftButtonDown, position, RawInputModifiers.None);\n\t}\n\n\tpublic void SendLeftMouseUp(TopLevel win, Point position)\n\t{\n\t\tSendMouseEvent(win, null, RawPointerEventType.LeftButtonUp, position, RawInputModifiers.None);\n\t}\n\n\tMethodInfo GetHandleInput(TopLevel win) \n\t{\n\t\tType type = typeof(TopLevel);\n\t\tvar mi = type.GetMethod(\"HandleInput\", BindingFlags.Instance | BindingFlags.NonPublic);\n\t\treturn mi;\n\t}\n\t\n\tpublic void SendMouseMove(TopLevel win, Control target, Point position, RawInputModifiers modifiers = RawInputModifiers.None)\n\t{\n\t\tCheckVisualTree(win, target, position);\n\t\t\n\t\tvar e = V11TestUtils.CreateRawPointerEventArgs(win, RawPointerEventType.Move, position, modifiers);\n\t\tMethodInfo mi = GetHandleInput(win);\n\t\tmi.Invoke(win, new object[]{ e});\n\t}\n\t\n\tpublic void SendMouseOut(TopLevel win, Point position)\n\t{\n\t\tvar e = V11TestUtils.CreateRawPointerEventArgs(win, RawPointerEventType.Move, position, RawInputModifiers.None);\n\t\tMethodInfo mi = GetHandleInput(win);\n\t\tmi.Invoke(win, new object[]{ e});\n\t}\n\n\tpublic void SendMouseMove(Control control, Point localPosition, RawInputModifiers modifiers = RawInputModifiers.None, bool translatePositionToRoot = true)\n\t{\n\t\tTopLevel root = CheckVisualRoot(control);\n\t\tSendMouseMove(root, control, translatePositionToRoot ? GetMousePoint(root, control, localPosition) : localPosition, modifiers);\n\t}\n\n\tprivate TopLevel CheckVisualRoot(Control control)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tfor (int i = 0; i < 20; i++)\n\t\t{\n\t\t\tif (root != null)\n\t\t\t\tbreak;\n\t\t\tDispatcher.UIThread.RunJobs();\n\t\t\tThread.Sleep(20);\n\t\t\troot = (TopLevel)control.GetVisualRoot();\n\t\t}\n\n\t\tAssert.NotNull(root);\n\t\treturn root;\n\t}\n\n\tpublic void SendMouseMove(Control control, RawInputModifiers modifiers = RawInputModifiers.None)\n\t{\n\t\tTopLevel root = CheckVisualRoot(control);\n\t\tSendMouseMove(root, control, GetMousePoint(root, control), modifiers);\n\t}\n\n\tpublic void SendMouseOut(Control control)\n\t{\n\t\tTopLevel root = CheckVisualRoot(control);\n\t\tSendMouseOut(root, GetMousePoint(root, control, new Point(-1, 0)));\n\t}\n\n\tpublic void SendLeftMouseDown(Control control)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tSendLeftMouseDown(root, control, GetMousePoint(root, control));\n\t}\n\t\n\tpublic void SendLeftMouseDown(Control control, KeyModifiers modifiers)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tSendLeftMouseDown(root, control, GetMousePoint(root, control), modifiers);\n\t}\n\t\n\tpublic void SendLeftMouseDown(Control control, Point pt, KeyModifiers modifiers)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tSendLeftMouseDown(root, control, GetMousePoint(root, control, pt), modifiers);\n\t}\n\n\tpublic void SendLeftMouseUp(Control control)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tSendLeftMouseUp(root, control, GetMousePoint(root, control));\n\t}\n\t\n\tpublic void SendLeftMouseUp(Control control, KeyModifiers modifiers)\n\t{\n\t\tTopLevel root = (TopLevel)control.GetVisualRoot();\n\t\tSendLeftMouseUp(root, control, GetMousePoint(root, control), modifiers);\n\t}\n\n\tpublic Point GetMousePoint(TopLevel root, Control control)\n\t{\n\t\tif (control.Bounds.Width == 0 || control.Bounds.Height == 0)\n\t\t{\n\t\t\tDispatcher.UIThread.RunJobs();\n\t\t\tThread.Sleep(50);\n\t\t}\n\t\t\n\t\tPoint pt = new Point(control.Bounds.Width / 2, control.Bounds.Height / 2);\n\t\treturn GetMousePoint(root, control, pt);\n\t}\n\n\tpublic Point GetMousePoint(TopLevel root, Control control, Point pt)\n\t{\n\t\tvar p = control.TranslatePoint(pt, root);\n\t\tfor (int i = 0; i < 50 && p == null; i++)\n\t\t{\n\t\t\tDispatcher.UIThread.RunJobs();\n\t\t\tThread.Sleep(20);\n\t\t\tp = control.TranslatePoint(pt, root);\n\t\t}\n\n\t\tAssert.NotNull(p);\n\t\tPixelPoint screen = root.PointToScreen(p.Value);\n\t\tPoint winPoint = root.PointToClient(screen);\n\t\treturn winPoint;\n\t}\n\t\n\tpublic void SendMiddleMouseUp(TopLevel win, Control target, Point position)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.MiddleButtonUp, position, RawInputModifiers.None);\n\t}\n\t\n\tpublic void SendMiddleMouseDown(TopLevel win, Control target, Point position)\n\t{\n\t\tSendMouseEvent(win, target, RawPointerEventType.MiddleButtonDown, position, RawInputModifiers.None);\n\t}\n}"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/V11TestUtils.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Reflection;\n\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Input.Raw;\n\nusing Xunit;\n\nnamespace Eremex.Avalonia.TestUtls;\n\npublic static class V11TestUtils\n{\n\tpublic static RawTextInputEventArgs CreateRawTextInputEventArgs(IInputRoot root, string text)\n\t{\n\t\t// IKeyboardDevice device, ulong timestamp, IInputRoot root,string text\n\t\tvar keyboardDevice = GetKeyboardDevice()!;\n\t\t\n\t\tulong timestamp = (ulong)(DateTime.Now - new DateTime(1970, 1, 1)).TotalMilliseconds;\n\t\tobject[] args =\n\t\t{\n\t\t\tkeyboardDevice,\n\t\t\ttimestamp,\n\t\t\troot,\n\t\t\ttext\n\t\t};\n\t\treturn Create<RawTextInputEventArgs>(args);\n\t}\n\t\n\tpublic static RawKeyEventArgs CreateRawKeyEventArgs(IInputRoot root, RawKeyEventType eventType, Key key, RawInputModifiers modifiers, string keySymbol = \"\")\n\t{\n\t\tvar keyboardDevice = GetKeyboardDevice()!;\n\t\tulong timestamp = (ulong)(DateTime.Now - new DateTime(1970, 1, 1)).TotalMilliseconds;\n\t\tvar types = new[]\n\t\t{\n\t\t\ttypeof(KeyboardDevice),\n\t\t\ttypeof(ulong),\n\t\t\ttypeof(IInputRoot),\n\t\t\ttypeof(RawKeyEventType),\n\t\t\ttypeof(Key),\n\t\t\ttypeof(RawInputModifiers),\n\t\t\ttypeof(PhysicalKey),\n\t\t\ttypeof(string)\n\t\t};\n\t\tobject[] args =\n\t\t{\n\t\t\tkeyboardDevice,\n\t\t\ttimestamp,\n\t\t\troot,\n\t\t\teventType,\n\t\t\tkey,\n\t\t\tmodifiers,\n\t\t\tPhysicalKey.None,\n\t\t\tkeySymbol\n\t\t\t\n\t\t};\n\t\treturn Create<RawKeyEventArgs>(args, types);\n\t}\n\t\n\tpublic static RawPointerEventArgs CreateRawPointerEventArgs(IInputRoot root, RawPointerEventType eventType, Point position, RawInputModifiers modifiers)\n\t{\n\t\t/*\n\t\t *  IInputDevice device,\n            ulong timestamp,\n            IInputRoot root,\n            RawPointerEventType type,\n            RawPointerPoint point,\n            RawInputModifiers inputModifiers\n\t\t */\n\t\tvar w = (WindowBase)root;\n\t\tvar mouseDevice = GetMouseDevice(w)!;\n\t\tulong timestamp = (ulong)(DateTime.Now - new DateTime(1970, 1, 1)).TotalMilliseconds;\n\t\tvar types = new[]\n\t\t{\n\t\t\ttypeof(IInputDevice),\n\t\t\ttypeof(ulong),\n\t\t\ttypeof(IInputRoot),\n\t\t\ttypeof(RawPointerEventType),\n\t\t\ttypeof(Point),\n\t\t\ttypeof(RawInputModifiers)\n\t\t};\n\t\tobject[] args =\n\t\t{\n\t\t\tmouseDevice,\n\t\t\ttimestamp,\n\t\t\troot,\n\t\t\teventType,\n\t\t\tposition,\n\t\t\tmodifiers\n\t\t};\n\t\treturn Create<RawPointerEventArgs>(args, types);\n\t}\n\t\n\tprivate static KeyboardDevice GetKeyboardDevice()\n\t{\n\t\tvar keyboardDevice = GetPropertyValue<KeyboardDevice>(typeof(KeyboardDevice), \"Instance\");\n\t\tAssert.NotNull(keyboardDevice);\n\t\treturn keyboardDevice;\n\t}\n\t\n\tprivate static IInputDevice GetMouseDevice(WindowBase window)\n\t{\n\t\tvar mouseDevice = GetPropertyValue<IInputDevice>(window.PlatformImpl!, \"MouseDevice\");\n\t\tAssert.NotNull(mouseDevice);\n\t\treturn mouseDevice;\n\t}\n\t\n\tprivate static T Create<T>(object[] args, Type[] argTypes = null) where T : class\n\t{\n\t\tvar types = argTypes ?? args.Select(x => x.GetType()).ToArray();\n\t\tvar ctor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,\n\t\t\ttypes);\n\t\treturn ctor?.Invoke(args) as T;\n\t}\n\t\n\tprivate static T GetPropertyValue<T>(object obj, string propertyName)\n\t{\n\t\tobject value = GetPropertyInfo(obj, propertyName)?.GetValue(obj);\n\t\treturn value is T ? (T)value : default;\n\t}\n\n\tprivate static T GetPropertyValue<T>(Type ownerType, string propertyName)\n\t{\n\t\tobject value = GetPropertyInfo(ownerType, propertyName)?.GetValue(null);\n\t\treturn value is T ? (T)value : default;\n\t}\n\t\n\tprivate static PropertyInfo GetPropertyInfo(object obj, string propertyName)\n\t{\n\t\treturn GetPropertyInfo(obj.GetType(), propertyName);\n\t}\n\n\tprivate static PropertyInfo GetPropertyInfo(Type ownerType, string propertyName)\n\t{\n\t\treturn ownerType.GetProperty(propertyName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);\n\t}\n}"
  },
  {
    "path": "Tests/DemoCenter.Desktop.UI.Tests/emxLicense.cs",
    "content": "﻿// This file is auto-generated. Please do not change it.\nusing System.Runtime.CompilerServices;\n\nusing Eremex.AvaloniaUI.Controls.License;\n\nnamespace DemoCenter.Desktop.UI.Tests;\npublic class LicenseProvider\n{\n#pragma warning disable CA2255 // The 'ModuleInitializer' attribute should not be used in libraries\n\t[ModuleInitializer]\n#pragma warning restore CA2255 // The 'ModuleInitializer' attribute should not be used in libraries\n    public static void RegisterLicense()\n\t{\n        ControlsLicenseManager.SetRuntimeLicenseOwner(new LicenseProvider(),\"\", \"A2F7867D\", \"F0 36 B2 B4 6D C8 D1 7B 41 AC 6C 8E A1 C2 73 46 F5 82 96 5A 55 F5 FE 77 94 4D EB A8 0F C0 44 AD 5D 26 DC B0 97 01 BF 82\", \"E7 B4 A0 1F 97 61 19 6B 7C 0C 05 C1 A7 8B 44 B3 00 8A C0 4E 1C C3 EE E6 AA 51 96 78 E0 33 E6 18 36 F7 4D 19 E2 74 FE 67\");\n\t}\n}"
  },
  {
    "path": "Tests/Directory.Build.targets",
    "content": "<Project>\n  <PropertyGroup>\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\n    <CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)Eremex.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <ItemGroup>\n    <AdditionalFiles Include=\"$(MSBuildThisFileDirectory)stylecop.json\" Link=\"Properties\\stylecop.json\" />\n  </ItemGroup>\n \n  <ItemGroup>\n\t<PackageReference Include=\"FluentAssertions\" />\n\t<PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n\t<PackageReference Include=\"xunit\" />\n\t<PackageReference Include=\"xunit.stafact\" />\n    <PackageReference Include=\"Xunit.Combinatorial\" />\n\t<PackageReference Include=\"xunit.runner.visualstudio\">\n\t\t<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n\t\t<PrivateAssets>all</PrivateAssets>\n\t</PackageReference>\n\t<PackageReference Include=\"stylecop.analyzers\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Threading.Analyzers\"/>\n    <PackageReference Include=\"JunitXml.TestLogger\"/>\n\t<PackageReference Include=\"Moq\" />\n    <PackageReference Include=\"Moq.AutoMock\" />\n\t<PackageReference Include=\"NuGet.Common\" />\n\t<PackageReference Include=\"XunitContext\" />\n\t<PackageReference Include=\"Serilog.Sinks.XUnit\" />\n  </ItemGroup>\n  \n</Project>\n"
  },
  {
    "path": "Tests/Eremex.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"15.0\">\n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.SpecialRules\">\n        <Rule Id=\"SA0001\"  Action=\"None\" />          <!-- XML comment analysis disabled -->\n        <Rule Id=\"SA0002\"  Action=\"None\" />          <!-- Invalid settings file -->\n    </Rules>\n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.SpacingRules\">\n        <Rule Id=\"SA1000\"  Action=\"None\" />          <!-- Keywords should be spaced correctly -->\n        <Rule Id=\"SA1001\"  Action=\"None\" />          <!-- Commas should be spaced correctly -->\n        <Rule Id=\"SA1002\"  Action=\"None\" />          <!-- Semicolons should be spaced correctly -->\n        <Rule Id=\"SA1003\"  Action=\"None\" />          <!-- Symbols should be spaced correctly -->\n        <Rule Id=\"SA1004\"  Action=\"None\" />          <!-- Documentation lines should begin with single space -->\n        <Rule Id=\"SA1005\"  Action=\"None\" />          <!-- Single line comments should begin with single space -->\n        <Rule Id=\"SA1006\"  Action=\"None\" />          <!-- Preprocessor keywords should not be preceded by space -->\n        <Rule Id=\"SA1007\"  Action=\"None\" />          <!-- Operator keyword should be followed by space -->\n        <Rule Id=\"SA1008\"  Action=\"None\" />          <!-- Opening parenthesis should be spaced correctly -->\n        <Rule Id=\"SA1009\"  Action=\"None\" />          <!-- Closing parenthesis should be spaced correctly -->\n        <Rule Id=\"SA1010\"  Action=\"None\" />          <!-- Opening square brackets should be spaced correctly -->\n        <Rule Id=\"SA1011\"  Action=\"None\" />          <!-- Closing square brackets should be spaced correctly -->\n        <Rule Id=\"SA1012\"  Action=\"None\" />          <!-- Opening braces should be spaced correctly -->\n        <Rule Id=\"SA1013\"  Action=\"None\" />          <!-- Closing braces should be spaced correctly -->\n        <Rule Id=\"SA1014\"  Action=\"None\" />          <!-- Opening generic brackets should be spaced correctly -->\n        <Rule Id=\"SA1015\"  Action=\"None\" />          <!-- Closing generic brackets should be spaced correctly -->\n        <Rule Id=\"SA1016\"  Action=\"None\" />          <!-- Opening attribute brackets should be spaced correctly -->\n        <Rule Id=\"SA1017\"  Action=\"None\" />          <!-- Closing attribute brackets should be spaced correctly -->\n        <Rule Id=\"SA1018\"  Action=\"None\" />          <!-- Nullable type symbols should be spaced correctly -->\n        <Rule Id=\"SA1019\"  Action=\"None\" />          <!-- Member access symbols should be spaced correctly -->\n        <Rule Id=\"SA1020\"  Action=\"None\" />          <!-- Increment decrement symbols should be spaced correctly -->\n        <Rule Id=\"SA1021\"  Action=\"None\" />          <!-- Negative signs should be spaced correctly -->\n        <Rule Id=\"SA1022\"  Action=\"None\" />          <!-- Positive signs should be spaced correctly -->\n        <Rule Id=\"SA1023\"  Action=\"None\" />          <!-- Dereference and access of symbols should be spaced correctly -->\n        <Rule Id=\"SA1024\"  Action=\"None\" />          <!-- Colons should be spaced correctly -->\n        <Rule Id=\"SA1025\"  Action=\"None\" />          <!-- Code should not contain multiple whitespace in a row -->\n        <Rule Id=\"SA1026\"  Action=\"None\" />          <!-- Code should not contain space after new or stackalloc keyword in implicitly typed array allocation -->\n        <Rule Id=\"SA1027\"  Action=\"None\" />          <!-- Use tabs correctly -->\n        <Rule Id=\"SA1028\"  Action=\"None\" />          <!-- Code should not contain trailing whitespace -->\n    </Rules>\n   \n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.ReadabilityRules\">\n        <Rule Id=\"SA1100\"  Action=\"None\" />          <!-- Do not prefix calls with base unless local implementation exists -->\n        <Rule Id=\"SA1101\"  Action=\"None\" />          <!-- Prefix local calls with this -->\n        <Rule Id=\"SA1102\"  Action=\"None\" />          <!-- Query clause should follow previous clause -->\n        <Rule Id=\"SA1103\"  Action=\"None\" />          <!-- Query clauses should be on separate lines or all on one line -->\n        <Rule Id=\"SA1104\"  Action=\"None\" />          <!-- Query clause should begin on new line when previous clause spans multiple lines -->\n        <Rule Id=\"SA1105\"  Action=\"None\" />          <!-- Query clauses spanning multiple lines should begin on own line -->\n        <Rule Id=\"SA1106\"  Action=\"Error\"/>          <!-- Code should not contain empty statements -->\n        <Rule Id=\"SA1107\"  Action=\"None\" />          <!-- Code should not contain multiple statements on one line -->\n        <Rule Id=\"SA1108\"  Action=\"None\" />          <!-- Block statements should not contain embedded comments -->\n        <Rule Id=\"SA1109\"  Action=\"None\" />             <!-- Block statements should not contain embedded regions -->\n        <Rule Id=\"SA1110\"  Action=\"None\" />          <!-- Opening parenthesis or bracket should be on declaration line -->\n        <Rule Id=\"SA1111\"  Action=\"None\" />          <!-- Closing parenthesis should be on line of last parameter -->\n        <Rule Id=\"SA1112\"  Action=\"None\" />          <!-- Closing parenthesis should be on line of opening parenthesis -->\n        <Rule Id=\"SA1113\"  Action=\"None\" />          <!-- Comma should be on the same line as previous parameter -->\n        <Rule Id=\"SA1114\"  Action=\"None\" />          <!-- Parameter list should follow declaration -->\n        <Rule Id=\"SA1115\"  Action=\"None\" />          <!-- Parameter should follow comma -->\n        <Rule Id=\"SA1116\"  Action=\"None\" />          <!-- Split parameters should start on line after declaration -->\n        <Rule Id=\"SA1117\"  Action=\"None\" />          <!-- Parameters should be on same line or separate lines -->\n        <Rule Id=\"SA1118\"  Action=\"None\" />          <!-- Parameter should not span multiple lines -->\n        <Rule Id=\"SA1120\"  Action=\"Error\" />         <!-- Comments should contain text -->\n        <Rule Id=\"SA1121\"  Action=\"None\" />          <!-- Use built-in type alias -->\n        <Rule Id=\"SA1122\"  Action=\"None\"/>          <!-- Use string.Empty for empty strings -->\n        <Rule Id=\"SA1123\"  Action=\"None\" />          <!-- Do not place regions within elements -->\n        <Rule Id=\"SA1124\"  Action=\"None\" />          <!-- Do not use regions -->\n        <Rule Id=\"SA1125\"  Action=\"None\" />          <!-- Use shorthand for nullable types -->\n        <Rule Id=\"SA1126\"  Action=\"None\" />             <!-- Prefix calls correctly -->\n        <Rule Id=\"SA1127\"  Action=\"None\" />          <!-- Generic type constraints should be on their own line -->\n        <Rule Id=\"SA1128\"  Action=\"None\" />          <!-- Put constructor initializers on their own line -->\n        <Rule Id=\"SA1129\"  Action=\"None\" />          <!-- Do not use default value type constructor -->\n        <Rule Id=\"SA1130\"  Action=\"None\" />          <!-- Use lambda syntax -->\n        <Rule Id=\"SA1131\"  Action=\"None\" />          <!-- Use readable conditions -->\n        <Rule Id=\"SA1132\"  Action=\"None\" />          <!-- Do not combine fields -->\n        <Rule Id=\"SA1133\"  Action=\"None\" />          <!-- Do not combine attributes -->\n        <Rule Id=\"SA1134\"  Action=\"None\" />          <!-- Attributes should not share line -->\n        <Rule Id=\"SA1135\"  Action=\"None\" />          <!-- Using directives should be qualified -->\n        <Rule Id=\"SA1136\"  Action=\"None\" />          <!-- Enum values should be on separate lines -->\n        <Rule Id=\"SA1137\"  Action=\"None\" />          <!-- Elements should have the same indentation -->\n        <Rule Id=\"SA1139\"  Action=\"None\" />          <!-- Use literal suffix notation instead of casting -->\n\n        <Rule Id=\"SA1141\"  Action=\"None\" />          \n        <Rule Id=\"SA1142\"  Action=\"None\" />          \n        <Rule Id=\"SX1101\"  Action=\"None\" />             <!-- Do not prefix local calls with 'this.' -->\n    </Rules>\n\t\n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.OrderingRules\">\n        <Rule Id=\"SA1200\"  Action=\"None\" />          <!-- Using directives should be placed correctly -->\n        <Rule Id=\"SA1201\"  Action=\"None\" />          <!-- Elements should appear in the correct order -->\n        <Rule Id=\"SA1202\"  Action=\"None\" />          <!-- Elements should be ordered by access -->\n        <Rule Id=\"SA1203\"  Action=\"None\" />          <!-- Constants should appear before fields -->\n        <Rule Id=\"SA1204\"  Action=\"None\" />          <!-- Static elements should appear before instance elements -->\n        <Rule Id=\"SA1205\"  Action=\"None\" />          <!-- Partial elements should declare access -->\n        <Rule Id=\"SA1206\"  Action=\"None\" />          <!-- Declaration keywords should follow order -->\n        <Rule Id=\"SA1207\"  Action=\"None\" />          <!-- Protected should come before internal -->\n        <Rule Id=\"SA1208\"  Action=\"None\" />          <!-- System using directives should be placed before other using directives -->\n        <Rule Id=\"SA1209\"  Action=\"None\" />          <!-- Using alias directives should be placed after other using directives -->\n        <Rule Id=\"SA1210\"  Action=\"None\" />          <!-- Using directives should be ordered alphabetically by namespace -->\n        <Rule Id=\"SA1211\"  Action=\"None\" />          <!-- Using alias directives should be ordered alphabetically by alias name -->\n        <Rule Id=\"SA1212\"  Action=\"None\" />          <!-- Property accessors should follow order -->\n        <Rule Id=\"SA1213\"  Action=\"None\" />          <!-- Event accessors should follow order -->\n        <Rule Id=\"SA1214\"  Action=\"None\" />          <!-- Readonly fields should appear before non-readonly fields -->\n        <Rule Id=\"SA1216\"  Action=\"None\" />          <!-- Using static directives should be placed at the correct location -->\n        <Rule Id=\"SA1217\"  Action=\"None\" />          <!-- Using static directives should be ordered alphabetically -->\n    </Rules>\n\n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.NamingRules\">\n        <Rule Id=\"SA1300\"  Action=\"None\" />          <!-- Element should begin with upper-case letter -->\n        <Rule Id=\"SA1301\"  Action=\"None\" />             <!-- Element should begin with lower-case letter -->\n        <Rule Id=\"SA1302\"  Action=\"None\" />          <!-- Interface names should begin with I -->\n        <Rule Id=\"SA1303\"  Action=\"None\" />          <!-- Const field names should begin with upper-case letter -->\n        <Rule Id=\"SA1304\"  Action=\"None\" />          <!-- Non-private readonly fields should begin with upper-case letter -->\n        <Rule Id=\"SA1305\"  Action=\"None\" />             <!-- Field names should not use Hungarian notation -->\n        <Rule Id=\"SA1306\"  Action=\"None\" />          <!-- Field names should begin with lower-case letter -->\n        <Rule Id=\"SA1307\"  Action=\"None\" />          <!-- Accessible fields should begin with upper-case letter -->\n        <Rule Id=\"SA1308\"  Action=\"None\" />          <!-- Variable names should not be prefixed -->\n        <Rule Id=\"SA1309\"  Action=\"None\" />          <!-- Field names should not begin with underscore -->\n        <Rule Id=\"SA1310\"  Action=\"None\" />          <!-- Field names should not contain underscore -->\n        <Rule Id=\"SA1311\"  Action=\"None\" />          <!-- Static readonly fields should begin with upper-case letter -->\n        <Rule Id=\"SA1312\"  Action=\"None\" />          <!-- Variable names should begin with lower-case letter -->\n        <Rule Id=\"SA1313\"  Action=\"None\" />          <!-- Parameter names should begin with lower-case letter -->\n        <Rule Id=\"SA1314\"  Action=\"None\" />          <!-- Type parameter names should begin with T -->\n        <Rule Id=\"SA1316\"  Action=\"None\" />          \n        <Rule Id=\"SX1309\"  Action=\"None\" />             <!-- Field names should begin with underscore -->\n        <Rule Id=\"SX1309S\" Action=\"None\" />             <!-- Static field names should begin with underscore -->\n        <Rule Id=\"SA1329\" Action=\"Error\" />            \n    </Rules>\n\n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.MaintainabilityRules\">\n        <Rule Id=\"SA1119\"  Action=\"None\" />          <!-- Statement should not use unnecessary parenthesis -->\n        <Rule Id=\"SA1400\"  Action=\"None\" />          <!-- Access modifier should be declared -->\n        <Rule Id=\"SA1401\"  Action=\"None\" />          <!-- Fields should be private -->\n        <Rule Id=\"SA1402\"  Action=\"None\" />          <!-- File may only contain a single type -->\n        <Rule Id=\"SA1403\"  Action=\"None\" />          <!-- File may only contain a single namespace -->\n        <Rule Id=\"SA1404\"  Action=\"None\" />          <!-- Code analysis suppression should have justification -->\n        <Rule Id=\"SA1405\"  Action=\"None\" />          <!-- Debug.Assert should provide message text -->\n        <Rule Id=\"SA1406\"  Action=\"None\" />          <!-- Debug.Fail should provide message text -->\n        <Rule Id=\"SA1407\"  Action=\"None\" />          <!-- Arithmetic expressions should declare precedence -->\n        <Rule Id=\"SA1408\"  Action=\"None\" />          <!-- Conditional expressions should declare precedence -->\n        <Rule Id=\"SA1409\"  Action=\"None\"    />          <!-- Remove unnecessary code -->\n        <Rule Id=\"SA1410\"  Action=\"None\" />          <!-- Remove delegate parenthesis when possible -->\n        <Rule Id=\"SA1411\"  Action=\"None\" />          <!-- Attribute constructor should not use unnecessary parenthesis -->\n        <Rule Id=\"SA1412\"  Action=\"Error\"/>          <!-- Store files as UTF-8 with byte order mark -->\n        <Rule Id=\"SA1413\"  Action=\"None\" />          <!-- Use trailing comma in multi-line initializers -->\n        <Rule Id=\"SA1414\"  Action=\"None\" />          \n    </Rules>\n\t\n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.LayoutRules\">\n        <Rule Id=\"SA1500\"  Action=\"Error\" />          <!-- Braces for multi-line statements should not share line -->\n        <Rule Id=\"SA1501\"  Action=\"None\" />          <!-- Statement should not be on a single line -->\n        <Rule Id=\"SA1502\"  Action=\"None\" />          <!-- Element should not be on a single line -->\n        <Rule Id=\"SA1503\"  Action=\"None\" />          <!-- Braces should not be omitted -->\n        <Rule Id=\"SA1504\"  Action=\"None\" />          <!-- All accessors should be single-line or multi-line -->\n        <Rule Id=\"SA1505\"  Action=\"None\" />          <!-- Opening braces should not be followed by blank line -->\n        <Rule Id=\"SA1506\"  Action=\"None\" />          <!-- Element documentation headers should not be followed by blank line -->\n        <Rule Id=\"SA1507\"  Action=\"Error\" />         <!-- Code should not contain multiple blank lines in a row -->\n        <Rule Id=\"SA1508\"  Action=\"None\" />          <!-- Closing braces should not be preceded by blank line -->\n        <Rule Id=\"SA1509\"  Action=\"None\" />          <!-- Opening braces should not be preceded by blank line -->\n        <Rule Id=\"SA1510\"  Action=\"None\" />          <!-- Chained statement blocks should not be preceded by blank line -->\n        <Rule Id=\"SA1511\"  Action=\"None\" />          <!-- While-do footer should not be preceded by blank line -->\n        <Rule Id=\"SA1512\"  Action=\"None\" />          <!-- Single-line comments should not be followed by blank line -->\n        <Rule Id=\"SA1513\"  Action=\"None\" />          <!-- Closing brace should be followed by blank line -->\n        <Rule Id=\"SA1514\"  Action=\"None\" />          <!-- Element documentation header should be preceded by blank line -->\n        <Rule Id=\"SA1515\"  Action=\"None\" />          <!-- Single-line comment should be preceded by blank line -->\n        <Rule Id=\"SA1516\"  Action=\"None\" />          <!-- Elements should be separated by blank line -->\n        <Rule Id=\"SA1517\"  Action=\"Error\"/>          <!-- Code should not contain blank lines at start of file -->\n        <Rule Id=\"SA1518\"  Action=\"None\"/>          <!-- Use line endings correctly at end of file -->\n        <Rule Id=\"SA1519\"  Action=\"None\" />          <!-- Braces should not be omitted from multi-line child statement -->\n        <Rule Id=\"SA1520\"  Action=\"None\" />          <!-- Use braces consistently -->\n    </Rules>\n\t\n    <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers.DocumentationRules\">\n        <Rule Id=\"SA1600\"  Action=\"None\" />          <!-- Elements should be documented -->\n        <Rule Id=\"SA1601\"  Action=\"None\" />          <!-- Partial elements should be documented -->\n        <Rule Id=\"SA1602\"  Action=\"None\" />          <!-- Enumeration items should be documented -->\n        <Rule Id=\"SA1603\"  Action=\"None\" />             <!-- Documentation should contain valid XML -->\n        <Rule Id=\"SA1604\"  Action=\"None\" />          <!-- Element documentation should have summary -->\n        <Rule Id=\"SA1605\"  Action=\"None\" />          <!-- Partial element documentation should have summary -->\n        <Rule Id=\"SA1606\"  Action=\"None\" />          <!-- Element documentation should have summary text -->\n        <Rule Id=\"SA1607\"  Action=\"None\" />          <!-- Partial element documentation should have summary text -->\n        <Rule Id=\"SA1608\"  Action=\"None\" />          <!-- Element documentation should not have default summary -->\n        <Rule Id=\"SA1609\"  Action=\"None\" />             <!-- Property documentation should have value -->\n        <Rule Id=\"SA1610\"  Action=\"None\" />          <!-- Property documentation should have value text -->\n        <Rule Id=\"SA1611\"  Action=\"None\" />          <!-- Element parameters should be documented -->\n        <Rule Id=\"SA1612\"  Action=\"None\" />          <!-- Element parameter documentation should match element parameters -->\n        <Rule Id=\"SA1613\"  Action=\"None\" />          <!-- Element parameter documentation should declare parameter name -->\n        <Rule Id=\"SA1614\"  Action=\"None\" />          <!-- Element parameter documentation should have text -->\n        <Rule Id=\"SA1615\"  Action=\"None\" />          <!-- Element return value should be documented -->\n        <Rule Id=\"SA1616\"  Action=\"None\" />          <!-- Element return value documentation should have text -->\n        <Rule Id=\"SA1617\"  Action=\"None\" />          <!-- Void return value should not be documented -->\n        <Rule Id=\"SA1618\"  Action=\"None\" />          <!-- Generic type parameters should be documented -->\n        <Rule Id=\"SA1619\"  Action=\"None\" />          <!-- Generic type parameters should be documented partial class -->\n        <Rule Id=\"SA1620\"  Action=\"None\" />          <!-- Generic type parameter documentation should match type parameters -->\n        <Rule Id=\"SA1621\"  Action=\"None\" />          <!-- Generic type parameter documentation should declare parameter name -->\n        <Rule Id=\"SA1622\"  Action=\"None\" />          <!-- Generic type parameter documentation should have text -->\n        <Rule Id=\"SA1623\"  Action=\"None\" />          <!-- Property summary documentation should match accessors -->\n        <Rule Id=\"SA1624\"  Action=\"None\" />          <!-- Property summary documentation should omit accessor with restricted access -->\n        <Rule Id=\"SA1625\"  Action=\"None\" />          <!-- Element documentation should not be copied and pasted -->\n        <Rule Id=\"SA1626\"  Action=\"None\" />          <!-- Single-line comments should not use documentation style slashes -->\n        <Rule Id=\"SA1627\"  Action=\"None\" />          <!-- Documentation text should not be empty -->\n        <Rule Id=\"SA1628\"  Action=\"None\" />             <!-- Documentation text should begin with a capital letter -->\n        <Rule Id=\"SA1629\"  Action=\"None\" />          <!-- Documentation text should end with a period -->\n        <Rule Id=\"SA1630\"  Action=\"None\" />             <!-- Documentation text should contain whitespace -->\n        <Rule Id=\"SA1631\"  Action=\"None\" />             <!-- Documentation should meet character percentage -->\n        <Rule Id=\"SA1632\"  Action=\"None\" />             <!-- Documentation text should meet minimum character length -->\n        <Rule Id=\"SA1633\"  Action=\"None\" />          <!-- File should have header -->\n        <Rule Id=\"SA1634\"  Action=\"None\" />          <!-- File header should show copyright -->\n        <Rule Id=\"SA1635\"  Action=\"None\" />          <!-- File header should have copyright text -->\n        <Rule Id=\"SA1636\"  Action=\"None\" />          <!-- File header copyright text should match -->\n        <Rule Id=\"SA1637\"  Action=\"None\" />          <!-- File header should contain file name -->\n        <Rule Id=\"SA1638\"  Action=\"None\" />          <!-- File header file name documentation should match file name -->\n        <Rule Id=\"SA1639\"  Action=\"None\" />          <!-- File header should have summary -->\n        <Rule Id=\"SA1640\"  Action=\"None\" />          <!-- File header should have valid company text -->\n        <Rule Id=\"SA1641\"  Action=\"None\" />          <!-- File header company name text should match -->\n        <Rule Id=\"SA1642\"  Action=\"None\" />          <!-- Constructor summary documentation should begin with standard text -->\n        <Rule Id=\"SA1643\"  Action=\"None\" />          <!-- Destructor summary documentation should begin with standard text -->\n        <Rule Id=\"SA1644\"  Action=\"None\" />             <!-- Documentation headers should not contain blank lines -->\n        <Rule Id=\"SA1645\"  Action=\"None\" />             <!-- Included documentation file does not exist -->\n        <Rule Id=\"SA1646\"  Action=\"None\" />             <!-- Included documentation XPath does not exist -->\n        <Rule Id=\"SA1647\"  Action=\"None\" />             <!-- Include node does not contain valid file and path -->\n        <Rule Id=\"SA1648\"  Action=\"None\" />          <!-- Inheritdoc should be used with inheriting class -->\n        <Rule Id=\"SA1649\"  Action=\"None\" />          <!-- File name should match first type name -->\n        <Rule Id=\"SA1650\"  Action=\"None\" />             <!-- Element documentation should be spelled correctly -->\n        <Rule Id=\"SA1651\"  Action=\"None\" />          <!-- Do not use placeholder elements -->\n    </Rules>\n\n  <Rules AnalyzerId=\"Microsoft.Analyzers.ManagedCodeAnalysis\" RuleNamespace=\"Microsoft.Rules.Managed\">\n    <Rule Id=\"CA1001\" Action=\"None\" />   <!-- Dispose диагностика. Работает плохо -->\n    <Rule Id=\"CS0067\" Action=\"Info\" />   <!--An event was declared but never used in the class in which it was declared. Временно отключили потому что при портировании на net будет много такого кода. Потом надо будет включить -->\n    <Rule Id=\"CS0649\" Action=\"Info\" />   <!--Field 'field' is never assigned to, and will always have its default value 'value' Временно отключили потому что при портировании на net будет много такого кода. Потом надо будет включить -->\n    <Rule Id=\"CS0169\" Action=\"Info\" />   <!--The private field 'class member' is never used Временно отключили потому что при портировании на net будет много такого кода. Потом надо будет включить -->\n    <Rule Id=\"CS0414\" Action=\"Info\" />   <!--The private field 'field' is assigned but its value is never used Временно отключили потому что при портировании на net будет много такого кода. Потом надо будет включить -->\n    <Rule Id=\"CS0219\" Action=\"Info\" />   <!--The variable 'variable' is assigned but its value is never used Временно отключили потому что при портировании на net будет много такого кода. Потом надо будет включить -->\n\n    <Rule Id=\"CA1009\" Action=\"Warning\" />\n    <Rule Id=\"CA1016\" Action=\"Warning\" />\n    <Rule Id=\"CA1049\" Action=\"Warning\" />\n    <Rule Id=\"CA1060\" Action=\"None\" />\n    <Rule Id=\"CA1061\" Action=\"Warning\" />\n    <Rule Id=\"CA1063\" Action=\"None\" />\n    <Rule Id=\"CA1301\" Action=\"Warning\" />\n    <Rule Id=\"CA1400\" Action=\"Warning\" />\n    <Rule Id=\"CA1401\" Action=\"Warning\" />\n    <Rule Id=\"CA1403\" Action=\"Warning\" />\n    <Rule Id=\"CA1404\" Action=\"Warning\" />\n    <Rule Id=\"CA1405\" Action=\"Warning\" />\n    <Rule Id=\"CA1410\" Action=\"Warning\" />\n    <Rule Id=\"CA1415\" Action=\"Warning\" />\n    <Rule Id=\"CA1821\" Action=\"Warning\" />\n    <Rule Id=\"CA1900\" Action=\"Warning\" />\n    <Rule Id=\"CA1901\" Action=\"Warning\" />\n    <Rule Id=\"CA2002\" Action=\"None\" />\n    <Rule Id=\"CA2100\" Action=\"Warning\" />\n    <Rule Id=\"CA2101\" Action=\"Warning\" />\n    <Rule Id=\"CA2108\" Action=\"Warning\" />\n    <Rule Id=\"CA2111\" Action=\"Warning\" />\n    <Rule Id=\"CA2112\" Action=\"Warning\" />\n    <Rule Id=\"CA2114\" Action=\"Warning\" />\n    <Rule Id=\"CA2116\" Action=\"Warning\" />\n    <Rule Id=\"CA2117\" Action=\"Warning\" />\n    <Rule Id=\"CA2122\" Action=\"Warning\" />\n    <Rule Id=\"CA2123\" Action=\"Warning\" />\n    <Rule Id=\"CA2124\" Action=\"Warning\" />\n    <Rule Id=\"CA2126\" Action=\"Warning\" />\n    <Rule Id=\"CA2131\" Action=\"Warning\" />\n    <Rule Id=\"CA2132\" Action=\"Warning\" />\n    <Rule Id=\"CA2133\" Action=\"Warning\" />\n    <Rule Id=\"CA2134\" Action=\"Warning\" />\n    <Rule Id=\"CA2137\" Action=\"Warning\" />\n    <Rule Id=\"CA2138\" Action=\"Warning\" />\n    <Rule Id=\"CA2140\" Action=\"Warning\" />\n    <Rule Id=\"CA2141\" Action=\"Warning\" />\n    <Rule Id=\"CA2146\" Action=\"Warning\" />\n    <Rule Id=\"CA2147\" Action=\"Warning\" />\n    <Rule Id=\"CA2149\" Action=\"Warning\" />\n    <Rule Id=\"CA2200\" Action=\"Warning\" />\n    <Rule Id=\"CA2202\" Action=\"Warning\" />\n    <Rule Id=\"CA2207\" Action=\"Warning\" />\n    <Rule Id=\"CA2212\" Action=\"Warning\" />\n    <Rule Id=\"CA2213\" Action=\"Warning\" />\n    <Rule Id=\"CA2214\" Action=\"None\" />\n    <Rule Id=\"CA2216\" Action=\"Warning\" />\n    <Rule Id=\"CA2220\" Action=\"Warning\" />\n    <Rule Id=\"CA2229\" Action=\"Warning\" />\n    <Rule Id=\"CA2231\" Action=\"Warning\" />\n    <Rule Id=\"CA2232\" Action=\"Warning\" />\n    <Rule Id=\"CA2235\" Action=\"Warning\" />\n    <Rule Id=\"CA2236\" Action=\"Warning\" />\n    <Rule Id=\"CA2237\" Action=\"Warning\" />\n    <Rule Id=\"CA2238\" Action=\"Warning\" />\n    <Rule Id=\"CA2240\" Action=\"Warning\" />\n    <Rule Id=\"CA2241\" Action=\"Warning\" />\n    <Rule Id=\"CA2242\" Action=\"Warning\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.CodeAnalysis.CSharp\" RuleNamespace=\"Microsoft.CodeAnalysis.CSharp\">\n   <Rule Id=\"AD0001\" Action=\"None\" />\n    <Rule Id=\"CA1033\" Action=\"None\" />\n    <Rule Id=\"CA1065\" Action=\"None\" />\n    <Rule Id=\"CS0078\" Action=\"None\" />\n    <Rule Id=\"CS0105\" Action=\"None\" />\n    <Rule Id=\"CS0109\" Action=\"None\" />\n    <Rule Id=\"CS0114\" Action=\"None\" />\n    <Rule Id=\"CS0162\" Action=\"None\" />\n    <Rule Id=\"CS0164\" Action=\"None\" />\n    <Rule Id=\"CS0168\" Action=\"None\" />\n    <Rule Id=\"CS0183\" Action=\"None\" />\n    <Rule Id=\"CS0184\" Action=\"None\" />\n    <Rule Id=\"CS0197\" Action=\"None\" />\n    <Rule Id=\"CS0251\" Action=\"None\" />\n    <Rule Id=\"CS0252\" Action=\"None\" />\n    <Rule Id=\"CS0253\" Action=\"None\" />\n    <Rule Id=\"CS0278\" Action=\"None\" />\n    <Rule Id=\"CS0279\" Action=\"None\" />\n    <Rule Id=\"CS0280\" Action=\"None\" />\n    <Rule Id=\"CS0282\" Action=\"None\" />\n    <Rule Id=\"CS0419\" Action=\"None\" />\n    <Rule Id=\"CS0420\" Action=\"None\" />\n    <Rule Id=\"CS0435\" Action=\"None\" />\n    <Rule Id=\"CS0436\" Action=\"None\" />\n    <Rule Id=\"CS0437\" Action=\"None\" />\n    <Rule Id=\"CS0440\" Action=\"None\" />\n    <Rule Id=\"CS0458\" Action=\"None\" />\n    <Rule Id=\"CS0464\" Action=\"None\" />\n    <Rule Id=\"CS0465\" Action=\"None\" />\n    <Rule Id=\"CS0469\" Action=\"None\" />\n    <Rule Id=\"CS0472\" Action=\"None\" />\n    <Rule Id=\"CS0473\" Action=\"None\" />\n    <Rule Id=\"CS0612\" Action=\"None\" />\n    <Rule Id=\"CS0626\" Action=\"None\" />\n    <Rule Id=\"CS0628\" Action=\"None\" />\n    <Rule Id=\"CS0642\" Action=\"None\" />\n    <Rule Id=\"CS0652\" Action=\"None\" />\n    <Rule Id=\"CS0657\" Action=\"None\" />\n    <Rule Id=\"CS0658\" Action=\"None\" />\n    <Rule Id=\"CS0659\" Action=\"None\" />\n    <Rule Id=\"CS0660\" Action=\"None\" />\n    <Rule Id=\"CS0661\" Action=\"None\" />\n    <Rule Id=\"CS0665\" Action=\"None\" />\n    <Rule Id=\"CS0672\" Action=\"None\" />\n    <Rule Id=\"CS0675\" Action=\"None\" />\n    <Rule Id=\"CS0684\" Action=\"None\" />\n    <Rule Id=\"CS0693\" Action=\"None\" />\n    <Rule Id=\"CS0728\" Action=\"None\" />\n    <Rule Id=\"CS0809\" Action=\"None\" />\n    <Rule Id=\"CS0811\" Action=\"None\" />\n    <Rule Id=\"CS0824\" Action=\"None\" />\n    <Rule Id=\"CS1030\" Action=\"None\" />\n    <Rule Id=\"CS1058\" Action=\"None\" />\n    <Rule Id=\"CS1062\" Action=\"None\" />\n    <Rule Id=\"CS1064\" Action=\"None\" />\n    <Rule Id=\"CS1066\" Action=\"None\" />\n    <Rule Id=\"CS1072\" Action=\"None\" />\n    <Rule Id=\"CS1522\" Action=\"None\" />\n    <Rule Id=\"CS1570\" Action=\"None\" />\n    <Rule Id=\"CS1571\" Action=\"None\" />\n    <Rule Id=\"CS1572\" Action=\"None\" />\n    <Rule Id=\"CS1573\" Action=\"None\" />\n    <Rule Id=\"CS1574\" Action=\"None\" />\n    <Rule Id=\"CS1580\" Action=\"None\" />\n    <Rule Id=\"CS1581\" Action=\"None\" />\n    <Rule Id=\"CS1584\" Action=\"None\" />\n    <Rule Id=\"CS1587\" Action=\"None\" />\n    <Rule Id=\"CS1589\" Action=\"None\" />\n    <Rule Id=\"CS1590\" Action=\"None\" />\n    <Rule Id=\"CS1591\" Action=\"None\" />\n    <Rule Id=\"CS1592\" Action=\"None\" />\n    <Rule Id=\"CS1616\" Action=\"None\" />\n    <Rule Id=\"CS1633\" Action=\"None\" />\n    <Rule Id=\"CS1634\" Action=\"None\" />\n    <Rule Id=\"CS1635\" Action=\"None\" />\n    <Rule Id=\"CS1645\" Action=\"None\" />\n    <Rule Id=\"CS1658\" Action=\"None\" />\n    <Rule Id=\"CS1668\" Action=\"None\" />\n    <Rule Id=\"CS1685\" Action=\"None\" />\n    <Rule Id=\"CS1687\" Action=\"None\" />\n    <Rule Id=\"CS1690\" Action=\"None\" />\n    <Rule Id=\"CS1692\" Action=\"None\" />\n    <Rule Id=\"CS1695\" Action=\"None\" />\n    <Rule Id=\"CS1696\" Action=\"None\" />\n    <Rule Id=\"CS1697\" Action=\"None\" />\n    <Rule Id=\"CS1700\" Action=\"None\" />\n    <Rule Id=\"CS1701\" Action=\"None\" />\n    <Rule Id=\"CS1702\" Action=\"None\" />\n    <Rule Id=\"CS1710\" Action=\"None\" />\n    <Rule Id=\"CS1711\" Action=\"None\" />\n    <Rule Id=\"CS1712\" Action=\"None\" />\n    <Rule Id=\"CS1717\" Action=\"None\" />\n    <Rule Id=\"CS1718\" Action=\"None\" />\n    <Rule Id=\"CS1720\" Action=\"None\" />\n    <Rule Id=\"CS1723\" Action=\"None\" />\n    <Rule Id=\"CS1734\" Action=\"None\" />\n    <Rule Id=\"CS1735\" Action=\"None\" />\n    <Rule Id=\"CS1762\" Action=\"None\" />\n    <Rule Id=\"CS1927\" Action=\"None\" />\n    <Rule Id=\"CS1956\" Action=\"None\" />\n    <Rule Id=\"CS1957\" Action=\"None\" />\n    <Rule Id=\"CS1974\" Action=\"None\" />\n    <Rule Id=\"CS1981\" Action=\"None\" />\n    <Rule Id=\"CS1998\" Action=\"None\" />\n    <Rule Id=\"CS2002\" Action=\"None\" />\n    <Rule Id=\"CS2008\" Action=\"None\" />\n    <Rule Id=\"CS2023\" Action=\"None\" />\n    <Rule Id=\"CS2029\" Action=\"None\" />\n    <Rule Id=\"CS2038\" Action=\"None\" />\n    <Rule Id=\"CS3000\" Action=\"None\" />\n    <Rule Id=\"CS3001\" Action=\"None\" />\n    <Rule Id=\"CS3002\" Action=\"None\" />\n    <Rule Id=\"CS3003\" Action=\"None\" />\n    <Rule Id=\"CS3005\" Action=\"None\" />\n    <Rule Id=\"CS3006\" Action=\"None\" />\n    <Rule Id=\"CS3007\" Action=\"None\" />\n    <Rule Id=\"CS3008\" Action=\"None\" />\n    <Rule Id=\"CS3009\" Action=\"None\" />\n    <Rule Id=\"CS3010\" Action=\"None\" />\n    <Rule Id=\"CS3011\" Action=\"None\" />\n    <Rule Id=\"CS3012\" Action=\"None\" />\n    <Rule Id=\"CS3013\" Action=\"None\" />\n    <Rule Id=\"CS3014\" Action=\"None\" />\n    <Rule Id=\"CS3015\" Action=\"None\" />\n    <Rule Id=\"CS3016\" Action=\"None\" />\n    <Rule Id=\"CS3017\" Action=\"None\" />\n    <Rule Id=\"CS3018\" Action=\"None\" />\n    <Rule Id=\"CS3019\" Action=\"None\" />\n    <Rule Id=\"CS3021\" Action=\"None\" />\n    <Rule Id=\"CS3022\" Action=\"None\" />\n    <Rule Id=\"CS3023\" Action=\"None\" />\n    <Rule Id=\"CS3024\" Action=\"None\" />  \n    <Rule Id=\"CS3026\" Action=\"None\" />\n    <Rule Id=\"CS3027\" Action=\"None\" />\n    <Rule Id=\"CS4014\" Action=\"None\" />\n    <Rule Id=\"CS4024\" Action=\"None\" />\n    <Rule Id=\"CS4025\" Action=\"None\" />\n    <Rule Id=\"CS4026\" Action=\"None\" />\n    <Rule Id=\"CS7033\" Action=\"None\" />\n    <Rule Id=\"CS7035\" Action=\"None\" />\n    <Rule Id=\"CS7080\" Action=\"None\" />\n    <Rule Id=\"CS7081\" Action=\"None\" />\n    <Rule Id=\"CS7082\" Action=\"None\" />\n    <Rule Id=\"CS7090\" Action=\"None\" />  \n    <Rule Id=\"CS7095\" Action=\"None\" />  \n    <Rule Id=\"CS8001\" Action=\"None\" />\n    <Rule Id=\"CS8002\" Action=\"None\" />\n    <Rule Id=\"CS8009\" Action=\"None\" />\n    <Rule Id=\"CS8012\" Action=\"None\" />\n    <Rule Id=\"CS8018\" Action=\"None\" />  \n    <Rule Id=\"CS8019\" Action=\"Info\" />  <!--нельзя трогать этот. Ломает рефакторинги студии-->   \n    <Rule Id=\"CS8020\" Action=\"None\" />\n    <Rule Id=\"CS8021\" Action=\"None\" />\n    <Rule Id=\"CS8029\" Action=\"None\" />\n    <Rule Id=\"CS8032\" Action=\"None\" />   \n    <Rule Id=\"CS8033\" Action=\"None\" />\n    <Rule Id=\"CS8034\" Action=\"None\" />\n    <Rule Id=\"CS8040\" Action=\"None\" />\n    <Rule Id=\"CS8073\" Action=\"None\" />\n    <Rule Id=\"CS8094\" Action=\"None\" />\n    <Rule Id=\"CS8105\" Action=\"None\" />\n    <Rule Id=\"CS8123\" Action=\"None\" />\n    <Rule Id=\"CS8305\" Action=\"None\" />\n    <Rule Id=\"CS8313\" Action=\"None\" />\n    <Rule Id=\"CS8887\" Action=\"None\" /> \n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.CodeAnalysis.CSharp.EditorFeatures\" RuleNamespace=\"Microsoft.CodeAnalysis.CSharp.EditorFeatures\">\n    <Rule Id=\"IDE0032\" Action=\"None\" />\n    <Rule Id=\"IDE0032WithoutSuggestion\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.CodeAnalysis.CSharp.Features\" RuleNamespace=\"Microsoft.CodeAnalysis.CSharp.Features\">\n    <Rule Id=\"IDE0001\" Action=\"None\" />\n    <Rule Id=\"IDE0002\" Action=\"None\" />\n    <Rule Id=\"IDE0003\" Action=\"None\" />\n    <Rule Id=\"IDE0004\" Action=\"None\" />\n    <Rule Id=\"IDE0005\" Action=\"None\" />\n    <Rule Id=\"IDE0007\" Action=\"None\" />\n    <Rule Id=\"IDE0007WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0008\" Action=\"None\" />\n    <Rule Id=\"IDE0008WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0009\" Action=\"None\" />\n    <Rule Id=\"IDE0009WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0011\" Action=\"None\" />\n    <Rule Id=\"IDE0011WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0012\" Action=\"None\" />\n    <Rule Id=\"IDE0013\" Action=\"None\" />\n    <Rule Id=\"IDE0014\" Action=\"None\" />\n    <Rule Id=\"IDE0015\" Action=\"None\" />\n    <Rule Id=\"IDE0016\" Action=\"None\" />\n    <Rule Id=\"IDE0016WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0017\" Action=\"None\" />\n    <Rule Id=\"IDE0017WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0018\" Action=\"None\" />\n    <Rule Id=\"IDE0018WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0019\" Action=\"None\" />\n    <Rule Id=\"IDE0019WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0020\" Action=\"None\" />\n    <Rule Id=\"IDE0020WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0021\" Action=\"None\" />\n    <Rule Id=\"IDE0022\" Action=\"None\" />\n    <Rule Id=\"IDE0023\" Action=\"None\" />\n    <Rule Id=\"IDE0024\" Action=\"None\" />\n    <Rule Id=\"IDE0025\" Action=\"None\" />\n    <Rule Id=\"IDE0026\" Action=\"None\" />\n    <Rule Id=\"IDE0027\" Action=\"None\" />\n    <Rule Id=\"IDE0028\" Action=\"None\" />\n    <Rule Id=\"IDE0028WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0029\" Action=\"None\" />\n    <Rule Id=\"IDE0029WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0030\" Action=\"None\" />\n    <Rule Id=\"IDE0030WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0031\" Action=\"None\" />\n    <Rule Id=\"IDE0031WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0034\" Action=\"None\" />\n    <Rule Id=\"IDE0034WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE1005\" Action=\"None\" />\n    <Rule Id=\"IDE1005WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE1006\" Action=\"None\" />\n    <Rule Id=\"IDE1006WithoutSuggestion\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.CodeAnalysis.Features\" RuleNamespace=\"Microsoft.CodeAnalysis.Features\">\n    <Rule Id=\"IDE0010\" Action=\"None\" />\n    <Rule Id=\"IDE0010WithoutSuggestion\" Action=\"None\" />\n    <Rule Id=\"IDE0033\" Action=\"None\" />\n    <Rule Id=\"IDE0033WithoutSuggestion\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.VisualStudio.Threading\" RuleNamespace=\"Microsoft.VisualStudio.Threading.Analyzers\">\n<Rule Id=\"VSTHRD001\" Action=\"None\" /><!-- Avoid legacy thread switching methods | Critical | [1st rule\" ../threading_rules.md#Rule1) | 🔡 Warning -->\n<Rule Id=\"VSTHRD002\" Action=\"None\" /><!-- Avoid problematic synchronous waits | Critical | [2nd rule\" ../threading_rules.md#Rule2) | Warning-->\n<Rule Id=\"VSTHRD003\" Action=\"None\" /><!-- Avoid awaiting foreign Tasks | Critical | [3rd rule\" ../threading_rules.md#Rule3) | Warning-->\n<Rule Id=\"VSTHRD004\" Action=\"None\" /><!-- Await SwitchToMainThreadAsync | Critical | [1st rule\" ../threading_rules.md#Rule1) | Error-->\n<Rule Id=\"VSTHRD010\" Action=\"None\" /><!-- Invoke single-threaded types on Main thread | Critical | [1st rule\" ../threading_rules.md#Rule1) | Warning-->\n<Rule Id=\"VSTHRD011\" Action=\"None\" /><!-- Use `AsyncLazy<T>` | Critical | [3rd rule\" ../threading_rules.md#Rule3) | Error-->\n<Rule Id=\"VSTHRD012\" Action=\"None\" /><!-- Provide JoinableTaskFactory where allowed | Critical | [All rules\" ../threading_rules.md) | Warning-->\n<Rule Id=\"VSTHRD100\" Action=\"None\" /><!-- Avoid `async void` methods | Advisory | | Warning-->\n<Rule Id=\"VSTHRD101\" Action=\"None\" /><!-- Avoid unsupported async delegates | Advisory | [VSTHRD100\" VSTHRD100.md) | Warning-->\n<Rule Id=\"VSTHRD102\" Action=\"None\" /><!-- Implement internal logic asynchronously | Advisory | [2nd rule\" ../threading_rules.md#Rule2) | Info-->\n<Rule Id=\"VSTHRD103\" Action=\"None\" /><!-- Call async methods when in an async method | Advisory | | Warning-->\n<Rule Id=\"VSTHRD104\" Action=\"None\" /><!-- Offer async option | Advisory | | Info-->\n<Rule Id=\"VSTHRD105\" Action=\"None\" /><!-- Avoid method overloads that assume `TaskScheduler.Current` | Advisory | | Warning-->\n<Rule Id=\"VSTHRD106\" Action=\"None\" /><!-- Use `InvokeAsync` to raise async events | Advisory | | Warning-->\n<Rule Id=\"VSTHRD107\" Action=\"None\" /><!-- Await Task within using expression | Advisory | | Error-->\n<Rule Id=\"VSTHRD108\" Action=\"None\" /><!-- Assert thread affinity unconditionally | Advisory | [1st rule\" ../threading_rules.md#Rule1), [VSTHRD010\" VSTHRD010.md) | Warning-->\n<Rule Id=\"VSTHRD109\" Action=\"None\" /><!-- Switch instead of assert in async methods | Advisory | [1st rule\" ../threading_rules.md#Rule1) | Error-->\n<Rule Id=\"VSTHRD110\" Action=\"None\" /><!-- Observe result of async calls | Advisory | | Warning-->\n<Rule Id=\"VSTHRD111\" Action=\"None\" /><!-- Use `.ConfigureAwait(bool)` | Advisory | | Hidden-->\n<Rule Id=\"VSTHRD112\" Action=\"None\" /><!-- Implement `System.IAsyncDisposable` | Advisory | | Info-->\n<Rule Id=\"VSTHRD113\" Action=\"None\" /><!-- Check for `System.IAsyncDisposable` | Advisory | | Info-->\n<Rule Id=\"VSTHRD114\" Action=\"None\" /><!-- Avoid returning null from a `Task`-returning method. | Advisory | | Warning-->\n<Rule Id=\"VSTHRD200\" Action=\"None\" /><!-- Use `Async` naming convention | Guideline | [VSTHRD103](VSTHRD103.md) | Warning-->\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "Tests/stylecop.json",
    "content": "﻿{\n    \"$schema\": \"https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json\",\n    \"settings\": {\n        \"indentation\": {\n            \"useTabs\": false,\n            \"indentationSize\": 4\n        },\n        \"documentationRules\": {\n            \"companyName\": \"Eremex\",\n            \"xmlHeader\": false,\n            \"documentationCulture\": \"ru-RU\",\n            \"documentInterfaces\": true,\n            \"documentExposedElements\": true,\n            \"documentInternalElements\": false,\n            \"documentPrivateElements\": false,\n            \"documentPrivateFields\": false,\n            \"copyrightText\": \"Copyright (c) {companyName}. All rights reserved.\\nLicensed under the {licenseName} license. See {licenseFile} file in the project root for full license information.\",\n            \"variables\": {\n                \"licenseName\": \"TODO\",\n                \"licenseFile\": \"LICENSE\"\n            }\n        },\n        \"layoutRules\": {\n            \"allowDoWhileOnClosingBrace\": true,\n            \"newlineAtEndOfFile\": \"allow\",\n            \"allowConsecutiveUsings\": true\n\n        },\n        \"orderingRules\": {\n            \"usingDirectivesPlacement\": \"outsideNamespace\",\n            \"systemUsingDirectivesFirst\": true\n        },\n        \"namingRules\": {\n            \"includeInferredTupleElementNames\": true,\n            \"tupleElementNameCasing\": \"camelCase\"\n        },\n        \"maintainabilityRules\": {\n            \"topLevelTypes\": [\n                \"class\",\n                \"interface\",\n                \"struct\",\n                \"enum\",\n                \"delegate\"\n            ]\n        }\n    }\n}"
  },
  {
    "path": "docs/charts.md",
    "content": "# Charts\r\n\r\nThe Eremex Controls Library for Avalonia UI includes powerful chart controls that help you visualize data as 2D charts. The chart controls' graphics rendering is optimized to display large data. The controls maintain high performance even when series contain millions of points.\r\n\r\n## CartesianChart\r\n\r\nAllows you to plot a diagram on a Cartesian coordinate system.\r\n\r\n![cartesianchart1](images/cartesianchart1.png)\r\n\r\n### Features\r\n\r\n- An unlimited number of data series within each chart\r\n- Supported series views: Line, Scatter Line, Point, Area, Step Line, Bar, Range Bar, Candlestick, and more.\r\n- Displaying multiple axes simultaneously\r\n- Swapping X and Y axes\r\n- Reversing axes\r\n- Available axis types: Numeric, Date-Time, Time Span, Qualitative, and Logarithmic\r\n- Scrolling and zooming a View (all axes at the same time)\r\n- Scrolling and zooming individual axes\r\n- High-performance when displaying large data\r\n- Real-time data visualization\r\n- Strips and constant lines\r\n- Empty points (gaps)\r\n- Using the MVVM design pattern to provide data and customize chart options\r\n- Displaying rapidly changing real-time data. Use a special data adapter to implement a moving viewport\r\n\r\n### Series Types\r\n\r\n* Line Series View\r\n* Scatter Line Series View\r\n* Point Series View (with SVG marker support)\r\n* Area Series View\r\n* Step Line Series View\r\n* Step Area Series View\r\n* Range Area Series View\r\n* Stacked Area Series View\r\n* Full-Stacked Area Series View\r\n* Bar Series View\r\n* Range Bar Series View \r\n* Candlestick Series View\r\n* Lollipop Series View\r\n\r\n### Documentation\r\n\r\n- [Cartesian Chart](https://eremexcontrols.net/controls/charts/cartesian-chart/)\r\n\r\n\r\n## PolarChart\r\n\r\nPlots a diagram on a polar coordinate system.\r\n\r\n![polarchart1](images/polarchart1.png)\r\n\r\n### Features\r\n\r\n- Crosshair\r\n- Strips and constant lines\r\n- Using the MVVM design pattern to provide data and customize chart options\r\n- Sweep direction and start angle (for the X axis)\r\n\r\n### Series Types\r\n\r\n- Point Series View\r\n- Line Series View\r\n- Scatter Line Series View\r\n- Area Series View\r\n- Range Area Series View\r\n\r\n## SmithChart\r\n\r\nAllows you to create a Smith chart.\r\n\r\n![smithchart1](images/smithchart1.png)\r\n\r\n### Features\r\n\r\n- Crosshair\r\n- Using the MVVM design pattern to provide data and customize chart options\r\n\r\n### Series Types\r\n\r\n- Point Series View\r\n- Scatter Line Series View\r\n\r\n## Documentation\r\n\r\n- [Charts](https://eremexcontrols.net/controls/charts/)\r\n\r\n"
  },
  {
    "path": "docs/commoncontrols.md",
    "content": "# Utility Controls\r\n\r\nThe Eremex Avalonia Controls library ships with many multi-purpose utility controls that help you address a broad range of tasks.\r\n\r\n![utility-controls](images/utility-controls.png)\r\n\r\n- `MxTabControl` — A control that allows you to combine panels into a tabbed UI.\r\n    - An unlimited number of tabs.\r\n    - Population of tabs and tab contents from an item source.\r\n    - Tab re-ordering via drag-and-drop.\r\n    - Tab layout modes: Stretch, Scroll and Multi-line.\r\n    - Tab 'Close' buttons.\r\n    - 'New Tab' button.\r\n    - Custom controls in the tab header area.\r\n    \r\n- `SplitContainerControl` — Separates two panels with a splitter.\r\n    - A user can drag the splitter to change size of the panels.\r\n    - Vertical or horizontal arrangement of the panels.\r\n    - Ability to collapse/expand one of the panels.\r\n    - An option to hide the splitter.\r\n\r\n- `ColorEditor` — A standalone control that allows a user to pick a color. \r\n    - The ColorEditor is used as part of the PopupColorEditor control, and it can be used as a standalone control as well.\r\n    - Three color palettes — Default, Standard, Custom.\r\n    - The Default color palette can be initialized in code.\r\n    - The Standard color palette displays predefined standard colors.\r\n    - The Custom color palette allows users to add and modify colors using the built-in Color Picker.\r\n    - Ability to specify colors in the RGB and HSB formats.\r\n\r\n- `CalendarControl` — A standalone control that allows a user to pick a date. \r\n    - The CalendarControl is used as part of the DateEditor control. You can use it as a standalone control as well.\r\n    - Date selection in the calendar using the mouse and keyboard.\r\n    - Navigation bar allows for browsing through months and years.\r\n    - Three calendar views: month view, year view, and year range view.\r\n    - An option to limit the available date range.\r\n\r\n- `GroupBox` — A container for a group of controls.\r\n    - Displays a customizable header.\r\n    - Displays a line below the client region.\r\n\r\n- `MxMessageBox` - Displays a message box as a modal window.\r\n    - The dialog can display a text message, an icon, and a set of standard buttons.\r\n    - Full support for the Eremex visual themes.\r\n    - Simple and consistent API.\r\n\r\n- `CircleProgressIndicator` - Displays the progress of an operation as a rotating circle.\r\n\r\n## Documentation\r\n\r\n- [Utility Controls](https://eremexcontrols.net/controls/utility-controls/)\r\n"
  },
  {
    "path": "docs/datagrid.md",
    "content": "# Data Grid\r\n\r\n`DataGridControl` allows you to display data from any data source in a column and row format. It provides high-performance data shaping and rich editing functionality. The control supports data sorting and grouping by any number of columns. The built-in auto-filter row and search panel allows a user to quickly locate data. You can embed any editor in grid cells to format and edit cell data in a specific manner.\r\n\r\n![data grid](images/data-grid.png)\r\n\r\n- Data Binding — You can bind the control to an IList, IBindingList, DataTable or any IEnumerable data source.\r\n- Data Sorting — Allows you to sort data against an unlimited number of columns.\r\n- Data Grouping — The data grouping feature combines rows with identical column values into the same data groups. You can group the control's data against multiple columns.\r\n- Styles — Allow you to customize the appearance settings of the control's elements in various states.\r\n- Data Edit Operations — A user can edit cell values if data editing is enabled. You can embed Eremex and custom editors in cells to edit and present cell values in a specific manner.\r\n- Data Validation — The validation mechanism helps you check a user's input and data source's values, and show errors in cells.\r\n- Built-in and Custom Context Menus.\r\n- Unbound Columns — You can add unbound columns (those that are not bound to data source fields) and populate them with data manually, using an event.\r\n- Column Resize and Move Operations.\r\n- Search Panel — Helps a user quickly locate rows by the data they contain.\r\n- Auto Filter Row — A special row that allows a user to filter data against columns.\r\n- Row Drag-and-Drop - A user can drag a row within the control and to another control.\r\n- Column Bands — Allow you to visually group multiple columns under a common header.\r\n- Fixed Columns — Allow specific columns to remain visible and anchored to the left or right edge of the control while other columns scroll horizontally.\r\n- Column Header Templates – Allow you to display custom content in column headers, including images.\r\n- Multiple Row Selection (Highlight) — You can enable multiple row selection mode to allow a user to select (highlight) multiple rows at one time.\r\n- Data Annotation Attribute Support — The DataGrid control takes into account dedicated Data Annotation attributes applied to the data source's properties. You can use Data Annotation attributes to specify custom visibility, position, read-only state, and display name for auto-generated columns.\r\n- High Performance for Large Volumes of Data — The data virtualization mechanism for vertical and horizontal scrolling boosts the control's performance when displaying large numbers of rows and columns.\r\n- Export to XLSX, PDF, CSV, and image formats\r\n\r\n## Documentation\r\n\r\n- [Data Grid](https://eremexcontrols.net/controls/datagrid/)\r\n"
  },
  {
    "path": "docs/docking.md",
    "content": "# Docking UI\r\n\r\nThe **Dock Manager** component shipped as part of the Eremex Avalonia Controls library allows you to implement the classic docking UI found in popular IDEs. You can create tool panels that support dock, auto-hide, and float operations. Special Document containers are designed to display the main content of your window. You can create multiple Documents and combine them in a tabbed UI.\r\n\r\n![docking-ui](images/docking-ui.png)\r\n\r\nThe main features of the Docking library include:\r\n\r\n- Visual Studio IDE-inspired UI\r\n- Document Switcher\r\n- Dockable tool panels\r\n- Floating panels\r\n- Panel auto-hide functionality\r\n- Runtime layout customization\r\n- Support for Documents (special containers used to display the main content of your window)\r\n- Tabbed UI\r\n- Built-in context commands\r\n- MVVM support\r\n- Serialization and deserialization mechanism\r\n\r\n## Documentation\r\n\r\n- [Docking UI](https://eremexcontrols.net/controls/docking/)\r\n"
  },
  {
    "path": "docs/editors.md",
    "content": "# Editors\r\n\r\nThe Eremex Controls library includes multiple editors that provide advanced data editing capabilities. The editors allow you to display and edit data of different data types (numeric, Boolean, date-time, enumerations, etc.). They support the data validation mechanism to inform users about errors during data input. \r\n\r\n![data-editors](images/data-editors.png)\r\n\r\nYou can embed the Eremex data editors in cells in container controls (Data Grid, Tree List, Property Grid, and Toolbars/Menus) to present and edit cell data. Any custom control can be embedded in container control cells, but the use of Eremex in-place editors allows you to deliver high-performance UI/UX designs.\r\n\r\n<br/>\r\n\r\n- `ComboBoxEditor` — Allows a user to select an item from an item list displayed in an associated popup window. \r\n   - Supported item sources: a list of strings, list of business objects, and an enumeration type.\r\n   - Support for data templates used to render items in a custom manner.\r\n   - Single and multiple item selection modes.\r\n   - Built-in check boxes in multiple selection mode.\r\n   - The text auto-completion feature predicts an item selection when a user starts typing text in the edit box in single selection mode.\r\n\r\n<br/>\r\n\r\n- `SegmentedEditor` — Displays segments (items), one of which can be selected by a user.\r\n    - Horizontal arrangement of segments.\r\n    - A user can click a segment to select it and unselect other segments.\r\n    - A Ctrl-click on a selected item clears the selection.\r\n    - Supported item sources: a list of strings, list of business objects, and an enumeration type.\r\n    - Use data templates to render items in a custom manner.\r\n\r\n<br/>\r\n\r\n- `ButtonEditor` —  A text editor with built-in buttons.\r\n    - Regular and toggle buttons.\r\n    - Displaying text and images in buttons.\r\n    - Right and left button alignment.\r\n    - Tooltips.\r\n    - Built-in 'x' button to clear the editor's value.\r\n    - Watermarks.\r\n\r\n<br/>\r\n\r\n- `CheckEditor` — Displays a check box which is toggled on a click.\r\n    - Supports two (checked and unchecked) or three check states (checked, unchecked and indeterminate).\r\n    - The validation mechanism modifies the appearance of the control to indicate errors.\r\n\r\n<br/>\r\n\r\n- `PopupColorEditor` — Allows a user to select a color in a popup window.\r\n    - Three color palettes — Default, Standard, Custom.\r\n    - The Default color palette can be initialized in code.\r\n    - The Standard color palette displays predefined standard colors.\r\n    - The Custom color palette allows users to add and modify colors using the built-in Color Picker.\r\n    - Ability to specify colors in the RGB and HSB formats.\r\n        \r\n<br/>\r\n\r\n- `DateEditor` — An editor with an embedded dropdown calendar that allows users to pick a date.\r\n    - Built-in 'Today' and 'Clear' buttons.\r\n    - Support for multiple date display formats.\r\n    - Navigation bar in the dropdown calendar allows for browsing through months and years.\r\n    - Three calendar views: month view, year view, and year range view.\r\n    - An option to limit the available date range.\r\n\r\n<br/>\r\n\r\n- `HyperlinkEditor` — Displays a clickable hyperlink.\r\n    - Allows you to specify a command to handle clicks on a hyperlink.\r\n\r\n<br/>\r\n\r\n- `PopupEditor` — A text editor with an associated popup window.\r\n    - Allows you to embed any control in the popup.\r\n\r\n<br/>\r\n\r\n- `SpinEditor` — Allows you to edit numeric values using spin buttons.\r\n    - Built-in spin buttons allow a user to increase and decrease a value.\r\n    - Limiting the available value range.\r\n    - Custom increment value.\r\n    - Displaying custom value prefix and suffix in the edit box.\r\n\r\n<br/>\r\n\r\n- `TextEditor` — A text editor featuring the base text editing functionality.\r\n    - The ancestor of all text-based Eremex editors.\r\n    - Support for the data validation mechanism used to show errors to users.\r\n\r\n<br/>\r\n\r\n- `MemoEditor`  — A dropdown text editor.\r\n    - A text editor embedded in the dropdown window.\r\n    - To show the presence of text in the dropdown editor, the control can display a special icon or the first line of the text in the edit box. \r\n\r\n\r\n## Common Features\r\n\r\n- Masks\r\n    - Text editors support masked input, which prevents users from entering invalid values.\r\n    - Masks can be used to format cell text in container controls in display mode (when text editing is not active).\r\n    - Supported mask types: Numeric and DateTime.\r\n    - DateEditor uses a DateTime input mask by default.\r\n    - SpinEditor uses a Numeric input mask by default.\r\n\r\n<br/>\r\n\r\n- Eremex Application Themes\r\n    - Eremex application themes allow you to modify the appearance of the Eremex controls.\r\n    - You can apply the Eremex application themes to a set of standard Avalonia controls.\r\n    - Eremex editors support the primary and secondary color variants for each theme. These color variants help you give a slightly different color accent to the editors by changing a single property.\r\n\r\n<br/>\r\n\r\n- Data Validation\r\n    - The built-in value validation mechanism allows you to show errors to users in all text editors and CheckEditor.\r\n    - Text editors can display validation errors within edit boxes or below them.\r\n\r\n## Documentation\r\n\r\n- [Editors](https://eremexcontrols.net/controls/editors/)\r\n"
  },
  {
    "path": "docs/graphics3dcontrol.md",
    "content": "# Graphics3DControl\n\n`Graphics3DControl` allows you to display an interactive 3D model (or multiple models) on a window in your Avalonia application. A user can rotate, pan and zoom the model using the mouse and keyboard.\n\n![Grpahics3DControl](images/graphics3dcontrol.png)\n\nUse dedicated classes to define a 3D model for the `Graphics3DControl`. These classes allow you to specify vertices, materials (in PBR format), camera, model transformations, etc.\n\nThe control's main features include:\n\n- API to specify 3D models\n- Simple materials \n- Textured materials in PBR format\n- Displaying multiple 3D models simultaneously\n- Perspective and isometric camera modes\n- Model rotation, panning and zooming with the mouse and keyboard at runtime\n- Rendering on a video card with the Vulkan SDK\n- MVVM pattern support for specifying 3D models\n\n## Documentation\n\n- [Graphics 3D Control](https://eremexcontrols.net/controls/graphics3dcontrol/)"
  },
  {
    "path": "docs/heatmap.md",
    "content": "# Heatmap\n\nThe **Heatmap** control visualizes numeric data in a matrix using color. Heatmaps are useful for visual analysis of large datasets and locating correlations and anomalies across two variables displayed along the horizontal and vertical axes. \nThe color of each data point in a heatmap is determined by the point's numeric value. \n\n\n![heatmap](images/heatmap.png)\n\n![heatmap - grayscale](images/heatmap-grayscale.png)\n\nThe **Heatmap** control's features include:\n\n- Custom color encoding\n- Grayscale colorization\n- Customization of the X and Y axes\n- Crosshair \n- Strips and constant lines\n- Scroll and zoom with the mouse\n- Export the result of the data colorization to a bitmap\n\n\n## Documentation\n\n- [Heatmap](https://eremexcontrols.net/controls/charts/heatmap/)\n"
  },
  {
    "path": "docs/propertygrid.md",
    "content": "# Property Grid\r\n\r\nThe `PropertyGridControl` allows a user to browse properties of a single or multiple objects. The control displays public properties and their values of a bound object(s) as a vertical list, and allows a user to edit the property values.\r\n\r\n![propertygrid](images/propertygrid.png)\r\n\r\nThe control's main features include:\r\n\r\n- Automatic Creation of Rows — The control can use information provided by the bound object(s) to automatically generate rows.\r\n- Manual Row Creation — You can manually create rows for a specific set of object properties.\r\n- Data Edit Operations — The control uses default Eremex editors to present and edit cell values of common data types. You can embed custom editors in cells to render and edit cell values in a specific manner.\r\n- Data Annotation Attribute Support — The PropertyGrid takes into account dedicated Data Annotation attributes applied to the bound object's properties. You can use Data Annotation attributes to specify custom visibility, read-only state, display name, category and type converter for auto-generated rows.\r\n- Category Rows — Allow you to combine rows into expandable groups.\r\n- Tab Rows — Allow you to combine rows into a tabbed UI.\r\n- Search Panel — Helps a user quickly locate rows by names\r\n\r\n## Documentation\r\n\r\n- [Property Grid](https://eremexcontrols.net/controls/propertygrid/)\r\n"
  },
  {
    "path": "docs/ribbon.md",
    "content": "# Ribbon\n\nThe **RibbonControl** control allows you to create a ribbon UI inspired by Microsoft Office products. The control supports two views - Classic and Simplified, which arrange items in three and one row, respectively. A user can switch between them with a dedicated view selection button.\n\n![ribbon](images/ribbon.png)\n\nThe Ribbon control's main features include:\n\n- Classic and Simplified views\n- Support for all types of items (commands) available in the [traditional menus](toolbars.md): regular buttons, check buttons, editors, labels, sub-menus and button groups.\n- In-place and popup item galleries\n- Quick Access Toolbar - A user can add frequently used commands to this toolbar at runtime from a context menu.\n- Customizing the Quick Access Toolbar position (above or below the Ribbon command panel) and visibility\n- Displaying items in the tab header area\n- Tab header colorization (allows you to highlight contextual tabs)\n- Ribbon item navigation with the keyboard\n- Adaptive layout of groups and items (adjusts the layout of commands when the Ribbon control's width changes)\n\n## Documentation\n\n- [Ribbon](https://eremexcontrols.net/controls/ribbon/)"
  },
  {
    "path": "docs/toolbars.md",
    "content": "# Toolbars and Menus\n\nThe Eremex Control Library includes the `ToolbarManager` component that helps you create a traditional Toolbar&amp;Menu UI in your application. The `ToolbarManager` offers rich capabilities to arrange and manage bars, create context menus, change toolbar view and behavior settings, and customize bars at runtime.\n\n![toolbars](images/toolbars.png)\n\nYou can use multiple bar items to create the menu UI: regular buttons, check buttons, editors, labels, sub-menus and group items.\n\nThe Eremex toolbar controls are user-customizable. Users can choose to display the commands they need. \n\nThe main features of the Toolbar&amp;Menu controls include:\n\n- User customization:\n    - Bar drag-and-drop — Allows a user to rearrange bars using drag thumbs.\n    - Customization mode and Customization Window — In the Customization Window, a user can change the visibility of existing toolbars, and create custom toolbars. A user can hide, restore, and move toolbar items using drag-and-drop operations.\n    - Quick customization — A user can move items within and between bars using drag-and-drop by holding the Alt key down. There is no need to activate customization mode/Customization Window to perform quick customization.\n\n- Numerous bar layout options:\n    - Horizontal and vertical directions of individual bars.\n    - Any position within a window.\n    - Bar stretching mode.\n    - Bar adaptive layout — Toolbars automatically hide and restore their items when the space they accommodate is changed.\n    - An option to show/hide bar drag thumbs.\n    - An option to show/hide bar customization buttons.\n    \n- Supported bar items: ButtonItem, CheckItem, TextItem, EditorItem, MenuItem, GroupItem, and CheckGroupItem.\n- Context menus — You can create context menus for external controls. The style settings of all Eremex context menus are consistent with other Eremex Toolbar&amp;Menu controls.\n\n## Documentation\n\n- [Toolbars and Menus](https://eremexcontrols.net/controls/toolbars-and-menus/)\n"
  },
  {
    "path": "docs/treelist.md",
    "content": "# TreeList and TreeView Controls\r\n\r\nThe Eremex Controls library includes two data-aware controls to display hierarchical data in the form of a tree — `TreeListControl` and `TreeViewControl`. They render data source items as hierarchical nodes (rows).\r\n\r\n`TreeList` control supports multiple columns:\r\n\r\n![treelist](images/treelist.png)\r\n\r\n\r\n`TreeView` control is a single-column component:\r\n\r\n![treeview](images/treeview.png)\r\n\r\n\r\n\r\n`TreeListControl` and `TreeViewControl` have one ancestor, so they share multiple features:\r\n\r\n- Data Binding — You can bind the controls to self-referential (flat) and hierarchical data sources.\r\n- Unbound Mode — Allows you to manually create the node structure.\r\n- Built-in Node Checkboxes — Allow you to select individual nodes.\r\n- Data Sorting — Allows you to sort sibling nodes in ascending or descending order. TreeList supports data sorting against one or multiple columns.\r\n- Node Images — Allow you to display custom images before cell values in the hierarchy column.\r\n- Styles — Allow you to customize the appearance settings of the controls' elements in various states.\r\n- Search Panel — Helps a user quickly locate nodes by the data they contain.\r\n- Data Edit Operations — A user can edit cell values if data editing is enabled. You can embed Eremex and custom editors in cells to edit and present cell values in a specific manner.\r\n- Data Validation — The validation mechanism helps you check a user's input and data source's values, and show errors in cells.\r\n- Built-in and Custom Context Menus\r\n- Data Annotation Attribute Support — The TreeList and TreeView controls take into account dedicated Data Annotation attributes applied to the data source's properties. You can use Data Annotation attributes to specify custom visibility, position, read-only state, and display name for auto-generated columns.\r\n- Node Drag-and-Drop - A user can drag a node within the control and to another control.\r\n- High Performance for Large Volumes of Data — The data virtualization mechanism for vertical and horizontal scrolling boosts the control's performance when displaying large numbers of rows and columns.\r\n\r\nTreeList-specific features include:\r\n\r\n- Unbound Columns — You can add unbound columns (those that are not bound to data source fields) and populate them with data manually, using an event.\r\n- Column Resize and Move Operations\r\n- Auto Filter Row — A special row that allows a user to filter data against columns.\r\n- Column Header Templates – Allow you to display custom content in column headers, including images.\r\n- Multiple Node Selection (Highlight) — You can enable multiple node selection mode to allow a user to select (highlight) multiple nodes at one time.\r\n- Column Bands — Allow you to visually group multiple columns under a common header.\r\n- Fixed Columns — Allow specific columns to remain visible and anchored to the left or right edge of the control while other columns scroll horizontally.\r\n- Export to XLSX, PDF, CSV, and image formats\r\n\r\n## Documentation\r\n\r\n- [TreeList and TreeView](https://eremexcontrols.net/controls/treelist/)\r\n"
  },
  {
    "path": "readme.md",
    "content": "# Eremex Avalonia UI Controls Demo Application\n\nThe Eremex Avalonia Controls Library includes a powerful collection of UI controls to help you deliver cutting-edge applications for the cross-platform Avalonia UI framework.\nThe advanced controls - from Data Grid and Tree List to Charts and Docking UI - provide rich capabilities to visualize, shape, edit data, create classic navigation interfaces, and more. \n\n\n[![Latest Library](https://img.shields.io/nuget/v/Eremex.Avalonia.Controls?label=Latest&nbsp;Library&logo=nuget)](https://www.nuget.org/packages/Eremex.Avalonia.Controls) \n[![Library Downloads](https://img.shields.io/nuget/dt/Eremex.Avalonia.Controls?label=Downloads)](https://www.nuget.org/packages/Eremex.Avalonia.Controls) \n[![Telegram En](https://img.shields.io/badge/chat-on_Telegram_(En)-E4287C)](https://t.me/emxControlsEn)\n[![Telegram Ru](https://img.shields.io/badge/chat-on_Telegram_(Ru)-FF33AA)](https://t.me/emxControls)\n![repo size](https://img.shields.io/github/repo-size/Eremex/controls-demo)\n\n## About\n\nThe current repository includes a Demo project that enables you to explore and test all the features of the Eremex Controls for Avalonia UI. The demo provides access to the fully functional version of the Eremex Controls Library, which you can use in your projects for evaluation purposes without time restrictions. Note that an unlicensed version of the Library displays trial messages.\n\nFor more details about the Controls Library, [purchasing and licensing options](#product-purchasing-and-licensing), or any other inquiries, please feel free to [contact us](#contact-us).\n\nIf you are developing an open-source project and wish to use the Eremex Controls library within it, you can apply for a free non-commercial license. See [Free Non-commercial Licenses for Open-Source Projects](#free-non-commercial-licenses-for-open-source-projects).\n\n\n[![Controls - Light Theme](docs/images/controls-light-v1.3-sm.png)](docs/images/controls-light-v1.3.png)\n  \n<!-- [![Controls - Dark Theme](docs/images/controls-dark-sm.png)](docs/images/controls-dark.png) -->\n\n## Get Started\n\n### Run Demo Online\n\nWe've created a WASM (WebAssembly) version of this Demo, which you can run directly in your browser. You can access it here:\n\n- [Online Demo](https://eremex.github.io/controls-demo/)\n\n\nCertain example modules are disabled in the Online Demo, including:\n- Examples that demonstrate features not supported in WASM (for instance, the 3D engine).\n- Examples not optimized for display and interaction in a web browser.\n\nKnown limitations: Hyperlinks are not supported.\n\n### Run Demo Offline\n\n- Clone the repository with the `git clone` command.\n- Go to the `DemoCenter/DemoCenter.Desktop` directory for a classic desktop application, or the `DemoCenter/DemoCenter.Web` directory for a Web Assembly project.\n- Run the selected project with the `dotnet run` command.\n\n### Create New Application\n\n- [Get Started with Eremex Avalonia UI Controls](https://eremexcontrols.net/get-started/)\n\n\n## Data Management Controls\n\n\n\n### Data Grid\n\nDisplays data from an item source as a two-dimensional table, providing rich data shaping and editing functionality.\n\n![thumb-datagrid](docs/images/thumb-datagrid.png) \n\n- Large data sources support\n- Unbound data\n- Data sorting and grouping\n- In-place editors\n- Column bands\n- Fixed (frozen) columns\n- Search and data filtration\n- Data validation\n- Row drag-and-drop\n- Built-in and custom context menus\n- Export to XLSX, PDF, CSV, and image formats\n- Styles\n\n[Learn more...](docs/datagrid.md)\n\n### Tree List and Tree View\n\nRenders hierarchical data in the form of a tree. Tree List supports multiple data columns, while Tree View is a single-column control.\n\n![thumb-treelist](docs/images/thumb-treelist.png) \n\n- Binding to self-referential (flat) and hierarchical data sources\n- Unbound mode (allows you to manually supply data)\n- Built-in node checkboxes for row selection\n- Data sorting\n- In-place editors\n- Column bands\n- Fixed (frozen) columns\n- Data search and filtering\n- Data validation\n- Row drag-and-drop\n- Built-in and custom context menus\n- Export to XLSX, PDF, CSV, and image formats\n- Styles\n\n[Learn more...](docs/treelist.md)\n\n### Property Grid\n\nAn efficient solution for browsing and editing properties of one or more objects.\n\n![thumb-propertygrid](docs/images/thumb-propertygrid.png)  \n\n- Automatic generation of rows from public properties of a bound object(s)\n- Manual row creation mode\n- Combining rows in categories\n- Combining rows in tabs\n- Search panel (for quick row location)\n- In-place editors\n\n[Learn more...](docs/propertygrid.md)\n\n\n\n## Data Visualization Controls\n\n### Chart Controls\n\nThe `CartesianChart`, `PolarChart` and `SmithChart` controls allow you to integrate the most popular interactive charts into your application's UI.\n\n![thumb-chartcontrol](docs/images/thumb-chartcontrol.png) \n\n- Displaying an unlimited number of data series simultaneously.\n- Supported series views: Line, Scatter Line, Point, Area, Step Line, Bar, Range Bar, Candlestick, and more.\n- Available axis types: Numeric, Date-Time, Time Span, Qualitative, and Logarithmic\n- Scrolling and zooming the entire view and individual axes\n- High-performance when displaying large data.\n- Real-time data visualization\n\n[Learn more...](docs/charts.md) \n\n\n### Heatmap\n\nThe Heatmap control allows you to create a two-dimensional [heat map](https://en.wikipedia.org/wiki/Heat_map), a chart that visualizes data using color. The control paints each data point within a 2D \"map\" with a color that corresponds to a value at this point.\n\n![thumb-chartcontrol](docs/images/thumb-heatmap.png) \n\n- Custom color encoding\n- Grayscale colorization\n- Customization of the X and Y axes\n- Crosshair \n- Strips and constant lines\n- Scroll and zoom with the mouse\n- Export the result of the data colorization to a bitmap\n\n[Learn more...](docs/charts.md) \n\n\n\n## Navigation and Layout Controls\n\n### Ribbon\n\nThe menu inspired by the ribbon UI found in Microsoft Office products.\n\n![thumb-ribbon](docs/images/thumb-ribbon.png) \n\n- Simplified and Classic views\n- Supported items: small and large buttons, toggle buttons, button groups, sub-menus, and more.\n- Inline and dropdown galleries\n- Quick Access Toolbar\n- Tab colorization\n- Keyboard navigation\n- Adaptive layout\n\n\n[Learn more...](docs/ribbon.md)\n\n### Toolbars and Menus\n\nTraditional toolbars and menus for your applications.\n\n![thumb-bars](docs/images/thumb-bars.png) \n\n- Supported toolbar item types: buttons, check buttons, sub-menus, item groups, and more\n- Docking toolbars at the edges of a container\n- Placing toolbars at any position within the window (for example, at the top of client controls)\n- Horizontal and vertical toolbar orientations\n- Adaptive layout of commands\n- Toolbar layout customization at runtime using drag-and-drop operations\n- Runtime customization mode for advanced toolbar personalization\n- Quick customization (without the need to activate customization mode)\n- Show values in toolbars, and allow users to edit them using in-place editors\n- Hotkey support, including complex shortcuts, such as Ctrl+R, Ctrl+K\n- Context menus for external controls\n\n[Learn more...](docs/toolbars.md)\n\n### Docking UI\n\nClassic docking interface inspired by the Microsoft Visual Studio IDE.\n\n![thumb-docking](docs/images/thumb-docking.png) \n\n- Dockable panels\n- Documents (embedded dock windows)\n- Floating panels\n- Document switcher\n- Panel auto-hide functionality\n- Tab containers\n- Panel resizing and drag-and-drop\n- Dock hints\n- Built-in context menus to perform operations on panels and Documents\n- MVVM support\n- Docking on multiple monitors\n- Save and restore layouts of dock panels between applicaion runs\n\n[Learn more...](docs/docking.md)\n\n\n## 3D Graphics\n\n### Graphics3DControl\n\n`Graphics3DControl` can visualize 3D models in your Avalonia applications.\n\n![thumb-docking](docs/images/thumb-graphics3dcontrol.png) \n\n- API to specify 3D models\n- Simple materials \n- Textured materials in PBR format\n- Displaying multiple 3D models simultaneously\n- Perspective and isometric camera modes\n- Model rotation, panning and zooming with the mouse and keyboard at runtime\n- Rendering on a video card with the Vulkan SDK\n- MVVM pattern support for specifying 3D models\n\n[Learn more...](docs/graphics3dcontrol.md)\n\n## Editors and Utility Controls\n\n### Data Editors\n\nSimple and advanced editors that allow users to edit almost everything - from text and numbers to date/time values and colors. You can use them as standalone controls, or as in-place editors.\n\n![thumb-editors](docs/images/thumb-editors.png)  \n\n- ButtonEditor\n- CheckEditor\n- ComboBoxEditor\n- DateEditor\n- HyperlinkEditor\n- MemoEditor\n- PopupColorEditor\n- SegmentedEditor\n- SpinEditor\n- TextEditor\n\n[Learn more...](docs/editors.md) \n\n### Utility Controls\n\nA collection of useful controls shipped with the Eremex Controls library allow you to create feature-rich applications.\n\n![thumb-utilitycontrols](docs/images/thumb-utilitycontrols.png) \n\n- SplitButton\n- TabControl\n- SplitContainerControl\n- GroupBox\n- CalendarControl\n- MxMessageBox\n- CircleProgressIndicator\n\n[Learn more...](docs/commoncontrols.md)\n\n\n## Themes\n\nThe Eremex Controls Library includes the following paint themes to render the controls shipped with the library:\n\n- 'DeltaDesign' paint theme (included in the `Eremex.Avalonia.Themes.DeltaDesign` package) — Contains visual settings for the Eremex Controls (except `Graphics3DControl`) and a set of standard Avalonia UI controls. \n- 'Controls3D' paint theme (included in the `Eremex.Avalonia.Controls3D` package) — Contains visual settings for the `Graphics3DControl`.\n\nThese paint themes support two theme variants that help you deliver interfaces with the light and dark color palettes. Please note that the 'DeltaDesign' theme also affects a set of standard Avalonia controls used in your project: Button, CalendarControl, CheckBox, Label, ListBox, ProgressBar, RadioButton, Slider, TextBox, ToolTip, and more.\n\n\n| **Light Theme Variant** | **Dark Theme Variant** |\n|---|---|\n| ![thumb-lighttheme](docs/images/thumb-lighttheme.png) | ![thumb-darktheme](docs/images/thumb-darktheme.png) |\n| ![thumb-lighttheme2](docs/images/thumb-lighttheme2.png) | ![thumb-darktheme2](docs/images/thumb-darktheme2.png) |\n\n\n\n## Supported Operating Systems\n\n**Windows**\n\n- Windows 11\n- Windows 10\n\n**Linux**\n\n- Ubuntu\n- Debian\n\n**Russian Linux-based OSs**\n\n- [ALT Linux <img src=\"docs/images/os-logo-alt_linux.svg\" height=30>](https://www.basealt.ru) \n- [Astra Linux <img src=\"docs/images/os-logo-astra_linux.svg\" height=30>](https://astralinux.ru) <sup>*</sup>\n- [RED OS <img src=\"docs/images/os-logo-RED_OS.png\" height=30>](https://redos.red-soft.ru) \n\n\n\n**macOS**\n\n**WebAssembly**\n\n## System Requirements\n\nThe following are system requirements to run the current Demo project, and use the Eremex Controls Library for Avalonia UI in your projects.\n\n- [.NET](https://dotnet.microsoft.com/en-us/download/dotnet) 8.0+\n- [Avalonia UI Framework](https://avaloniaui.net) v11.3.8+\n- Developement: IDEs that have Avalonia UI support (Visual Studio 2022 and higher, JetBrains Rider 2021.3 and higher).\n\n\n## Documentation\n\n- [English Documentation](https://eremexcontrols.net)\n- [Документация на Русском](https://eremexcontrols.net/ru/)\n\n## Product Purchasing and Licensing\n\nEach Eremex Controls license provides one year of product updates (including new features and fixes) and technical support. A license is required for each individual developer using the product.\n\n### License Types \n\n- Perpetual License\n    \n    - Includes one year of updates and support from the purchase date.\n    - After the first year, you retain the perpetual right to build and distribute applications (both existing and new) based on the licensed version.\n    - To continue receiving updates after the first year, purchase the \"EMX Controls Update Subscription Renewal for 1 Year\".\n\n- Annual License\n\n    - Includes one year of updates and support from the purchase date.\n    - After the license expires, you may continue to build and distribute applications that were created during the active license period.\n    - To develop new projects after license expiration, a new license must be purchased.\n\n- Update Subscription Renewal for 1 Year\n\n    - This product extends access to updates and technical support for one additional year for owners of a valid Perpetual License. \n\n\n### How to Purchase\n\nPurchasing options vary by region:\n\n- For customers in Russia, Belarus, Kazakhstan, Kyrgyzstan, and Armenia (EAEU):\n\n    - Visit our regional website: [eremexcontrols.ru](https://www.eremexcontrols.ru)\n    - Purchase via the official Softline store: [EMX Controls on Softline](https://store.softline.ru/eremex/biblioteka-kontrolov-emx-controls/)\n\n- For customers in all other countries:\n\n    - Visit our global website: [eremexcontrols.com](https://www.eremexcontrols.com)\n\n### License Agreement\n\nThe terms and conditions for using the EMX Controls Library are fully defined in the End-User License Agreement (EULA). Please review it before purchasing.\n\n- [EMX Controls End-User License Agreement (EULA)](https://eremexcontrols.net/licensing/eula/)\n\n\n### Free Non-commercial Licenses for Open-Source Projects\n\nTo support open-source development, we offer free non-commercial licenses. If you are the author of an open-source project and wish to use our library within it, you can apply for a non-commecial license using the following service:\n\n- [Apply for an open-source project license](https://eremexcontrols.net/open-source-licensing/)\n\nFor more information, please see:\n\n- [Licensing and Product Evaluation](https://eremexcontrols.net/licensing/)\n\n## Source Code of This Demo Project\n\nThe source code included in the current repository is distributed under the terms of the MIT license.\n\n## Contact Us\n\n### Website\n\nVisit our official website for pricing details and frequently asked questions:\n\n- https://eremexcontrols.ru (Русский)\n- https://eremexcontrols.com (English)\n\n### Telegram\n\nHave a question or feedback? Please contact us at: \n\n- https://t.me/emxControls (Русский)\n- https://t.me/emxControlsEn (English)\n\n\n## More Resources\n\n### Convert Windows Forms Applications to Avalonia UI\n\nThe `WinForms2AvaloniaConverter` tool helps you migrate your existing Windows Forms projects to Avalonia UI. The Converter can convert entire projects or individual files.\n\n- [WinForms2AvaloniaConverter](https://github.com/MICVGLOB/WinForms2AvaloniaConverter)\n\n## Eremex Avalonia UI Controls Gallery\n\n| <div style=\"width:400px\"></div> | <div style=\"width:400px\"></div> | \n| --- | --- | \n| **Data Grid (Dark Theme)** <br> [![Data Grid (Dark Theme)](docs/images/controls-gallery/datagrid-editorsmodule-darktheme-sm.png)](docs/images/controls-gallery/datagrid-editorsmodule-darktheme.png) | **Data Grid (Light Theme)** <br> [![Data Grid (Light Theme)](docs/images/controls-gallery/datagrid-editorsmodule-grouping-lighttheme-sm.png)](docs/images/controls-gallery/datagrid-editorsmodule-grouping-lighttheme.png) | \n| **Data Grid - Grouping** <br> [![Data Grid - Grouping](docs/images/controls-gallery/datagrid-grouping-lighttheme-sm.png)](docs/images/controls-gallery/datagrid-grouping-lighttheme.png) | **Tree List (Light Theme)** <br> [![Tree List (Light Theme)](docs/images/controls-gallery/treelist-lighttheme-sm.png)](docs/images/controls-gallery/treelist-lighttheme.png) | \n| **Tree List (Dark Theme)** <br> [![Tree List (Dark Theme)](docs/images/controls-gallery/treelist-search-darktheme-sm.png)](docs/images/controls-gallery/treelist-search-darktheme.png) | **Tree List - Data Searching** <br> [![Tree List - Data Searching](docs/images/controls-gallery/treelist-search-lighttheme-sm.png)](docs/images/controls-gallery/treelist-search-lighttheme.png) |\n| **Toolbars&Menus (Dark Theme)** <br> [![Toolbars&Menus (Dark Theme)](docs/images/controls-gallery/bars-darktheme-sm.png)](docs/images/controls-gallery/bars-darktheme.png) | **Toolbars&Menus (Light Theme)** <br> [![bars](docs/images/controls-gallery/bars-sm.png)](docs/images/controls-gallery/bars-sm.png) | \n| **Editors** <br> [![Editors](docs/images/controls-gallery/editors-sm.png)](docs/images/controls-gallery/editors.png) | **Tab Control** <br> [![Tab Control](docs/images/controls-gallery/utilitycontrols-darktheme-sm.png)](docs/images/controls-gallery/utilitycontrols-darktheme.png) |\n| **Property Grid** <br> [![Property Grid](docs/images/controls-gallery/propertyGrid-sm.png)](docs/images/controls-gallery/propertyGrid.png) | **Property Grid - Inplace Editing** <br> [![Property Grid - Inplace Editing](docs/images/controls-gallery/propertyGrid-inplaceeditor-sm.png)](docs/images/controls-gallery/propertyGrid-inplaceeditor.png) |\n| **Docking (Dark Theme)** <br> [![Docking (Dark Theme)](docs/images/controls-gallery/docking-darktheme-sm.png)](docs/images/controls-gallery/docking-darktheme.png) | **Docking (Light Theme)** <br> [![Docking (Light Theme)](docs/images/controls-gallery/docking-lighttheme-sm.png)](docs/images/controls-gallery/docking-lighttheme.png) | \n| **Charts** <br> [![Charts](docs/images/controls-gallery/chart-axes-lighttheme-sm.png)](docs/images/controls-gallery/chart-axes-lighttheme.png) | **Charts (Logarithmic)** <br> [![Charts (logarithmic)](docs/images/controls-gallery/charts-logarithmic-sm.png)](docs/images/controls-gallery/charts-logarithmic.png) | \n| **Charts (Real-Time Data)** <br> [![Charts (Real-time data)](docs/images/controls-gallery/charts-realtimedata-sm.png)](docs/images/controls-gallery/charts-realtimedata.png) | |\n"
  }
]