diff --git a/.editorconfig b/.editorconfig index 89389c81f..59d9a3a3e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,128 +1,16 @@ -[*.{cs,vb}] - -# IDE0003: Remove qualification -dotnet_diagnostic.IDE0003.severity = silent - -# CS0659: Type overrides Object.Equals(object o) but does not override Object.GetHashCode() -dotnet_diagnostic.CS0659.severity = none - -[*.{cs,vb}] -#### Naming styles #### - -# Naming rules - -dotnet_naming_rule.interface_should_be_begins_with_i.severity = error -dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface -dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i - -dotnet_naming_rule.types_should_be_pascal_case.severity = error -dotnet_naming_rule.types_should_be_pascal_case.symbols = types -dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = error -dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members -dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case - -# Symbol specifications - -dotnet_naming_symbols.interface.applicable_kinds = interface -dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interface.required_modifiers = - -dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum -dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types.required_modifiers = - -dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method -dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.non_field_members.required_modifiers = - -# Naming styles - -dotnet_naming_style.begins_with_i.required_prefix = I -dotnet_naming_style.begins_with_i.required_suffix = -dotnet_naming_style.begins_with_i.word_separator = -dotnet_naming_style.begins_with_i.capitalization = pascal_case - -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = -dotnet_naming_style.pascal_case.capitalization = pascal_case - -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = -dotnet_naming_style.pascal_case.capitalization = pascal_case -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion -dotnet_style_prefer_auto_properties = true:silent -dotnet_style_object_initializer = true:suggestion -dotnet_style_operator_placement_when_wrapping = beginning_of_line -tab_width = 4 -indent_size = 4 -end_of_line = crlf -dotnet_style_collection_initializer = true:suggestion -dotnet_style_prefer_simplified_boolean_expressions = true:suggestion -dotnet_style_prefer_conditional_expression_over_assignment = true:silent -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_prefer_conditional_expression_over_return = true:silent -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_compound_assignment = true:suggestion -dotnet_style_prefer_simplified_interpolation = true:suggestion -dotnet_style_namespace_match_folder = true:suggestion -dotnet_style_readonly_field = true:suggestion -dotnet_style_predefined_type_for_locals_parameters_members = true:silent -dotnet_style_predefined_type_for_member_access = true:silent -dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent -dotnet_style_allow_multiple_blank_lines_experimental = true:silent -dotnet_style_allow_statement_immediately_after_block_experimental = true:silent -dotnet_code_quality_unused_parameters = all:warning -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent - -# IDE0003: Remove qualification -dotnet_style_qualification_for_field = false - -[*.cs] -csharp_using_directive_placement = outside_namespace:silent -csharp_prefer_simple_using_statement = true:suggestion -csharp_prefer_braces = true:silent -csharp_style_namespace_declarations = block_scoped:silent -csharp_style_prefer_method_group_conversion = true:silent -csharp_style_expression_bodied_methods = false:silent -csharp_style_expression_bodied_constructors = false:silent -csharp_style_expression_bodied_operators = false:silent -csharp_style_expression_bodied_properties = true:silent -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_accessors = true:silent -csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_local_functions = false:silent -csharp_indent_labels = one_less_than_current -csharp_space_around_binary_operators = before_and_after -csharp_style_throw_expression = true:suggestion -csharp_style_prefer_null_check_over_type_check = true:suggestion -csharp_prefer_simple_default_expression = true:suggestion -csharp_style_prefer_local_over_anonymous_function = true:suggestion -csharp_style_prefer_index_operator = true:suggestion -csharp_style_prefer_range_operator = true:suggestion -csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion -csharp_style_prefer_tuple_swap = true:suggestion -csharp_style_inlined_variable_declaration = true:suggestion -csharp_style_deconstructed_variable_declaration = true:suggestion -csharp_style_unused_value_assignment_preference = discard_variable:suggestion -csharp_style_unused_value_expression_statement_preference = discard_variable:silent -csharp_prefer_static_local_function = true:suggestion -csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent -csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent -csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent -csharp_style_conditional_delegate_call = true:suggestion -csharp_style_prefer_parameter_null_checking = true:suggestion -csharp_style_prefer_switch_expression = true:suggestion -csharp_style_prefer_pattern_matching = true:silent -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_prefer_not_pattern = true:suggestion \ No newline at end of file +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe077042..000000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index e75fc2e90..6f2921d27 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,24 +1,42 @@ -name: Deploy to Github Pages +name: Deploy to Github Pages on: push: branches: - - dev -# schedule: -# - cron: '0 0 * * *' + - 'pages' + +env: + TARGET_DIR: dist/analog/public jobs: - github-pages: + build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v2 - with: - path: vendor/bundle - key: ${{ runner.os }}-gems-v2-${{ hashFiles('**/Gemfile') }} - restore-keys: | - ${{ runner.os }}-gems-v2 - - uses: helaili/jekyll-action@v2 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} - target_branch: gh-pages + node-version: '20.x' + - name: Set environment variable based on branch + run: | + if [[ $GITHUB_REF == refs/heads/pages ]]; then + echo "Branch is main or master. Setting DRY_RUN_OPTION to empty." + echo "DRY_RUN_OPTION=" >> $GITHUB_ENV + else + echo "Branch is not main or master. Setting DRY_RUN_OPTION to '--dry-run'." + echo "DRY_RUN_OPTION=--dry-run" >> $GITHUB_ENV + fi + - name: Install + run: npm ci + - name: Build + run: npm run build + - name: Deploy Website (gh-pages branch) + env: + GH_TOKEN: ${{ secrets.CUSTOM_GITHUB_TOKEN }} # A token must be created to be able to deploy on the gh-pages branch + CNAME_OPTION: --cname=race.elementfuture.com # omit if your not running it on a custom domain + run: | + echo "DRY_RUN_OPTION=$DRY_RUN_OPTION" + git config user.email "reinierklarenberg@gmail.com" + git config user.name "Reinier Klarenberg" + npx angular-cli-ghpages --no-silent --dir="${{env.TARGET_DIR}}" $CNAME_OPTION $DRY_RUN_OPTION + + diff --git a/.gitignore b/.gitignore index 426d76ddc..5c9de1e59 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,47 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +/.nx/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db + ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## @@ -97,302 +141,4 @@ StyleCopReport.xml *.pidb *.svclog *.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml +/.nx diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..77b374577 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..57dbf761e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,19 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:5173/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..a298b5bd8 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + } + ] +} diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 701e920cc..000000000 --- a/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -source 'https://rubygems.org' - -gem 'jekyll-dash', '~> 2.4' -gem 'jekyll-sass-converter', '~> 2.0' -gem 'liquid-md5' -gem 'jekyll-tagging' diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 6a9f4fe47..000000000 --- a/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md index b0daac3ee..684df4a42 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,26 @@ -# ![Race Element - Name](https://user-images.githubusercontent.com/4581237/209894151-3f8a5dc5-45de-4d7c-a46a-8c5a2a57cd91.png) +# Analog App +This project was generated with [Analog](https://analogjs.org), the fullstack meta-framework for Angular. -[![Build status](https://ci.appveyor.com/api/projects/status/wnbn1pdscccqwegg?svg=true)](https://ci.appveyor.com/project/RiddleTime/race-element) -[![Discord](https://badgen.net/discord/members/26AAEW5mUq?icon=discord&color=5562ea&label=Race%20Element)](https://discord.gg/26AAEW5mUq) -[![Hits](https://hits.seeyoufarm.com/api/count/keep/badge.svg?url=https%3A%2F%2Fgithub.com%2FRiddleTime%2FRace-Element&count_bg=%23FF4500&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=Usage%3A+Today+%2F+All-time&edge_flat=false)](https://hits.seeyoufarm.com) +## Setup -Provides tooling for Sim Racing -- HUDs -- Telemetry -- Setups -- Liveries -- Racing Tools +Run `npm install` to install the application dependencies. -[Download Latest Release](https://github.com/RiddleTime/Race-Element/releases/latest) +## Development +Run `npm start` for a dev server. Navigate to `http://localhost:5173/`. The application automatically reloads if you change any of the source files. -### Requires .NET Framework 4.8 -[https://dotnet.microsoft.com/en-us/download/dotnet-framework/net48](https://dotnet.microsoft.com/en-us/download/dotnet-framework/net48) +## Build -### Frameworks -- WPF -- [MaterialDesign In Xaml Toolkit](https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit) -- [LiteDB](https://github.com/mbdavid/LiteDB) -- [ScottPlot](https://github.com/scottplot/scottplot) +Run `npm run build` to build the client/server project. The client build artifacts are located in the `dist/analog/public` directory. The server for the API build artifacts are located in the `dist/analog/server` directory. + +## Test + +Run `npm run test` to run unit tests with [Vitest](https://vitest.dev). + +## Community + +- Visit and Star the [GitHub Repo](https://github.com/analogjs/analog) +- Join the [Discord](https://chat.analogjs.org) +- Follow us on [Twitter](https://twitter.com/analogjs) +- Become a [Sponsor](https://github.com/sponsors/brandonroberts) diff --git a/Race Element.sln b/Race Element.sln deleted file mode 100644 index 1e0ceed39..000000000 --- a/Race Element.sln +++ /dev/null @@ -1,191 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.1.32328.378 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element", "Race_Element\Race Element.csproj", "{DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element.HUD", "Race_Element.HUD\Race Element.HUD.csproj", "{3717A55E-4629-40ED-9C93-24058D9EF18C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element.HUD.ACC", "Race_Element.HUD.ACC\Race Element.HUD.ACC.csproj", "{F1699F70-54A1-49F2-896D-B70B1EDABF74}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element.SharedMemory", "Race_Element.SharedMemory\Race Element.SharedMemory.csproj", "{9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element.Util", "Race_Element.Util\Race Element.Util.csproj", "{AAB23116-299B-415B-8305-96CB86148CE7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element.Data.ACC", "Race_Element.Data.ACC\Race Element.Data.ACC.csproj", "{BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element.Broadcast", "Race_Element.Broadcast\Race Element.Broadcast.csproj", "{840220BD-8469-4A04-A6EC-1ED2BC743EFB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6CD0A8A8-EC7F-4626-AF60-EB41B5C990CE}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Race Element.Hardware", "Race_Element.Hardware\Race Element.Hardware.csproj", "{8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug Minimized|Any CPU = Debug Minimized|Any CPU - Debug Minimized|x64 = Debug Minimized|x64 - Debug Minimized|x86 = Debug Minimized|x86 - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug Minimized|Any CPU.ActiveCfg = Debug Minimized|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug Minimized|Any CPU.Build.0 = Debug Minimized|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug Minimized|x64.ActiveCfg = Debug Minimized|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug Minimized|x64.Build.0 = Debug Minimized|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug Minimized|x86.ActiveCfg = Debug Minimized|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug Minimized|x86.Build.0 = Debug Minimized|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug|x64.ActiveCfg = Debug|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug|x64.Build.0 = Debug|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug|x86.ActiveCfg = Debug|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Debug|x86.Build.0 = Debug|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Release|Any CPU.Build.0 = Release|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Release|x64.ActiveCfg = Release|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Release|x64.Build.0 = Release|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Release|x86.ActiveCfg = Release|Any CPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9}.Release|x86.Build.0 = Release|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug Minimized|Any CPU.ActiveCfg = Debug Minimized|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug Minimized|Any CPU.Build.0 = Debug Minimized|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug Minimized|x64.ActiveCfg = Debug Minimized|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug Minimized|x64.Build.0 = Debug Minimized|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug Minimized|x86.ActiveCfg = Debug Minimized|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug Minimized|x86.Build.0 = Debug Minimized|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug|x64.ActiveCfg = Debug|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug|x64.Build.0 = Debug|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug|x86.ActiveCfg = Debug|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Debug|x86.Build.0 = Debug|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Release|Any CPU.Build.0 = Release|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Release|x64.ActiveCfg = Release|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Release|x64.Build.0 = Release|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Release|x86.ActiveCfg = Release|Any CPU - {3717A55E-4629-40ED-9C93-24058D9EF18C}.Release|x86.Build.0 = Release|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug Minimized|Any CPU.ActiveCfg = Debug Minimized|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug Minimized|Any CPU.Build.0 = Debug Minimized|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug Minimized|x64.ActiveCfg = Debug Minimized|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug Minimized|x64.Build.0 = Debug Minimized|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug Minimized|x86.ActiveCfg = Debug Minimized|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug Minimized|x86.Build.0 = Debug Minimized|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug|x64.ActiveCfg = Debug|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug|x64.Build.0 = Debug|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug|x86.ActiveCfg = Debug|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Debug|x86.Build.0 = Debug|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Release|Any CPU.Build.0 = Release|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Release|x64.ActiveCfg = Release|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Release|x64.Build.0 = Release|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Release|x86.ActiveCfg = Release|Any CPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74}.Release|x86.Build.0 = Release|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug Minimized|Any CPU.ActiveCfg = Debug Minimized|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug Minimized|Any CPU.Build.0 = Debug Minimized|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug Minimized|x64.ActiveCfg = Debug Minimized|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug Minimized|x64.Build.0 = Debug Minimized|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug Minimized|x86.ActiveCfg = Debug Minimized|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug Minimized|x86.Build.0 = Debug Minimized|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug|x64.ActiveCfg = Debug|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug|x64.Build.0 = Debug|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug|x86.ActiveCfg = Debug|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Debug|x86.Build.0 = Debug|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Release|Any CPU.Build.0 = Release|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Release|x64.ActiveCfg = Release|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Release|x64.Build.0 = Release|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Release|x86.ActiveCfg = Release|Any CPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F}.Release|x86.Build.0 = Release|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug Minimized|Any CPU.ActiveCfg = Debug Minimized|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug Minimized|Any CPU.Build.0 = Debug Minimized|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug Minimized|x64.ActiveCfg = Debug Minimized|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug Minimized|x64.Build.0 = Debug Minimized|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug Minimized|x86.ActiveCfg = Debug Minimized|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug Minimized|x86.Build.0 = Debug Minimized|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug|x64.ActiveCfg = Debug|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug|x64.Build.0 = Debug|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug|x86.ActiveCfg = Debug|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Debug|x86.Build.0 = Debug|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Release|Any CPU.Build.0 = Release|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Release|x64.ActiveCfg = Release|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Release|x64.Build.0 = Release|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Release|x86.ActiveCfg = Release|Any CPU - {AAB23116-299B-415B-8305-96CB86148CE7}.Release|x86.Build.0 = Release|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug Minimized|Any CPU.ActiveCfg = Debug Minimized|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug Minimized|Any CPU.Build.0 = Debug Minimized|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug Minimized|x64.ActiveCfg = Debug Minimized|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug Minimized|x64.Build.0 = Debug Minimized|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug Minimized|x86.ActiveCfg = Debug Minimized|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug Minimized|x86.Build.0 = Debug Minimized|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug|x64.ActiveCfg = Debug|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug|x64.Build.0 = Debug|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug|x86.ActiveCfg = Debug|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Debug|x86.Build.0 = Debug|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Release|Any CPU.Build.0 = Release|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Release|x64.ActiveCfg = Release|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Release|x64.Build.0 = Release|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Release|x86.ActiveCfg = Release|Any CPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE}.Release|x86.Build.0 = Release|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug Minimized|Any CPU.ActiveCfg = Debug Minimized|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug Minimized|Any CPU.Build.0 = Debug Minimized|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug Minimized|x64.ActiveCfg = Debug Minimized|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug Minimized|x64.Build.0 = Debug Minimized|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug Minimized|x86.ActiveCfg = Debug Minimized|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug Minimized|x86.Build.0 = Debug Minimized|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug|x64.ActiveCfg = Debug|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug|x64.Build.0 = Debug|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug|x86.ActiveCfg = Debug|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Debug|x86.Build.0 = Debug|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Release|Any CPU.Build.0 = Release|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Release|x64.ActiveCfg = Release|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Release|x64.Build.0 = Release|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Release|x86.ActiveCfg = Release|Any CPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB}.Release|x86.Build.0 = Release|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug Minimized|Any CPU.ActiveCfg = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug Minimized|Any CPU.Build.0 = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug Minimized|x64.ActiveCfg = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug Minimized|x64.Build.0 = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug Minimized|x86.ActiveCfg = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug Minimized|x86.Build.0 = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug|x64.ActiveCfg = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug|x64.Build.0 = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug|x86.ActiveCfg = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Debug|x86.Build.0 = Debug|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Release|Any CPU.Build.0 = Release|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Release|x64.ActiveCfg = Release|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Release|x64.Build.0 = Release|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Release|x86.ActiveCfg = Release|Any CPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D4FB11E1-6550-4E3D-B2CE-4346D74712F8} - EndGlobalSection -EndGlobal diff --git a/Race_Element.Broadcast/ACCUdpRemoteClient.cs b/Race_Element.Broadcast/ACCUdpRemoteClient.cs deleted file mode 100644 index d655f1022..000000000 --- a/Race_Element.Broadcast/ACCUdpRemoteClient.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Threading.Tasks; - -namespace RaceElement.Broadcast -{ - public class ACCUdpRemoteClient : IDisposable - { - private UdpClient _client; - private Task _listenerTask; - public BroadcastingNetworkProtocol MessageHandler { get; } - public string IpPort { get; } - public string DisplayName { get; } - public string ConnectionPassword { get; } - public string CommandPassword { get; } - public int MsRealtimeUpdateInterval { get; } - - /// - /// To get the events delivered inside the UI thread, just create this object from the UI thread/synchronization context. - /// - public ACCUdpRemoteClient(string ip, int port, string displayName, string connectionPassword, string commandPassword, int msRealtimeUpdateInterval) - { - IpPort = $"{ip}:{port}"; - MessageHandler = new BroadcastingNetworkProtocol(IpPort, Send); - _client = new UdpClient(new IPEndPoint(IPAddress.Loopback, 0)); - _client.Connect(ip, port); - - DisplayName = displayName; - ConnectionPassword = connectionPassword; - CommandPassword = commandPassword; - MsRealtimeUpdateInterval = msRealtimeUpdateInterval; - - _listenerTask = ConnectAndRun(); - } - - private void Send(byte[] payload) - { - if (_client != null) - _client.Send(payload, payload.Length); - } - - public void Shutdown() - { - ShutdownAsnyc().ContinueWith(t => - { - if (t.Exception?.InnerExceptions?.Any() == true) - System.Diagnostics.Debug.WriteLine($"Broadcast Client shut down with {t.Exception.InnerExceptions.Count} errors"); - //else - //System.Diagnostics.Debug.WriteLine("Client shut down asynchronously"); - - }); - } - - public async Task ShutdownAsnyc() - { - if (_client == null) - return; - - if (_listenerTask != null && !_listenerTask.IsCompleted) - { - MessageHandler.Disconnect(); - _client.Close(); - _client = null; - await _listenerTask; - } - } - - private async Task ConnectAndRun() - { - MessageHandler.RequestConnection(DisplayName, ConnectionPassword, MsRealtimeUpdateInterval, CommandPassword); - while (_client != null) - { - try - { - var udpPacket = await _client.ReceiveAsync(); - using (var ms = new System.IO.MemoryStream(udpPacket.Buffer)) - using (var reader = new System.IO.BinaryReader(ms)) - { - MessageHandler.ProcessMessage(reader); - } - } - catch (ObjectDisposedException) - { - // Shutdown happened - break; - } - catch (Exception) - { - // Other exceptions - //System.Diagnostics.Debug.WriteLine(ex); - } - } - } - - #region IDisposable Support - private bool disposedValue = false; // To detect redundant calls - - protected virtual void Dispose(bool disposing) - { - if (!disposedValue) - { - if (disposing) - { - try - { - if (_client != null) - { - _client.Close(); - _client.Dispose(); - _client = null; - } - - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex); - } - } - - // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. - // TODO: set large fields to null. - - disposedValue = true; - } - } - - // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. - // ~ACCUdpRemoteClient() { - // // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - // Dispose(false); - // } - - // This code added to correctly implement the disposable pattern. - public void Dispose() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(true); - // TODO: uncomment the following line if the finalizer is overridden above. - // GC.SuppressFinalize(this); - } - #endregion - } -} diff --git a/Race_Element.Broadcast/BroadcastConfig.cs b/Race_Element.Broadcast/BroadcastConfig.cs deleted file mode 100644 index bde306f44..000000000 --- a/Race_Element.Broadcast/BroadcastConfig.cs +++ /dev/null @@ -1,81 +0,0 @@ -using RaceElement.Util; -using Newtonsoft.Json; -using System; -using System.Diagnostics; -using System.IO; - -namespace RaceElement.Broadcast -{ - public class BroadcastConfig - { - public class Root - { - [JsonProperty("updListenerPort")] - public int UpdListenerPort { get; set; } - [JsonProperty("connectionPassword")] - public string ConnectionPassword { get; set; } - [JsonProperty("commandPassword")] - public string CommandPassword { get; set; } - } - - private static string _lock = String.Empty; - - public static Root GetConfiguration() - { - lock (_lock) - { - FileInfo broadcastingConfig = new FileInfo(FileUtil.AccConfigPath + "broadcasting.json"); - - if (broadcastingConfig.Exists) - { - try - { - using (FileStream fileStream = broadcastingConfig.OpenRead()) - { - Root config = GetConfiguration(fileStream); - - if (config.UpdListenerPort == 0) - { - config.UpdListenerPort = 9000; - File.WriteAllText(broadcastingConfig.FullName, JsonConvert.SerializeObject(config, Formatting.Indented)); - LogWriter.WriteToLog($"Auto-Changed the port number in \"{FileUtil.AccConfigPath}broadcasting.json\" from 0 to 9000."); - } - - return config; - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - } - } - return null; - } - - - private static Root GetConfiguration(Stream stream) - { - string jsonString = string.Empty; - try - { - using (StreamReader reader = new StreamReader(stream)) - { - jsonString = reader.ReadToEnd(); - jsonString = jsonString.Replace("\0", ""); - reader.Close(); - stream.Close(); - } - - return JsonConvert.DeserializeObject(jsonString); - } - catch (Exception e) - { - Debug.WriteLine(e); - } - - return null; - } - - } -} diff --git a/Race_Element.Broadcast/BroadcastingEnums.cs b/Race_Element.Broadcast/BroadcastingEnums.cs deleted file mode 100644 index b934428af..000000000 --- a/Race_Element.Broadcast/BroadcastingEnums.cs +++ /dev/null @@ -1,153 +0,0 @@ -namespace RaceElement.Broadcast -{ - public enum DriverCategory - { - Platinum = 3, - Gold = 2, - Silver = 1, - Bronze = 0, - Error = 255 - } - - public enum LapType - { - ERROR = 0, - Outlap = 1, - Regular = 2, - Inlap = 3 - } - - public enum CarLocationEnum - { - NONE = 0, - Track = 1, - Pitlane = 2, - PitEntry = 3, - PitExit = 4 - } - - public enum SessionPhase - { - NONE = 0, - Starting = 1, - PreFormation = 2, - FormationLap = 3, - PreSession = 4, - Session = 5, - SessionOver = 6, - PostSession = 7, - ResultUI = 8 - }; - public enum RaceSessionType - { - Practice = 0, - Qualifying = 4, - Superpole = 9, - Race = 10, - Hotlap = 11, - Hotstint = 12, - HotlapSuperpole = 13, - Replay = 14 - }; - - public enum BroadcastingCarEventType - { - None = 0, - GreenFlag = 1, - SessionOver = 2, - PenaltyCommMsg = 3, - Accident = 4, - LapCompleted = 5, - BestSessionLap = 6, - BestPersonalLap = 7 - }; - - public enum NationalityEnum - { - Any = 0, - Italy = 1, - Germany = 2, - France = 3, - Spain = 4, - GreatBritain = 5, - Hungary = 6, - Belgium = 7, - Switzerland = 8, - Austria = 9, - Russia = 10, - Thailand = 11, - Netherlands = 12, - Poland = 13, - Argentina = 14, - Monaco = 15, - Ireland = 16, - Brazil = 17, - SouthAfrica = 18, - PuertoRico = 19, - Slovakia = 20, - Oman = 21, - Greece = 22, - SaudiArabia = 23, - Norway = 24, - Turkey = 25, - SouthKorea = 26, - Lebanon = 27, - Armenia = 28, - Mexico = 29, - Sweden = 30, - Finland = 31, - Denmark = 32, - Croatia = 33, - Canada = 34, - China = 35, - Portugal = 36, - Singapore = 37, - Indonesia = 38, - USA = 39, - NewZealand = 40, - Australia = 41, - SanMarino = 42, - UAE = 43, - Luxembourg = 44, - Kuwait = 45, - HongKong = 46, - Colombia = 47, - Japan = 48, - Andorra = 49, - Azerbaijan = 50, - Bulgaria = 51, - Cuba = 52, - CzechRepublic = 53, - Estonia = 54, - Georgia = 55, - India = 56, - Israel = 57, - Jamaica = 58, - Latvia = 59, - Lithuania = 60, - Macau = 61, - Malaysia = 62, - Nepal = 63, - NewCaledonia = 64, - Nigeria = 65, - NorthernIreland = 66, - PapuaNewGuinea = 67, - Philippines = 68, - Qatar = 69, - Romania = 70, - Scotland = 71, - Serbia = 72, - Slovenia = 73, - Taiwan = 74, - Ukraine = 75, - Venezuela = 76, - Wales = 77, - Iran = 78, - Bahrain = 79, - Zimbabwe = 80, - ChineseTaipei = 81, - Chile = 82, - Uruguay = 83, - Madagascar = 84 - }; -} diff --git a/Race_Element.Broadcast/BroadcastingNetworkProtocol.cs b/Race_Element.Broadcast/BroadcastingNetworkProtocol.cs deleted file mode 100644 index 6569b1d22..000000000 --- a/Race_Element.Broadcast/BroadcastingNetworkProtocol.cs +++ /dev/null @@ -1,524 +0,0 @@ -using RaceElement.Broadcast.Structs; -using RaceElement.Util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; - -namespace RaceElement.Broadcast -{ - public enum OutboundMessageTypes : byte - { - REGISTER_COMMAND_APPLICATION = 1, - UNREGISTER_COMMAND_APPLICATION = 9, - - REQUEST_ENTRY_LIST = 10, - REQUEST_TRACK_DATA = 11, - - CHANGE_HUD_PAGE = 49, - CHANGE_FOCUS = 50, - INSTANT_REPLAY_REQUEST = 51, - - PLAY_MANUAL_REPLAY_HIGHLIGHT = 52, // TODO, but planned - SAVE_MANUAL_REPLAY_HIGHLIGHT = 60 // TODO, but planned: saving manual replays gives distributed clients the possibility to see the play the same replay - } - - public enum InboundMessageTypes : byte - { - REGISTRATION_RESULT = 1, - REALTIME_UPDATE = 2, - REALTIME_CAR_UPDATE = 3, - ENTRY_LIST = 4, - ENTRY_LIST_CAR = 6, - TRACK_DATA = 5, - BROADCASTING_EVENT = 7 - } - - public class BroadcastingNetworkProtocol - { - public const int BROADCASTING_PROTOCOL_VERSION = 4; - private string ConnectionIdentifier { get; } - private SendMessageDelegate Send { get; } - public int ConnectionId { get; private set; } - public float TrackMeters { get; private set; } - - internal delegate void SendMessageDelegate(byte[] payload); - - #region Events - - public delegate void ConnectionStateChangedDelegate(int connectionId, bool connectionSuccess, bool isReadonly, string error); - public event ConnectionStateChangedDelegate OnConnectionStateChanged; - - public delegate void TrackDataUpdateDelegate(string sender, TrackData trackUpdate); - public event TrackDataUpdateDelegate OnTrackDataUpdate; - - public delegate void EntryListUpdateDelegate(string sender, CarInfo car); - public event EntryListUpdateDelegate OnEntrylistUpdate; - - public delegate void RealtimeUpdateDelegate(string sender, RealtimeUpdate update); - public event RealtimeUpdateDelegate OnRealtimeUpdate; - - public delegate void RealtimeCarUpdateDelegate(string sender, RealtimeCarUpdate carUpdate); - public event RealtimeCarUpdateDelegate OnRealtimeCarUpdate; - - public delegate void BroadcastingEventDelegate(string sender, BroadcastingEvent evt); - public event BroadcastingEventDelegate OnBroadcastingEvent; - - - - #endregion - - #region EntryList handling - - // To avoid huge UDP pakets for longer entry lists, we will first receive the indexes of cars and drivers, - // cache the entries and wait for the detailled updates - List _entryListCars = new List(); - - #endregion - - #region optional failsafety - detect when we have a desync and need a new entry list - - DateTime lastEntrylistRequest = DateTime.Now; - - #endregion - - internal BroadcastingNetworkProtocol(string connectionIdentifier, SendMessageDelegate sendMessageDelegate) - { - if (string.IsNullOrEmpty(connectionIdentifier)) - throw new ArgumentNullException(nameof(connectionIdentifier), $"No connection identifier set; we use this to distinguish different connections. Using the remote IP:Port is a good idea"); - - if (sendMessageDelegate == null) - throw new ArgumentNullException(nameof(sendMessageDelegate), $"The protocol class doesn't know anything about the network layer; please put a callback we can use to send data via UDP"); - - ConnectionIdentifier = connectionIdentifier; - Send = sendMessageDelegate; - } - - internal void ProcessMessage(BinaryReader br) - { - try - { - // Any message starts with an 1-byte command type - var messageType = (InboundMessageTypes)br.ReadByte(); - switch (messageType) - { - case InboundMessageTypes.REGISTRATION_RESULT: - { - ConnectionId = br.ReadInt32(); - var connectionSuccess = br.ReadByte() > 0; - var isReadonly = br.ReadByte() == 0; - var errMsg = ReadString(br); - - OnConnectionStateChanged?.Invoke(ConnectionId, connectionSuccess, isReadonly, errMsg); - - // In case this was successful, we will request the initial data - RequestEntryList(); - RequestTrackData(); - } - break; - case InboundMessageTypes.ENTRY_LIST: - { - _entryListCars.Clear(); - - var connectionId = br.ReadInt32(); - var carEntryCount = br.ReadUInt16(); - for (int i = 0; i < carEntryCount; i++) - { - _entryListCars.Add(new CarInfo(br.ReadUInt16())); - } - } - break; - case InboundMessageTypes.ENTRY_LIST_CAR: - { - - var carId = br.ReadUInt16(); - - var carInfo = _entryListCars.SingleOrDefault(x => x.CarIndex == carId); - if (carInfo == null) - { - //System.Diagnostics.Debug.WriteLine($"Entry list update for unknown carIndex {carId}"); - break; - } - - carInfo.CarModelType = br.ReadByte(); // Byte sized car model - carInfo.TeamName = ReadString(br); - carInfo.RaceNumber = br.ReadInt32(); - carInfo.CupCategory = br.ReadByte(); // Cup: Overall/Pro = 0, ProAm = 1, Am = 2, Silver = 3, National = 4 - carInfo.CurrentDriverIndex = br.ReadByte(); - carInfo.Nationality = (NationalityEnum)br.ReadUInt16(); - - // Now the drivers on this car: - var driversOnCarCount = br.ReadByte(); - for (int di = 0; di < driversOnCarCount; di++) - { - var driverInfo = new DriverInfo(); - - driverInfo.FirstName = ReadString(br); - driverInfo.LastName = ReadString(br); - driverInfo.ShortName = ReadString(br); - driverInfo.Category = (DriverCategory)br.ReadByte(); // Platinum = 3, Gold = 2, Silver = 1, Bronze = 0 - - // new in 1.13.11: - driverInfo.Nationality = (NationalityEnum)br.ReadUInt16(); - - carInfo.AddDriver(driverInfo); - } - - OnEntrylistUpdate?.Invoke(ConnectionIdentifier, carInfo); - } - break; - case InboundMessageTypes.REALTIME_UPDATE: - { - RealtimeUpdate update = new RealtimeUpdate(); - update.EventIndex = (int)br.ReadUInt16(); - update.SessionIndex = (int)br.ReadUInt16(); - update.SessionType = (RaceSessionType)br.ReadByte(); - update.Phase = (SessionPhase)br.ReadByte(); - var sessionTime = br.ReadSingle(); - update.SessionTime = TimeSpan.FromMilliseconds(sessionTime); - var sessionEndTime = br.ReadSingle(); - update.SessionEndTime = TimeSpan.FromMilliseconds(sessionEndTime); - - update.FocusedCarIndex = br.ReadInt32(); - update.ActiveCameraSet = ReadString(br); - update.ActiveCamera = ReadString(br); - update.CurrentHudPage = ReadString(br); - - update.IsReplayPlaying = br.ReadByte() > 0; - if (update.IsReplayPlaying) - { - update.ReplaySessionTime = br.ReadSingle(); - update.ReplayRemainingTime = br.ReadSingle(); - } - - update.TimeOfDay = TimeSpan.FromMilliseconds(br.ReadSingle()); - update.AmbientTemp = br.ReadByte(); - update.TrackTemp = br.ReadByte(); - update.Clouds = br.ReadByte() / 10.0f; - update.RainLevel = br.ReadByte() / 10.0f; - update.Wetness = br.ReadByte() / 10.0f; - - update.BestSessionLap = ReadLap(br); - - OnRealtimeUpdate?.Invoke(ConnectionIdentifier, update); - } - break; - case InboundMessageTypes.REALTIME_CAR_UPDATE: - { - RealtimeCarUpdate carUpdate = new RealtimeCarUpdate(); - - carUpdate.CarIndex = br.ReadUInt16(); - carUpdate.DriverIndex = br.ReadUInt16(); // Driver swap will make this change - carUpdate.DriverCount = br.ReadByte(); - carUpdate.Gear = br.ReadByte() - 2; // -2 makes the R -1, N 0 and the rest as-is - carUpdate.Heading = br.ReadSingle(); - carUpdate.WorldPosX = br.ReadSingle(); - carUpdate.WorldPosY = br.ReadSingle(); - carUpdate.CarLocation = (CarLocationEnum)br.ReadByte(); // - , Track, Pitlane, PitEntry, PitExit = 4 - carUpdate.Kmh = br.ReadUInt16(); - carUpdate.Position = br.ReadUInt16(); // official P/Q/R position (1 based) - carUpdate.CupPosition = br.ReadUInt16(); // official P/Q/R position (1 based) - carUpdate.TrackPosition = br.ReadUInt16(); // position on track (1 based) - carUpdate.SplinePosition = br.ReadSingle(); // track position between 0.0 and 1.0 - carUpdate.Laps = br.ReadUInt16(); - - carUpdate.Delta = br.ReadInt32(); // Realtime delta to best session lap - carUpdate.BestSessionLap = ReadLap(br); - carUpdate.LastLap = ReadLap(br); - carUpdate.CurrentLap = ReadLap(br); - - // the concept is: "don't know a car or driver? ask for an entry list update" - var carEntry = _entryListCars.FirstOrDefault(x => x.CarIndex == carUpdate.CarIndex); - if (carEntry == null || carEntry.Drivers.Count != carUpdate.DriverCount) - { - if ((DateTime.Now - lastEntrylistRequest).TotalSeconds > 1) - { - lastEntrylistRequest = DateTime.Now; - RequestEntryList(); - //System.Diagnostics.Debug.WriteLine($"CarUpdate {carUpdate.CarIndex}|{carUpdate.DriverIndex} not know, will ask for new EntryList"); - } - } - else - { - OnRealtimeCarUpdate?.Invoke(ConnectionIdentifier, carUpdate); - } - } - break; - case InboundMessageTypes.TRACK_DATA: - { - var connectionId = br.ReadInt32(); - var trackData = new TrackData(); - - trackData.TrackName = ReadString(br); - trackData.TrackId = br.ReadInt32(); - trackData.TrackMeters = br.ReadInt32(); - TrackMeters = trackData.TrackMeters > 0 ? trackData.TrackMeters : -1; - - trackData.CameraSets = new Dictionary>(); - - var cameraSetCount = br.ReadByte(); - for (int camSet = 0; camSet < cameraSetCount; camSet++) - { - var camSetName = ReadString(br); - trackData.CameraSets.Add(camSetName, new List()); - - var cameraCount = br.ReadByte(); - for (int cam = 0; cam < cameraCount; cam++) - { - var cameraName = ReadString(br); - trackData.CameraSets[camSetName].Add(cameraName); - } - } - - var hudPages = new List(); - var hudPagesCount = br.ReadByte(); - for (int i = 0; i < hudPagesCount; i++) - { - hudPages.Add(ReadString(br)); - } - trackData.HUDPages = hudPages; - - OnTrackDataUpdate?.Invoke(ConnectionIdentifier, trackData); - } - break; - case InboundMessageTypes.BROADCASTING_EVENT: - { - BroadcastingEvent evt = new BroadcastingEvent() - { - Type = (BroadcastingCarEventType)br.ReadByte(), - Msg = ReadString(br), - TimeMs = br.ReadInt32(), - CarId = br.ReadInt32(), - }; - - evt.CarData = _entryListCars.FirstOrDefault(x => x.CarIndex == evt.CarId); - OnBroadcastingEvent?.Invoke(ConnectionIdentifier, evt); - } - break; - default: - break; - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - Debug.WriteLine(ex); - } - } - - /// - /// Laps are always sent in a common way, it makes sense to have a shared function to parse them - /// - private static LapInfo ReadLap(BinaryReader br) - { - var lap = new LapInfo(); - lap.LaptimeMS = br.ReadInt32(); - - lap.CarIndex = br.ReadUInt16(); - lap.DriverIndex = br.ReadUInt16(); - - var splitCount = br.ReadByte(); - for (int i = 0; i < splitCount; i++) - lap.Splits.Add(br.ReadInt32()); - - lap.IsInvalid = br.ReadByte() > 0; - lap.IsValidForBest = br.ReadByte() > 0; - - var isOutlap = br.ReadByte() > 0; - var isInlap = br.ReadByte() > 0; - - if (isOutlap) - lap.Type = LapType.Outlap; - else if (isInlap) - lap.Type = LapType.Inlap; - else - lap.Type = LapType.Regular; - - // Now it's possible that this is "no" lap that doesn't even include a - // first split, we can detect this by comparing with int32.Max - while (lap.Splits.Count < 3) - { - lap.Splits.Add(null); - } - - // "null" entries are Int32.Max, in the C# world we can replace this to null - for (int i = 0; i < lap.Splits.Count; i++) - if (lap.Splits[i] == Int32.MaxValue) - lap.Splits[i] = null; - - if (lap.LaptimeMS == Int32.MaxValue) - lap.LaptimeMS = null; - - return lap; - } - - private static string ReadString(BinaryReader br) - { - var length = br.ReadUInt16(); - var bytes = br.ReadBytes(length); - return Encoding.UTF8.GetString(bytes); - } - - private static void WriteString(BinaryWriter bw, string s) - { - var bytes = Encoding.UTF8.GetBytes(s); - bw.Write(Convert.ToUInt16(bytes.Length)); - bw.Write(bytes); - } - - /// - /// Will try to register this client in the targeted ACC instance. - /// Needs to be called once, before anything else can happen. - /// - /// - /// - /// - internal void RequestConnection(string displayName, string connectionPassword, int msRealtimeUpdateInterval, string commandPassword) - { - using (var ms = new MemoryStream()) - using (var br = new BinaryWriter(ms)) - { - br.Write((byte)OutboundMessageTypes.REGISTER_COMMAND_APPLICATION); // First byte is always the command type - br.Write((byte)BROADCASTING_PROTOCOL_VERSION); - - WriteString(br, displayName); - WriteString(br, connectionPassword); - br.Write(msRealtimeUpdateInterval); - WriteString(br, commandPassword); - - Send(ms.ToArray()); - } - } - - internal void Disconnect() - { - using (var ms = new MemoryStream()) - using (var br = new BinaryWriter(ms)) - { - br.Write((byte)OutboundMessageTypes.UNREGISTER_COMMAND_APPLICATION); // First byte is always the command type - Send(ms.ToArray()); - } - } - - - /// - /// Will ask the ACC client for an updated entry list, containing all car and driver data. - /// The client will send this automatically when something changes; however if you detect a carIndex or driverIndex, this may cure the - /// problem for future updates - /// - private void RequestEntryList() - { - using (var ms = new MemoryStream()) - using (var br = new BinaryWriter(ms)) - { - br.Write((byte)OutboundMessageTypes.REQUEST_ENTRY_LIST); // First byte is always the command type - br.Write((int)ConnectionId); - - Send(ms.ToArray()); - } - } - - private void RequestTrackData() - { - using (var ms = new MemoryStream()) - using (var br = new BinaryWriter(ms)) - { - br.Write((byte)OutboundMessageTypes.REQUEST_TRACK_DATA); // First byte is always the command type - br.Write((int)ConnectionId); - - Send(ms.ToArray()); - } - } - - public void SetFocus(UInt16 carIndex) - { - SetFocusInternal(carIndex, null, null); - } - - /// - /// Always put both cam + cam set; even if it doesn't make sense - /// - public void SetCamera(string cameraSet, string camera) - { - SetFocusInternal(null, cameraSet, camera); - } - - public void SetFocus(UInt16 carIndex, string cameraSet, string camera) - { - SetFocusInternal(carIndex, cameraSet, camera); - } - - /// - /// Sends the request to change the focused car and/or the camera used. - /// The idea is that this often wants to be triggered together, so this is a all-in-one function. - /// This way we can make sure the switch happens in the same frame, even in more complex scenarios - /// - private void SetFocusInternal(UInt16? carIndex, string cameraSet, string camera) - { - using (var ms = new MemoryStream()) - using (var bw = new BinaryWriter(ms)) - { - bw.Write((byte)OutboundMessageTypes.CHANGE_FOCUS); // First byte is always the command type - bw.Write((int)ConnectionId); - - if (!carIndex.HasValue) - { - bw.Write((byte)0); // No change of focused car - } - else - { - bw.Write((byte)1); - bw.Write((UInt16)(carIndex.Value)); - } - - if (string.IsNullOrEmpty(cameraSet) || string.IsNullOrEmpty(camera)) - { - bw.Write((byte)0); // No change of camera set or camera - } - else - { - bw.Write((byte)1); - WriteString(bw, cameraSet); - WriteString(bw, camera); - } - - Send(ms.ToArray()); - } - } - - public void RequestInstantReplay(float startSessionTime, float durationMS, int initialFocusedCarIndex = -1, string initialCameraSet = "", string initialCamera = "") - { - using (var ms = new MemoryStream()) - using (var bw = new BinaryWriter(ms)) - { - bw.Write((byte)OutboundMessageTypes.INSTANT_REPLAY_REQUEST); // First byte is always the command type - bw.Write((int)ConnectionId); - - bw.Write((float)startSessionTime); - bw.Write((float)durationMS); - bw.Write((int)initialFocusedCarIndex); - - WriteString(bw, initialCameraSet); - WriteString(bw, initialCamera); - - Send(ms.ToArray()); - } - } - - public void RequestHUDPage(string hudPage) - { - using (var ms = new MemoryStream()) - using (var bw = new BinaryWriter(ms)) - { - bw.Write((byte)OutboundMessageTypes.CHANGE_HUD_PAGE); // First byte is always the command type - bw.Write((int)ConnectionId); - - WriteString(bw, hudPage); - - Send(ms.ToArray()); - } - } - } -} diff --git a/Race_Element.Broadcast/Properties/AssemblyInfo.cs b/Race_Element.Broadcast/Properties/AssemblyInfo.cs deleted file mode 100644 index 985ba540e..000000000 --- a/Race_Element.Broadcast/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("RaceElement.Broadcast")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("RaceElement.Broadcast")] -[assembly: AssemblyCopyright("Copyright © 2022")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("840220bd-8469-4a04-a6ec-1ed2bc743efb")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Race_Element.Broadcast/Race Element.Broadcast.csproj b/Race_Element.Broadcast/Race Element.Broadcast.csproj deleted file mode 100644 index 9555f184f..000000000 --- a/Race_Element.Broadcast/Race Element.Broadcast.csproj +++ /dev/null @@ -1,74 +0,0 @@ - - - - - Debug - AnyCPU - {840220BD-8469-4A04-A6EC-1ED2BC743EFB} - Library - Properties - RaceElement.Broadcast - RaceElement.Broadcast - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\Debug Minimized\ - DEBUG;TRACE - full - AnyCPU - 7.3 - prompt - - - - ..\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - - - - - - - - - - - {AAB23116-299B-415B-8305-96CB86148CE7} - Race Element.Util - - - - \ No newline at end of file diff --git a/Race_Element.Broadcast/Structs/BroadcastingEvent.cs b/Race_Element.Broadcast/Structs/BroadcastingEvent.cs deleted file mode 100644 index 62980e2f8..000000000 --- a/Race_Element.Broadcast/Structs/BroadcastingEvent.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace RaceElement.Broadcast.Structs -{ - public struct BroadcastingEvent - { - public BroadcastingCarEventType Type { get; internal set; } - public string Msg { get; internal set; } - public int TimeMs { get; internal set; } - public int CarId { get; internal set; } - public CarInfo CarData { get; internal set; } - } -} diff --git a/Race_Element.Broadcast/Structs/CarInfo.cs b/Race_Element.Broadcast/Structs/CarInfo.cs deleted file mode 100644 index 15016ef31..000000000 --- a/Race_Element.Broadcast/Structs/CarInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; - -namespace RaceElement.Broadcast.Structs -{ - public class CarInfo - { - public ushort CarIndex { get; } - public byte CarModelType { get; protected internal set; } - public string TeamName { get; protected internal set; } - public int RaceNumber { get; protected internal set; } - public byte CupCategory { get; protected internal set; } - public int CurrentDriverIndex { get; protected internal set; } - public IList Drivers { get; } = new List(); - public NationalityEnum Nationality { get; protected internal set; } - - public CarInfo(ushort carIndex) - { - CarIndex = carIndex; - } - - internal void AddDriver(DriverInfo driverInfo) - { - Drivers.Add(driverInfo); - } - - public string GetCurrentDriverName() - { - if (CurrentDriverIndex < Drivers.Count) - return Drivers[CurrentDriverIndex].LastName; - return "nobody(?)"; - } - } -} diff --git a/Race_Element.Broadcast/Structs/ConnectionState.cs b/Race_Element.Broadcast/Structs/ConnectionState.cs deleted file mode 100644 index c77f3776f..000000000 --- a/Race_Element.Broadcast/Structs/ConnectionState.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace RaceElement.Broadcast.Structs -{ - public struct ConnectionState - { - public int ConnectionId { get; set; } - public bool ConnectionSuccess { get; set; } - public bool IsReadonly { get; set; } - public string Error { get; set; } - } -} diff --git a/Race_Element.Broadcast/Structs/DriverInfo.cs b/Race_Element.Broadcast/Structs/DriverInfo.cs deleted file mode 100644 index 205daaa36..000000000 --- a/Race_Element.Broadcast/Structs/DriverInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace RaceElement.Broadcast.Structs -{ - public struct DriverInfo - { - public string FirstName { get; internal set; } - public string LastName { get; internal set; } - public string ShortName { get; internal set; } - public DriverCategory Category { get; internal set; } - public NationalityEnum Nationality { get; internal set; } - } -} diff --git a/Race_Element.Broadcast/Structs/LapInfo.cs b/Race_Element.Broadcast/Structs/LapInfo.cs deleted file mode 100644 index 809c6652a..000000000 --- a/Race_Element.Broadcast/Structs/LapInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; - -namespace RaceElement.Broadcast.Structs -{ - public class LapInfo - { - public int? LaptimeMS { get; internal set; } - public List Splits { get; } = new List(); - public ushort CarIndex { get; internal set; } - public ushort DriverIndex { get; internal set; } - public bool IsInvalid { get; internal set; } - public bool IsValidForBest { get; internal set; } - public LapType Type { get; internal set; } - - public override string ToString() - { - return $"{LaptimeMS, 5}|{string.Join("|", Splits)}"; - } - } -} diff --git a/Race_Element.Broadcast/Structs/RealtimeCarUpdate.cs b/Race_Element.Broadcast/Structs/RealtimeCarUpdate.cs deleted file mode 100644 index f084d602a..000000000 --- a/Race_Element.Broadcast/Structs/RealtimeCarUpdate.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace RaceElement.Broadcast.Structs -{ - public struct RealtimeCarUpdate - { - public int CarIndex { get; internal set; } - public int DriverIndex { get; internal set; } - public int Gear { get; internal set; } - public float Heading { get; internal set; } - public float WorldPosX { get; internal set; } - public float WorldPosY { get; internal set; } - public CarLocationEnum CarLocation { get; internal set; } - public int Kmh { get; internal set; } - public int Position { get; internal set; } - public int TrackPosition { get; internal set; } - public float SplinePosition { get; set; } - public int Delta { get; internal set; } - public LapInfo BestSessionLap { get; internal set; } - public LapInfo LastLap { get; internal set; } - public LapInfo CurrentLap { get; internal set; } - public int Laps { get; internal set; } - public ushort CupPosition { get; internal set; } - public byte DriverCount { get; internal set; } - } -} diff --git a/Race_Element.Broadcast/Structs/RealtimeUpdate.cs b/Race_Element.Broadcast/Structs/RealtimeUpdate.cs deleted file mode 100644 index 13a6c8413..000000000 --- a/Race_Element.Broadcast/Structs/RealtimeUpdate.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; - -namespace RaceElement.Broadcast.Structs -{ - public struct RealtimeUpdate - { - public int EventIndex { get; internal set; } - public int SessionIndex { get; internal set; } - public SessionPhase Phase { get; internal set; } - public TimeSpan SessionTime { get; internal set; } - public TimeSpan RemainingTime { get; internal set; } - public TimeSpan TimeOfDay { get; internal set; } - public float RainLevel { get; internal set; } - public float Clouds { get; internal set; } - public float Wetness { get; internal set; } - public LapInfo BestSessionLap { get; internal set; } - public ushort BestLapCarIndex { get; internal set; } - public ushort BestLapDriverIndex { get; internal set; } - public int FocusedCarIndex { get; internal set; } - public string ActiveCameraSet { get; internal set; } - public string ActiveCamera { get; internal set; } - public bool IsReplayPlaying { get; internal set; } - public float ReplaySessionTime { get; internal set; } - public float ReplayRemainingTime { get; internal set; } - public TimeSpan SessionRemainingTime { get; internal set; } - public TimeSpan SessionEndTime { get; internal set; } - public RaceSessionType SessionType { get; internal set; } - public byte AmbientTemp { get; internal set; } - public byte TrackTemp { get; internal set; } - public string CurrentHudPage { get; internal set; } - } -} diff --git a/Race_Element.Broadcast/Structs/TrackData.cs b/Race_Element.Broadcast/Structs/TrackData.cs deleted file mode 100644 index 4c2db6d3e..000000000 --- a/Race_Element.Broadcast/Structs/TrackData.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; - -namespace RaceElement.Broadcast.Structs -{ - public struct TrackData - { - public string TrackName { get; internal set; } - public int TrackId { get; internal set; } - public float TrackMeters { get; internal set; } - public Dictionary> CameraSets { get; internal set; } - public IEnumerable HUDPages { get; internal set; } - } -} diff --git a/Race_Element.Broadcast/packages.config b/Race_Element.Broadcast/packages.config deleted file mode 100644 index 4de699c93..000000000 --- a/Race_Element.Broadcast/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Race_Element.Data.ACC/AccidentList/AccidentListTracker.cs b/Race_Element.Data.ACC/AccidentList/AccidentListTracker.cs deleted file mode 100644 index 530508e7a..000000000 --- a/Race_Element.Data.ACC/AccidentList/AccidentListTracker.cs +++ /dev/null @@ -1,258 +0,0 @@ -using RaceElement.Broadcast; -using RaceElement.Broadcast.Structs; -using RaceElement.Data.ACC.Tracker; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace RaceElement.Data.ACC.AccidentList -{ - public sealed class AccidentListTracker - { - - public event EventHandler OnAccident; - - private static AccidentListTracker _instance; - private RealtimeUpdate _realtimeUpdate; - private float _trackDistance; - private DateTime _accidentTime = DateTime.MinValue; - - // History of realtime car updates - // Maps session time to a map of carID and realTimeInfo - private Dictionary> _realTimeCarHistory = new Dictionary>(); - - // store all incoming broadcast accident events with the corresponding real time car update - private List _unprocessedAccidents = new List(); - - public static AccidentListTracker Instance - { - get - { - if (_instance == null) _instance = new AccidentListTracker(); - return _instance; - } - private set { _instance = value; } - } - - internal void Start() - { - BroadcastTracker.Instance.OnRealTimeCarUpdate += RealTimeCarUpdate_EventHandler; - BroadcastTracker.Instance.OnRealTimeUpdate += RealTimeUpdate_EventHandler; - BroadcastTracker.Instance.OnBroadcastEvent += BroadcastEvent_EventHandler; - BroadcastTracker.Instance.OnTrackDataUpdate += TrackDataUpdate_EventHandler; - } - - internal void Stop() - { - BroadcastTracker.Instance.OnRealTimeCarUpdate -= RealTimeCarUpdate_EventHandler; - BroadcastTracker.Instance.OnRealTimeUpdate -= RealTimeUpdate_EventHandler; - BroadcastTracker.Instance.OnBroadcastEvent -= BroadcastEvent_EventHandler; - BroadcastTracker.Instance.OnTrackDataUpdate -= TrackDataUpdate_EventHandler; - } - - private void BroadcastEvent_EventHandler(object sender, BroadcastingEvent broadcastingEvent) - { - switch (broadcastingEvent.Type) - { - case BroadcastingCarEventType.Accident: - { - HandleAccidentEvent(broadcastingEvent); - break; - } - } - } - - private void HandleAccidentEvent(BroadcastingEvent broadcastingEvent) - { - - if (broadcastingEvent.CarData == null) return; - - Debug.WriteLine($"#{broadcastingEvent.CarData.RaceNumber}|{broadcastingEvent.CarData.GetCurrentDriverName()} had an accident. {broadcastingEvent.Msg}"); - - // accident events seems to be 5000 ms too late - // with the corrected accident time get a valid key into the history data - double key = GetValidHistoryKey(GetSessionTimeKey() - 5000); - - if (!_realTimeCarHistory.ContainsKey(key)) - { - Debug.WriteLine($"! no history data for key=({key})"); - return; - } - - //Debug.WriteLine($"session time {key} accident time {accidentTime}"); - // get real time car update data from history and add information to accident event - CarInfoWithRealTime carInfoWithRealTime = new CarInfoWithRealTime(broadcastingEvent.CarData); - carInfoWithRealTime.RealtimeCarUpdate = _realTimeCarHistory[key][broadcastingEvent.CarId]; - lock(_unprocessedAccidents) - { - _unprocessedAccidents.Add(carInfoWithRealTime); - //Debug.WriteLine($"unprocessed accidents list size: {_unprocessedAccidents.Count}"); - } - - - if (_accidentTime == DateTime.MinValue) - { - _accidentTime = DateTime.Now; - //Debug.WriteLine($"set new accident timestamp: {_accidentTime}"); - } - - - } - - private void ProcessAccidentData() - { - DateTime processTime = DateTime.Now; - - // process accidents older than 1 sec. - TimeSpan timediff = processTime - _accidentTime; - if (_accidentTime != DateTime.MinValue && timediff.TotalMilliseconds > 1000) - { - //Debug.WriteLine($"process old accident data list size {_unprocessedAccidents.Count} ..."); - - if (_unprocessedAccidents.Count < 2) - { - Debug.WriteLine($"accident: #{_unprocessedAccidents[0].RaceNumber}|{_unprocessedAccidents[0].GetCurrentDriverName()}"); - } - - for (int i=0; i<_unprocessedAccidents.Count-1; i++) - { - float distance = Math.Abs((_unprocessedAccidents[i].RealtimeCarUpdate.SplinePosition - _unprocessedAccidents[i + 1].RealtimeCarUpdate.SplinePosition) * _trackDistance); - Debug.WriteLine($"accident: #{_unprocessedAccidents[i].RaceNumber} vs #{_unprocessedAccidents[i+1].RaceNumber} distance {distance.ToString("0.##")}m"); - - // TODO send out accident event - OnAccident?.Invoke(this, new AccidentEvent()); - } - - lock(_unprocessedAccidents) - { - //Debug.WriteLine($"clear unprocessed accident list and reset accident timestamp"); - _accidentTime = DateTime.MinValue; - _unprocessedAccidents.Clear(); - } - } - - - // double key = GetSessionTimeKey(); - - } - - private void RealTimeCarUpdate_EventHandler(object sender, RealtimeCarUpdate realtimeCarUpdate) - { - AddCarUpdateToHistory(realtimeCarUpdate); - RemoveOldHistoryData(); - ProcessAccidentData(); - } - - private void RemoveOldHistoryData() - { - double key = GetSessionTimeKey(); - foreach (var kv in _realTimeCarHistory.ToList()) - { - if (key - kv.Key > 20000) - { - _realTimeCarHistory.Remove(kv.Key); - } - } - } - - private void AddCarUpdateToHistory(RealtimeCarUpdate realtimeCarUpdate) - { - double key = GetSessionTimeKey(); - if (key == 0) return; // session not started - - if (_realTimeCarHistory.ContainsKey(key)) - { - //Debug.WriteLine($"+ add to key {key} car index {realtimeCarUpdate.CarIndex}"); - var carUpdate = _realTimeCarHistory[key]; - if (carUpdate.ContainsKey(realtimeCarUpdate.CarIndex)) - { - carUpdate[realtimeCarUpdate.CarIndex] = realtimeCarUpdate; - } - else - { - _realTimeCarHistory[key].Add(realtimeCarUpdate.CarIndex, realtimeCarUpdate); - } - - } - else - { - Dictionary carUpdate = new Dictionary(); - carUpdate[realtimeCarUpdate.CarIndex] = realtimeCarUpdate; - //Debug.WriteLine($"# create key {key} car index {realtimeCarUpdate.CarIndex}"); - _realTimeCarHistory[key] = carUpdate; - } - - } - - private double GetValidHistoryKey(double key) - { - if (_realTimeCarHistory.ContainsKey(key)) - { - return key; - } - - // find nearest history session key - double nearest = 999999f; - double nearestHistoryKey = 0f; - foreach (var historyKey in _realTimeCarHistory.Keys) - { - double dt = Math.Abs(historyKey - key); - if (dt < nearest) - { - nearest = dt; - nearestHistoryKey = historyKey; - } - } - return nearestHistoryKey; - } - - private double GetSessionTimeKey() - { - return _realtimeUpdate.SessionTime.TotalMilliseconds; - } - - private void RealTimeUpdate_EventHandler(object sender, RealtimeUpdate realtimeUpdate) - { - _realtimeUpdate = realtimeUpdate; - } - - private void TrackDataUpdate_EventHandler(object sender, TrackData trackData) - { - Debug.WriteLine($"receive track data update, track id=({trackData.TrackId}) track distance=({trackData.TrackMeters})"); - _trackDistance = trackData.TrackMeters; - } - - private class CarInfoWithRealTime : CarInfo - { - public RealtimeCarUpdate RealtimeCarUpdate { get; set; } - - public CarInfoWithRealTime(CarInfo carInfoIn) : base(carInfoIn.CarIndex) - { - CarModelType = carInfoIn.CarModelType; - TeamName = carInfoIn.TeamName; - RaceNumber = carInfoIn.RaceNumber; - CupCategory = carInfoIn.CupCategory; - CurrentDriverIndex = carInfoIn.CurrentDriverIndex; - Nationality = carInfoIn.Nationality; - } - - public CarInfoWithRealTime(ushort carIndex) : base(carIndex) - { - } - } - - private class ContactData - { - public double SessionTime { get; set; } - } - - // TODO define accident event with all neccessary data, or use existing CarInfo - public class AccidentEvent - { - public double SessionTime { get; set; } - public List CarIds { get; set; } - - } - } -} diff --git a/Race_Element.Data.ACC/Cars/Damage.cs b/Race_Element.Data.ACC/Cars/Damage.cs deleted file mode 100644 index d1c2045fa..000000000 --- a/Race_Element.Data.ACC/Cars/Damage.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using static RaceElement.ACCSharedMemory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.ACC.Cars -{ - public class Damage - { - private const float MagicDamageMultiplier = 0.282f; - - public static float GetTotalRepairTime(SPageFilePhysics pagePhysics) - { - float totalRepairTime = 0; - - totalRepairTime += GetBodyWorkDamage(pagePhysics, CarDamagePosition.Centre); - - foreach (Wheel wheel in Enum.GetValues(typeof(Wheel))) - totalRepairTime += GetSuspensionDamage(pagePhysics, wheel); - - return totalRepairTime; - } - - public static bool HasAnyDamage(SPageFilePhysics pagePhysics) - { - foreach (int i in Enum.GetValues(typeof(CarDamagePosition))) - if (pagePhysics.CarDamage[i] > 0) - return true; - - foreach (int i in Enum.GetValues(typeof(Wheel))) - if (pagePhysics.SuspensionDamage[i] > 0) - return true; - - return false; - } - - /// - /// Gets the amount of damage/repair-time for the given wheel - /// - /// - /// - public static float GetSuspensionDamage(SPageFilePhysics pagePhysics, Wheel wheel) - { - return pagePhysics.SuspensionDamage[(int)wheel] * 30; - } - - /// - /// Gets the amount of bodywork damage/repair-time for the given car damage position - /// - /// - /// - public static float GetBodyWorkDamage(SPageFilePhysics pagePhysics, CarDamagePosition position) - { - return pagePhysics.CarDamage[(int)position] * MagicDamageMultiplier; - } - - public enum CarDamagePosition : int - { - Front, - Rear, - Left, - Right, - Centre - } - } -} diff --git a/Race_Element.Data.ACC/Cars/SteeringLock.cs b/Race_Element.Data.ACC/Cars/SteeringLock.cs deleted file mode 100644 index 06b3d96c9..000000000 --- a/Race_Element.Data.ACC/Cars/SteeringLock.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Collections.Generic; - -namespace RaceElement.Data.ACC.Cars -{ - public class SteeringLock - { - private static readonly Dictionary _steeringLocks = new Dictionary() - { - // CUP - {"porsche_991ii_gt3_cup", 800}, - {"porsche_992_gt3_cup", 540}, - // ST - {"lamborghini_huracan_st", 620}, - {"lamborghini_huracan_st_evo2", 620}, - // CHL - {"ferrari_488_challenge_evo", 480}, - // TCX - {"bmw_m2_cs_racing", 360}, - // GT3 - {"amr_v12_vantage_gt3", 640}, - {"amr_v8_vantage_gt3", 640}, - {"audi_r8_lms", 720}, - {"audi_r8_lms_evo", 720}, - {"audi_r8_lms_evo_ii", 720}, - {"bentley_continental_gt3_2016", 640}, - {"bentley_continental_gt3_2018", 640}, - {"bmw_m4_gt3", 516}, - {"bmw_m6_gt3", 566}, - {"jaguar_g3", 720}, - {"ferrari_488_gt3", 480}, - {"ferrari_488_gt3_evo", 480}, - {"honda_nsx_gt3", 620}, - {"honda_nsx_gt3_evo", 436}, - {"lamborghini_huracan_gt3", 620}, - {"lamborghini_huracan_gt3_evo", 620}, - {"lexus_rc_f_gt3", 640}, - {"mclaren_650s_gt3", 480}, - {"mclaren_720s_gt3", 480}, - {"mercedes_amg_gt3", 640}, - {"mercedes_amg_gt3_evo", 640}, - {"nissan_gt_r_gt3_2017", 640}, - {"nissan_gt_r_gt3_2018", 640}, - {"porsche_991_gt3_r", 800}, - {"porsche_991ii_gt3_r", 800}, - {"lamborghini_gallardo_rex", 720}, - // GT4 - {"alpine_a110_gt4", 720}, - {"amr_v8_vantage_gt4", 640}, - {"audi_r8_gt4", 720}, - {"bmw_m4_gt4", 492}, - {"chevrolet_camaro_gt4r", 720}, - {"ginetta_g55_gt4", 720}, - {"ktm_xbow_gt4", 582}, - {"maserati_mc_gt4", 900}, - {"mclaren_570s_gt4", 480}, - {"mercedes_amg_gt4", 492}, - {"porsche_718_cayman_gt4_mr", 800}, - }; - - /// - /// Returns the steering lock for the given car model, if no car model has been found, returns 360 - /// - /// - /// - public static int Get(string carModel) - { - if (_steeringLocks.TryGetValue(carModel, out int steeringLock)) - return steeringLock; - - return 360; - } - - } -} diff --git a/Race_Element.Data.ACC/Core/AccProcess.cs b/Race_Element.Data.ACC/Core/AccProcess.cs deleted file mode 100644 index 982660a63..000000000 --- a/Race_Element.Data.ACC/Core/AccProcess.cs +++ /dev/null @@ -1,98 +0,0 @@ -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.Linq; -using System.Threading; - -namespace RaceElement.Data.ACC.Core -{ - public class AccProcess - { - private static ProcessTracker _handlerInstance; - private static ProcessTracker Handler - { - get - { - if (_handlerInstance == null) _handlerInstance = new ProcessTracker("AC2-Win64-Shipping"); - return _handlerInstance; - } - } - - public static bool IsRunning { get => Handler.IsRunning; } - - private sealed class ProcessTracker : IDisposable - { - public bool IsRunning = false; - - public event EventHandler IsRunningChanged; - - private Process _acc; - - private readonly string _name; - - private bool _shouldTrack = true; - private DateTime _lastCheck = DateTime.MinValue; - - public ProcessTracker(string name) - { - _name = name; - FindProcess(); - TrackProcess(); - } - - private void TrackProcess() - { - new Thread(x => - { - while (_shouldTrack) - { - Thread.Sleep(5000); - - try - { - if (!IsRunning || _acc == null) - FindProcess(); - else if (_acc != null && _acc.Handle != IntPtr.Zero && _acc.HasExited) - FindProcess(); - } - catch (Exception e) - { - Debug.WriteLine(e); - LogWriter.WriteToLog(e); - } - } - }).Start(); - } - - private void FindProcess() - { - if (_lastCheck.AddSeconds(3) < DateTime.UtcNow) - { - if (!IsRunning || _acc == null || _acc.HasExited) - { - Process processes = Process.GetProcesses().FirstOrDefault(x => x.ProcessName == _name); - if (processes != null) - { - IsRunning = true; - IsRunningChanged?.Invoke(this, IsRunning); - } - else - { - IsRunning = false; - IsRunningChanged?.Invoke(this, IsRunning); - } - } - - _lastCheck = DateTime.UtcNow; - } - } - - public void Dispose() - { - _acc?.Dispose(); - _acc = null; - _shouldTrack = false; - } - } - } -} diff --git a/Race_Element.Data.ACC/Core/Config/ReplayJson.cs b/Race_Element.Data.ACC/Core/Config/ReplayJson.cs deleted file mode 100644 index be79a70b1..000000000 --- a/Race_Element.Data.ACC/Core/Config/ReplayJson.cs +++ /dev/null @@ -1,56 +0,0 @@ -using RaceElement.Util; -using Newtonsoft.Json; - -namespace RaceElement.Data.ACC.Core.Config -{ - public class ReplaySettingsJson : IGenericSettingsJson - { - [JsonProperty("replayQuality")] - public int ReplayQuality { get; set; } - - [JsonProperty("farAIReplayQuality")] - public int FarAIReplayQuality { get; set; } - - [JsonProperty("automaticHiglightEnabled")] - public int AutomaticHiglightEnabled { get; set; } - - [JsonProperty("useOnlyPlayerCarHighlights")] - public int UseOnlyPlayerCarHighlights { get; set; } - - [JsonProperty("highlightsRecTimeBefore")] - public int HighlightsRecTimeBefore { get; set; } - - [JsonProperty("highlightsRecTimeAfter")] - public int HighlightsRecTimeAfter { get; set; } - - [JsonProperty("maxTimeReplaySeconds")] - public int MaxTimeReplaySeconds { get; set; } - - [JsonProperty("autoSaveEnabled")] - public int AutoSaveEnabled { get; set; } - - [JsonProperty("autoSaveRaceNumber")] - public int AutoSaveRaceNumber { get; set; } - - [JsonProperty("autoSaveQualifyNumber")] - public int AutoSaveQualifyNumber { get; set; } - - [JsonProperty("autoSaveOthersNumber")] - public int AutoSaveOthersNumber { get; set; } - - [JsonProperty("autoSaveMinTimeSeconds")] - public int AutoSaveMinTimeSeconds { get; set; } - } - - public class ReplaySettings : AbstractSettingsJson - { - public override string Path => FileUtil.AccConfigPath; - - public override string FileName => "replay.json"; - - public override ReplaySettingsJson Default() - { - return new ReplaySettingsJson(); - } - } -} diff --git a/Race_Element.Data.ACC/Core/Game/AccScheduler.cs b/Race_Element.Data.ACC/Core/Game/AccScheduler.cs deleted file mode 100644 index c12e34a74..000000000 --- a/Race_Element.Data.ACC/Core/Game/AccScheduler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Quartz; -using Quartz.Impl; -using RaceElement.Data.ACC.Core.Game.Jobs; -using RaceElement.Data.ACC.Tracker; - -namespace ACCManager.Data.ACC.Core.Game -{ - public static class AccScheduler - { - public static IScheduler Scheduler; - - public static void RegisterJobs() - { - StdSchedulerFactory factory = new StdSchedulerFactory(); - Scheduler = factory.GetScheduler().Result; - Scheduler.Start(); - - //ReplaySaver.Schedule(); - PageStaticTracker.Schedule(); - } - } -} diff --git a/Race_Element.Data.ACC/Core/Game/Jobs/ReplaySaver.cs b/Race_Element.Data.ACC/Core/Game/Jobs/ReplaySaver.cs deleted file mode 100644 index 1a69d85fd..000000000 --- a/Race_Element.Data.ACC/Core/Game/Jobs/ReplaySaver.cs +++ /dev/null @@ -1,56 +0,0 @@ -using ACCManager.Data.ACC.Core.Game; -using Quartz; -using RaceElement.Data.ACC.Core.Config; -using RaceElement.Data.ACC.HotKey; -using RaceElement.Util.Settings; -using System; -using System.Diagnostics; -using System.Threading.Tasks; - -namespace RaceElement.Data.ACC.Core.Game.Jobs -{ - public class ReplaySaver : IJob - { - public static readonly JobKey JobKey = new JobKey("replay-saver", "acc-jobs"); - public static readonly TriggerKey TriggerKey = new TriggerKey("replaySaverTrigger"); - - private static DateTime LastReplaySave = DateTime.MinValue; - - public async Task Execute(IJobExecutionContext context) - { - if (AccProcess.IsRunning) - { - var replayJson = new ReplaySettings().Get(); - var accSettings = new AccSettings().Get(); - - if (accSettings.AutoRecordReplay && replayJson.AutoSaveEnabled == 1) - { - if (ACCSharedMemory.Instance.ReadGraphicsPageFile().Status == ACCSharedMemory.AcStatus.AC_LIVE) - { - if (DateTime.UtcNow.Subtract(LastReplaySave) > new TimeSpan(0, 0, replayJson.MaxTimeReplaySeconds)) - { - Debug.WriteLine("Auto save is enabled"); - LastReplaySave = AccHotkeys.SaveReplay(); - - Debug.WriteLine(LastReplaySave); - } - } - } - else - { - await context.Scheduler.UnscheduleJob(TriggerKey); - Debug.WriteLine("Auto save is not enabled, unscheduled replay saver"); - } - } - } - - public static void Schedule() - { - IJobDetail job = JobBuilder.Create().WithIdentity(JobKey).Build(); - if (!AccScheduler.Scheduler.CheckExists(JobKey).Result) - AccScheduler.Scheduler.ScheduleJob(job, TriggerBuilder.Create() - .WithIdentity(TriggerKey) - .WithSimpleSchedule(x => x.WithInterval(new TimeSpan(0, 0, 15)).RepeatForever()).ForJob(JobKey).Build()); - } - } -} diff --git a/Race_Element.Data.ACC/Database/GameData/DbCarData.cs b/Race_Element.Data.ACC/Database/GameData/DbCarData.cs deleted file mode 100644 index 3c61882e0..000000000 --- a/Race_Element.Data.ACC/Database/GameData/DbCarData.cs +++ /dev/null @@ -1,76 +0,0 @@ -using LiteDB; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace RaceElement.Data.ACC.Database.GameData -{ - public class DbCarData - { - public Guid Id { get; set; } - - public string ParseName { get; set; } - } - - public class CarDataCollection - { - private static ILiteCollection Collection - { - get - { - ILiteCollection _collection = RaceWeekendDatabase.Database.GetCollection(); - - return _collection; - } - } - - public static ILiteCollection GetCollection(ILiteDatabase db) - { - return db.GetCollection(); - } - - public static List GetAll(LiteDatabase db) - { - return GetCollection(db).FindAll().OrderBy(x => x.ParseName).ToList(); - } - - public static List GetAll() - { - return Collection.FindAll().OrderBy(x => x.ParseName).ToList(); - } - - public static DbCarData GetCarData(ILiteDatabase db, Guid id) - { - return GetCollection(db).FindById(id); - } - - public static DbCarData GetCarData(Guid id) - { - return Collection.FindById(id); - } - - public static DbCarData GetCarData(string parseName) - { - var result = Collection.FindOne(x => x.ParseName == parseName); - - if (result == null) - { - Insert(new DbCarData() { ParseName = parseName }); - result = Collection.FindOne(x => x.ParseName == parseName); - } - - return result; - } - - public static void Insert(DbCarData car) - { - RaceWeekendDatabase.Database.BeginTrans(); - Collection.EnsureIndex(x => x.Id, true); - Collection.Insert(car); - RaceWeekendDatabase.Database.Commit(); - - Debug.WriteLine($"Inserted new car data {car.Id} {car.ParseName}"); - } - } -} diff --git a/Race_Element.Data.ACC/Database/GameData/DbTrackData.cs b/Race_Element.Data.ACC/Database/GameData/DbTrackData.cs deleted file mode 100644 index 7b2f8db55..000000000 --- a/Race_Element.Data.ACC/Database/GameData/DbTrackData.cs +++ /dev/null @@ -1,85 +0,0 @@ -using RaceElement.Data.ACC.Tracks; -using LiteDB; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace RaceElement.Data.ACC.Database.GameData -{ - public class DbTrackData - { - public Guid Id { get; set; } - - public string ParseName { get; set; } - } - - public class TrackDataCollection - { - private static ILiteCollection Collection - { - get - { - ILiteCollection _collection = RaceWeekendDatabase.Database.GetCollection(); - - return _collection; - } - } - - private static ILiteCollection GetCollection(ILiteDatabase db) - { - return db.GetCollection(); - } - - - public static List GetAll(ILiteDatabase db) - { - var allTracks = GetCollection(db).FindAll(); - if (!allTracks.Any()) return new List(); - - return allTracks.OrderBy(x => x.ParseName).ToList(); - } - - public static List GetAll() - { - var allTracks = Collection.FindAll(); - if (!allTracks.Any()) return new List(); - - return allTracks.OrderBy(x => x.ParseName).ToList(); - } - - public static DbTrackData GetTrackData(Guid id) - { - return Collection.FindById(id); - } - - public static DbTrackData GetTrackData(ILiteDatabase db, Guid id) - { - return GetCollection(db).FindById(id); - } - - public static DbTrackData GetTrackData(string trackParseName) - { - var result = Collection.FindOne(x => x.ParseName == trackParseName); - if (result == null) - { - TrackData.Tracks.TryGetValue(trackParseName, out AbstractTrackData trackData); - Insert(new DbTrackData() { ParseName = trackParseName, Id = trackData.Guid }); - result = Collection.FindOne(x => x.ParseName == trackParseName); - } - - return result; - } - - public static void Insert(DbTrackData track) - { - RaceWeekendDatabase.Database.BeginTrans(); - Collection.EnsureIndex(x => x.Id, true); - Collection.Insert(track); - RaceWeekendDatabase.Database.Commit(); - Debug.WriteLine($"Inserted new track data {track.Id} {track.ParseName}"); - - } - } -} diff --git a/Race_Element.Data.ACC/Database/LapDataDB/DbLapData.cs b/Race_Element.Data.ACC/Database/LapDataDB/DbLapData.cs deleted file mode 100644 index ff799d21d..000000000 --- a/Race_Element.Data.ACC/Database/LapDataDB/DbLapData.cs +++ /dev/null @@ -1,92 +0,0 @@ -using RaceElement.Broadcast; -using LiteDB; -using System; -using System.Collections.Generic; -using System.Linq; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Data.ACC.Database.LapDataDB -{ - /// - /// All data except for the Index must be divided by 1000 to get the actual value (floating point precision is annoying) - /// - public class DbLapData - { - public Guid Id { get; set; } - - public Guid RaceSessionId { get; set; } = Guid.NewGuid(); - - /// - /// The time when this lap was completed - /// - public DateTime UtcCompleted { get; set; } - - /// - /// Lap Index - /// - public int Index { get; set; } = -1; - - /// - /// Lap Time in milliseconds - /// - public int Time { get; set; } = -1; - public int Sector1 { get; set; } = -1; - public int Sector2 { get; set; } = -1; - public int Sector3 { get; set; } = -1; - - public bool IsValid { get; set; } = true; - - public LapType LapType { get; set; } = LapType.ERROR; - - /// - /// Milliliters of Fuel left at the end of the lap, divide by 1000... - /// - public int FuelUsage { get; set; } = -1; - public float FuelInTank { get; set; } = -1; - - public float TempAmbient { get; set; } = -1; - public float TempTrack { get; set; } = -1; - public AcTrackGripStatus GripStatus { get; set; } = AcTrackGripStatus.Optimum; - - public override string ToString() - { - return $"Lap: {Index}, Time: {new TimeSpan(0, 0, 0, 0, Time):mm\\:ss\\:fff}, IsValid: {IsValid}, S1: {this.GetSector1():F3}, S2: {this.GetSector2():F3}, S3: {this.GetSector3():F3}, LapType: {this.LapType}"; - } - } - - public class LapDataCollection - { - private static ILiteCollection Collection - { - get - { - ILiteCollection _collection = RaceWeekendDatabase.Database.GetCollection(); - - return _collection; - } - } - - public static bool Any() - { - return Collection.Count() != 0; - } - - public static void Insert(DbLapData lap) - { - RaceWeekendDatabase.Database.BeginTrans(); - Collection.EnsureIndex(x => x.Id, true); - Collection.Insert(lap); - RaceWeekendDatabase.Database.Commit(); - } - - public static Dictionary GetForSession(LiteDatabase db, Guid sessionId) - { - return db.GetCollection().Find(x => x.RaceSessionId == sessionId).ToDictionary(x => x.Index); - } - - public static Dictionary GetForSession(Guid sessionId) - { - return Collection.Find(x => x.RaceSessionId == sessionId).ToDictionary(x => x.Index); - } - } -} diff --git a/Race_Element.Data.ACC/Database/LapDataDB/LapDataExtensions.cs b/Race_Element.Data.ACC/Database/LapDataDB/LapDataExtensions.cs deleted file mode 100644 index 34e619905..000000000 --- a/Race_Element.Data.ACC/Database/LapDataDB/LapDataExtensions.cs +++ /dev/null @@ -1,247 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using System.Collections.Generic; -using System.Linq; - -namespace RaceElement.Data.ACC.Database.LapDataDB -{ - public static class LapDataExtensions - { - #region DbLapData Extensions - - public static float GetLapTime(this DbLapData lap) - { - return lap.Time / 1000f; - } - - public static float GetSector1(this DbLapData lap) - { - return lap.Sector1 / 1000f; - } - - public static float GetSector2(this DbLapData lap) - { - return lap.Sector2 / 1000f; - } - - public static float GetSector3(this DbLapData lap) - { - return lap.Sector3 / 1000f; - } - - public static float GetFuelUsage(this DbLapData lap) - { - return lap.FuelUsage / 1000f; - } - - #endregion - - #region Dictionary Extensions - - public static int GetPotentialFastestLapTime(this Dictionary laps) - { - if (laps.Count == 0) return -1; - - int fastestSector1 = laps.GetFastestSector(1); - if (fastestSector1 == int.MaxValue) return -1; - - int fastestSector2 = laps.GetFastestSector(2); - if (fastestSector2 == int.MaxValue) return -1; - - int fastestSector3 = laps.GetFastestSector(3); - if (fastestSector3 == int.MaxValue) return -1; - - return fastestSector1 + fastestSector2 + fastestSector3; - } - - /// - /// Finds the lap index of the fastest lap - /// - /// -1 if not fastest lap - public static int GetFastestLapIndex(this Dictionary laps) - { - int fastestTime = int.MaxValue; - int fastestLapIndex = -1; - - foreach (var key in laps.Keys) - { - DbLapData lap = laps[key]; - if (lap.Time < fastestTime && lap.IsValid) - { - fastestTime = lap.Time; - fastestLapIndex = lap.Index; - } - - } - - return fastestLapIndex; - } - - public static int GetAverageFuelUsage(this Dictionary laps) - { - return laps.GetAverageFuelUsage(laps.Count); - } - - public static int GetAverageFuelUsage(this Dictionary laps, int lapAmount) - { - lapAmount.ClipMax(laps.Count); - if (lapAmount < 2) - return -1; - - int total = 0; - foreach (DbLapData lap in laps.Select(x => x.Value).OrderByDescending(x => x.Index).Take(lapAmount)) - total += lap.FuelUsage; - - return total / lapAmount; - } - - public static int GetAverageLapTime(this Dictionary laps) - { - return laps.GetAverageLapTime(laps.Count); - } - - public static int GetAverageLapTime(this Dictionary laps, bool onlyValidLaps) - { - return laps.GetAverageLapTime(laps.Count, onlyValidLaps); - } - - public static int GetAverageLapTime(this Dictionary laps, int lapAmount) - { - return laps.GetAverageLapTime(lapAmount, false); - } - - public static int GetAverageLapTime(this Dictionary laps, int lapAmount, bool onlyValidLaps) - { - lapAmount.ClipMax(laps.Count); - if (lapAmount == 0) - return 0; - - int total = 0; - int validCount = 0; - - foreach (DbLapData lap in laps.Select(x => x.Value)) - { - if (onlyValidLaps) - { - if (lap.IsValid) - { - validCount++; - total += lap.Time; - } - } - else - total += lap.Time; - } - - if (onlyValidLaps) - return total / validCount; - else - return total / lapAmount; - } - - /// - /// - /// - /// 1, 2 or 3 - /// laptime as int - /// true if the given sector time is faster than any others of that sector in these laps - public static bool IsSectorFastest(this Dictionary laps, int sector, int time) - { - Dictionary data = laps; - - sector.Clip(1, 3); - - switch (sector) - { - case 1: - foreach (DbLapData timing in data.Select(x => x.Value)) - if (timing.IsValid && timing.Sector1 < time) - return false; break; - - case 2: - foreach (DbLapData timing in data.Select(x => x.Value)) - if (timing.IsValid && timing.Sector2 < time) - return false; break; - - case 3: - foreach (DbLapData timing in data.Select(x => x.Value)) - if (timing.IsValid && timing.Sector3 < time) - return false; break; - - default: return true; - } - - return true; - } - - /// - /// Returns the fastest sector time, int.MaxValue if no valid fastest sector available - /// - /// - /// - /// - public static int GetFastestSector(this Dictionary laps, int sector) - { - sector.Clip(1, 3); - if (laps.Count == 0) - return int.MaxValue; - - int fastest = int.MaxValue; - switch (sector) - { - case 1: - foreach (DbLapData lap in laps.Select(x => x.Value)) - if (lap.IsValid && (lap.Sector1 < fastest) && lap.Sector1 != -1) - fastest = lap.Sector1; break; - - case 2: - foreach (DbLapData lap in laps.Select(x => x.Value)) - if (lap.IsValid && (lap.Sector2 < fastest) && lap.Sector2 != -1) - fastest = lap.Sector2; break; - - case 3: - foreach (DbLapData lap in laps.Select(x => x.Value)) - if (lap.IsValid && (lap.Sector3 < fastest) && lap.Sector3 != -1) - fastest = lap.Sector3; break; - - default: return fastest; - } - - return fastest; - } - - public static int GetLastLapTime(this Dictionary laps, bool onlyValidLaps = false) - { - if (laps.Count == 0) return -1; - - int lastLapIndex = -1; - - foreach (DbLapData lap in laps.Select(x => x.Value)) - { - if (onlyValidLaps && !lap.IsValid) - { - continue; - } - - if (lastLapIndex < lap.Index) - lastLapIndex = lap.Index; - } - - return laps[lastLapIndex].Time; - } - - public static int GetBestLapTime(this Dictionary laps) - { - if (laps.Count == 0) return -1; - - int idx = GetFastestLapIndex(laps); - laps.TryGetValue(idx, out DbLapData fastest); - - if (fastest == null) - return -1; - - return fastest.Time; - } - - #endregion - } -} diff --git a/Race_Element.Data.ACC/Database/RaceWeekend/DbRaceWeekend.cs b/Race_Element.Data.ACC/Database/RaceWeekend/DbRaceWeekend.cs deleted file mode 100644 index 51344622e..000000000 --- a/Race_Element.Data.ACC/Database/RaceWeekend/DbRaceWeekend.cs +++ /dev/null @@ -1,55 +0,0 @@ -using LiteDB; -using System; -using System.Diagnostics; -using System.Linq; - -namespace RaceElement.Data.ACC.Database.RaceWeekend -{ - public class DbRaceWeekend - { - public Guid Id { get; set; } - - public DateTime UtcStart { get; set; } - public DateTime UtcEnd { get; set; } - } - - public class RaceWeekendCollection - { - public static DbRaceWeekend Current { get; private set; } - - private static ILiteCollection Collection - { - get - { - ILiteCollection _collection = RaceWeekendDatabase.Database.GetCollection(); - _collection.EnsureIndex(x => x.Id, true); - return _collection; - } - } - - public static void End() - { - try - { - var storedWeekend = Collection.FindOne(x => x.Id == Current.Id); - if (storedWeekend != null) - { - storedWeekend.UtcEnd = DateTime.UtcNow; - Collection.Update(storedWeekend); - Debug.WriteLine($"Updated Race weekend {Current.Id}"); - RaceWeekendDatabase.Close(); - } - } - catch (Exception ex) { Debug.WriteLine(ex); } - } - - public static void Insert(DbRaceWeekend raceWeekend) - { - RaceWeekendDatabase.Database.BeginTrans(); - Collection.Insert(raceWeekend); - RaceWeekendDatabase.Database.Commit(); - Current = Collection.FindAll().First(); - Debug.WriteLine($"Inserted new race weekend {raceWeekend.Id}"); - } - } -} diff --git a/Race_Element.Data.ACC/Database/RaceWeekendDatabase.cs b/Race_Element.Data.ACC/Database/RaceWeekendDatabase.cs deleted file mode 100644 index 9a6892def..000000000 --- a/Race_Element.Data.ACC/Database/RaceWeekendDatabase.cs +++ /dev/null @@ -1,87 +0,0 @@ -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Util; -using LiteDB; -using System; -using System.Diagnostics; -using System.IO; - -namespace RaceElement.Data.ACC.Database -{ - /// - /// https://github.com/mbdavid/LiteDB - /// - public class RaceWeekendDatabase - { - private static string fileName; - - internal static LiteDatabase CreateDatabase(string trackParseName, string carParseName, DateTime startTime) - { - try - { - DirectoryInfo dataDir = new DirectoryInfo(FileUtil.RaceElementDataPath); - if (!dataDir.Exists) - dataDir.Create(); - - fileName = FileUtil.RaceElementDataPath + $"{trackParseName}-{carParseName}-" + $"{startTime:G}".Replace(":", ".").Replace("/", ".").Replace(" ", "-") + ".rwdb"; - - - if (Database == null) - Database = new LiteDatabase($"Filename={fileName}; Initial Size=16KB;"); - - if (Database == null) - Trace.WriteLine("Something went wrong initializing the LocalDatabase.Database"); - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - - return Database; - - } - - public static LiteDatabase OpenDatabase(string file) - { - try - { - LiteDatabase db = new LiteDatabase($"Filename={file}; Mode=ReadOnly;"); - - if (db == null) - Trace.WriteLine("Something went wrong initializing the LocalDatabase.Database"); - else - return db; - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - - return null; - } - - public static LiteDatabase Database { get; private set; } - - public static void Close() - { - if (Database == null) - return; - - bool anyLaps = LapDataCollection.Any(); - Database.Dispose(); - Database = null; - - if (!anyLaps) - { - try - { - new FileInfo(fileName).Delete(); - Debug.WriteLine("Deleted rwdb file, contains no laps."); - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - } - } - } - } -} diff --git a/Race_Element.Data.ACC/Database/SessionData/DbRaceSession.cs b/Race_Element.Data.ACC/Database/SessionData/DbRaceSession.cs deleted file mode 100644 index d746af6d7..000000000 --- a/Race_Element.Data.ACC/Database/SessionData/DbRaceSession.cs +++ /dev/null @@ -1,109 +0,0 @@ -using LiteDB; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Data.ACC.Database.SessionData -{ - public class DbRaceSession - { - public Guid Id { get; set; } - - public Guid RaceWeekendId { get; set; } - public Guid TrackId { get; set; } - public Guid CarId { get; set; } - - public DateTime UtcStart { get; set; } - public DateTime UtcEnd { get; set; } - public AcSessionType SessionType { get; set; } - public bool IsOnline { get; set; } - public int SessionIndex { get; set; } - } - - public class RaceSessionCollection - { - private static ILiteCollection Collection - { - get - { - ILiteCollection _collection = RaceWeekendDatabase.Database.GetCollection(); - - return _collection; - } - } - - private static ILiteCollection GetCollection(ILiteDatabase db) - { - return db.GetCollection(); - } - - /// - /// Returns all db Car Guids which exist with the given track guid - /// - /// - /// - public static List GetAllCarsForTrack(Guid trackId) - { - return Collection.Find(x => x.TrackId == trackId) - .Select(x => x.CarId) - .Distinct() - .ToList(); - } - - /// - /// Returns all db Car Guids which exist with the given track guid - /// - /// - /// - public static List GetAllCarsForTrack(ILiteDatabase db, Guid trackId) - { - return GetCollection(db).Find(x => x.TrackId == trackId) - .Select(x => x.CarId) - .Distinct() - .ToList(); - } - - public static List GetAll(ILiteDatabase db) - { - return GetCollection(db).FindAll().OrderByDescending(x => x.UtcStart).ToList(); - } - - public static List GetAll() - { - return Collection.FindAll().OrderByDescending(x => x.UtcStart).ToList(); - } - - public static void Update(DbRaceSession raceSession) - { - try - { - var storedSession = Collection.FindOne(x => x.Id == raceSession.Id); - if (storedSession != null) - { - storedSession = raceSession; - Collection.Update(storedSession); - Debug.WriteLine($"Updated Race session {raceSession.Id}"); - } - } - catch (Exception ex) { Debug.WriteLine(ex); } - } - - public static void Insert(DbRaceSession raceSession) - { - RaceWeekendDatabase.Database.BeginTrans(); - Collection.EnsureIndex(x => x.Id, true); - Collection.Insert(raceSession); - RaceWeekendDatabase.Database.Commit(); - Debug.WriteLine($"Inserted new race session {raceSession.SessionIndex} {raceSession.SessionType} {raceSession.Id}"); - } - - public static void Delete(DbRaceSession raceSession) - { - RaceWeekendDatabase.Database.BeginTrans(); - Collection.Delete(raceSession.Id); - RaceWeekendDatabase.Database.Commit(); - } - } -} diff --git a/Race_Element.Data.ACC/Database/Telemetry/DbLapTelemetry.cs b/Race_Element.Data.ACC/Database/Telemetry/DbLapTelemetry.cs deleted file mode 100644 index 51328d3ea..000000000 --- a/Race_Element.Data.ACC/Database/Telemetry/DbLapTelemetry.cs +++ /dev/null @@ -1,87 +0,0 @@ -using LiteDB; -using System; - -namespace RaceElement.Data.ACC.Database.Telemetry -{ - public class DbLapTelemetry - { - public Guid Id { get; set; } - public Guid LapId { get; set; } - public int Herz { get; set; } - public byte[] LapData { get; set; } - } - - [Serializable] - public class TelemetryPoint - { - public float SplinePosition { get; set; } - public InputsData InputsData { get; set; } - public TyreData TyreData { get; set; } - public BrakeData BrakeData { get; set; } - public PhysicsData PhysicsData { get; set; } - } - - [Serializable] - public class InputsData - { - public float Gas { get; set; } - public float Brake { get; set; } - public float SteerAngle { get; set; } - public int Gear { get; set; } - } - - [Serializable] - public class TyreData - { - public float[] TyreCoreTemperature { get; set; } - public float[] TyrePressure { get; set; } - } - - [Serializable] - public class BrakeData - { - public float[] BrakeTemperature { get; set; } - } - - [Serializable] - public class PhysicsData - { - public float[] WheelSlip { get; set; } - public float Speed { get; set; } - public float X { get; set; } - public float Y { get; set; } - public float Heading { get; set; } - } - - public class LapTelemetryCollection - { - private static ILiteCollection Collection - { - get - { - ILiteCollection _collection = RaceWeekendDatabase.Database.GetCollection(); - - return _collection; - } - } - - private static ILiteCollection GetCollection(ILiteDatabase db) - { - return db.GetCollection(); - } - - public static DbLapTelemetry GetForLap(ILiteCollection collection, Guid lapId) - { - if (lapId == Guid.Empty) return null; - try - { - return collection.FindOne(x => x.LapId == lapId); - } - catch (InvalidCastException) - { - //System.InvalidCastException: 'Unable to cast object of type 'System.Collections.Generic.Dictionary`2[System.String, LiteDB.BsonValue]' to type 'System.Byte[]'.' - return null; - } - } - } -} diff --git a/Race_Element.Data.ACC/Database/Telemetry/DbLapTelemetryExtensions.cs b/Race_Element.Data.ACC/Database/Telemetry/DbLapTelemetryExtensions.cs deleted file mode 100644 index c5c080a1f..000000000 --- a/Race_Element.Data.ACC/Database/Telemetry/DbLapTelemetryExtensions.cs +++ /dev/null @@ -1,55 +0,0 @@ -using RaceElement.Util; -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; - -namespace RaceElement.Data.ACC.Database.Telemetry -{ - public static class DbLapTelemetryExtensions - { - public static Dictionary DeserializeLapData(this DbLapTelemetry dbLapTelemetry) - { - Dictionary Data = new Dictionary(); - - try - { - using (var ms = new MemoryStream(dbLapTelemetry.LapData)) - { - var formatter = new BinaryFormatter(); - Data = (Dictionary)formatter.Deserialize(ms); - ms.Close(); - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - - return Data; - } - - public static byte[] SerializeLapData(this Dictionary dbLapTelemetry) - { - byte[] Data = new byte[0]; - - try - { - using (var ms = new MemoryStream()) - { - var formatter = new BinaryFormatter(); - - formatter.Serialize(ms, dbLapTelemetry); - Data = ms.ToArray(); - ms.Close(); - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - - return Data; - } - } -} diff --git a/Race_Element.Data.ACC/Database/Telemetry/TelemetryRecorder.cs b/Race_Element.Data.ACC/Database/Telemetry/TelemetryRecorder.cs deleted file mode 100644 index 748828f41..000000000 --- a/Race_Element.Data.ACC/Database/Telemetry/TelemetryRecorder.cs +++ /dev/null @@ -1,223 +0,0 @@ -using RaceElement.Util.Settings; -using RaceElement.Data.ACC.Session; -using RaceElement.Data.ACC.Tracker; -using RaceElement.Data.ACC.Tracker.Laps; -using RaceElement.Util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Data.ACC.Database.Telemetry -{ - internal class TelemetryRecorder - { - private static TelemetryRecorder _instance; - public static TelemetryRecorder Instance - { - get - { - if (_instance == null) - _instance = new TelemetryRecorder(); - - return _instance; - } - } - - private readonly int IntervalMillis; - private readonly TimeSpan _intervalTimeSpan; - - private bool _isRunning = false; - private SPageFilePhysics _pagePhysics; - private SPageFileGraphic _pageGraphics; - private readonly Dictionary _lapData = new Dictionary(); - - private TelemetryRecorder() - { - IntervalMillis = 1000 / new AccManagerSettings().Get().TelemetryDetailedHerz; - _intervalTimeSpan = new TimeSpan(0, 0, 0, IntervalMillis); - - PagePhysicsTracker.Instance.Tracker += OnPagePhysicsUpdated; - PageGraphicsTracker.Instance.Tracker += OnPageGraphicsUpdated; - LapTracker.Instance.LapFinished += OnLapFinished; - RaceSessionTracker.Instance.OnSessionFinished += OnSessionFinished; - - _pageGraphics = ACCSharedMemory.Instance.ReadGraphicsPageFile(true); - _pagePhysics = ACCSharedMemory.Instance.ReadPhysicsPageFile(true); - } - - private void OnSessionFinished(object sender, SessionData.DbRaceSession e) - { - Stop(); - } - - private void OnLapFinished(object sender, LapDataDB.DbLapData e) - { - if (_isRunning) - { - lock (_lapData) - { - LogWriter.WriteToLog($"TelemetryRecorder: Recorded {_lapData.Count} data points."); - DbLapTelemetry lapTelemetry = new DbLapTelemetry() - { - Id = Guid.NewGuid(), - LapId = e.Id, - LapData = _lapData.SerializeLapData(), - Herz = 1000 / this.IntervalMillis - }; - _lapData.Clear(); - var collection = RaceWeekendDatabase.Database.GetCollection(); - - var existing = collection.Find(x => x.LapId == e.Id); - if (!existing.Any()) - { - LogWriter.WriteToLog("TelemetryRecorder: Inserting LapTelemetry"); - RaceWeekendDatabase.Database.BeginTrans(); - collection.Insert(lapTelemetry); - RaceWeekendDatabase.Database.Commit(); - } - else - { - LogWriter.WriteToLog($"TelemetryRecorder: LapTelemetry already exists for lap id {e.Id}"); - } - } - } - } - - private void OnPageGraphicsUpdated(object sender, SPageFileGraphic e) => _pageGraphics = e; - private void OnPagePhysicsUpdated(object sender, SPageFilePhysics e) => _pagePhysics = e; - - public void Record() - { - if (_isRunning) - { - Debug.WriteLine("TelemetryRecorded: Already Recording"); - LogWriter.WriteToLog("TelemetryRecorded: Already Recording"); - return; - } - - LogWriter.WriteToLog("TelemetryRecorder: Record()"); - - if (!new AccManagerSettings().Get().TelemetryRecordDetailed) - return; - - _isRunning = true; - new Thread(x => - { - LogWriter.WriteToLog("Starting recording loop"); - var nextTick = DateTime.UtcNow.AddMilliseconds(IntervalMillis); - while (_isRunning) - { - try - { - while (DateTime.UtcNow < nextTick) - Thread.Sleep(nextTick - DateTime.UtcNow); - } - catch { } - nextTick = DateTime.UtcNow.AddMilliseconds(IntervalMillis); - long ticks = DateTime.UtcNow.Ticks; - - try - { - lock (_lapData) - { - if (_pageGraphics.GlobalRed) - continue; - - float currentSplinePositio = _pageGraphics.NormalizedCarPosition; - - - bool hasLapData = _lapData.Any(); - bool isSamePoint = false; - - if (hasLapData) - isSamePoint = _lapData.Last().Value.SplinePosition == currentSplinePositio; - - - if (_pageGraphics.NormalizedCarPosition == 1) - continue; - - if (!hasLapData || (hasLapData && !isSamePoint)) - { - if (!_lapData.ContainsKey(ticks)) - { - float xCoord = 0; - float yCoord = 0; - for (int i = 0; i < 4; i++) - { - xCoord += _pagePhysics.TyreContactPoint[i].X; - yCoord += _pagePhysics.TyreContactPoint[i].Z; - } - xCoord /= 4; - yCoord /= 4; - - if (xCoord == 0 || yCoord == 0) - continue; - - _lapData.Add(ticks, new TelemetryPoint() - { - SplinePosition = _pageGraphics.NormalizedCarPosition, - InputsData = new InputsData() - { - Gas = _pagePhysics.Gas, - Brake = _pagePhysics.Brake, - Gear = _pagePhysics.Gear, - SteerAngle = _pagePhysics.SteerAngle - }, - TyreData = new TyreData() - { - TyreCoreTemperature = _pagePhysics.TyreCoreTemperature, - TyrePressure = _pagePhysics.WheelPressure, - }, - BrakeData = new BrakeData() - { - BrakeTemperature = _pagePhysics.BrakeTemperature, - }, - PhysicsData = new PhysicsData() - { - WheelSlip = _pagePhysics.WheelSlip, - Speed = _pagePhysics.SpeedKmh, - X = xCoord, - Y = yCoord, - Heading = _pagePhysics.Heading, - } - }); - } - else - { - //LogWriter.WriteToLog("Telemetry Point for time tick already exists: " + ticks); - } - } - else - { - //if (hasLapData) - //{ - // LogWriter.WriteToLog($"lapdata.count: {_lapData.Count}, Current Spline: {_pageGraphics.NormalizedCarPosition:F4}, Last spline: {_lapData.Last().Value.SplinePosition:F4} "); - //} - - } - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - } - }).Start(); - } - - public void Stop() - { - _isRunning = false; - LogWriter.WriteToLog("TelemetryRecorder: Stop()"); - Thread.Sleep(IntervalMillis * 3); - - //PagePhysicsTracker.Instance.Tracker -= OnPagePhysicsUpdated; - //PageGraphicsTracker.Instance.Tracker -= OnPageGraphicsUpdated; - //LapTracker.Instance.LapFinished -= OnLapFinished; - //RaceSessionTracker.Instance.OnSessionFinished -= OnSessionFinished; - } - } -} diff --git a/Race_Element.Data.ACC/EntryList/EntryListTracker.cs b/Race_Element.Data.ACC/EntryList/EntryListTracker.cs deleted file mode 100644 index ef7c61047..000000000 --- a/Race_Element.Data.ACC/EntryList/EntryListTracker.cs +++ /dev/null @@ -1,241 +0,0 @@ -using RaceElement.Broadcast; -using RaceElement.Broadcast.Structs; -using RaceElement.Data.ACC.EntryList.TrackPositionGraph; -using RaceElement.Data.ACC.AccidentList; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using RaceElement.Data.ACC.Tracker; - -namespace RaceElement.Data.ACC.EntryList -{ - public class EntryListTracker - { - public class CarData - { - public CarInfo CarInfo { get; set; } - public RealtimeCarUpdate RealtimeCarUpdate { get; set; } - } - - - - private static EntryListTracker _instance; - public static EntryListTracker Instance - { - get - { - if (_instance == null) _instance = new EntryListTracker(); - return _instance; - } - private set { _instance = value; } - } - - internal Dictionary _entryListCars = new Dictionary(); - private static AccidentListTracker _accidentListTracker = AccidentListTracker.Instance; - - public List> Cars - { - get - { - lock (_entryListCars) - { - return _entryListCars.ToList(); - } - } - } - private bool _isRunning = false; - - private EntryListTracker() - { - - } - - internal void Start() - { -#if DEBUG - - _isRunning = true; - BroadcastTracker.Instance.OnRealTimeCarUpdate += RealTimeCarUpdate_EventHandler; - BroadcastTracker.Instance.OnEntryListUpdate += EntryListUpdate_EventHandler; - BroadcastTracker.Instance.OnBroadcastEvent += Broadcast_EventHandler; - - _accidentListTracker.Start(); - - StartEntryListCleanupTracker(); -#endif - } - - internal void Stop() - { -#if DEBUG - Debug.WriteLine("Stopping EntryListTracker"); - _isRunning = false; - BroadcastTracker.Instance.OnRealTimeCarUpdate -= RealTimeCarUpdate_EventHandler; - BroadcastTracker.Instance.OnEntryListUpdate -= EntryListUpdate_EventHandler; - BroadcastTracker.Instance.OnBroadcastEvent -= Broadcast_EventHandler; - - _accidentListTracker.Stop(); - - _entryListCars?.Clear(); -#endif - } - - private void StartEntryListCleanupTracker() - { - new Task(() => - { - try - { - while (_isRunning) - { - Thread.Sleep(100); - - int[] activeCarIds = ACCSharedMemory.Instance.ReadGraphicsPageFile().CarIds; - - List> datas = _entryListCars.ToList(); - foreach (var entryListCar in datas) - { - bool isInServer = activeCarIds.Contains(entryListCar.Key); - if (!isInServer) - lock (_entryListCars) - _entryListCars.Remove(entryListCar.Key); - } - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - }).Start(); - } - - private void Broadcast_EventHandler(object sender, BroadcastingEvent broadcastingEvent) - { - try - { - switch (broadcastingEvent.Type) - { - case BroadcastingCarEventType.LapCompleted: - { - if (broadcastingEvent.CarData == null) - break; - //lock (_entryListCars) - //{ - // CarData carData; - // if (_entryListCars.TryGetValue(broadcastingEvent.CarData.CarIndex, out carData)) - // { - // carData.CarInfo = broadcastingEvent.CarData; - // } - // else - // { - // //Debug.WriteLine($"BroadcastingCarEventType.LapCompleted car index: {broadcastingEvent.CarData.CarIndex} not found in entry list"); - // carData = new CarData(); - // carData.CarInfo = broadcastingEvent.CarData; - // _entryListCars.Add(broadcastingEvent.CarData.CarIndex, carData); - // } - //} - break; - } - case BroadcastingCarEventType.Accident: - { - //Debug.WriteLine($"#{broadcastingEvent.CarData.RaceNumber}| {broadcastingEvent.CarData.GetCurrentDriverName()} had an accident. {broadcastingEvent.Msg}"); - break; - } - - default: - { - if (broadcastingEvent.CarData == null) - break; - - //Debug.WriteLine($"{broadcastingEvent.Type} - {broadcastingEvent.CarData.RaceNumber} - {broadcastingEvent.Msg}"); - break; - } - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - } - - private void EntryListUpdate_EventHandler(object sender, CarInfo carInfo) - { - try - { - CarData carData; - lock (_entryListCars) - { - if (_entryListCars.TryGetValue(carInfo.CarIndex, out carData)) - { - carData.CarInfo = carInfo; - - // - Car car = PositionGraph.Instance.GetCar(carInfo.CarIndex); - if (car != null) - car.UpdateLocation(carData.RealtimeCarUpdate.SplinePosition, carData.RealtimeCarUpdate.CarLocation); - } - else - { - carData = new CarData(); - carData.CarInfo = carInfo; - - _entryListCars.Add(carInfo.CarIndex, carData); - PositionGraph.Instance.AddCar(carInfo.CarIndex); - } - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - } - - private void RealTimeCarUpdate_EventHandler(object sender, RealtimeCarUpdate carUpdate) - { - try - { - CarData carData; - lock (_entryListCars) - { - if (_entryListCars.TryGetValue(carUpdate.CarIndex, out carData)) - { - carData.RealtimeCarUpdate = carUpdate; - - Car car = PositionGraph.Instance.GetCar(carUpdate.CarIndex); - if (car != null) - car.UpdateLocation(carUpdate.SplinePosition, carUpdate.CarLocation); - } - else - { - //Debug.WriteLine($"RealTimeCarUpdate_EventHandler car index: {carUpdate.CarIndex} not found in entry list"); - carData = new CarData(); - carData.RealtimeCarUpdate = carUpdate; - - _entryListCars.Add(carUpdate.CarIndex, carData); - - PositionGraph.Instance.AddCar(carUpdate.CarIndex); - } - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - - /*var accidentList = _accidentListTracker.GetNewAccidents(); - foreach (var broadcastEventList in accidentList) - { - if (broadcastEventList.Count == 0) continue; - - string carNumbers = string.Join(" ", broadcastEventList.Select(x => x.CarData.RaceNumber).ToArray()); - string accidentMessage = $"accident between [{carNumbers}]"; - Debug.WriteLine($"{accidentMessage}"); - - }*/ - - } - } -} diff --git a/Race_Element.Data.ACC/EntryList/TrackPositionGraph/CarPosition.cs b/Race_Element.Data.ACC/EntryList/TrackPositionGraph/CarPosition.cs deleted file mode 100644 index 176e23c84..000000000 --- a/Race_Element.Data.ACC/EntryList/TrackPositionGraph/CarPosition.cs +++ /dev/null @@ -1,187 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Broadcast; -using System.Diagnostics; - -namespace RaceElement.Data.ACC.EntryList.TrackPositionGraph -{ - public class Car - { - public int CarIndex { get; set; } - public int LapIndex { get; set; } - public float SplinePosition { get; set; } - public CarLocationEnum Location { get; set; } - public CarLocationEnum PreviousLocation { get; set; } - - public override bool Equals(object obj) - { - return this.CarIndex == ((Car)obj).CarIndex; - } - } - - public static class CarPositionUpdater - { - public static void UpdateLocation(this Car car, float newSplinePosition, CarLocationEnum newLocation) - { - EntryListTracker.CarData carData = EntryListTracker.Instance._entryListCars[car.CarIndex]; - if (carData.CarInfo == null) - return; - string currentDriver = carData.CarInfo.Drivers[carData.CarInfo.CurrentDriverIndex].LastName; - - - string carInfo = $"#{carData.CarInfo.RaceNumber}".FillEnd(5, ' '); - - if (newLocation != car.Location) - { - switch (newLocation) - { - case CarLocationEnum.PitEntry: - { - switch (car.Location) - { - case CarLocationEnum.Track: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - - case CarLocationEnum.NONE: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - Debug.WriteLine($"{carInfo} has come into the pit entry on the formation lap"); - break; - } - } - break; - } - case CarLocationEnum.Pitlane: - { - switch (car.Location) - { - case CarLocationEnum.PitEntry: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - case CarLocationEnum.PitExit: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - case CarLocationEnum.Track: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - case CarLocationEnum.NONE: - { - Debug.WriteLine($"{carInfo} has joined the server"); - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - } - break; - } - - case CarLocationEnum.PitExit: - { - switch (car.Location) - { - case CarLocationEnum.Pitlane: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - } - break; - } - case CarLocationEnum.Track: - { - switch (car.Location) - { - case CarLocationEnum.PitEntry: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - //Debug.WriteLine($"{carInfo} has cancelled his pit entry"); - break; - } - case CarLocationEnum.PitExit: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - - case CarLocationEnum.NONE: - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - - break; - } - } - break; - } - } - - if (newLocation == CarLocationEnum.Track && car.Location == CarLocationEnum.Pitlane) - { - - car.PreviousLocation = car.Location; - car.Location = newLocation; - } - - if (car.PreviousLocation != car.Location) - Debug.WriteLine($"{carInfo} | lap:{car.LapIndex} | {car.PreviousLocation}->{car.Location}"); - } - - - if (car.SplinePosition > newSplinePosition && car.SplinePosition > 0.99) - { - if (newLocation == CarLocationEnum.Track && car.Location == CarLocationEnum.Track) - { - Debug.WriteLine($"{carInfo} has gained a lap on track"); - car.LapIndex++; - car.PreviousLocation = car.Location; - car.Location = newLocation; - } - - if (newLocation == CarLocationEnum.Pitlane && car.Location == CarLocationEnum.Pitlane && car.PreviousLocation == CarLocationEnum.PitEntry) - { - if (car.LapIndex > 0) - { - car.LapIndex++; - Debug.WriteLine($"{carInfo} has gained a lap in the pitlane."); - } - - car.PreviousLocation = car.Location; - car.Location = newLocation; - } - - if (newLocation == CarLocationEnum.Track && car.Location == CarLocationEnum.NONE) - { - car.PreviousLocation = car.Location; - car.Location = newLocation; - } - } - - car.SplinePosition = newSplinePosition; - } - } -} diff --git a/Race_Element.Data.ACC/EntryList/TrackPositionGraph/PositionGraph.cs b/Race_Element.Data.ACC/EntryList/TrackPositionGraph/PositionGraph.cs deleted file mode 100644 index 7780d7123..000000000 --- a/Race_Element.Data.ACC/EntryList/TrackPositionGraph/PositionGraph.cs +++ /dev/null @@ -1,65 +0,0 @@ -using RaceElement.Data.ACC.Session; -using System.Collections.Generic; -using System.Diagnostics; - -namespace RaceElement.Data.ACC.EntryList.TrackPositionGraph -{ - public class PositionGraph - { - private Dictionary _cars = new Dictionary(); - - private static PositionGraph _instance; - public static PositionGraph Instance - { - get - { - if (_instance == null) _instance = new PositionGraph(); - return _instance; - } - } - - private PositionGraph() - { - RaceSessionTracker.Instance.OnACSessionTypeChanged += (s, e) => ResetData(); - } - - public void AddCar(int carIndex) - { - Car newCar = new Car() - { - CarIndex = carIndex, - Location = Broadcast.CarLocationEnum.NONE, - LapIndex = 0, - SplinePosition = 0, - PreviousLocation = Broadcast.CarLocationEnum.NONE, - }; - - if (!_cars.TryGetValue(carIndex, out _)) - _cars.Add(carIndex, newCar); - } - - public Car GetCar(int carIndex) - { - if (_cars.TryGetValue(carIndex, out Car car)) - { - return car; - } - - return null; - } - - public void ResetData() - { - Debug.WriteLine("Reset Position Graph"); - //_cars.Clear(); - - foreach (Car car in _cars.Values) - { - _cars[car.CarIndex].Location = Broadcast.CarLocationEnum.NONE; - _cars[car.CarIndex].LapIndex = 0; - _cars[car.CarIndex].SplinePosition = 0; - _cars[car.CarIndex].PreviousLocation = Broadcast.CarLocationEnum.NONE; - } - } - } -} diff --git a/Race_Element.Data.ACC/HotKey/AccHotkeys.cs b/Race_Element.Data.ACC/HotKey/AccHotkeys.cs deleted file mode 100644 index 0d91dd43f..000000000 --- a/Race_Element.Data.ACC/HotKey/AccHotkeys.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Threading; -using System.Windows.Forms; - -namespace RaceElement.Data.ACC.HotKey -{ - public class AccHotkeys - { - /// - /// Sends the M hotkey to the active application. - /// Returns the UtcNow time w - /// - /// - public static DateTime SaveReplay() - { - Thread.Sleep(1000); - SendKeys.SendWait("m"); - return DateTime.UtcNow; - } - } -} diff --git a/Race_Element.Data.ACC/Laps/LapTracker.cs b/Race_Element.Data.ACC/Laps/LapTracker.cs deleted file mode 100644 index 04ed87c5a..000000000 --- a/Race_Element.Data.ACC/Laps/LapTracker.cs +++ /dev/null @@ -1,222 +0,0 @@ -using RaceElement.Broadcast.Structs; -using RaceElement.Data.ACC.Core; -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Data.ACC.Session; -using RaceElement.Util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Threading; - -namespace RaceElement.Data.ACC.Tracker.Laps -{ - public class LapTracker - { - private static LapTracker _instance; - public static LapTracker Instance - { - get - { - if (_instance == null) _instance = new LapTracker(); - return _instance; - } - } - - private bool IsTracking = false; - - private int CurrentSector = 0; - - public Dictionary Laps = new Dictionary(); - public DbLapData CurrentLap = new DbLapData(); - - public event EventHandler LapFinished; - - private LapTracker() - { - if (!IsTracking) - this.Start(); - - BroadcastTracker.Instance.OnRealTimeLocalCarUpdate += Instance_OnRealTimeCarUpdate; - RaceSessionTracker.Instance.OnACSessionTypeChanged += Instance_OnACSessionTypeChanged; - RaceSessionTracker.Instance.OnNewSessionStarted += Instance_OnNewSessionStarted; - } - - private void Instance_OnNewSessionStarted(object sender, Database.SessionData.DbRaceSession e) - { - Laps.Clear(); - CurrentLap = new DbLapData() { Index = ACCSharedMemory.Instance.ReadGraphicsPageFile(true).CompletedLaps + 1 }; - } - - private void Instance_OnACSessionTypeChanged(object sender, ACCSharedMemory.AcSessionType e) - { - var pageGraphics = ACCSharedMemory.Instance.ReadGraphicsPageFile(true); - - lock (Laps) - Laps.Clear(); - - lock (CurrentLap) - { - if (RaceSessionTracker.Instance.CurrentSession == null) - Debug.WriteLine("Lap Tracker cannot record a new lap on session type change, current session is null"); - else - CurrentLap = new DbLapData() { Index = pageGraphics.CompletedLaps + 1, RaceSessionId = RaceSessionTracker.Instance.CurrentSession.Id }; - } - Debug.WriteLine("LapTracker: Resetted current lap and previous recorded laps."); - } - - private LapInfo _lastLapInfo; - - private void Instance_OnRealTimeCarUpdate(object sender, RealtimeCarUpdate e) - { - if (e.LastLap != null) - { - _lastLapInfo = e.LastLap; - - FinalizeCurrentLapData(); - } - } - - private void FinalizeCurrentLapData() - { - try - { - if (_lastLapInfo != null) - if (_lastLapInfo.Splits != null && _lastLapInfo.Splits.Count == 3) - { - lock (Laps) - if (Laps.Count != 0) - { - if (!Laps.TryGetValue(CurrentLap.Index - 1, out DbLapData lastData)) - return; - - if (_lastLapInfo.LaptimeMS == lastData.Time) - { - if (_lastLapInfo.Splits[2].HasValue) - { - if (Laps[CurrentLap.Index - 1].Sector3 != _lastLapInfo.Splits[2].Value) - { - Laps[CurrentLap.Index - 1].Sector3 = _lastLapInfo.Splits[2].Value; - Laps[CurrentLap.Index - 1].IsValid = !_lastLapInfo.IsInvalid; - Laps[CurrentLap.Index - 1].LapType = _lastLapInfo.Type; - - if (RaceSessionTracker.Instance.CurrentSession != null) - { - Laps[CurrentLap.Index - 1].Id = Guid.NewGuid(); - Laps[CurrentLap.Index - 1].RaceSessionId = RaceSessionTracker.Instance.CurrentSession.Id; - Laps[CurrentLap.Index - 1].UtcCompleted = DateTime.UtcNow; - Laps[CurrentLap.Index - 1].FuelInTank = ACCSharedMemory.Instance.ReadPhysicsPageFile().Fuel; - Laps[CurrentLap.Index - 1].TempTrack = ACCSharedMemory.Instance.ReadPhysicsPageFile().RoadTemp; - Laps[CurrentLap.Index - 1].TempAmbient = ACCSharedMemory.Instance.ReadPhysicsPageFile().AirTemp; - Laps[CurrentLap.Index - 1].GripStatus = ACCSharedMemory.Instance.ReadGraphicsPageFile().trackGripStatus; - LapDataCollection.Insert(Laps[CurrentLap.Index - 1]); - - Trace.WriteLine($"{Laps[CurrentLap.Index - 1]}"); - - LapFinished?.Invoke(this, Laps[CurrentLap.Index - 1]); - } - } - } - } - } - } - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - - internal void Start() - { - if (IsTracking) - return; - - IsTracking = true; - new Thread(x => - { - while (IsTracking) - { - try - { - - - if (AccProcess.IsRunning) - { - Thread.Sleep(1000 / 10); - - var pageGraphics = ACCSharedMemory.Instance.ReadGraphicsPageFile(true); - - if (pageGraphics.Status == ACCSharedMemory.AcStatus.AC_OFF) - { - Laps.Clear(); - CurrentLap = new DbLapData() { Index = pageGraphics.CompletedLaps + 1 }; - } - - - // TOdo if current lap is inlap/outlap reset the lap data. - - // collect sector times. - if (CurrentSector != pageGraphics.CurrentSectorIndex) - { - if (CurrentLap.Sector1 == -1 && CurrentSector != 0) - { - // simply don't collect, we're already into a lap and passed sector 1, can't properly calculate the sector times now. - } - else - switch (pageGraphics.CurrentSectorIndex) - { - case 1: CurrentLap.Sector1 = pageGraphics.LastSectorTime; break; - case 2: CurrentLap.Sector2 = pageGraphics.LastSectorTime - CurrentLap.Sector1; break; - - // this sector time is now finalized with the FinalizeCurrentLapData() function - //case 0: CurrentLap.Sector3 = pageGraphics.LastTimeMs - CurrentLap.Sector2 - CurrentLap.Sector1; break; - } - - CurrentSector = pageGraphics.CurrentSectorIndex; - } - - // finalize lap time data and add it to history. - if (CurrentLap.Index - 1 != pageGraphics.CompletedLaps && pageGraphics.LastTimeMs != int.MaxValue) - { - CurrentLap.Time = pageGraphics.LastTimeMs; - CurrentLap.FuelUsage = (int)(ACCSharedMemory.Instance.ReadGraphicsPageFile().FuelXLap * 1000); - - if (CurrentLap.Sector1 != -1) - { - lock (Laps) - { - if (!Laps.ContainsKey(CurrentLap.Index)) - Laps.Add(CurrentLap.Index, CurrentLap); - } - } - - CurrentLap = new DbLapData() { Index = pageGraphics.CompletedLaps + 1 }; - } - } - else - { - Thread.Sleep(1000); - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - LogWriter.WriteToLog(ex); - } - } - - _instance = null; - IsTracking = false; - }).Start(); - } - - internal void Stop() - { - RaceSessionTracker.Instance.OnACSessionTypeChanged -= Instance_OnACSessionTypeChanged; - BroadcastTracker.Instance.OnRealTimeLocalCarUpdate -= Instance_OnRealTimeCarUpdate; - IsTracking = false; - } - } - - -} diff --git a/Race_Element.Data.ACC/Properties/AssemblyInfo.cs b/Race_Element.Data.ACC/Properties/AssemblyInfo.cs deleted file mode 100644 index 1d04f7305..000000000 --- a/Race_Element.Data.ACC/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("RaceElement.Data.ACC")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Element Future")] -[assembly: AssemblyProduct("RaceElement.Data.ACC")] -[assembly: AssemblyCopyright("Copyright 2022 © Reinier Klarenberg")] -[assembly: AssemblyTrademark("Element Future")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("bb693ceb-cd96-4eb6-9f13-110d3ccecffe")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Race_Element.Data.ACC/Race Element.Data.ACC.csproj b/Race_Element.Data.ACC/Race Element.Data.ACC.csproj deleted file mode 100644 index f7b6ae1e3..000000000 --- a/Race_Element.Data.ACC/Race Element.Data.ACC.csproj +++ /dev/null @@ -1,350 +0,0 @@ - - - - - Debug - AnyCPU - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE} - Library - Properties - RaceElement.Data.ACC - RaceElement.Data.ACC - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\Debug Minimized\ - DEBUG;TRACE - full - AnyCPU - 7.3 - prompt - - - - ..\packages\AutoMapper.8.1.0\lib\net461\AutoMapper.dll - - - ..\packages\LiteDB.5.0.15\lib\net45\LiteDB.dll - - - ..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll - - - ..\packages\Microsoft.Extensions.Configuration.7.0.0\lib\net462\Microsoft.Extensions.Configuration.dll - - - ..\packages\Microsoft.Extensions.Configuration.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Configuration.Binder.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Binder.dll - - - ..\packages\Microsoft.Extensions.Configuration.CommandLine.7.0.0\lib\net462\Microsoft.Extensions.Configuration.CommandLine.dll - - - ..\packages\Microsoft.Extensions.Configuration.EnvironmentVariables.7.0.0\lib\net462\Microsoft.Extensions.Configuration.EnvironmentVariables.dll - - - ..\packages\Microsoft.Extensions.Configuration.FileExtensions.7.0.0\lib\net462\Microsoft.Extensions.Configuration.FileExtensions.dll - - - ..\packages\Microsoft.Extensions.Configuration.Json.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Json.dll - - - ..\packages\Microsoft.Extensions.Configuration.UserSecrets.7.0.0\lib\net462\Microsoft.Extensions.Configuration.UserSecrets.dll - - - ..\packages\Microsoft.Extensions.DependencyInjection.7.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.dll - - - ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll - - - ..\packages\Microsoft.Extensions.FileProviders.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.FileProviders.Abstractions.dll - - - ..\packages\Microsoft.Extensions.FileProviders.Physical.7.0.0\lib\net462\Microsoft.Extensions.FileProviders.Physical.dll - - - ..\packages\Microsoft.Extensions.FileSystemGlobbing.7.0.0\lib\net462\Microsoft.Extensions.FileSystemGlobbing.dll - - - ..\packages\Microsoft.Extensions.Hosting.7.0.0\lib\net462\Microsoft.Extensions.Hosting.dll - - - ..\packages\Microsoft.Extensions.Hosting.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Hosting.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Logging.7.0.0\lib\net462\Microsoft.Extensions.Logging.dll - - - ..\packages\Microsoft.Extensions.Logging.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Logging.Configuration.7.0.0\lib\net462\Microsoft.Extensions.Logging.Configuration.dll - - - ..\packages\Microsoft.Extensions.Logging.Console.7.0.0\lib\net462\Microsoft.Extensions.Logging.Console.dll - - - ..\packages\Microsoft.Extensions.Logging.Debug.7.0.0\lib\net462\Microsoft.Extensions.Logging.Debug.dll - - - ..\packages\Microsoft.Extensions.Logging.EventLog.7.0.0\lib\net462\Microsoft.Extensions.Logging.EventLog.dll - - - ..\packages\Microsoft.Extensions.Logging.EventSource.7.0.0\lib\net462\Microsoft.Extensions.Logging.EventSource.dll - - - ..\packages\Microsoft.Extensions.Options.7.0.0\lib\net462\Microsoft.Extensions.Options.dll - - - ..\packages\Microsoft.Extensions.Options.ConfigurationExtensions.7.0.0\lib\net462\Microsoft.Extensions.Options.ConfigurationExtensions.dll - - - ..\packages\Microsoft.Extensions.Primitives.7.0.0\lib\net462\Microsoft.Extensions.Primitives.dll - - - ..\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\packages\obs-websocket-dotnet.5.0.0.3\lib\netstandard2.0\obs-websocket-dotnet.dll - - - ..\packages\Quartz.3.5.0\lib\net472\Quartz.dll - - - ..\packages\Quartz.Extensions.DependencyInjection.3.5.0\lib\netstandard2.0\Quartz.Extensions.DependencyInjection.dll - - - ..\packages\SLOBSharp.1.1.4\lib\netstandard2.0\SLOBSharp.dll - - - - ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - ..\packages\System.Collections.Immutable.7.0.0\lib\net462\System.Collections.Immutable.dll - - - - - - - ..\packages\System.Diagnostics.DiagnosticSource.7.0.0\lib\net462\System.Diagnostics.DiagnosticSource.dll - - - ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll - True - True - - - ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll - - - - ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\packages\System.Reactive.5.0.0\lib\net472\System.Reactive.dll - - - ..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll - True - True - - - ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - - ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll - True - True - - - - ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll - True - True - - - ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - True - True - - - ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - True - True - - - ..\packages\System.Text.Encodings.Web.7.0.0\lib\net462\System.Text.Encodings.Web.dll - - - ..\packages\System.Text.Json.7.0.0\lib\net462\System.Text.Json.dll - - - ..\packages\System.Threading.Channels.7.0.0\lib\net462\System.Threading.Channels.dll - - - ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - - - ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll - - - - - ..\packages\WebSocketSharp-netstandard.1.0.1\lib\net45\websocket-sharp.dll - - - ..\packages\Websocket.Client.4.4.43\lib\netstandard2.0\Websocket.Client.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {840220BD-8469-4A04-A6EC-1ED2BC743EFB} - Race Element.Broadcast - - - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F} - Race Element.SharedMemory - - - {AAB23116-299B-415B-8305-96CB86148CE7} - Race Element.Util - - - - \ No newline at end of file diff --git a/Race_Element.Data.ACC/Session/RaceSessionState.cs b/Race_Element.Data.ACC/Session/RaceSessionState.cs deleted file mode 100644 index e787d76c7..000000000 --- a/Race_Element.Data.ACC/Session/RaceSessionState.cs +++ /dev/null @@ -1,12 +0,0 @@ -using RaceElement.Broadcast; - -namespace RaceElement.Data.ACC.Session -{ - public class RaceSessionState - { - public static bool IsFormationLap(bool globalRed, SessionPhase phase) - { - return globalRed && (phase == SessionPhase.PreSession || phase == SessionPhase.FormationLap); - } - } -} diff --git a/Race_Element.Data.ACC/Session/RaceSessionTracker.cs b/Race_Element.Data.ACC/Session/RaceSessionTracker.cs deleted file mode 100644 index 87bf5358e..000000000 --- a/Race_Element.Data.ACC/Session/RaceSessionTracker.cs +++ /dev/null @@ -1,258 +0,0 @@ -using RaceElement.Broadcast; -using RaceElement.Data.ACC.Core; -using RaceElement.Data.ACC.Core.Config; -using RaceElement.Data.ACC.Database; -using RaceElement.Data.ACC.Database.GameData; -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Data.ACC.Database.RaceWeekend; -using RaceElement.Data.ACC.Database.SessionData; -using RaceElement.Data.ACC.Database.Telemetry; -using RaceElement.Data.ACC.HotKey; -using RaceElement.Data.ACC.Tracker; -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Data.ACC.Session -{ - public class RaceSessionTracker - { - private bool _isTracking = false; - - private float _sessionTimeLeft; - - private AcSessionType _lastSessionType = AcSessionType.AC_UNKNOWN; - public event EventHandler OnACSessionTypeChanged; - - private SessionPhase _lastSessionPhase = SessionPhase.NONE; - public event EventHandler OnSessionPhaseChanged; - - private AcStatus _lastAcStatus = AcStatus.AC_OFF; - public event EventHandler OnACStatusChanged; - - private int _lastSessionIndex = -1; - public event EventHandler OnSessionIndexChanged; - - public event EventHandler OnNewSessionStarted; - public event EventHandler OnSessionFinished; - public event EventHandler OnRaceWeekendEnded; - - internal DbRaceSession CurrentSession { get; private set; } - - private DateTime _lastReplaySave; - - private static RaceSessionTracker _instance; - - private RaceSessionTracker() - { - Debug.WriteLine("Started race session tracker."); - - StartTracking(); - OnSessionIndexChanged += TryCreateNewSession; - OnACSessionTypeChanged += TryCreateNewSession; - - ReplaySettings replaySettingsJson = new ReplaySettings(); - var json = replaySettingsJson.Get(false); - Debug.WriteLine(json); - } - - public static RaceSessionTracker Instance - { - get - { - if (_instance == null) _instance = new RaceSessionTracker(); - return _instance; - } - } - - private void TryCreateNewSession(object sender, AcSessionType index) - { - if (index != AcSessionType.AC_UNKNOWN) - TryCreateNewSession(sender, _lastSessionIndex); - } - - private void TryCreateNewSession(object sender, int sessionIndex) - { - if (_lastSessionType == AcSessionType.AC_UNKNOWN) - return; - - if (_lastSessionIndex > -1) - { - if (CurrentSession != null) - { - if (_lastAcStatus != AcStatus.AC_OFF) - if (_lastSessionIndex == CurrentSession.SessionIndex && _lastSessionType == CurrentSession.SessionType) - return; - - CurrentSession.UtcEnd = DateTime.UtcNow; - RaceSessionCollection.Update(CurrentSession); - } - - var staticPageFile = ACCSharedMemory.Instance.ReadStaticPageFile(); - DbCarData carData = CarDataCollection.GetCarData(staticPageFile.CarModel); - DbTrackData trackData = TrackDataCollection.GetTrackData(staticPageFile.Track); - if (carData == null || trackData == null) - return; - - CurrentSession = new DbRaceSession() - { - UtcStart = DateTime.UtcNow, - RaceWeekendId = RaceWeekendCollection.Current.Id, - SessionIndex = _lastSessionIndex, - SessionType = _lastSessionType, - CarId = carData.Id, - TrackId = trackData.Id, - IsOnline = staticPageFile.isOnline - }; - _sessionTimeLeft = ACCSharedMemory.Instance.ReadGraphicsPageFile(true).SessionTimeLeft; - - _lastReplaySave = DateTime.UtcNow; - - RaceSessionCollection.Insert(CurrentSession); - OnNewSessionStarted?.Invoke(this, CurrentSession); - - //TelemetryRecorder.Instance.Record(); - } - } - - private void FinalizeCurrentSession() - { - if (CurrentSession != null) - { - _lastSessionIndex = -1; - _lastSessionType = AcSessionType.AC_UNKNOWN; - CurrentSession.UtcEnd = DateTime.UtcNow; - - var lapData = LapDataCollection.GetForSession(CurrentSession.Id); - if (lapData.Any()) - RaceSessionCollection.Update(CurrentSession); - else - RaceSessionCollection.Delete(CurrentSession); - - OnSessionFinished?.Invoke(this, CurrentSession); - Debug.WriteLine("RaceSessionTracker: Finalized Current Session"); - } - - CurrentSession = null; - Debug.WriteLine("CurrentSession Reset to null"); - } - - private void FinalizeRaceWeekend() - { - RaceWeekendCollection.Current.UtcEnd = DateTime.UtcNow; - OnRaceWeekendEnded?.Invoke(this, RaceWeekendCollection.Current); - RaceWeekendCollection.End(); - } - - private void CreateNewRaceWeekend() - { - var pageStatic = ACCSharedMemory.Instance.ReadStaticPageFile(); - RaceWeekendDatabase.CreateDatabase(pageStatic.Track, pageStatic.CarModel, DateTime.UtcNow); - RaceWeekendCollection.Insert(new DbRaceWeekend() { Id = Guid.NewGuid(), UtcStart = DateTime.UtcNow }); - } - - private void StartTracking() - { - _isTracking = true; - - new Thread(() => - { - BroadcastTracker.Instance.OnRealTimeUpdate += Instance_OnRealTimeUpdate; - - - while (_isTracking) - { - Thread.Sleep(100); - - if (AccProcess.IsRunning) - { - var pageGraphics = ACCSharedMemory.Instance.ReadGraphicsPageFile(true); - - if (pageGraphics.Status != _lastAcStatus) - { - Debug.WriteLine($"AcStatus: {_lastAcStatus} -> {pageGraphics.Status}"); - - if (_lastAcStatus == AcStatus.AC_OFF) - CreateNewRaceWeekend(); - - _lastAcStatus = pageGraphics.Status; - - if (_lastAcStatus == AcStatus.AC_OFF) - { - FinalizeCurrentSession(); - FinalizeRaceWeekend(); - OnSessionIndexChanged?.Invoke(this, _lastSessionIndex); - } - - OnACStatusChanged?.Invoke(this, _lastAcStatus); - } - - bool sessionIndexChanged = false; - if (pageGraphics.SessionIndex != _lastSessionIndex && _lastAcStatus != AcStatus.AC_OFF) - { - Debug.WriteLine($"SessionIndex: {_lastSessionIndex} -> {pageGraphics.SessionIndex}"); - _lastSessionIndex = pageGraphics.SessionIndex; - sessionIndexChanged = true; - } - - bool sessionTypeChanged = false; - if (pageGraphics.SessionType != _lastSessionType && _lastAcStatus != AcStatus.AC_OFF) - { - Debug.WriteLine($"SessionType: {_lastSessionType} -> {pageGraphics.SessionType}"); - _lastSessionType = pageGraphics.SessionType; - sessionTypeChanged = true; - } - - if (pageGraphics.SessionTimeLeft > _sessionTimeLeft) - { - if (CurrentSession == null) - _sessionTimeLeft = pageGraphics.SessionTimeLeft; - - Debug.WriteLine("Detected session restart.. finalizing current session"); - FinalizeCurrentSession(); - } - - if (sessionIndexChanged) - OnSessionIndexChanged?.Invoke(this, _lastSessionIndex); - if (sessionTypeChanged) - OnACSessionTypeChanged?.Invoke(this, _lastSessionType); - - //HandleReplaySave(); - - } - } - - BroadcastTracker.Instance.OnRealTimeUpdate -= Instance_OnRealTimeUpdate; - }).Start(); - - } - - private void HandleReplaySave() - { - if (_lastReplaySave.AddHours(1) < DateTime.UtcNow) - { - LogWriter.WriteToLog($"Automatically Saving Replay after {_lastReplaySave.Subtract(DateTime.UtcNow)}"); - _lastReplaySave = AccHotkeys.SaveReplay(); - } - } - - private void Instance_OnRealTimeUpdate(object sender, Broadcast.Structs.RealtimeUpdate e) - { - if (e.Phase != _lastSessionPhase) - { - Debug.WriteLine($"SessionPhase: {_lastSessionPhase} -> {e.Phase}"); - - _lastSessionPhase = e.Phase; - OnSessionPhaseChanged?.Invoke(this, e.Phase); - } - } - - internal void Stop() - { - _isTracking = false; - } - } -} diff --git a/Race_Element.Data.ACC/Session/SessionTimeTracker.cs b/Race_Element.Data.ACC/Session/SessionTimeTracker.cs deleted file mode 100644 index b0a293059..000000000 --- a/Race_Element.Data.ACC/Session/SessionTimeTracker.cs +++ /dev/null @@ -1,116 +0,0 @@ -using RaceElement.Data.ACC.Tracker; -using System; -using System.Diagnostics; -using System.Threading; - -namespace RaceElement.Data.ACC.Session -{ - public class SessionTimeTracker - { - private static SessionTimeTracker _instance; - public static SessionTimeTracker Instance - { - get - { - if (_instance == null) _instance = new SessionTimeTracker(); - return _instance; - } - } - - private int _timeMultiplier = -1; - private bool _isTracking = false; - - public event EventHandler OnMultiplierChanged; - - private SessionTimeTracker() - { - StartTracking(); - } - - private void StartTracking() - { - new Thread(() => - { - _isTracking = true; - BroadcastTracker.Instance.OnRealTimeUpdate += Instance_OnRealTimeUpdate; - RaceSessionTracker.Instance.OnACSessionTypeChanged += Instance_OnACSessionTypeChanged; - RaceSessionTracker.Instance.OnSessionPhaseChanged += Instance_OnSessionPhaseChanged; - RaceSessionTracker.Instance.OnSessionIndexChanged += Instance_OnSessionIndexChanged; - - while (_isTracking) - { - Thread.Sleep(1000); - - } - - BroadcastTracker.Instance.OnRealTimeUpdate -= Instance_OnRealTimeUpdate; - RaceSessionTracker.Instance.OnACSessionTypeChanged -= Instance_OnACSessionTypeChanged; - RaceSessionTracker.Instance.OnSessionPhaseChanged -= Instance_OnSessionPhaseChanged; - RaceSessionTracker.Instance.OnSessionIndexChanged -= Instance_OnSessionIndexChanged; - _instance = null; - }).Start(); - } - - private void Instance_OnSessionIndexChanged(object sender, int e) - { - ResetTimeTrackingData(); - } - - private void Instance_OnSessionPhaseChanged(object sender, Broadcast.SessionPhase e) - { - if (e == Broadcast.SessionPhase.NONE) - ResetTimeTrackingData(); - } - - private void Instance_OnACSessionTypeChanged(object sender, ACCSharedMemory.AcSessionType e) - { - ResetTimeTrackingData(); - } - - private void ResetTimeTrackingData() - { - Debug.WriteLine("Reset time tracking data"); - _serverChanges = 0; - _lastServerMilliseconds = -1; - _timeMultiplier = -1; - OnMultiplierChanged?.Invoke(_instance, _timeMultiplier); - } - - private long _lastServerMilliseconds = -1; - private int _serverChanges = 0; - private void Instance_OnRealTimeUpdate(object sender, Broadcast.Structs.RealtimeUpdate e) - { - long newMilliseconds = (long)(e.TimeOfDay.TotalMilliseconds); - if (newMilliseconds != _lastServerMilliseconds) - { - double serverTimeChange = newMilliseconds - _lastServerMilliseconds; - - if (serverTimeChange < 240000 && serverTimeChange >= 1) - if (_lastServerMilliseconds != -1 && _serverChanges > 3) - { - serverTimeChange = Math.Ceiling(serverTimeChange); - serverTimeChange = Math.Floor(serverTimeChange / 5) * 5; - if (serverTimeChange > 0) - { - double possibleMultiplier = (int)Math.Ceiling(serverTimeChange / 5); - - if (possibleMultiplier > 0 && possibleMultiplier < 25) - if (_timeMultiplier != possibleMultiplier) - { - _timeMultiplier = (int)Math.Floor(possibleMultiplier); - OnMultiplierChanged?.Invoke(_instance, (int)Math.Floor(possibleMultiplier)); - } - } - } - - _lastServerMilliseconds = newMilliseconds; - _serverChanges++; - } - } - - internal void Stop() - { - _isTracking = false; - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AMRV12VantageGT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/AMRV12VantageGT3.cs deleted file mode 100644 index 2f829632b..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AMRV12VantageGT3.cs +++ /dev/null @@ -1,188 +0,0 @@ -using RaceElement.Data.SetupRanges; -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class AMRV12VantageGT3 : ICarSetupConversion, ISetupChanger - { - public CarModels CarModel => CarModels.Aston_Martin_Vantage_V12_GT3_2013; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - private static readonly double[] casters = new double[] { 8.3, 8.5, 8.7, 9.0, 9.2, 9.4, 9.6, 9.9, 10.1, 10.3, 10.5, 10.8, 11.0, - 11.2, 11.4, 11.6, 11.9, 12.1, 12.3, 12.5, 12.7, 13.0, 13.2, 13.4, 13.6, 13.8, 14.0, 14.3, 14.5, 14.7, 14.9 }; - private static readonly int[] wheelRateFronts = new int[] { 115000, 120000, 125000, 130000, 135000, 140000, 145000, 150000, - 155000, 160000, 165000, 170000, 175000, 180000, 185000 }; - private static readonly int[] wheelRateRears = new int[] { 95000, 100000, 105000, 110000, 115000, 120000, 125000, 130000, 135000, 140000, 145000, 150000, - 155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000}; - - ITyreSetupChanger ISetupChanger.TyreSetupChanger => new TyreSetupChanger(); - IElectronicsSetupChanger ISetupChanger.ElectronicsSetupChanger => new ElectronicsSetupChanger(); - IMechanicalSetupChanger ISetupChanger.MechanicalSetupChanger => new MechSetupChanger(); - IAeroSetupChanger ISetupChanger.AeroSetupChanger => new AeroSetupChanger(); - IDamperSetupChanger ISetupChanger.DamperSetupChanger => new DamperSetupChanger(); - - private class TyreSetupChanger : ITyreSetupChanger - { - public SetupDoubleRange TyrePressures => TyrePressuresGT3; - public SetupDoubleRange CamberFront => CamberFrontGT3; - public SetupDoubleRange CamberRear => CamberRearGT3; - public SetupDoubleRange ToeFront => new SetupDoubleRange(-0.4, 0.4, 0.01); - public SetupDoubleRange ToeRear => ToeFront; - public SetupDoubleRange Caster => new SetupDoubleRange(casters); - } - - private class ElectronicsSetupChanger : IElectronicsSetupChanger - { - public SetupIntRange TractionControl => new SetupIntRange(0, 11, 1); - public SetupIntRange ABS => new SetupIntRange(0, 11, 1); - public SetupIntRange EcuMap => new SetupIntRange(1, 8, 1); - public SetupIntRange TractionControlCut => new SetupIntRange(0, 0, 1); - } - - private class MechSetupChanger : IMechanicalSetupChanger - { - public SetupIntRange AntiRollBarFront => new SetupIntRange(0, 8, 1); - public SetupIntRange AntiRollBarRear => AntiRollBarFront; - public SetupDoubleRange BrakeBias => new SetupDoubleRange(57.0, 78.0, 0.2); - public SetupIntRange PreloadDifferential => new SetupIntRange(20, 300, 10); - public SetupIntRange BrakePower => new SetupIntRange(80, 100, 1); - public SetupDoubleRange SteeringRatio => new SetupDoubleRange(14, 18, 1); - public SetupIntRange WheelRateFronts => new SetupIntRange(wheelRateFronts); - public SetupIntRange WheelRateRears => new SetupIntRange(wheelRateRears); - public SetupIntRange BumpstopRate => new SetupIntRange(300, 2500, 100); - public SetupIntRange BumpstopRangeFronts => new SetupIntRange(0, 22, 1); - public SetupIntRange BumpstopRangeRears => new SetupIntRange(0, 68, 1); - } - - private class AeroSetupChanger : IAeroSetupChanger - { - public SetupIntRange RideHeightFront => new SetupIntRange(55, 80, 1); - public SetupIntRange RideHeightRear => new SetupIntRange(55, 90, 1); - public SetupIntRange BrakeDucts => BrakeDuctsGT3; - public SetupIntRange Splitter => new SetupIntRange(0, 0, 1); - public SetupIntRange RearWing => new SetupIntRange(0, 10, 1); - } - - private class DamperSetupChanger : IDamperSetupChanger - { - public SetupIntRange BumpSlow => new SetupIntRange(0, 40, 1); - public SetupIntRange BumpFast => new SetupIntRange(0, 49, 1); - public SetupIntRange ReboundSlow => BumpSlow; - public SetupIntRange ReboundFast => BumpFast; - } - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(57 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(14d + rawValue, 2); - } - - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return wheelRateFronts[rawValue[(int)wheel]]; - case Position.Rear: return wheelRateRears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 55 + rawValue[0]; - case Position.Rear: return 55 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AMRV8VantageGT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/AMRV8VantageGT3.cs deleted file mode 100644 index 293921de3..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AMRV8VantageGT3.cs +++ /dev/null @@ -1,194 +0,0 @@ -using RaceElement.Data.SetupRanges; -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class AMRV8VantageGT3 : ICarSetupConversion, ISetupChanger - { - public CarModels CarModel => CarModels.Aston_Martin_V8_Vantage_GT3_2019; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - private static readonly double[] casters = new double[] { 10.7, 10.9, 11.1, 11.3, 11.5, 11.6, 11.8, 12.0, 12.2, 12.4, 12.5, 12.7, 12.9, 13.1, 13.3, 13.4, - 13.6, 13.8, 14.0, 14.2, 14.3, 14.5, 14.7, 14.9, 15.0, 15.2, 15.4, 15.6, 15.7, 15.9, 16.1 }; - private static readonly int[] wheelRateFronts = new int[] { 115000, 125000, 135000, 145000, 155000, 165000, 175000, 185000 }; - private static readonly int[] wheelRateRears = new int[] { 105000, 115000, 125000, 135000, 145000, 155000, 165000, 175000, 185000, 195000 }; - - ITyreSetupChanger ISetupChanger.TyreSetupChanger => new TyreSetupChanger(); - IElectronicsSetupChanger ISetupChanger.ElectronicsSetupChanger => new ElectronicsSetupChanger(); - IMechanicalSetupChanger ISetupChanger.MechanicalSetupChanger => new MechSetupChanger(); - IAeroSetupChanger ISetupChanger.AeroSetupChanger => new AeroSetupChanger(); - IDamperSetupChanger ISetupChanger.DamperSetupChanger => new DamperSetupChanger(); - - private class TyreSetupChanger : ITyreSetupChanger - { - public SetupDoubleRange TyrePressures => TyrePressuresGT3; - public SetupDoubleRange CamberFront => CamberFrontGT3; - public SetupDoubleRange CamberRear => CamberRearGT3; - public SetupDoubleRange ToeFront => new SetupDoubleRange(-0.4, 0.4, 0.01); - public SetupDoubleRange ToeRear => ToeFront; - public SetupDoubleRange Caster => new SetupDoubleRange(casters); - } - - private class ElectronicsSetupChanger : IElectronicsSetupChanger - { - public SetupIntRange TractionControl => new SetupIntRange(0, 8, 1); - public SetupIntRange ABS => new SetupIntRange(0, 8, 1); - public SetupIntRange EcuMap => new SetupIntRange(1, 8, 1); - public SetupIntRange TractionControlCut => new SetupIntRange(0, 8, 1); - } - - private class MechSetupChanger : IMechanicalSetupChanger - { - public SetupIntRange AntiRollBarFront => new SetupIntRange(0, 8, 1); - public SetupIntRange AntiRollBarRear => AntiRollBarFront; - public SetupDoubleRange BrakeBias => new SetupDoubleRange(57.0, 78.0, 0.2); - public SetupIntRange PreloadDifferential => new SetupIntRange(20, 300, 10); - public SetupIntRange BrakePower => new SetupIntRange(80, 100, 1); - public SetupDoubleRange SteeringRatio => new SetupDoubleRange(14, 18, 1); - public SetupIntRange WheelRateFronts => new SetupIntRange(wheelRateFronts); - public SetupIntRange WheelRateRears => new SetupIntRange(wheelRateRears); - public SetupIntRange BumpstopRate => new SetupIntRange(300, 2500, 100); - public SetupIntRange BumpstopRangeFronts => new SetupIntRange(0, 23, 1); - public SetupIntRange BumpstopRangeRears => new SetupIntRange(0, 68, 1); - } - - private class AeroSetupChanger : IAeroSetupChanger - { - public SetupIntRange RideHeightFront => new SetupIntRange(55, 80, 1); - public SetupIntRange RideHeightRear => new SetupIntRange(55, 90, 1); - public SetupIntRange BrakeDucts => BrakeDuctsGT3; - public SetupIntRange Splitter => new SetupIntRange(0, 0, 1); - public SetupIntRange RearWing => new SetupIntRange(0, 10, 1); - } - - private class DamperSetupChanger : IDamperSetupChanger - { - public SetupIntRange BumpSlow => new SetupIntRange(0, 40, 1); - public SetupIntRange BumpFast => new SetupIntRange(0, 49, 1); - public SetupIntRange ReboundSlow => BumpSlow; - public SetupIntRange ReboundFast => BumpFast; - } - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 10.7, 10.9, 11.1, 11.3, 11.5, 11.6, 11.8, 12.0, 12.2, 12.4, 12.5, 12.7, 12.9, 13.1, 13.3, 13.4, - 13.6, 13.8, 14.0, 14.2, 14.3, 14.5, 14.7, 14.9, 15.0, 15.2, 15.4, 15.6, 15.7, 15.9, 16.1 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(57 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(14d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 115000, 125000, 135000, 145000, 155000, 165000, 175000, 185000 }; - private readonly int[] rears = new int[] { 105000, 115000, 125000, 135000, 145000, 155000, 165000, 175000, 185000, 195000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - - - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 55 + rawValue[0]; - case Position.Rear: return 55 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMS.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMS.cs deleted file mode 100644 index 3a8ad3c1c..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMS.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class AudiR8LMS : ICarSetupConversion - { - public CarModels CarModel => CarModels.Audi_R8_LMS_2015; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 8.8, 9.1, 9.3, 9.6, 9.8, 10.0, 10.3, 10.5, 10.8, 11.0, 11.2, - 11.5, 11.7, 11.9, 12.2, 12.4, 12.6, 12.9, 13.1, 13.3, 13.6, 13.8, 14.0, 14.3, 14.5, 14.7, - 15.0, 15.2, 15.4, 15.7, 15.9, 16.1, 16.3, 16.6, 16.8 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(12d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 112000, 132000, 153000, 174000, 185000, 195000 }; - private readonly int[] rears = new int[] { 124000, 144000, 163000, 173000, 183000, 202000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMSevo.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMSevo.cs deleted file mode 100644 index 8d7e1ca87..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMSevo.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class AudiR8LMSevo : ICarSetupConversion - { - public CarModels CarModel => CarModels.Audi_R8_LMS_Evo_2019; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 8.8, 9.1, 9.3, 9.6, 9.8, 10.0, 10.3, 10.5, 10.8, 11.0, 11.2, - 11.5, 11.7, 11.9, 12.2, 12.4, 12.6, 12.9, 13.1, 13.3, 13.6, 13.8, 14.0, 14.3, 14.5, 14.7, - 15.0, 15.2, 15.4, 15.7, 15.9, 16.1, 16.3, 16.6, 16.8 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(12d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 112000, 132000, 153000, 174000, 185000, 195000 }; - private readonly int[] rears = new int[] { 124000, 144000, 163000, 173000, 183000, 202000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMSevoII.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMSevoII.cs deleted file mode 100644 index 8ef8a796a..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/AudiR8LMSevoII.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class AudiR8LMSevoII : ICarSetupConversion - { - public CarModels CarModel => CarModels.Audi_R8_LMS_Evo_II_2022; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 8.8, 9.1, 9.3, 9.6, 9.8, 10.0, 10.3, 10.5, 10.8, 11.0, 11.2, - 11.5, 11.7, 11.9, 12.2, 12.4, 12.6, 12.9, 13.1, 13.3, 13.6, 13.8, 14.0, 14.3, 14.5, 14.7, - 15.0, 15.2, 15.4, 15.7, 15.9, 16.1, 16.3, 16.6, 16.8 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(12d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 112000, 132000, 153000, 174000, 185000, 195000 }; - private readonly int[] rears = new int[] { 124000, 144000, 163000, 173000, 183000, 202000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BentleyContinentalGT3_2015.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/BentleyContinentalGT3_2015.cs deleted file mode 100644 index 998e3294d..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BentleyContinentalGT3_2015.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class BentleyContinentalGT3_2015 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Bentley_Continental_GT3_2015; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 8.3, 8.5, 8.8, 9.0, 9.2, 9.5, 9.7, 10.0, - 10.2, 10.5, 10.7, 10.9, 11.2, 11.4, 11.7, 11.9, 12.1, 12.4, 12.6, 12.9, 13.1, 13.3, 13.6, - 13.8, 14.0, 14.3, 14.5, 14.8, 15.0, 15.2, 15.5 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(57 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 115000, 120000, 125000, 130000, - 135000, 140000, 145000, 150000, 155000, 160000, 165000, 170000, 175000, - 180000, 185000 }; - private readonly int[] rears = new int[] { 95000, 100000, 105000, 110000, 115000, - 120000,125000, 130000, 135000, 140000, 145000, 150000, 155000, 160000, 165000, 170000, - 175000, 180000, 185000, 190000, 195000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BentleyContinentalGT3_2018.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/BentleyContinentalGT3_2018.cs deleted file mode 100644 index d62a60240..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BentleyContinentalGT3_2018.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class BentleyContinentalGT3_2018 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Bentley_Continental_GT3_2018; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 8.3, 8.5, 8.8, 9.0, 9.2, 9.5, 9.7, 10.0, - 10.2, 10.5, 10.7, 10.9, 11.2, 11.4, 11.7, 11.9, 12.1, 12.4, 12.6, 12.9, 13.1, 13.3, 13.6, - 13.8, 14.0, 14.3, 14.5, 14.8, 15.0, 15.2, 15.5 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(57 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 115000, 120000, 125000, 130000, - 135000, 140000, 145000, 150000, 155000, 160000, 165000, 170000, 175000, - 180000, 185000 }; - private readonly int[] rears = new int[] { 95000, 100000, 105000, 110000, 115000, - 120000,125000, 130000, 135000, 140000, 145000, 150000, 155000, 160000, 165000, 170000, - 175000, 180000, 185000, 190000, 195000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BmwM4GT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/BmwM4GT3.cs deleted file mode 100644 index 7c97523f1..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BmwM4GT3.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class BmwM4GT3 : ICarSetupConversion - { - public CarModels CarModel => CarModels.BMW_M4_GT3_2021; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 6.1, 6.3, 6.5, 6.7, 6.9, - 7.1, 7.3, 7.5, 7.7, 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, - 9.7, 9.9, 10.1, 10.3, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, - 12.0, 12.2, 12.4, 12.6, 12.8, 13.0, 13.2, 13.4, 13.6, 13.7, 13.9 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0.0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(48.5 + 0.3 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 200 + 50 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 105000, 120000, 135000, 150000, 165000, 180000 }; - private readonly int[] rears = new int[] { 90000, 105000, 120000, 135000, 150000, 165000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 50 + rawValue[0]; - case Position.Rear: return 50 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BmwM6GT3_2017.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/BmwM6GT3_2017.cs deleted file mode 100644 index fbc9ce930..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/BmwM6GT3_2017.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class BmwM6GT3_2017 : ICarSetupConversion - { - public CarModels CarModel => CarModels.BMW_M6_GT3_2017; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 6.7, 6.9, 7.1, 7.4, 7.6, 7.8, 8.0, - 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, - 11.3, 11.5, 11.7, 11.9, 12.1, 12.3, 12.5, 12.7, 12.9, 13.1, 13.3, 13.5, 13.7, - 13.9, 14.2, 14.4, 14.6, 14.8, 15.0, }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0.0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47.5 + 0.3 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 136000, 146000, 156000, 166000, 176000, 186000 }; - private readonly int[] rears = new int[] { 96000, 106000, 116000, 126000, 136000, 146000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 52 + rawValue[0]; - case Position.Rear: return 52 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Ferrari488GT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/Ferrari488GT3.cs deleted file mode 100644 index 6d6fca129..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Ferrari488GT3.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class Ferrari488GT3 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Ferrari_488_GT3_2018; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 5.0, 5.1, 5.3, 5.5, 5.6, - 5.8, 6.0, 6.1, 6.3, 6.5, 6.6, 6.8, 7.0, 7.1, 7.3, 7.5, 7.6, 7.8, - 8.0, 8.1, 8.3, 8.5, 8.6, 8.8, 9.0, 9.1, 9.3, 9.5, 9.6, 9.8, 9.9, - 10.1, 10.3, 10.4, 10.6, 10.8, 10.9, 11.1, 11.2, 11.4, 11.6, 11.7, 11.9, - 12.1, 12.2, 12.4, 12.5, 12.7, 12.9, 13.0, 13.2, 13.3, 13.5, 13.7, 13.8, - 14.0, 14.1, 14.3, 14.4, 14.6, 14.8, 14.9, 15.1, 15.2, 15.4, 15.5, 15.7, - 15.9, 16.0, 16.2, 16.3, 16.5, 16.6, 16.8, 16.9, 17.1, 17.3, 17.4, 17.6, - 17.7, 17.9, 18.0, 18.2, 18.3, 18.5, 18.6, 18.8, 18.9, 19.1, 19.2, 19.4, - 19.5, 19.7, 19.8, 20.0, 20.1, 20.3, 20.4, 20.6 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47.0 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 94000, 101000, 107000, 113000, 120000, 126000, 138600, 151000, 163800, 176000, 189000 }; - private readonly int[] rears = new int[] { 106000, 113000, 120000, 127000, 134000, 141000, 155000, 169500, 183600, 198000, 212000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 55 + rawValue[0]; - case Position.Rear: return 55 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Ferrari488GT3evo.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/Ferrari488GT3evo.cs deleted file mode 100644 index f9ea60d34..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Ferrari488GT3evo.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class Ferrari488GT3evo : ICarSetupConversion - { - public CarModels CarModel => CarModels.Ferrari_488_GT3_Evo_2020; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 5.0, 5.1, 5.3, 5.5, 5.6, - 5.8, 6.0, 6.1, 6.3, 6.5, 6.6, 6.8, 7.0, 7.1, 7.3, 7.5, 7.6, 7.8, - 8.0, 8.1, 8.3, 8.5, 8.6, 8.8, 9.0, 9.1, 9.3, 9.5, 9.6, 9.8, 9.9, - 10.1, 10.3, 10.4, 10.6, 10.8, 10.9, 11.1, 11.2, 11.4, 11.6, 11.7, 11.9, - 12.1, 12.2, 12.4, 12.5, 12.7, 12.9, 13.0, 13.2, 13.3, 13.5, 13.7, 13.8, - 14.0, 14.1, 14.3, 14.4, 14.6, 14.8, 14.9, 15.1, 15.2, 15.4, 15.5, 15.7, - 15.9, 16.0, 16.2, 16.3, 16.5, 16.6, 16.8, 16.9, 17.1, 17.3, 17.4, 17.6, - 17.7, 17.9, 18.0, 18.2, 18.3, 18.5, 18.6, 18.8, 18.9, 19.1, 19.2, 19.4, - 19.5, 19.7, 19.8, 20.0, 20.1, 20.3, 20.4, 20.6 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47.0 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 94000, 101000, 107000, 113000, 120000, 126000, 138600, 151000, 163800, 176000, 189000 }; - private readonly int[] rears = new int[] { 106000, 113000, 120000, 127000, 134000, 141000, 155000, 169500, 183600, 198000, 212000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 55 + rawValue[0]; - case Position.Rear: return 55 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/HondaNsxGT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/HondaNsxGT3.cs deleted file mode 100644 index 7a6b5c5c9..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/HondaNsxGT3.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class HondaNsxGT3 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Honda_NSX_GT3_2017; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, - 10.8, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9, 12.1, 12.3, 12.4, 12.6, 12.8, 13.0, 13.2, - 13.4, 13.6, 13.8, 13.9, 14.1, 14.3, 14.5, 14.7, 14.9, 15.0, 15.2 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 115000, 124000, 133000, 142000, 151000, - 160000, 169000, 178000, 187000, 196000 }; - private readonly int[] rears = new int[] { 115000, 124000, 133000, 142000, 151000, - 160000, 169000, 178000, 187000, 196000, 205000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/HondaNsxGT3Evo.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/HondaNsxGT3Evo.cs deleted file mode 100644 index bcd27ed1e..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/HondaNsxGT3Evo.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class HondaNsxGT3Evo : ICarSetupConversion - { - public CarModels CarModel => CarModels.Honda_NSX_GT3_Evo_2019; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 8.9, 9.1 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 1 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 1 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(44 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 200 + 50 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - - private readonly int[] fronts = new int[] { 73000, 79080, 85160, 91240, - 97320, 103400, 109480, 115560, 121640, 127720, 133800, 139880, 145960, - 152040, 158120, 164200, 170280 }; - private readonly int[] rears = new int[] { 126800, 134700, 142600, 150500, - 158400, 166300, 174200, 182100, 190000, 197900, 205800, 213700, - 221600, 229500, 237400, 245300, 253200 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/JaguarG3GT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/JaguarG3GT3.cs deleted file mode 100644 index 5abeed079..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/JaguarG3GT3.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class JaguarG3GT3 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Emil_Frey_Jaguar_G3_2021; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 4.0, 4.1, 4.3, 4.5, 4.7, 4.9, 5.1, - 5.3, 5.5, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 6.9, 7.1, 7.3, 7.5, 7.7, 7.9, 8.0, - 8.2, 8.4, 8.6, 8.8, 9.0, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.2, 10.4, 10.6, 10.8, - 11.0, 11.2, 11.3 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(57 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 100000, 105000, 110000, 115000, 120000, 125000, - 130000, 135000, 140000, 145000, 150000, 155000, 160000, 165000, 170000, 175000, 180000, - 185000 }; - private readonly int[] rears = new int[] { 120000, 125000, 130000, 135000, 140000, 145000, - 150000, 155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 60 + rawValue[0]; - case Position.Rear: return 60 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniGallardoG3Reiter_2017.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniGallardoG3Reiter_2017.cs deleted file mode 100644 index 5d3d52ba6..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniGallardoG3Reiter_2017.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class LamborghiniGallardoG3Reiter_2017 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Lamborghini_Gallardo_G3_Reiter_2017; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 4.9, 5.1, 5.3, 5.5, 5.8, 6.0, 6.2, - 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, - 9.7, 9.9, 10.1, 10.3, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 12.0 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 121000, 126000, 131000, 136000, - 141000, 146000, 151000, 156000, 161000, 166000, 171000, 176000, 181000, - 186000, 191000, 196000, 201000, 206000, 211000 }; - private readonly int[] rears = new int[] { 117000, 122000, 127000, 132000, - 137000, 142000, 147000, 152000, 157000, 162000, 167000, 172000, 177000, - 182000, 187000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniHuracanGT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniHuracanGT3.cs deleted file mode 100644 index 1e23b1af7..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniHuracanGT3.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class LamborghiniHuracanGT3 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Lamborghini_Huracan_GT3_2015; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 6.2, 6.5, 6.7, 7.0, 7.3, 7.5, 7.8, 8.1, - 8.3, 8.6, 8.9, 9.1, 9.4, 9.6, 9.9, 10.2, 10.4, 10.7, 10.9, 11.2, 11.5, 11.7, 12.0, 12.2, - 12.5, 12.8, 13.0, 13.3, 13.5, 13.8, 14.0, 14.3, 14.5, 14.8, 15.0 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 121000, 144000, 167000, 190000, 201000, 212000 }; - private readonly int[] rears = new int[] { 117000, 136000, 154000, 164000, 173000, 191000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniHuracanGT3evo.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniHuracanGT3evo.cs deleted file mode 100644 index 6d72e803e..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LamborghiniHuracanGT3evo.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class LamborghiniHuracanGT3evo : ICarSetupConversion - { - public CarModels CarModel => CarModels.Lamborghini_Huracan_GT3_Evo_2019; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 6.2, 6.5, 6.7, 7.0, 7.3, 7.5, 7.8, 8.1, - 8.3, 8.6, 8.9, 9.1, 9.4, 9.6, 9.9, 10.2, 10.4, 10.7, 10.9, 11.2, 11.5, 11.7, 12.0, 12.2, - 12.5, 12.8, 13.0, 13.3, 13.5, 13.8, 14.0, 14.3, 14.5, 14.8, 15.0 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 121000, 144000, 167000, 190000, 201000, 212000 }; - private readonly int[] rears = new int[] { 117000, 136000, 154000, 164000, 173000, 191000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LexusRcfGT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/LexusRcfGT3.cs deleted file mode 100644 index f1e50d392..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/LexusRcfGT3.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class LexusRcfGT3 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Lexus_RCF_GT3_2016; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - - private readonly double[] casters = new double[] { 7.9, 8.1, 8.3, 8.5, 8.7, 8.8, 9.0, 9.2, - 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9, 12.1, - 12.3, 12.5, 12.6, 12.8, 13.0, 13.2, 13.4, 13.6 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 96000, 115000, 134000, 154000, 173000, 192000 }; - private readonly int[] rears = new int[] { 87000, 112000, 136000, 154000, 175000, 210000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 50 + rawValue[0]; - case Position.Rear: return 65 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue + 1; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Mclaren650sGT3_2015.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/Mclaren650sGT3_2015.cs deleted file mode 100644 index 7d1c1ed90..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Mclaren650sGT3_2015.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class Mclaren650sGT3_2015 : ICarSetupConversion - { - public CarModels CarModel => CarModels.McLaren_650S_GT3_2015; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 5.3, 5.6, 5.8, 6.0, 6.3, 6.5, - 6.8, 7.0, 7.3, 7.5, 7.8, 8.0, 8.2, 8.5, 8.7, 9.0, 9.2, 9.4, 9.7, 9.9, 10.2, - 10.4, 10.7, 10.9, 11.1, 11.4, 11.6, 11.8, 12.1, 12.3, 12.6, 12.8, 13.0, 13.3, - 13.5, 13.7, 14.0, 14.2, 14.4, 14.7, 14.9}; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 126000, 136000, 146000, 156000, 166000, 176000 }; - private readonly int[] rears = new int[] { 126000, 136000, 146000, 156000, 166000, 176000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 56 + rawValue[0]; - case Position.Rear: return 56 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Mclaren720sGT3.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/Mclaren720sGT3.cs deleted file mode 100644 index be2d47885..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Mclaren720sGT3.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class Mclaren720sGT3 : ICarSetupConversion - { - public CarModels CarModel => CarModels.McLaren_720S_GT3_2019; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 5.3, 5.6, 5.8, 6.0, 6.3, 6.5, 6.8, 7.0, 7.3, 7.5, 7.8, 8.0 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.48 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.1 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 118000, 134000, 150000, 166000, 182000, 198000, 214000, 230000 }; - private readonly int[] rears = new int[] { 114000, 128000, 142000, 156000, 170000, 184000, 198000, 212000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 50 + rawValue[0]; - case Position.Rear: return 64 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} - diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/MercedesAMGGT3_2015.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/MercedesAMGGT3_2015.cs deleted file mode 100644 index d0a9e3353..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/MercedesAMGGT3_2015.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class MercedesAMGGT3_2015 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Mercedes_AMG_GT3_2015; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 6.0, 6.2, 6.4, 6.6, 6.7, 6.9, 7.1, 7.3, 7.5, - 7.7, 7.9, 8.1, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, - 10.7, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 11.9, 12.1, 12.3, 12.5, 12.7, 12.8, 13.0, - 13.2, 13.4, 13.6, 13.7, 13.9, 14.1 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 130000, 143000, 155000, 171000, 187000, 202000 }; - private readonly int[] rears = new int[] { 71000, 83000, 95000, 107000, 119000, 131000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 42 + rawValue[0]; - case Position.Rear: return 67 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue + 1; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/MercedesAMGGT3evo.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/MercedesAMGGT3evo.cs deleted file mode 100644 index 4075db91d..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/MercedesAMGGT3evo.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class MercedesAMGGT3evo : ICarSetupConversion - { - public CarModels CarModel => CarModels.Mercedes_AMG_GT3_Evo_2020; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 6.0, 6.2, 6.4, 6.6, 6.7, 6.9, 7.1, 7.3, 7.5, - 7.7, 7.9, 8.1, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, - 10.7, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 11.9, 12.1, 12.3, 12.5, 12.7, 12.8, 13.0, - 13.2, 13.4, 13.6, 13.7, 13.9, 14.1 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 130000, 143000, 155000, 171000, 187000, 202000 }; - private readonly int[] rears = new int[] { 71000, 83000, 95000, 107000, 119000, 131000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 42 + rawValue[0]; - case Position.Rear: return 67 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue + 1; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/NissanGtrGT3_2015.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/NissanGtrGT3_2015.cs deleted file mode 100644 index 62781305c..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/NissanGtrGT3_2015.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class NissanGtrGT3_2015 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Nissan_GT_R_Nismo_GT3_2015; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - - private readonly double[] casters = new double[] { 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, - 7.3, 7.5, 7.7, 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.8, 10.0, 10.2, - 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.7, 11.9, 12.1, 12.3, 12.5, 12.7, 12.9, - 13.1, 13.2, 13.4, 13.6, 13.8, 14.0, 14.2, 14.4, 14.5, 14.7, 14.9, 15.1, 15.3, 15.5, - 15.6, 15.8, 16.0, 16.2, 16.4, 16.5, 16.7, 16.9, 17.1, 17.3 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0.0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47.5 + 0.3 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(12d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 122000, 132000, 142000, 152000, 162000, 172000, 182000 }; - private readonly int[] rears = new int[] { 94000, 104000, 114000, 124000, 134000, 144000, 154000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 55 + rawValue[0]; - case Position.Rear: return 55 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/NissanGtrGT3_2018.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/NissanGtrGT3_2018.cs deleted file mode 100644 index 0de8ecfd4..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/NissanGtrGT3_2018.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class NissanGtrGT3_2018 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Nissan_GT_R_Nismo_GT3_2018; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - - private readonly double[] casters = new double[] { 12.5, 12.6, 12.8, 13.0, 13.2, 13.4, 13.6, - 13.8, 13.9, 14.1, 14.3, 14.5, 14.7, 14.9, 15.0, 15.2, 15.4, 15.6, 15.8, 16.0, 16.1, 16.3, - 16.5, 16.7, 16.9, 17.0, 17.2, 17.4, 17.6, 17.8, 17.9, 18.1, 18.3, 18.5, 18.6, 18.8, 19.0, - 19.2, 19.3, 19.5, 19.7, }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0.0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47.5 + 0.3 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(12d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 136000, 146000, 156000, 166000, 176000, 186000 }; - private readonly int[] rears = new int[] { 96000, 106000, 116000, 126000, 136000, 146000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 55 + rawValue[0]; - case Position.Rear: return 55 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Porsche911IIGT3R.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/Porsche911IIGT3R.cs deleted file mode 100644 index ef6380eec..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Porsche911IIGT3R.cs +++ /dev/null @@ -1,190 +0,0 @@ -using RaceElement.Data.SetupRanges; -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class Porsche911IIGT3R : ICarSetupConversion, ISetupChanger - { - public CarModels CarModel => CarModels.Porsche_911_II_GT3_R_2019; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - private static readonly double[] casters = new double[] { 4.4, 4.6, 4.8, 5.1, 5.3, 5.5, 5.7, 5.9, 6.1, 6.3, 6.5, - 6.7, 6.9, 7.1, 7.3, 7.5, 7.7, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, - 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 12.0, 12.2, 12.4 }; - private static readonly int[] wheelRateFronts = new int[] { 100500, 110000, 114000, 119000, 127000, 137000, 141500, 146000, 155000, 173500 }; - private static readonly int[] wheelRateRears = new int[] { 137000, 149500, 156000, 162000, 174500, 187000, 193000, 199500, 212000, 237000 }; - - ITyreSetupChanger ISetupChanger.TyreSetupChanger => new TyreSetupChanger(); - IElectronicsSetupChanger ISetupChanger.ElectronicsSetupChanger => new ElectronicsSetupChanger(); - IMechanicalSetupChanger ISetupChanger.MechanicalSetupChanger => new MechSetupChanger(); - IAeroSetupChanger ISetupChanger.AeroSetupChanger => new AeroSetupChanger(); - IDamperSetupChanger ISetupChanger.DamperSetupChanger => new DamperSetupChanger(); - - private class TyreSetupChanger : ITyreSetupChanger - { - public SetupDoubleRange TyrePressures => TyrePressuresGT3; - public SetupDoubleRange CamberFront => CamberFrontGT3; - public SetupDoubleRange CamberRear => CamberRearGT3; - public SetupDoubleRange ToeFront => new SetupDoubleRange(-0.4, 0.4, 0.01); - public SetupDoubleRange ToeRear => ToeFront; - public SetupDoubleRange Caster => new SetupDoubleRange(casters); - } - - private class ElectronicsSetupChanger : IElectronicsSetupChanger - { - public SetupIntRange TractionControl => new SetupIntRange(0, 11, 1); - public SetupIntRange ABS => new SetupIntRange(0, 11, 1); - public SetupIntRange EcuMap => new SetupIntRange(1, 10, 1); - public SetupIntRange TractionControlCut => new SetupIntRange(0, 11, 1); - } - - private class MechSetupChanger : IMechanicalSetupChanger - { - public SetupIntRange AntiRollBarFront => new SetupIntRange(0, 6, 1); - public SetupIntRange AntiRollBarRear => AntiRollBarFront; - public SetupDoubleRange BrakeBias => new SetupDoubleRange(43.0, 64.0, 0.2); - public SetupIntRange PreloadDifferential => new SetupIntRange(20, 300, 10); - public SetupIntRange BrakePower => new SetupIntRange(80, 100, 1); - public SetupDoubleRange SteeringRatio => new SetupDoubleRange(11, 17, 1); - public SetupIntRange WheelRateFronts => new SetupIntRange(wheelRateFronts); - public SetupIntRange WheelRateRears => new SetupIntRange(wheelRateRears); - public SetupIntRange BumpstopRate => new SetupIntRange(300, 2500, 100); - public SetupIntRange BumpstopRangeFronts => new SetupIntRange(0, 49, 1); - public SetupIntRange BumpstopRangeRears => new SetupIntRange(0, 50, 1); - } - - private class AeroSetupChanger : IAeroSetupChanger - { - public SetupIntRange RideHeightFront => new SetupIntRange(53, 85, 1); - public SetupIntRange RideHeightRear => new SetupIntRange(55, 90, 1); - public SetupIntRange BrakeDucts => BrakeDuctsGT3; - public SetupIntRange Splitter => new SetupIntRange(0, 5, 1); - public SetupIntRange RearWing => new SetupIntRange(0, 12, 1); - } - - private class DamperSetupChanger : IDamperSetupChanger - { - public SetupIntRange BumpSlow => new SetupIntRange(0, 17, 1); - public SetupIntRange BumpFast => new SetupIntRange(0, 12, 1); - public SetupIntRange ReboundSlow => BumpSlow; - public SetupIntRange ReboundFast => BumpFast; - } - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(43 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return wheelRateFronts[rawValue[(int)wheel]]; - case Position.Rear: return wheelRateRears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 53 + rawValue[0]; - case Position.Rear: return 55 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Porsche991GT3R.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT3/Porsche991GT3R.cs deleted file mode 100644 index 801e88097..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT3/Porsche991GT3R.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT3 -{ - internal class Porsche991GT3R : ICarSetupConversion - { - public CarModels CarModel => CarModels.Porsche_911_GT3_R_2018; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT3; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, - 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, - 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(43 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 83000, 100000, 116000, 133000, 149000, 166000 }; - private readonly int[] rears = new int[] { 115000, 128000, 141000, 154000, 167000, 180000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 60 + rawValue[0]; - case Position.Rear: return 60 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/AMRV8VantageGT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/AMRV8VantageGT4.cs deleted file mode 100644 index 87ba4315d..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/AMRV8VantageGT4.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class AMRV8VantageGT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Aston_Martin_Vantage_AMR_GT4_2018; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-4 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 10.7, 10.9, 11.1, 11.3, 11.5, 11.6, 11.8, 12.0, 12.2, 12.4, 12.5, 12.7, 12.9, - 13.1, 13.3, 13.4, 13.6, 13.8, 14.0, 14.2, 14.3, 14.5, 14.7, 14.9, 15.0, 15.2, - 15.4, 15.6, 15.7, 15.9, 16.1 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(45 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 10 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(14d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 80000, 90000, 100000, 110000 }; - private readonly int[] rears = new int[] { 70000, 75000, 80000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 93 + rawValue[0]; - case Position.Rear: return 97 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/AlpineA110GT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/AlpineA110GT4.cs deleted file mode 100644 index afc3c1e6e..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/AlpineA110GT4.cs +++ /dev/null @@ -1,190 +0,0 @@ -using RaceElement.Data.SetupRanges; -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class AlpineA110GT4 : ICarSetupConversion, ISetupChanger - { - public CarModels CarModel => CarModels.Alpine_A110_GT4_2018; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - private static readonly double[] casters = new double[] { 7.3, 7.5, 7.7, 7.9, 8.1, 8.3, 8.5, 8.6, 8.8, 9.0, 9.2, - 9.4, 9.6, 9.8, 10.0, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.6, 11.8, 12.0, 12.2, - 12.4, 12.6, 12.7, 12.9, 13.1, 13.3, 13.5, 13.7 }; - private static readonly int[] wheelRateFronts = new int[] { 62500, 72500, 82500, 92500 }; - private static readonly int[] wheelRateRears = new int[] { 73300, 83300, 93300, 103300 }; - - ITyreSetupChanger ISetupChanger.TyreSetupChanger => new TyreSetupChanger(); - IElectronicsSetupChanger ISetupChanger.ElectronicsSetupChanger => new ElectronicsSetupChanger(); - IMechanicalSetupChanger ISetupChanger.MechanicalSetupChanger => new MechSetupChanger(); - IAeroSetupChanger ISetupChanger.AeroSetupChanger => new AeroSetupChanger(); - IDamperSetupChanger ISetupChanger.DamperSetupChanger => new DamperSetupChanger(); - - private class TyreSetupChanger : ITyreSetupChanger - { - public SetupDoubleRange TyrePressures => TyrePressuresGT4; - public SetupDoubleRange CamberFront => new SetupDoubleRange(-5.0, 0.0, 0.1); - public SetupDoubleRange CamberRear => CamberFront; - public SetupDoubleRange ToeFront => new SetupDoubleRange(-0.4, 0.4, 0.01); - public SetupDoubleRange ToeRear => ToeFront; - public SetupDoubleRange Caster => new SetupDoubleRange(casters); - } - - private class ElectronicsSetupChanger : IElectronicsSetupChanger - { - public SetupIntRange TractionControl => new SetupIntRange(0, 5, 1); - public SetupIntRange ABS => new SetupIntRange(0, 10, 1); - public SetupIntRange EcuMap => new SetupIntRange(1, 1, 1); - public SetupIntRange TractionControlCut => new SetupIntRange(0, 0, 1); - } - - private class MechSetupChanger : IMechanicalSetupChanger - { - public SetupIntRange AntiRollBarFront => new SetupIntRange(0, 3, 1); - public SetupIntRange AntiRollBarRear => new SetupIntRange(0, 2, 1); - public SetupDoubleRange BrakeBias => new SetupDoubleRange(45.0, 70.0, 0.2); - public SetupIntRange PreloadDifferential => new SetupIntRange(10, 80, 10); - public SetupIntRange BrakePower => new SetupIntRange(80, 100, 1); - public SetupDoubleRange SteeringRatio => new SetupDoubleRange(12, 18, 1); - public SetupIntRange WheelRateFronts => new SetupIntRange(wheelRateFronts); - public SetupIntRange WheelRateRears => new SetupIntRange(wheelRateRears); - public SetupIntRange BumpstopRate => new SetupIntRange(300, 1000, 100); - public SetupIntRange BumpstopRangeFronts => new SetupIntRange(0, 0, 1); - public SetupIntRange BumpstopRangeRears => new SetupIntRange(0, 0, 1); - } - - private class AeroSetupChanger : IAeroSetupChanger - { - public SetupIntRange RideHeightFront => new SetupIntRange(95, 120, 1); - public SetupIntRange RideHeightRear => new SetupIntRange(85, 125, 1); - public SetupIntRange BrakeDucts => BrakeDuctsGT3; - public SetupIntRange Splitter => new SetupIntRange(0, 0, 1); - public SetupIntRange RearWing => new SetupIntRange(0, 4, 1); - } - - private class DamperSetupChanger : IDamperSetupChanger - { - public SetupIntRange BumpSlow => new SetupIntRange(0, 24, 1); - public SetupIntRange BumpFast => new SetupIntRange(0, 0, 1); - public SetupIntRange ReboundSlow => BumpSlow; - public SetupIntRange ReboundFast => BumpFast; - } - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - //private readonly double[] casters = new double[] { 7.3, 7.5, 7.7, 7.9, 8.1, 8.3, 8.5, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.6, 11.8, 12.0, 12.2, 12.4, 12.6, 12.7, 12.9, 13.1, 13.3, 13.5, 13.7 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(45 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 10 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(12d + rawValue, 2); - } - - //private readonly int[] fronts = new int[] { 62500, 72500, 82500, 92500 }; - //private readonly int[] rears = new int[] { 73300, 83300, 93300, 103300 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return wheelRateFronts[rawValue[(int)wheel]]; - case Position.Rear: return wheelRateRears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 95 + rawValue[0]; - case Position.Rear: return 85 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/AudiR8GT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/AudiR8GT4.cs deleted file mode 100644 index b6b16ad36..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/AudiR8GT4.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class AudiR8GT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Audi_R8_LMS_GT4_2016; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4.5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, - 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, - 11.4, 11.6, 11.8, 12.0, 12.2,12.3, 12.7, 12.9, 13.1, 13.3 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 10 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(14d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 142000, 160000 }; - private readonly int[] rears = new int[] { 146000, 163000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => new CustomDamperSetup(); - private class CustomDamperSetup : IDamperSetup - { - int IDamperSetup.BumpFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - int IDamperSetup.BumpSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.ReboundFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - int IDamperSetup.ReboundSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - } - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 105 + rawValue[0]; - case Position.Rear: return 112 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/BMWM4GT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/BMWM4GT4.cs deleted file mode 100644 index e18128fa4..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/BMWM4GT4.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class BMWM4GT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.BMW_M4_GT4_2018; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4.5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 8.4 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0.0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(49 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 10 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 165888, 184320, 202752 }; - private readonly int[] rears = new int[] { 103335, 117113, 130891 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 70 + rawValue[0]; - case Position.Rear: return 65 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/ChevroletCamaroGT4R.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/ChevroletCamaroGT4R.cs deleted file mode 100644 index ef5b45586..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/ChevroletCamaroGT4R.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class ChevroletCamaroGT4R : ICarSetupConversion - { - public CarModels CarModel => CarModels.Chevrolet_Camaro_GT4_R_2017; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-5.0 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 7.1 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0.0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(47 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 165888, 184320, 202752 }; - private readonly int[] rears = new int[] { 90000, 102000, 114000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 115 + rawValue[0]; - case Position.Rear: return 123 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/GinettaG55GT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/GinettaG55GT4.cs deleted file mode 100644 index 64213dc82..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/GinettaG55GT4.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class GinettaG55GT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Ginetta_G55_GT4_2012; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4.0 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 3.7, 3.9, 4.2, 4.5, 4.7, 5.0, 5.3, 5.6, 5.8, 6.1, 6.4, 6.6, 6.9, 7.2, 7.4, 7.7, - 7.9, 8.2, 8.5, 8.7, 9.0, 9.3, 9.5, 9.8, 10.1, 10.3, 10.6, 10.8, 11.1, 11.4, 11.6, - 11.9, 12.1, 12.4, 12.7, 12.9, 13.2, 13.4, 13.7, 13.9, 14.2 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(46 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 80000, 90000, 100000, 110000, 120000 }; - private readonly int[] rears = new int[] { 60000, 70000, 80000, 90000, 100000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 75 + rawValue[0]; - case Position.Rear: return 76 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/KTMXbowGT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/KTMXbowGT4.cs deleted file mode 100644 index e92f2da72..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/KTMXbowGT4.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class KTMXbowGT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.KTM_Xbow_GT4_2016; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-2.5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-2.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.1, 3.3, 3.5, 3.7, 3.9, 4.1, 4.3, 4.5, 4.7, - 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.1, 7.3, 7.5, 7.7, - 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.2, 9.4 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(44 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 10 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 87000, 97000, 107000, 117000, 127000 }; - private readonly int[] rears = new int[] { 81000, 91000, 101000, 111000, 121000, 131000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 110 + rawValue[0]; - case Position.Rear: return 110 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/MaseratiMCGT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/MaseratiMCGT4.cs deleted file mode 100644 index 3396ce224..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/MaseratiMCGT4.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class MaseratiMCGT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Maserati_Gran_Turismo_MC_GT4_2016; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4.3 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-2.8 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 3.4, 3.7, 3.9, 4.1, 4.3, 4.5, 4.7, 5.0, 5.2, 5.4, 5.6 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue + 1; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue + 1; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(49 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(14d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 116000, 151000, 186000 }; - private readonly int[] rears = new int[] { 113000, 138000, 163000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 80 + rawValue[0]; - case Position.Rear: return 105 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/Mclaren570SGT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/Mclaren570SGT4.cs deleted file mode 100644 index a6ffaadbd..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/Mclaren570SGT4.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class Mclaren570SGT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.McLaren_570s_GT4_2016; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-5.0 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-5.0 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 5.3, 5.6, 5.8, 6.0, 6.3, 6.5, 6.8, 7.0, 7.3, 7.5, 7.8, - 8.0, 8.2, 8.5, 8.7, 9.0, 9.2, 9.4, 9.7, 9.9, 10.2 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(60 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 0 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 140000, 175000 }; - private readonly int[] rears = new int[] { 162850, 175520 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 100 + rawValue[0]; - case Position.Rear: return 100 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/MercedesAMGGT4.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/MercedesAMGGT4.cs deleted file mode 100644 index 70c0aa049..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/MercedesAMGGT4.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class MercedesAMGGT4 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Mercedes_AMG_GT4_2016; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4.5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 9.2, 9.4, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, - 11.9, 12.1, 12.3, 12.5, 12.7, 12.8, 13.0, 13.2, 13.4, 13.6, 13.7, 13.9, 14.1, 14.3, - 14.5, 14.6, 14.8, 15.0, 15.2, 15.4, 15.5, 15.7, 15.9, 16.1, 16.2, 16.4 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0.0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(51 + 0.3 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 10 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 78000, 88000, 104000 }; - private readonly int[] rears = new int[] { 66000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 103 + rawValue[0]; - case Position.Rear: return 101 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GT4/Porsche718CaymanGT4MR.cs b/Race_Element.Data.ACC/SetupParser/Cars/GT4/Porsche718CaymanGT4MR.cs deleted file mode 100644 index 945ff23ef..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GT4/Porsche718CaymanGT4MR.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GT4 -{ - internal class Porsche718CaymanGT4MR : ICarSetupConversion - { - public CarModels CarModel => CarModels.Porsche_718_Cayman_GT4_MR_2019; - - CarClasses ICarSetupConversion.CarClass => CarClasses.GT4; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-5.0 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-5.0 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, - 8.9, 9.0, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return 0 + rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return 0 + rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(45 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 10 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(15d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 99000, 108000, 116000, 124000 }; - private readonly int[] rears = new int[] { 91000, 99000, 108000, 116000, 124000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 96 + rawValue[0]; - case Position.Rear: return 84 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GTC/Ferrari488ChallengeEvo.cs b/Race_Element.Data.ACC/SetupParser/Cars/GTC/Ferrari488ChallengeEvo.cs deleted file mode 100644 index 4ac80450d..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GTC/Ferrari488ChallengeEvo.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GTC -{ - internal class Ferrari488ChallengeEvo : ICarSetupConversion - { - public CarModels CarModel => CarModels.Ferrari_488_Challenge_Evo_2020; - - CarClasses ICarSetupConversion.CarClass => CarClasses.CHL; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-4.4 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.3 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 5.0, 5.1, 5.3, 5.5, 5.6, 5.8, 6.0, 6.1, 6.3, 6.5, 6.6, 6.8, 7.0, 7.1, 7.3, 7.5, - 7.6, 7.8, 8.0, 8.1, 8.3, 8.5, 8.6, 8.8, 9.0, 9.1, 9.3, 9.5, 9.6, 9.8, 9.9, 10.1, - 10.3, 10.4, 10.6, 10.8, 10.9, 11.1, 11.2, 11.4, 11.6, 11.7, 11.9, 12.1, 12.2, - 12.4, 12.5, 12.7, 12.9, 13.0, 13.2, 13.3, 13.5, 13.7, 13.8, 14.0, 14.1, 14.3, - 14.4, 14.6, 14.8, 14.9, 15.1, 15.2, 15.4, 15.5, 15.7, 15.9, 16.0, 16.2, 16.3, - 16.5, 16.6, 16.8, 16.9, 17.1, 17.3, 17.4, 17.6, 17.7, 17.9, 18.2, 18.3, 18.5, - 18.6, 18.8, 18.9, 19.1, 19.2, 19.4, 19.5, 19.7, 19.8, 20.0, 20.1, 20.3, 20.4, 20.6 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(51 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 0 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 0 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 151000, 163800 }; - private readonly int[] rears = new int[] { 141000, 155000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 59 + rawValue[0]; - case Position.Rear: return 103 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue + 1; - } - } - } -} \ No newline at end of file diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GTC/LamborghiniHuracanSTEvo2.cs b/Race_Element.Data.ACC/SetupParser/Cars/GTC/LamborghiniHuracanSTEvo2.cs deleted file mode 100644 index ec3081e84..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GTC/LamborghiniHuracanSTEvo2.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GTC -{ - internal class LamborghiniHuracanSTEvo22021 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Lamborghini_Huracan_ST_Evo2_2021; - - CarClasses ICarSetupConversion.CarClass => CarClasses.ST; // did this for tyre pressures, should be 'GTC' - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-3.0 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { - 10.7, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9, 12.1, 12.3, 12.5, 12.1, 12.9, 13.1, - 13.3, 13.5, 13.7, 13.9, 14.1, 14.3, 14.5, 14.7, 14.9, 15.1, 15.3, 15.5, 15.7, - 15.9, 16.1, 16.3, 16.5, 16.7, 16.8, 17.0, 17.2, 17.4 - }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 121000, 144000, 167000, 190000, 201000, 212000 }; - private readonly int[] rears = new int[] { 117000, 136000, 154000, 164000, 173000, 191000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - //IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - IDamperSetup ICarSetupConversion.DamperSetup => new CustomDamperSetup(); - private class CustomDamperSetup : IDamperSetup - { - int IDamperSetup.BumpFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.BumpSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.ReboundFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.ReboundSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - } - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GTC/LamborghiniHuracanST_2015.cs b/Race_Element.Data.ACC/SetupParser/Cars/GTC/LamborghiniHuracanST_2015.cs deleted file mode 100644 index dc6da8049..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GTC/LamborghiniHuracanST_2015.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GTC -{ - internal class LamborghiniHuracanST_2015 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Lamborghini_Huracan_ST_2015; - - CarClasses ICarSetupConversion.CarClass => CarClasses.ST; // did this for tyre pressures, should be 'GTC' - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 6.2, 6.5, 6.7, 7.0, 7.3, 7.5, 7.8, 8.1, - 8.3, 8.6, 8.9, 9.1, 9.4, 9.6, 9.9, 10.2, 10.4, 10.7, 10.9, 11.2, 11.5, 11.7, 12.0, 12.2, - 12.5, 12.8, 13.0, 13.3, 13.5, 13.8, 14.0, 14.3, 14.5, 14.8, 15.0 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 100 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 121000, 144000, 167000, 190000, 201000, 212000 }; - private readonly int[] rears = new int[] { 117000, 136000, 154000, 164000, 173000, 191000 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 54 + rawValue[0]; - case Position.Rear: return 54 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GTC/Porsche991IIGT3Cup_2017.cs b/Race_Element.Data.ACC/SetupParser/Cars/GTC/Porsche991IIGT3Cup_2017.cs deleted file mode 100644 index d15cf0255..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GTC/Porsche991IIGT3Cup_2017.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GTC -{ - internal class Porsche991IIGT3Cup_2017 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Porsche_991_II_GT3_Cup_2017; - - CarClasses ICarSetupConversion.CarClass => CarClasses.CUP; // did this for tyre pressures, should be 'GTC' - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-6.5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, - 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, - 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 1000 + 0 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 0 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 0, 1, 2, 3 }; - private readonly int[] rears = new int[] { 0, 1, 2, 3 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 60 + rawValue[0]; - case Position.Rear: return 80 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/GTC/Porsche992GT3Cup_2021.cs b/Race_Element.Data.ACC/SetupParser/Cars/GTC/Porsche992GT3Cup_2021.cs deleted file mode 100644 index eee25c03b..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/GTC/Porsche992GT3Cup_2021.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.GTC -{ - internal class Porsche992GT3Cup_2021 : ICarSetupConversion - { - public CarModels CarModel => CarModels.Porsche_992_GT3_Cup_2021; - - CarClasses ICarSetupConversion.CarClass => CarClasses.CUP; // did this for tyre pressures, should be 'GTC' - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020; - - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-4.4 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - private readonly double[] casters = new double[] { 14.8 }; - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-0.4 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(50 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 1 + 0 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 0 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(11d + rawValue, 2); - } - - private readonly int[] fronts = new int[] { 1 }; - private readonly int[] rears = new int[] { 1 }; - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return fronts[rawValue[(int)wheel]]; - case Position.Rear: return rears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - //IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - IDamperSetup ICarSetupConversion.DamperSetup => new CustomDamperSetup(); - private class CustomDamperSetup : IDamperSetup - { - int IDamperSetup.BumpFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.BumpSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.ReboundFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.ReboundSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - } - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 72 + rawValue[0]; - case Position.Rear: return 106 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/Cars/TCX/BMWM2CSRacing.cs b/Race_Element.Data.ACC/SetupParser/Cars/TCX/BMWM2CSRacing.cs deleted file mode 100644 index 67253e556..000000000 --- a/Race_Element.Data.ACC/SetupParser/Cars/TCX/BMWM2CSRacing.cs +++ /dev/null @@ -1,216 +0,0 @@ -using RaceElement.Data.SetupRanges; -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Data.Cars.TCX -{ - internal class BMWM2CSRacing : ICarSetupConversion, ISetupChanger - { - public CarModels CarModel => CarModels.BMW_M2_Cup_2020; - - CarClasses ICarSetupConversion.CarClass => CarClasses.TCX; - public DryTyreCompounds DryTyreCompound => DryTyreCompounds.DHE2020_GT4; - - - private static readonly double[] casters = new double[] { 8.5 }; - private static readonly int[] wheelRateFronts = new int[] { 162000, 180000, 198000 }; - private static readonly int[] wheelRateRears = new int[] { 103000, 117000, 131000 }; - - ITyreSetupChanger ISetupChanger.TyreSetupChanger => new TyreSetupChanger(); - IElectronicsSetupChanger ISetupChanger.ElectronicsSetupChanger => new ElectronicsSetupChanger(); - IMechanicalSetupChanger ISetupChanger.MechanicalSetupChanger => new MechSetupChanger(); - IAeroSetupChanger ISetupChanger.AeroSetupChanger => new AeroSetupChanger(); - IDamperSetupChanger ISetupChanger.DamperSetupChanger => new DamperSetupChanger(); - - private class TyreSetupChanger : ITyreSetupChanger - { - public SetupDoubleRange TyrePressures => TyrePressuresGT4; - public SetupDoubleRange CamberFront => new SetupDoubleRange(-5.0, -3.0, 0.1); - public SetupDoubleRange CamberRear => new SetupDoubleRange(-3.5, -2.0, 0.1); - public SetupDoubleRange ToeFront => new SetupDoubleRange(-0.2, 0.2, 0.01); - public SetupDoubleRange ToeRear => new SetupDoubleRange(0.0, 0.31, 0.01); - public SetupDoubleRange Caster => new SetupDoubleRange(casters); - } - - private class ElectronicsSetupChanger : IElectronicsSetupChanger - { - public SetupIntRange TractionControl => new SetupIntRange(0, 4, 1); - public SetupIntRange ABS => new SetupIntRange(0, 2, 1); - public SetupIntRange EcuMap => new SetupIntRange(1, 1, 1); - public SetupIntRange TractionControlCut => new SetupIntRange(0, 0, 1); - } - - private class MechSetupChanger : IMechanicalSetupChanger - { - public SetupIntRange AntiRollBarFront => new SetupIntRange(0, 2, 1); - public SetupIntRange AntiRollBarRear => AntiRollBarFront; - public SetupDoubleRange BrakeBias => new SetupDoubleRange(56.0, 56.0, 0.2); - public SetupIntRange PreloadDifferential => new SetupIntRange(20, 20, 10); - public SetupIntRange BrakePower => new SetupIntRange(80, 100, 1); - public SetupDoubleRange SteeringRatio => new SetupDoubleRange(10, 17, 1); - public SetupIntRange WheelRateFronts => new SetupIntRange(wheelRateFronts); - public SetupIntRange WheelRateRears => new SetupIntRange(wheelRateRears); - public SetupIntRange BumpstopRate => new SetupIntRange(300, 1000, 100); - public SetupIntRange BumpstopRangeFronts => new SetupIntRange(0, 48, 1); - public SetupIntRange BumpstopRangeRears => new SetupIntRange(0, 40, 1); - } - - private class AeroSetupChanger : IAeroSetupChanger - { - public SetupIntRange RideHeightFront => new SetupIntRange(125, 140, 1); - public SetupIntRange RideHeightRear => RideHeightFront; - public SetupIntRange BrakeDucts => BrakeDuctsGT3; - public SetupIntRange Splitter => new SetupIntRange(0, 0, 1); - public SetupIntRange RearWing => new SetupIntRange(1, 5, 1); - } - - private class DamperSetupChanger : IDamperSetupChanger - { - public SetupIntRange BumpSlow => new SetupIntRange(1, 20, 1); - public SetupIntRange BumpFast => new SetupIntRange(0, 0, 1); - public SetupIntRange ReboundSlow => BumpSlow; - public SetupIntRange ReboundFast => BumpFast; - } - - AbstractTyresSetup ICarSetupConversion.TyresSetup => new TyreSetup(); - private class TyreSetup : AbstractTyresSetup - { - public override double Camber(Wheel wheel, List rawValue) - { - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-5 + 0.1 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(-3.5 + 0.1 * rawValue[(int)wheel], 2); - default: return -1; - } - } - - public override double Caster(int rawValue) - { - return Math.Round(casters[rawValue], 2); - } - - public override double Toe(Wheel wheel, List rawValue) - { - - switch (GetPosition(wheel)) - { - case Position.Front: return Math.Round(-0.2 + 0.01 * rawValue[(int)wheel], 2); - case Position.Rear: return Math.Round(0 + 0.01 * rawValue[(int)wheel], 2); - default: return -1; - } - - } - } - - IMechanicalSetup ICarSetupConversion.MechanicalSetup => new MechSetup(); - private class MechSetup : IMechanicalSetup - { - public int AntiRollBarFront(int rawValue) - { - return rawValue; - } - - public int AntiRollBarRear(int rawValue) - { - return rawValue; - } - - public double BrakeBias(int rawValue) - { - return Math.Round(56 + 0.2 * rawValue, 2); - } - - public int BrakePower(int rawValue) - { - return 80 + rawValue; - } - - public int BumpstopRange(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - public int BumpstopRate(List rawValue, Wheel wheel) - { - return 300 + 0 * rawValue[(int)wheel]; - } - - public int PreloadDifferential(int rawValue) - { - return 20 + rawValue * 10; - } - - public double SteeringRatio(int rawValue) - { - return Math.Round(10d + rawValue, 2); - } - - public int WheelRate(List rawValue, Wheel wheel) - { - switch (GetPosition(wheel)) - { - case Position.Front: return wheelRateFronts[rawValue[(int)wheel]]; - case Position.Rear: return wheelRateRears[rawValue[(int)wheel]]; - default: return -1; - } - } - } - - //IDamperSetup ICarSetupConversion.DamperSetup => DefaultDamperSetup; - IDamperSetup ICarSetupConversion.DamperSetup => new CustomDamperSetup(); - private class CustomDamperSetup : IDamperSetup - { - int IDamperSetup.BumpFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - int IDamperSetup.BumpSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - - int IDamperSetup.ReboundFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - int IDamperSetup.ReboundSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel] + 1; - } - } - - IAeroBalance ICarSetupConversion.AeroBalance => new AeroSetup(); - private class AeroSetup : IAeroBalance - { - public int BrakeDucts(int rawValue) - { - return rawValue; - } - - public int RearWing(int rawValue) - { - return rawValue + 1; - } - - public int RideHeight(List rawValue, Position position) - { - switch (position) - { - case Position.Front: return 125 + rawValue[0]; - case Position.Rear: return 125 + rawValue[2]; - default: return -1; - } - } - - public int Splitter(int rawValue) - { - return rawValue; - } - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/ConversionFactory.cs b/Race_Element.Data.ACC/SetupParser/ConversionFactory.cs deleted file mode 100644 index c21e353ab..000000000 --- a/Race_Element.Data.ACC/SetupParser/ConversionFactory.cs +++ /dev/null @@ -1,414 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using RaceElement.Data.Cars.GT3; -using RaceElement.Data.Cars.GT4; - -using RaceElement.Data.Cars.GTC; -using RaceElement.Data.Cars.TCX; -using System.IO; -using System; -using System.Diagnostics; -using Newtonsoft.Json; -using static RaceElement.Data.SetupConverter; -using static RaceElement.Data.ConversionFactory.CarModels; -using static RaceElement.Data.SetupJson; - -namespace RaceElement.Data -{ - public static class ConversionFactory - { - public enum CarModels - { - None, - Alpine_A110_GT4_2018, - Aston_Martin_V8_Vantage_GT3_2019, - Aston_Martin_Vantage_AMR_GT4_2018, - Aston_Martin_Vantage_V12_GT3_2013, - Audi_R8_LMS_2015, - Audi_R8_LMS_GT4_2016, - Audi_R8_LMS_Evo_2019, - Audi_R8_LMS_Evo_II_2022, - Bentley_Continental_GT3_2015, - Bentley_Continental_GT3_2018, - BMW_M2_Cup_2020, - BMW_M4_GT3_2021, - BMW_M4_GT4_2018, - BMW_M6_GT3_2017, - Chevrolet_Camaro_GT4_R_2017, - Emil_Frey_Jaguar_G3_2021, - Ferrari_488_Challenge_Evo_2020, - Ferrari_488_GT3_2018, - Ferrari_488_GT3_Evo_2020, - Ginetta_G55_GT4_2012, - Honda_NSX_GT3_2017, - Honda_NSX_GT3_Evo_2019, - KTM_Xbow_GT4_2016, - Lexus_RCF_GT3_2016, - Lamborghini_Huracan_GT3_2015, - Lamborghini_Huracan_GT3_Evo_2019, - Lamborghini_Huracan_ST_2015, - Lamborghini_Huracan_ST_Evo2_2021, - Lamborghini_Gallardo_G3_Reiter_2017, - Maserati_Gran_Turismo_MC_GT4_2016, - McLaren_570s_GT4_2016, - McLaren_650S_GT3_2015, - McLaren_720S_GT3_2019, - Mercedes_AMG_GT3_2015, - Mercedes_AMG_GT3_Evo_2020, - Mercedes_AMG_GT4_2016, - Nissan_GT_R_Nismo_GT3_2015, - Nissan_GT_R_Nismo_GT3_2018, - Porsche_718_Cayman_GT4_MR_2019, - Porsche_991_II_GT3_Cup_2017, - Porsche_911_II_GT3_R_2019, - Porsche_911_GT3_R_2018, - Porsche_992_GT3_Cup_2021 - } - - private static readonly Dictionary Changers = new Dictionary() - { - // GT3 - {Aston_Martin_V8_Vantage_GT3_2019, new AMRV8VantageGT3() }, - {Aston_Martin_Vantage_V12_GT3_2013, new AMRV12VantageGT3() }, - //{Audi_R8_LMS_2015, new AudiR8LMS() }, - //{Audi_R8_LMS_Evo_2019, new AudiR8LMSevo() }, - //{Audi_R8_LMS_Evo_II_2022, new AudiR8LMSevoII() }, - //{Bentley_Continental_GT3_2015, new BentleyContinentalGT3_2015() }, - //{Bentley_Continental_GT3_2018, new BentleyContinentalGT3_2018() }, - //{BMW_M4_GT3_2021, new BmwM4GT3() }, - //{BMW_M6_GT3_2017, new BmwM6GT3_2017() } , - //{Emil_Frey_Jaguar_G3_2021, new JaguarG3GT3() }, - //{Ferrari_488_GT3_2018, new Ferrari488GT3() }, - //{Ferrari_488_GT3_Evo_2020, new Ferrari488GT3evo() }, - //{Honda_NSX_GT3_2017, new HondaNsxGT3() }, - //{Honda_NSX_GT3_Evo_2019, new HondaNsxGT3Evo() }, - //{Lamborghini_Gallardo_G3_Reiter_2017, new LamborghiniGallardoG3Reiter_2017() }, - //{Lamborghini_Huracan_GT3_2015, new LamborghiniHuracanGT3() }, - //{Lamborghini_Huracan_GT3_Evo_2019, new LamborghiniHuracanGT3evo() }, - //{Lamborghini_Huracan_ST_2015, new LamborghiniHuracanST_2015() }, - //{Lamborghini_Huracan_ST_Evo2_2021, new LamborghiniHuracanSTEvo22021() }, - //{Lexus_RCF_GT3_2016, new LexusRcfGT3() }, - //{McLaren_650S_GT3_2015, new Mclaren650sGT3_2015() }, - //{McLaren_720S_GT3_2019, new Mclaren720sGT3() }, - //{Mercedes_AMG_GT3_2015, new MercedesAMGGT3_2015() }, - //{Mercedes_AMG_GT3_Evo_2020, new MercedesAMGGT3evo() }, - //{Nissan_GT_R_Nismo_GT3_2015, new NissanGtrGT3_2015() }, - //{Nissan_GT_R_Nismo_GT3_2018, new NissanGtrGT3_2018() }, - {Porsche_911_II_GT3_R_2019, new Porsche911IIGT3R() }, - //{Porsche_911_GT3_R_2018, new Porsche991GT3R() }, - - // GT4 - {Alpine_A110_GT4_2018, new AlpineA110GT4() }, - //{Aston_Martin_Vantage_AMR_GT4_2018, new AMRV8VantageGT4() }, - //{Audi_R8_LMS_GT4_2016, new AudiR8GT4() }, - //{BMW_M4_GT4_2018, new BMWM4GT4() }, - //{Chevrolet_Camaro_GT4_R_2017, new ChevroletCamaroGT4R() }, - //{Ginetta_G55_GT4_2012, new GinettaG55GT4() }, - //{KTM_Xbow_GT4_2016, new KTMXbowGT4() }, - //{Maserati_Gran_Turismo_MC_GT4_2016, new MaseratiMCGT4() }, - //{McLaren_570s_GT4_2016, new Mclaren570SGT4() }, - //{Mercedes_AMG_GT4_2016, new MercedesAMGGT4() }, - //{Porsche_718_Cayman_GT4_MR_2019, new Porsche718CaymanGT4MR() }, - - // GTC - //{Porsche_991_II_GT3_Cup_2017, new Porsche991IIGT3Cup_2017() }, - //{Porsche_992_GT3_Cup_2021, new Porsche992GT3Cup_2021() }, - //{Ferrari_488_Challenge_Evo_2020, new Ferrari488ChallengeEvo() }, - - // TCX - {BMW_M2_Cup_2020, new BMWM2CSRacing() } - }; - - public static ISetupChanger GetChanger(CarModels model) - { - bool found = Changers.TryGetValue(model, out var changer); - if (found) return changer; - return null; - } - - private static readonly Dictionary Conversions = new Dictionary() - { - // GT3 - {Aston_Martin_V8_Vantage_GT3_2019, new AMRV8VantageGT3() }, - {Aston_Martin_Vantage_V12_GT3_2013, new AMRV12VantageGT3() }, - {Audi_R8_LMS_2015, new AudiR8LMS() }, - {Audi_R8_LMS_Evo_2019, new AudiR8LMSevo() }, - {Audi_R8_LMS_Evo_II_2022, new AudiR8LMSevoII() }, - {Bentley_Continental_GT3_2015, new BentleyContinentalGT3_2015() }, - {Bentley_Continental_GT3_2018, new BentleyContinentalGT3_2018() }, - {BMW_M4_GT3_2021, new BmwM4GT3() }, - {BMW_M6_GT3_2017, new BmwM6GT3_2017() } , - {Emil_Frey_Jaguar_G3_2021, new JaguarG3GT3() }, - {Ferrari_488_GT3_2018, new Ferrari488GT3() }, - {Ferrari_488_GT3_Evo_2020, new Ferrari488GT3evo() }, - {Honda_NSX_GT3_2017, new HondaNsxGT3() }, - {Honda_NSX_GT3_Evo_2019, new HondaNsxGT3Evo() }, - {Lamborghini_Gallardo_G3_Reiter_2017, new LamborghiniGallardoG3Reiter_2017() }, - {Lamborghini_Huracan_GT3_2015, new LamborghiniHuracanGT3() }, - {Lamborghini_Huracan_GT3_Evo_2019, new LamborghiniHuracanGT3evo() }, - {Lamborghini_Huracan_ST_2015, new LamborghiniHuracanST_2015() }, - {Lamborghini_Huracan_ST_Evo2_2021, new LamborghiniHuracanSTEvo22021() }, - {Lexus_RCF_GT3_2016, new LexusRcfGT3() }, - {McLaren_650S_GT3_2015, new Mclaren650sGT3_2015() }, - {McLaren_720S_GT3_2019, new Mclaren720sGT3() }, - {Mercedes_AMG_GT3_2015, new MercedesAMGGT3_2015() }, - {Mercedes_AMG_GT3_Evo_2020, new MercedesAMGGT3evo() }, - {Nissan_GT_R_Nismo_GT3_2015, new NissanGtrGT3_2015() }, - {Nissan_GT_R_Nismo_GT3_2018, new NissanGtrGT3_2018() }, - {Porsche_911_II_GT3_R_2019, new Porsche911IIGT3R() }, - {Porsche_911_GT3_R_2018, new Porsche991GT3R() }, - - // GT4 - {Alpine_A110_GT4_2018, new AlpineA110GT4() }, - {Aston_Martin_Vantage_AMR_GT4_2018, new AMRV8VantageGT4() }, - {Audi_R8_LMS_GT4_2016, new AudiR8GT4() }, - {BMW_M4_GT4_2018, new BMWM4GT4() }, - {Chevrolet_Camaro_GT4_R_2017, new ChevroletCamaroGT4R() }, - {Ginetta_G55_GT4_2012, new GinettaG55GT4() }, - {KTM_Xbow_GT4_2016, new KTMXbowGT4() }, - {Maserati_Gran_Turismo_MC_GT4_2016, new MaseratiMCGT4() }, - {McLaren_570s_GT4_2016, new Mclaren570SGT4() }, - {Mercedes_AMG_GT4_2016, new MercedesAMGGT4() }, - {Porsche_718_Cayman_GT4_MR_2019, new Porsche718CaymanGT4MR() }, - - // GTC - {Porsche_991_II_GT3_Cup_2017, new Porsche991IIGT3Cup_2017() }, - {Porsche_992_GT3_Cup_2021, new Porsche992GT3Cup_2021() }, - {Ferrari_488_Challenge_Evo_2020, new Ferrari488ChallengeEvo() }, - - // TCX - {BMW_M2_Cup_2020, new BMWM2CSRacing() } - }; - - public static ICarSetupConversion GetConversion(CarModels model) - { - bool found = Conversions.TryGetValue(model, out var conversion); - if (found) return conversion; - return null; - } - - public static List GetAllNamesByClass(CarClasses carClass) - { - List classNames = new List(); - Conversions.ToList().ForEach(x => - { - if (x.Value.CarClass == carClass) - { - classNames.Add(CarModelToCarName[x.Value.CarModel]); - } - }); - - return classNames; - } - - public static readonly Dictionary CarModelToCarName = new Dictionary() { - {None, "Unknown car model" }, - {Alpine_A110_GT4_2018, "Alpine A110 GT4 2018" }, - {Aston_Martin_V8_Vantage_GT3_2019, "Aston Martin V8 Vantage GT3 2019" }, - {Aston_Martin_Vantage_AMR_GT4_2018, "Aston Martin Vantage AMR GT4 2018" }, - {Aston_Martin_Vantage_V12_GT3_2013, "Aston Martin Vantage V12 GT3 2013"}, - {Audi_R8_LMS_2015, "Audi R8 LMS 2015" }, - {Audi_R8_LMS_Evo_2019, "Audi R8 LMS Evo 2019" }, - {Audi_R8_LMS_Evo_II_2022, "Audi R8 LMS Evo II 2022" }, - {Audi_R8_LMS_GT4_2016, "Audi R8 LMS GT4 2016" }, - {Bentley_Continental_GT3_2015, "Bentley Continental GT3 2015" }, - {Bentley_Continental_GT3_2018, "Bentley Continental GT3 2018" }, - {BMW_M4_GT3_2021, "BMW M4 GT3 2021" }, - {BMW_M4_GT4_2018, "BMW M4 GT4 2018" }, - {BMW_M6_GT3_2017, "BMW M6 GT3 2017" }, - {BMW_M2_Cup_2020, "BMW M2 Cup 2020" }, - {Chevrolet_Camaro_GT4_R_2017, "Chevrolet Camaro GT4 R 2017"}, - {Emil_Frey_Jaguar_G3_2021, "Emil Frey Jaguar G3 2012" }, - {Ferrari_488_Challenge_Evo_2020, "Ferrari 488 Challenge Evo 2020" }, - {Ferrari_488_GT3_2018, "Ferrari 488 GT3 2018" }, - {Ferrari_488_GT3_Evo_2020, "Ferrari 488 GT3 Evo 2020" }, - {Ginetta_G55_GT4_2012, "Ginetta G55 GT4 2012" }, - {Honda_NSX_GT3_2017, "Honda NSX GT3 2017" }, - {Honda_NSX_GT3_Evo_2019, "Honda NSX GT3 Evo 2019" }, - {KTM_Xbow_GT4_2016, "KTM Xbow GT4 2016" }, - {Lexus_RCF_GT3_2016, "Lexus RCF GT3 2016" }, - {Lamborghini_Gallardo_G3_Reiter_2017, "Lamborghini Gallardo G3 Reiter 2017" }, - {Lamborghini_Huracan_GT3_2015, "Lamborghini Huracán GT3 2015" }, - {Lamborghini_Huracan_GT3_Evo_2019, "Lamborghini Huracán GT3 Evo 2019" }, - {Lamborghini_Huracan_ST_2015, "Lamborghini Huracán ST 2015" }, - {Lamborghini_Huracan_ST_Evo2_2021, "Lamborghini Huracán ST Evo2 2021" }, - {Maserati_Gran_Turismo_MC_GT4_2016, "Maserati Gran Turismo MC GT4 2016" }, - {McLaren_570s_GT4_2016, "McLaren 570s GT4 2016"}, - {McLaren_650S_GT3_2015, "McLaren 650S GT3 2015" }, - {McLaren_720S_GT3_2019, "McLaren 720S GT3 2019" }, - {Mercedes_AMG_GT3_2015, "Mercedes-AMG GT3 2015"}, - {Mercedes_AMG_GT3_Evo_2020, "Mercedes-AMG GT3 2020"}, - {Mercedes_AMG_GT4_2016, "Mercedes AMG GT4 2016"}, - {Nissan_GT_R_Nismo_GT3_2015, "Nissan GT-R Nismo GT3 2015" }, - {Nissan_GT_R_Nismo_GT3_2018, "Nissan GT-R Nismo GT3 2018" }, - {Porsche_718_Cayman_GT4_MR_2019, "Porsche 718 Cayman GT4 MR 2019" }, - {Porsche_991_II_GT3_Cup_2017, "Porsche 911 II GT3 Cup 2017" }, - {Porsche_911_II_GT3_R_2019, "Porsche 911 II GT3 R 2019" }, - {Porsche_911_GT3_R_2018, "Porsche 911 GT3 R 2018" }, - {Porsche_992_GT3_Cup_2021, "Porsche 992 GT3 Cup 2021" } - }; - - public static string GetNameFromCarModel(CarModels model) - { - string name; - CarModelToCarName.TryGetValue(model, out name); - return name; - } - - public static readonly Dictionary ParseNames = new Dictionary() - { - {"alpine_a110_gt4", Alpine_A110_GT4_2018 }, - {"amr_v8_vantage_gt3", Aston_Martin_V8_Vantage_GT3_2019 }, - {"amr_v8_vantage_gt4", Aston_Martin_Vantage_AMR_GT4_2018 }, - {"amr_v12_vantage_gt3", Aston_Martin_Vantage_V12_GT3_2013 }, - {"audi_r8_gt4", Audi_R8_LMS_GT4_2016 }, - {"audi_r8_lms", Audi_R8_LMS_2015 }, - {"audi_r8_lms_evo", Audi_R8_LMS_Evo_2019 }, - {"audi_r8_lms_evo_ii", Audi_R8_LMS_Evo_II_2022 }, - {"bentley_continental_gt3_2016", Bentley_Continental_GT3_2015 }, - {"bentley_continental_gt3_2018", Bentley_Continental_GT3_2018 }, - {"bmw_m2_cs_racing", BMW_M2_Cup_2020 }, - {"bmw_m4_gt3", BMW_M4_GT3_2021 }, - {"bmw_m4_gt4", BMW_M4_GT4_2018 }, - {"bmw_m6_gt3", BMW_M6_GT3_2017 }, - {"chevrolet_camaro_gt4r", Chevrolet_Camaro_GT4_R_2017 }, - {"ferrari_488_challenge_evo", Ferrari_488_Challenge_Evo_2020 }, - {"ferrari_488_gt3", Ferrari_488_GT3_2018 }, - {"ferrari_488_gt3_evo", Ferrari_488_GT3_Evo_2020 }, - {"ginetta_g55_gt4", Ginetta_G55_GT4_2012 }, - {"honda_nsx_gt3", Honda_NSX_GT3_2017 }, - {"honda_nsx_gt3_evo", Honda_NSX_GT3_Evo_2019 }, - {"jaguar_g3", Emil_Frey_Jaguar_G3_2021 }, - {"ktm_xbow_gt4", KTM_Xbow_GT4_2016 }, - {"lamborghini_gallardo_rex", Lamborghini_Gallardo_G3_Reiter_2017 }, - {"lamborghini_huracan_gt3", Lamborghini_Huracan_GT3_2015 }, - {"lamborghini_huracan_gt3_evo", Lamborghini_Huracan_GT3_Evo_2019 }, - {"lamborghini_huracan_st", Lamborghini_Huracan_ST_2015 }, - {"lamborghini_huracan_st_evo2", Lamborghini_Huracan_ST_Evo2_2021 }, - {"lexus_rc_f_gt3", Lexus_RCF_GT3_2016 }, - {"maserati_mc_gt4", Maserati_Gran_Turismo_MC_GT4_2016 }, - {"mclaren_570s_gt4", McLaren_570s_GT4_2016 }, - {"mclaren_650s_gt3", McLaren_650S_GT3_2015 }, - {"mclaren_720s_gt3", McLaren_720S_GT3_2019 }, - {"mercedes_amg_gt3", Mercedes_AMG_GT3_2015 }, - {"mercedes_amg_gt3_evo", Mercedes_AMG_GT3_Evo_2020 }, - {"mercedes_amg_gt4", Mercedes_AMG_GT4_2016 }, - {"nissan_gt_r_gt3_2017", Nissan_GT_R_Nismo_GT3_2015 }, // yes the parsename is 2017 and not 2015.. (kunos feature) - {"nissan_gt_r_gt3_2018", Nissan_GT_R_Nismo_GT3_2018 }, - {"porsche_718_cayman_gt4_mr", Porsche_718_Cayman_GT4_MR_2019 }, - {"porsche_991_gt3_r", Porsche_911_GT3_R_2018 }, - {"porsche_991ii_gt3_cup", Porsche_991_II_GT3_Cup_2017 }, - {"porsche_991ii_gt3_r", Porsche_911_II_GT3_R_2019 }, - {"porsche_992_gt3_cup", Porsche_992_GT3_Cup_2021 } - }; - - public static CarModels ParseCarName(string parseName) - { - if (ParseNames.ContainsKey(parseName)) - return ParseNames[parseName]; - else return None; - } - - private static readonly Dictionary IdsToCarModel = new Dictionary() - { - {0, Porsche_911_GT3_R_2018 }, - {1, Mercedes_AMG_GT3_2015 }, - {2, Ferrari_488_GT3_2018 }, - {3, Audi_R8_LMS_2015 }, - {4, Lamborghini_Huracan_GT3_2015 }, - {5, McLaren_650S_GT3_2015 }, - {6, Nissan_GT_R_Nismo_GT3_2018 }, - {7, BMW_M6_GT3_2017 }, - {8, Bentley_Continental_GT3_2018 }, - {9, Porsche_991_II_GT3_Cup_2017 }, - {10, Nissan_GT_R_Nismo_GT3_2015 }, - {11, Bentley_Continental_GT3_2015 }, - {12, Aston_Martin_Vantage_V12_GT3_2013 }, - {13, Lamborghini_Gallardo_G3_Reiter_2017 }, - {14, Emil_Frey_Jaguar_G3_2021 }, - {15, Lexus_RCF_GT3_2016 }, - {16, Lamborghini_Huracan_GT3_Evo_2019 }, - {17, Honda_NSX_GT3_2017 }, - {18, Lamborghini_Huracan_ST_2015 }, - {19, Audi_R8_LMS_Evo_2019 }, - {20, Aston_Martin_V8_Vantage_GT3_2019 }, - {21, Honda_NSX_GT3_Evo_2019 }, - {22, McLaren_720S_GT3_2019 }, - {23, Porsche_911_II_GT3_R_2019 }, - {24, Ferrari_488_GT3_Evo_2020 }, - {25, Mercedes_AMG_GT3_Evo_2020 }, - {26, Ferrari_488_Challenge_Evo_2020 }, - {27, BMW_M2_Cup_2020 }, - {28, Porsche_992_GT3_Cup_2021 }, - {29, Lamborghini_Huracan_ST_Evo2_2021 }, - {30, BMW_M4_GT3_2021 }, - {31, Audi_R8_LMS_Evo_II_2022 }, - {50, Alpine_A110_GT4_2018 }, - {51, Aston_Martin_Vantage_AMR_GT4_2018 }, - {52, Audi_R8_LMS_GT4_2016 }, - {53, BMW_M4_GT4_2018 }, - {55, Chevrolet_Camaro_GT4_R_2017 }, - {56, Ginetta_G55_GT4_2012 }, - {57, KTM_Xbow_GT4_2016 }, - {58, Maserati_Gran_Turismo_MC_GT4_2016 }, - {59, McLaren_570s_GT4_2016 }, - {60, Mercedes_AMG_GT4_2016 }, - {61, Porsche_718_Cayman_GT4_MR_2019 } - }; - - public static CarModels GetCarModels(int carId) - { - if (IdsToCarModel.ContainsKey(carId)) - { - return IdsToCarModel[carId]; - } - return None; - } - - public static string GetCarName(int carId) - { - if (IdsToCarModel.ContainsKey(carId)) - { - CarModels model = IdsToCarModel[carId]; - if (CarModelToCarName.ContainsKey(model)) - return CarModelToCarName[model]; - } - - return $"Unknown: {carId}"; - } - - public static Root GetSetupJsonRoot(FileInfo jsonFile) - { - string jsonString = string.Empty; - try - { - using (FileStream fileStream = jsonFile.OpenRead()) - { - using (StreamReader reader = new StreamReader(fileStream)) - { - jsonString = reader.ReadToEnd(); - reader.Close(); - fileStream.Close(); - } - } - } - catch (Exception e) - { - Debug.WriteLine(e); - return null; - } - - Root setup = JsonConvert.DeserializeObject(jsonString); - return setup; - } - - public static Root GetSetupJsonRoot(string file) - { - FileInfo jsonFile = new FileInfo(file); - if (!jsonFile.Exists) - return null; - - return GetSetupJsonRoot(jsonFile); - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/SetupChanger/SetupDoubleRange.cs b/Race_Element.Data.ACC/SetupParser/SetupChanger/SetupDoubleRange.cs deleted file mode 100644 index 7c0a69297..000000000 --- a/Race_Element.Data.ACC/SetupParser/SetupChanger/SetupDoubleRange.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace RaceElement.Data.SetupRanges -{ - public class SetupDoubleRange - { - public double Min; - public double Max; - public double Increment; - public double[] LUT; - - public SetupDoubleRange(double[] LUT) - { - this.LUT = LUT; - } - - public SetupDoubleRange(double min, double max, double increment) - { - Min = min; - Max = max; - Increment = increment; - } - - public static double[] GetOptionsCollection(SetupDoubleRange doubleRange) - { - if (doubleRange.LUT != null) - { - return doubleRange.LUT; - } - - List collection = new List(); - - for (double i = doubleRange.Min; i < doubleRange.Max + Math.Round(doubleRange.Increment, 2); i += Math.Round(doubleRange.Increment, 2)) - { - i = Math.Round(i, 2); - collection.Add(Math.Round(i, 2)); - } - - return collection.ToArray(); - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/SetupChanger/SetupIntRange.cs b/Race_Element.Data.ACC/SetupParser/SetupChanger/SetupIntRange.cs deleted file mode 100644 index 12f1f686e..000000000 --- a/Race_Element.Data.ACC/SetupParser/SetupChanger/SetupIntRange.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Generic; - -namespace RaceElement.Data.SetupRanges -{ - public class SetupIntRange - { - public int Min; - public int Max; - public int Increment; - public int[] LUT; - - public SetupIntRange(int[] LUT) - { - this.LUT = LUT; - } - - public SetupIntRange(int min, int max, int increment) - { - Min = min; - Max = max; - Increment = increment; - } - - public static int[] GetOptionsCollection(SetupIntRange intRange) - { - if (intRange.LUT != null) - { - return intRange.LUT; - } - - List collection = new List(); - - for (int i = intRange.Min; i < intRange.Max + intRange.Increment; i += intRange.Increment) - { - collection.Add(i); - } - - return collection.ToArray(); - } - } -} diff --git a/Race_Element.Data.ACC/SetupParser/SetupConverter.cs b/Race_Element.Data.ACC/SetupParser/SetupConverter.cs deleted file mode 100644 index 4f3dd864d..000000000 --- a/Race_Element.Data.ACC/SetupParser/SetupConverter.cs +++ /dev/null @@ -1,245 +0,0 @@ -using RaceElement.Data.SetupRanges; -using System; -using System.Collections.Generic; -using static RaceElement.Data.ConversionFactory; - -namespace RaceElement.Data -{ - public class SetupConverter - { - public enum CarClasses - { - GT3, - GT4, - CUP, - ST, - TCX, - CHL - } - - public enum DryTyreCompounds - { - DHE2020_GT4, - DHE2020, - } - - public enum Wheel : int - { - FrontLeft, - FrontRight, - RearLeft, - RearRight - } - - public enum Position - { - Front, - Rear - } - - public enum TyreCompound - { - Dry, - Wet - } - - public static Position GetPosition(Wheel wheel) - { - Position position; - switch (wheel) - { - case Wheel.FrontLeft: - position = Position.Front; - break; - case Wheel.FrontRight: - position = Position.Front; - break; - - default: - position = Position.Rear; - break; - } - return position; - } - - public interface ICarSetupConversion - { - CarModels CarModel { get; } - CarClasses CarClass { get; } - DryTyreCompounds DryTyreCompound { get; } - - AbstractTyresSetup TyresSetup { get; } - IDamperSetup DamperSetup { get; } - IMechanicalSetup MechanicalSetup { get; } - IAeroBalance AeroBalance { get; } - - } - - public interface IMechanicalSetup - { - int AntiRollBarFront(int rawValue); - int AntiRollBarRear(int rawValue); - int PreloadDifferential(int rawValue); - - double BrakeBias(int rawValue); - - /** - * The brake power in % - */ - int BrakePower(int rawValue); - - double SteeringRatio(int rawValue); - int WheelRate(List rawValue, Wheel wheel); - - int BumpstopRate(List rawValue, Wheel wheel); - int BumpstopRange(List rawValue, Wheel wheel); - } - - - public interface IDamperSetup - { - int BumpSlow(List rawValue, Wheel wheel); - int BumpFast(List rawValue, Wheel wheel); - int ReboundSlow(List rawValue, Wheel wheel); - int ReboundFast(List rawValue, Wheel wheel); - } - - internal static IDamperSetup DefaultDamperSetup = new DefaultDamperSetupImplementation(); - private class DefaultDamperSetupImplementation : IDamperSetup - { - int IDamperSetup.BumpFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - int IDamperSetup.BumpSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - int IDamperSetup.ReboundFast(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - - int IDamperSetup.ReboundSlow(List rawValue, Wheel wheel) - { - return rawValue[(int)wheel]; - } - } - - public interface IAeroBalance - { - int RideHeight(List rawValue, Position position); - int BrakeDucts(int rawValue); - int RearWing(int rawValue); - int Splitter(int rawValue); - } - - public interface IElectronicsSetup - { - - int TractionControl { get; } - int ABS { get; } - int EcuMap { get; } - int TractionControl2 { get; } - } - - public interface ISetupChanger - { - ITyreSetupChanger TyreSetupChanger { get; } - IElectronicsSetupChanger ElectronicsSetupChanger { get; } - IMechanicalSetupChanger MechanicalSetupChanger { get; } - IAeroSetupChanger AeroSetupChanger { get; } - IDamperSetupChanger DamperSetupChanger { get; } - } - - public interface ITyreSetupChanger - { - SetupDoubleRange TyrePressures { get; } - SetupDoubleRange CamberFront { get; } - SetupDoubleRange CamberRear { get; } - SetupDoubleRange ToeFront { get; } - SetupDoubleRange ToeRear { get; } - SetupDoubleRange Caster { get; } - } - - public interface IElectronicsSetupChanger - { - SetupIntRange TractionControl { get; } - SetupIntRange ABS { get; } - SetupIntRange EcuMap { get; } - SetupIntRange TractionControlCut { get; } - } - - public static SetupDoubleRange TyrePressuresGT3 = new SetupDoubleRange(20.3, 35, 0.1); - public static SetupDoubleRange TyrePressuresGT4 = new SetupDoubleRange(17.0, 35, 0.1); - - public static SetupDoubleRange CamberFrontGT3 => new SetupDoubleRange(-4, -1.5, 0.1); - public static SetupDoubleRange CamberRearGT3 => new SetupDoubleRange(-3.5, -1, 0.1); - - public static SetupIntRange BrakeDuctsGT3 => new SetupIntRange(0, 6, 1); - - public interface IMechanicalSetupChanger - { - SetupIntRange AntiRollBarFront { get; } - SetupIntRange AntiRollBarRear { get; } - SetupIntRange PreloadDifferential { get; } - SetupDoubleRange BrakeBias { get; } - SetupIntRange BrakePower { get; } - SetupDoubleRange SteeringRatio { get; } - SetupIntRange WheelRateFronts { get; } - SetupIntRange WheelRateRears { get; } - SetupIntRange BumpstopRate { get; } - SetupIntRange BumpstopRangeFronts { get; } - SetupIntRange BumpstopRangeRears { get; } - } - - public interface IAeroSetupChanger - { - SetupIntRange RideHeightFront { get; } - SetupIntRange RideHeightRear { get; } - SetupIntRange BrakeDucts { get; } - SetupIntRange RearWing { get; } - SetupIntRange Splitter { get; } - } - - public interface IDamperSetupChanger - { - SetupIntRange BumpSlow { get; } - SetupIntRange BumpFast { get; } - SetupIntRange ReboundSlow { get; } - SetupIntRange ReboundFast { get; } - } - - public abstract class AbstractTyresSetup - { - public TyreCompound Compound(int rawValue) - { - switch (rawValue) - { - case 0: return TyreCompound.Dry; - case 1: return TyreCompound.Wet; - - default: return TyreCompound.Dry; - } - } - - public double TirePressure(DryTyreCompounds compound, Wheel wheel, List rawValue) - { - switch (compound) - { - case DryTyreCompounds.DHE2020: return Math.Round(20.3f + 0.1f * rawValue[(int)wheel], 2); - case DryTyreCompounds.DHE2020_GT4: return Math.Round(17.0f + 0.1f * rawValue[(int)wheel], 2); - - default: return -1; - } - } - public abstract double Toe(Wheel wheel, List rawValue); - public abstract double Camber(Wheel wheel, List rawValue); - public abstract double Caster(int rawValue); - } - } - -} - diff --git a/Race_Element.Data.ACC/SetupParser/SetupJson.cs b/Race_Element.Data.ACC/SetupParser/SetupJson.cs deleted file mode 100644 index 9f8bef638..000000000 --- a/Race_Element.Data.ACC/SetupParser/SetupJson.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System.Collections.Generic; - -namespace RaceElement.Data -{ - public class SetupJson - { - public class Root - { - public string CarName { get; set; } - public BasicSetup BasicSetup { get; set; } - public AdvancedSetup AdvancedSetup { get; set; } - public int TrackBopType { get; set; } - } - - public class AdvancedSetup - { - public MechanicalBalance MechanicalBalance { get; set; } - public Dampers Dampers { get; set; } - public AeroBalance AeroBalance { get; set; } - public Drivetrain Drivetrain { get; set; } - } - - public class Tyres - { - public int TyreCompound { get; set; } - public List TyrePressure { get; set; } - } - - public class Alignment - { - public List Camber { get; set; } - public List Toe { get; set; } - public List StaticCamber { get; set; } - public List ToeOutLinear { get; set; } - public int CasterLF { get; set; } - public int CasterRF { get; set; } - public int SteerRatio { get; set; } - } - - public class Electronics - { - public int TC1 { get; set; } - public int TC2 { get; set; } - public int Abs { get; set; } - public int ECUMap { get; set; } - public int FuelMix { get; set; } - public int TelemetryLaps { get; set; } - } - - public class PitStrategyItem - { - public int FuelToAdd { get; set; } - public Tyres Tyres { get; set; } - public int TyreSet { get; set; } - public int FrontBrakePadCompound { get; set; } - public int RearBrakePadCompound { get; set; } - } - - public class Strategy - { - public int Fuel { get; set; } - public int NPitStops { get; set; } - public int TyreSet { get; set; } - public int FrontBrakePadCompound { get; set; } - public int RearBrakePadCompound { get; set; } - public List PitStrategy { get; set; } - public double FuelPerLap { get; set; } - } - - public class BasicSetup - { - public Tyres Tyres { get; set; } - public Alignment Alignment { get; set; } - public Electronics Electronics { get; set; } - public Strategy Strategy { get; set; } - } - - public class MechanicalBalance - { - public int ARBFront { get; set; } - public int ARBRear { get; set; } - public List WheelRate { get; set; } - public List BumpStopRateUp { get; set; } - public List BumpStopRateDn { get; set; } - public List BumpStopWindow { get; set; } - public int BrakeTorque { get; set; } - public int BrakeBias { get; set; } - } - - public class Dampers - { - public List BumpSlow { get; set; } - public List BumpFast { get; set; } - public List ReboundSlow { get; set; } - public List ReboundFast { get; set; } - } - - public class AeroBalance - { - public List RideHeight { get; set; } - public List RodLength { get; set; } - public int Splitter { get; set; } - public int RearWing { get; set; } - public List BrakeDuct { get; set; } - } - - public class Drivetrain - { - public int Preload { get; set; } - } - } -} diff --git a/Race_Element.Data.ACC/Tracker/BroadcastTracker.cs b/Race_Element.Data.ACC/Tracker/BroadcastTracker.cs deleted file mode 100644 index b2893604e..000000000 --- a/Race_Element.Data.ACC/Tracker/BroadcastTracker.cs +++ /dev/null @@ -1,122 +0,0 @@ -using RaceElement.Broadcast; -using RaceElement.Broadcast.Structs; -using System; -using System.Diagnostics; -using System.Net; - -namespace RaceElement.Data.ACC.Tracker -{ - public class BroadcastTracker : IDisposable - { - private static BroadcastTracker _instance; - public static BroadcastTracker Instance - { - get - { - if (_instance == null) - _instance = new BroadcastTracker(); - - return _instance; - } - } - - private ACCUdpRemoteClient _client; - public bool IsConnected { get; private set; } - - private BroadcastTracker() - { - - } - - public event EventHandler OnRealTimeUpdate; - public event EventHandler OnConnectionStateChanged; - public event EventHandler OnEntryListUpdate; - public event EventHandler OnTrackDataUpdate; - public event EventHandler OnBroadcastEvent; - public event EventHandler OnRealTimeCarUpdate; - public event EventHandler OnRealTimeLocalCarUpdate; - - internal void Connect() - { - this.IsConnected = true; - ConnectDataClient(); - } - - private void ConnectDataClient() - { - BroadcastConfig.Root config = BroadcastConfig.GetConfiguration(); - _client = new ACCUdpRemoteClient(IPAddress.Loopback.MapToIPv4().ToString()/* "127.0.0.1"*/, config.UpdListenerPort, string.Empty, config.ConnectionPassword, config.CommandPassword, 100); - - AddEventListeners(ref _client); - } - - private void AddEventListeners(ref ACCUdpRemoteClient client) - { - client.MessageHandler.OnRealtimeUpdate += (s, realTimeUpdate) => - { - OnRealTimeUpdate?.Invoke(this, realTimeUpdate); - }; - client.MessageHandler.OnConnectionStateChanged += (int connectionId, bool connectionSuccess, bool isReadonly, string error) => - { - ConnectionState state = new ConnectionState() - { - ConnectionId = connectionId, - ConnectionSuccess = connectionSuccess, - IsReadonly = isReadonly, - Error = error - }; - - Trace.WriteLine($"Udp remote client state change: ID: {connectionId} - succes?: {connectionSuccess}, error:\n{error}"); - - OnConnectionStateChanged?.Invoke(this, state); - }; - - client.MessageHandler.OnEntrylistUpdate += (s, carInfo) => - { - OnEntryListUpdate?.Invoke(this, carInfo); - }; - - client.MessageHandler.OnBroadcastingEvent += (s, broadcastEvent) => - { - OnBroadcastEvent?.Invoke(this, broadcastEvent); - }; - - client.MessageHandler.OnTrackDataUpdate += (s, trackData) => OnTrackDataUpdate?.Invoke(this, trackData); - - client.MessageHandler.OnRealtimeCarUpdate += (s, e) => - { - OnRealTimeCarUpdate?.Invoke(this, e); - - int localCarIndex = ACCSharedMemory.Instance.ReadGraphicsPageFile(true).PlayerCarID; - if (e.CarIndex == localCarIndex) - OnRealTimeLocalCarUpdate?.Invoke(this, e); - }; - } - - private void ResetData() - { - OnConnectionStateChanged?.Invoke(this, new ConnectionState()); - OnRealTimeUpdate?.Invoke(this, new RealtimeUpdate()); - OnBroadcastEvent?.Invoke(this, new BroadcastingEvent()); - OnRealTimeLocalCarUpdate?.Invoke(this, new RealtimeCarUpdate()); - OnTrackDataUpdate?.Invoke(this, new TrackData()); - } - - internal void Disconnect() - { - this.IsConnected = false; - ResetData(); - - if (_client != null) - { - _client.Shutdown(); - _client.Dispose(); - } - } - - public void Dispose() - { - this.Disconnect(); - } - } -} diff --git a/Race_Element.Data.ACC/Tracker/PageGraphicsTracker.cs b/Race_Element.Data.ACC/Tracker/PageGraphicsTracker.cs deleted file mode 100644 index d6899ee2c..000000000 --- a/Race_Element.Data.ACC/Tracker/PageGraphicsTracker.cs +++ /dev/null @@ -1,120 +0,0 @@ -using RaceElement.Data.ACC.Core; -using RaceElement.Data.ACC.EntryList; -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.Threading; -using System.Threading.Tasks; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Data.ACC.Tracker -{ - public class PageGraphicsTracker : IDisposable - { - private static PageGraphicsTracker _instance; - public static PageGraphicsTracker Instance - { - get - { - if (_instance == null) - _instance = new PageGraphicsTracker(); - - return _instance; - } - } - - public event EventHandler Tracker; - - private bool isTracking = false; - - private readonly Task trackingTask; - - private PageGraphicsTracker() - { - - isTracking = true; - - trackingTask = Task.Run(() => - { - while (isTracking) - { - if (AccProcess.IsRunning) - { - Thread.Sleep(2); - Tracker?.Invoke(this, ACCSharedMemory.Instance.ReadGraphicsPageFile()); - } - else - { - Thread.Sleep(500); - } - } - }); - - Task.Run(() => - { - while (isTracking) - { - try - { - Thread.Sleep(100); - - if (AccProcess.IsRunning) - { - SPageFileGraphic sPageFileGraphic = ACCSharedMemory.Instance.ReadGraphicsPageFile(false); - - if (sPageFileGraphic.Status == AcStatus.AC_OFF) - { - if (BroadcastTracker.Instance.IsConnected) - { - BroadcastTracker.Instance.Disconnect(); -#if DEBUG - EntryListTracker.Instance.Stop(); -#endif - } - - if (SetupHiderTracker.Instance.IsTracking) - SetupHiderTracker.Instance.Dispose(); - } - else if (sPageFileGraphic.Status != AcStatus.AC_OFF) - { - if (!BroadcastTracker.Instance.IsConnected) - { - BroadcastTracker.Instance.Connect(); -#if DEBUG - EntryListTracker.Instance.Start(); -#endif - } - - if (!SetupHiderTracker.Instance.IsTracking) - SetupHiderTracker.Instance.StartTracker(); - } - } - else - { - if (BroadcastTracker.Instance.IsConnected) - { - BroadcastTracker.Instance.Disconnect(); -#if DEBUG - EntryListTracker.Instance.Stop(); -#endif - } - } - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - Debug.WriteLine(e); - } - } - }); - - _instance = this; - } - - public void Dispose() - { - isTracking = false; - trackingTask.Dispose(); - } - } -} diff --git a/Race_Element.Data.ACC/Tracker/PagePhysicsTracker.cs b/Race_Element.Data.ACC/Tracker/PagePhysicsTracker.cs deleted file mode 100644 index 64dca25c5..000000000 --- a/Race_Element.Data.ACC/Tracker/PagePhysicsTracker.cs +++ /dev/null @@ -1,59 +0,0 @@ -using RaceElement.Data.ACC.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Data.ACC.Tracker -{ - public class PagePhysicsTracker : IDisposable - { - private static PagePhysicsTracker _instance; - public static PagePhysicsTracker Instance - { - get - { - if (_instance == null) - _instance = new PagePhysicsTracker(); - - return _instance; - } - } - - public event EventHandler Tracker; - - private bool isTracking = false; - - private readonly Task trackingTask; - - private PagePhysicsTracker() - { - trackingTask = Task.Run(() => - { - isTracking = true; - while (isTracking) - { - - - if (AccProcess.IsRunning) - { - Thread.Sleep(2); - Tracker?.Invoke(this, ACCSharedMemory.Instance.ReadPhysicsPageFile()); - } - else - { - Thread.Sleep(500); - } - } - }); - - _instance = this; - } - - public void Dispose() - { - isTracking = false; - trackingTask.Dispose(); - } - } -} diff --git a/Race_Element.Data.ACC/Tracker/PageStaticTracker.cs b/Race_Element.Data.ACC/Tracker/PageStaticTracker.cs deleted file mode 100644 index 219a2ecfc..000000000 --- a/Race_Element.Data.ACC/Tracker/PageStaticTracker.cs +++ /dev/null @@ -1,31 +0,0 @@ -using ACCManager.Data.ACC.Core.Game; -using Quartz; -using RaceElement.Data.ACC.Core; -using System; -using System.Threading.Tasks; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Data.ACC.Tracker -{ - public class PageStaticTracker : IJob - { - public static readonly JobKey JobKey = new JobKey("PageStaticTracker", "acc-jobs"); - public static readonly TriggerKey TriggerKey = new TriggerKey("PageStaticTracker"); - - public static event EventHandler Tracker; - - public async Task Execute(IJobExecutionContext context) - { - if (AccProcess.IsRunning) - Tracker?.Invoke(null, ACCSharedMemory.Instance.ReadStaticPageFile()); - } - - public static void Schedule() - { - IJobDetail job = JobBuilder.Create().WithIdentity(JobKey).Build(); - AccScheduler.Scheduler.ScheduleJob(job, TriggerBuilder.Create() - .WithIdentity(TriggerKey) - .WithSimpleSchedule(x => x.WithInterval(new TimeSpan(0, 0, 0, 0, 500)).RepeatForever()).ForJob(JobKey).Build()); - } - } -} diff --git a/Race_Element.Data.ACC/Tracker/SetupHiderTracker.cs b/Race_Element.Data.ACC/Tracker/SetupHiderTracker.cs deleted file mode 100644 index 5846ff93b..000000000 --- a/Race_Element.Data.ACC/Tracker/SetupHiderTracker.cs +++ /dev/null @@ -1,164 +0,0 @@ -using RaceElement.Util.Settings; -using OBSWebsocketDotNet; -using SLOBSharp.Client; -using SLOBSharp.Client.Requests; -using System; -using System.Diagnostics; -using System.Linq; -using System.Threading; - -namespace RaceElement.Data.ACC.Tracker -{ - public class SetupHiderTracker : IDisposable - { - public static SetupHiderTracker _instance; - public static SetupHiderTracker Instance - { - get - { - if (_instance == null) _instance = new SetupHiderTracker(); - return _instance; - } - } - - public bool IsTracking = false; - - private OBSWebsocket _obsWebSocket; - private SlobsPipeClient _SlobsClient; - - private bool _toggle = false; - - private readonly StreamSettings _streamSettings; - - private SetupHiderTracker() - { - _streamSettings = new StreamSettings(); - } - - public void StartTracker() - { - - var streamSettings = _streamSettings.Get(); - if (streamSettings.SetupHider) - { - if (streamSettings.StreamingSoftware == "OBS") - { - _obsWebSocket = new OBSWebsocket(); - _obsWebSocket.Connected += ObsWebSocket_Connected; - Connect(); - } - else - { - _SlobsClient = new SlobsPipeClient(); - } - - IsTracking = true; - new Thread(() => - { - while (IsTracking) - { - Thread.Sleep(50); - var pageGraphics = ACCSharedMemory.Instance.ReadGraphicsPageFile(true); - - if (pageGraphics.Status != ACCSharedMemory.AcStatus.AC_OFF) - if (pageGraphics.IsSetupMenuVisible != _toggle) - { - _toggle = pageGraphics.IsSetupMenuVisible; - Toggle(pageGraphics.IsSetupMenuVisible); - } - } - }).Start(); - } - } - - - private void Connect() - { - try - { - var streamSettings = _streamSettings.Get(); - - if (streamSettings.StreamingSoftware == "OBS") - _obsWebSocket.ConnectAsync($"ws://{streamSettings.StreamingWebSocketIP}:{streamSettings.StreamingWebSocketPort}", streamSettings.StreamingWebSocketPassword); - } - catch (Exception) - { - //Debug.WriteLine(ex.ToString()); - } - } - - private void ObsWebSocket_Connected(object sender, EventArgs e) - { - } - - public void Toggle(bool enable) - { - Trace.WriteLine("Setup hider is " + (enable ? "Visible" : "Hidden")); - if (_obsWebSocket != null) - ToggleOBS(enable); - else - ToggleStreamLabs(enable); - } - - private void ToggleOBS(bool enable) - { - try - { - if (_obsWebSocket.IsConnected) - { - string currentScene = _obsWebSocket.GetCurrentProgramScene(); - var list = _obsWebSocket.GetSceneItemList(currentScene); - - var sceneItemSetupHider = list.Find(x => x.SourceName == "SetupHider"); - if (sceneItemSetupHider != null) - { - _obsWebSocket.SetSceneItemEnabled(currentScene, sceneItemSetupHider.ItemId, enable); - } - } - } - catch (Exception) - { - //Debug.WriteLine(e); - } - } - - private void ToggleStreamLabs(bool enable) - { - try - { - var request = SlobsRequestBuilder.NewRequest().SetMethod("getScenes").SetResource("ScenesService").BuildRequest(); - - var response = _SlobsClient.ExecuteRequest(request); - if (response.Error != null) - throw new Exception($"{response.Error.Code}: {response.Error.Message} "); - else - { - string resource = string.Empty; - var node = response.Result.First().Nodes.Find(x => x.Name == "SetupHider"); - - if (node != null) - { - if (node.Visible != enable) - { - request = SlobsRequestBuilder.NewRequest().SetMethod("setVisibility").SetResource(node.ResourceId).AddArgs(enable).BuildRequest(); - _SlobsClient.ExecuteRequest(request); - } - } - } - } - catch (Exception) - { - //Debug.WriteLine(e); - } - } - - public void Dispose() - { - IsTracking = false; - if (_obsWebSocket != null) - _obsWebSocket.Disconnect(); - - _instance = null; - } - } -} diff --git a/Race_Element.Data.ACC/Tracker/TrackerDispose.cs b/Race_Element.Data.ACC/Tracker/TrackerDispose.cs deleted file mode 100644 index 938cc3a01..000000000 --- a/Race_Element.Data.ACC/Tracker/TrackerDispose.cs +++ /dev/null @@ -1,26 +0,0 @@ -using RaceElement.Data.ACC.Database; -using RaceElement.Data.ACC.EntryList; -using RaceElement.Data.ACC.Session; -using RaceElement.Data.ACC.Tracker.Laps; -using System.Diagnostics; - -namespace RaceElement.Data.ACC.Tracker -{ - public class ACCTrackerDispose - { - public static void Dispose() - { - Debug.WriteLine("Safely disposing ACC Data Tracker instances"); - BroadcastTracker.Instance.Dispose(); - EntryListTracker.Instance.Stop(); - - SetupHiderTracker.Instance.Dispose(); - - - RaceSessionTracker.Instance.Stop(); - LapTracker.Instance.Stop(); - - RaceWeekendDatabase.Close(); - } - } -} diff --git a/Race_Element.Data.ACC/Tracker/TrackerStarter.cs b/Race_Element.Data.ACC/Tracker/TrackerStarter.cs deleted file mode 100644 index 2ecc0f511..000000000 --- a/Race_Element.Data.ACC/Tracker/TrackerStarter.cs +++ /dev/null @@ -1,25 +0,0 @@ -using RaceElement.Data.ACC.Session; -using RaceElement.Data.ACC.Tracker.Laps; -using System.Diagnostics; -using System.Threading; - -namespace RaceElement.Data.ACC.Tracker -{ - public static class ACCTrackerStarter - { - public static void StartACCTrackers() - { - new Thread(() => - { - _ = LapTracker.Instance; - _ = RaceSessionTracker.Instance; - - Debug.WriteLine("Started ACC.Trackers"); - - - - - }).Start(); - } - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Barcelona.cs b/Race_Element.Data.ACC/Tracks/Data/Barcelona.cs deleted file mode 100644 index 61a15000c..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Barcelona.cs +++ /dev/null @@ -1,37 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Barcelona : AbstractTrackData - { - public override Guid Guid => new Guid("c47d348d-4cac-4377-90ff-be3613bc6519"); - public override string FullName => "Circuit de Barcelona-Catalunya"; - public override int TrackLength => 4655; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.1577717f, 0.1954681f), (1, "Elf") }, - { new FloatRangeStruct(0.1967648f, 0.2195874f), (2, "Elf") }, - { new FloatRangeStruct(0.2282194f, 0.3202321f), (3, "Renault") }, - { new FloatRangeStruct(0.3504574f, 0.4274578f), (4, "Repsol") }, - { new FloatRangeStruct(0.4452616f, 0.4849422f), (5, "Seat") }, - { new FloatRangeStruct(0.5049684f, 0.5296696f), (6, string.Empty) }, - { new FloatRangeStruct(0.5345824f, 0.5626252f), (7, "Würth") }, - { new FloatRangeStruct(0.5643317f, 0.5912151f), (8, "Würth") }, - { new FloatRangeStruct(0.6078672f, 0.6661669f), (9, "Campsa") }, - { new FloatRangeStruct(0.7314663f, 0.7708687f), (10, "La Caixa") }, - { new FloatRangeStruct(0.7779655f, 0.792363f), (11, "Banc de Sabadell") }, - { new FloatRangeStruct(0.7934548f, 0.8429551f), (12, "Banc de Sabadell") }, - { new FloatRangeStruct(0.8548293f, 0.8812364f), (13, "Europcar") }, - { new FloatRangeStruct(0.8875112f, 0.8994124f), (14, "Chicane RACC") }, - { new FloatRangeStruct(0.9000266f, 0.9133028f), (15, "Chicane RACC") }, - { new FloatRangeStruct(0.917703f, 0.9730397f), (16, "New Holland") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/BrandsHatch.cs b/Race_Element.Data.ACC/Tracks/Data/BrandsHatch.cs deleted file mode 100644 index 1ed8bbaf2..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/BrandsHatch.cs +++ /dev/null @@ -1,31 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class BrandsHatch : AbstractTrackData - { - public override Guid Guid => new Guid("7827823f-6df1-4295-bc24-93bc83d71855"); - public override string FullName => "Brands Hatch Circuit"; - public override int TrackLength => 3908; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.02583388f, 0.09228041f), (1, "Paddock Hill Bend") }, - { new FloatRangeStruct(0.128806f, 0.1749151f), (1, "Druids") }, - { new FloatRangeStruct(0.2037492f, 0.2366925f), (1, "Graham Hill Bend") }, - { new FloatRangeStruct(0.2918635f, 0.3475159f), (1, "Surtees") }, - { new FloatRangeStruct(0.4960743f, 0.5494739f), (1, "Hawthorn Bend") }, - { new FloatRangeStruct(0.5836455f, 0.6203906f), (1, "Westfield Bend") }, - { new FloatRangeStruct(0.65591f, 0.6856291f), (1, "Dingle Dell") }, - { new FloatRangeStruct(0.6919114f, 0.7209466f), (1, "Sheene's") }, - { new FloatRangeStruct(0.7484918f, 0.7844133f), (1, "Stirlings") }, - { new FloatRangeStruct(0.8544036f, 0.9092523f), (1, "Clark Curve") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Cota.cs b/Race_Element.Data.ACC/Tracks/Data/Cota.cs deleted file mode 100644 index 9159087de..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Cota.cs +++ /dev/null @@ -1,41 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Cota : AbstractTrackData - { - public override Guid Guid => new Guid("f45eac53-7a77-4fe5-812f-064b30ac22df"); - public override string FullName => "Circuit of the Americas"; - public override int TrackLength => 5513; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.09711581f, 0.1336419f), (1, string.Empty) }, - { new FloatRangeStruct(0.139182f, 0.1873701f), (2, string.Empty) }, - { new FloatRangeStruct(0.1990563f, 0.2206976f), (3, string.Empty) }, - { new FloatRangeStruct(0.2225156f, 0.2368565f), (4, string.Empty) }, - { new FloatRangeStruct(0.2387608f, 0.2539387f), (5, string.Empty) }, - { new FloatRangeStruct(0.2557565f, 0.2953745f), (6, string.Empty) }, - { new FloatRangeStruct(0.2992989f, 0.3273459f), (7, string.Empty) }, - { new FloatRangeStruct(0.3315877f, 0.3512957f), (8, string.Empty) }, - { new FloatRangeStruct(0.3534598f, 0.3714648f), (9, string.Empty) }, - { new FloatRangeStruct(0.3827475f, 0.4132474f), (10, string.Empty) }, - { new FloatRangeStruct(0.4447892f, 0.4825258f), (11, string.Empty) }, - { new FloatRangeStruct(0.6667117f, 0.6991135f), (12, string.Empty) }, - { new FloatRangeStruct(0.7148103f, 0.7378947f), (13, string.Empty) }, - { new FloatRangeStruct(0.7392216f, 0.7586122f), (14, string.Empty) }, - { new FloatRangeStruct(0.7662588f, 0.7915642f), (15, string.Empty) }, - { new FloatRangeStruct(0.8056163f, 0.8274886f), (16, string.Empty) }, - { new FloatRangeStruct(0.8287005f, 0.8437918f), (17, string.Empty) }, - { new FloatRangeStruct(0.8478028f, 0.88618f), (18, string.Empty) }, - { new FloatRangeStruct(0.8997419f, 0.9391019f), (19, string.Empty) }, - { new FloatRangeStruct(0.9560677f, 0.9854119f), (20, string.Empty) } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Donington.cs b/Race_Element.Data.ACC/Tracks/Data/Donington.cs deleted file mode 100644 index dc3ab15ff..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Donington.cs +++ /dev/null @@ -1,32 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Donington : AbstractTrackData - { - public override Guid Guid => new Guid("e93925e9-16c8-442a-bea3-ae449d2e04be"); - public override string FullName => "Donington Park"; - public override int TrackLength => 4020; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.0772981f, 0.1404632f), (1,"Redgate") }, - { new FloatRangeStruct(0.1477933f, 0.1860932f), (1, "Hollywood") }, - { new FloatRangeStruct(0.1924699f, 0.2584147f), (1, "Craner Curves") }, - { new FloatRangeStruct(0.2683981f, 0.3242396f), (1, "Old Hairpin") }, - { new FloatRangeStruct(0.340085f, 0.3834941f), (1, "Starkey's Bridge") }, - { new FloatRangeStruct(0.3931186f, 0.4279727f), (1, "Schwantz Curve") }, - { new FloatRangeStruct(0.3931186f, 0.4847209f), (1, "McLeans") }, - { new FloatRangeStruct(0.5150666f, 0.6010549f), (1, "Coppice") }, - { new FloatRangeStruct(0.7011805f, 0.7645504f), (1, "Fogarty Esses") }, - { new FloatRangeStruct(0.8194078f, 0.8732706f), (1, "Melbourne Hairpin") }, - { new FloatRangeStruct(0.9239673f, 0.9740674f), (1, "Goddards") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Hungaroring.cs b/Race_Element.Data.ACC/Tracks/Data/Hungaroring.cs deleted file mode 100644 index 47edcd4b9..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Hungaroring.cs +++ /dev/null @@ -1,35 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Hungaroring : AbstractTrackData - { - public override Guid Guid => new Guid("f59e6015-077b-40e0-a822-71104f253ea2"); - public override string FullName => "Hungaroring"; - public override int TrackLength => 4381; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.117462f, 0.1763413f), (1, string.Empty) }, - { new FloatRangeStruct(0.2342479f, 0.2827142f), (2, string.Empty) }, - { new FloatRangeStruct(0.291177f, 0.3305657f), (3, string.Empty) }, - { new FloatRangeStruct(0.3976955f, 0.4400478f), (4, string.Empty) }, - { new FloatRangeStruct(0.4505019f, 0.5123134f), (5, string.Empty) }, - { new FloatRangeStruct(0.5293858f, 0.55264f), (6, string.Empty) }, - { new FloatRangeStruct(0.5531477f, 0.5745245f), (7, string.Empty) }, - { new FloatRangeStruct(0.5845071f, 0.6076503f), (8, string.Empty) }, - { new FloatRangeStruct(0.611815f, 0.645991f), (9, string.Empty) }, - { new FloatRangeStruct(0.6554344f, 0.69012f), (10, string.Empty) }, - { new FloatRangeStruct(0.6952906f, 0.7409733f), (11, string.Empty) }, - { new FloatRangeStruct(0.7882351f, 0.8321922f), (12, string.Empty) }, - { new FloatRangeStruct(0.8449233f, 0.8961363f), (13, string.Empty) }, - { new FloatRangeStruct(0.9104271f, 0.9746534f), (14, string.Empty) } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Imola.cs b/Race_Element.Data.ACC/Tracks/Data/Imola.cs deleted file mode 100644 index a2a8ff53a..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Imola.cs +++ /dev/null @@ -1,40 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Imola : AbstractTrackData - { - public override Guid Guid => new Guid("678eefc3-a5f0-4b2a-a1cc-03ac62650ede"); - public override string FullName => "Imola (Autodromo Internazionale Enzo e Dino Ferrari)"; - public override int TrackLength => 4959; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.0005297028f, 0.03412261f), (1, string.Empty) }, - { new FloatRangeStruct(0.112587f, 0.1497782f), (2, "Variante Tamburello") }, - { new FloatRangeStruct(0.1506454f, 0.1665117f), (3, "Variante Tamburello") }, - { new FloatRangeStruct(0.172935f, 0.2106085f), (4, "Variante Tamburello") }, - { new FloatRangeStruct(0.249086f, 0.2795623f), (5, "Villeneuve") }, - { new FloatRangeStruct(0.2797552f, 0.3088191f), (6, "Villeneuve") }, - { new FloatRangeStruct(0.3316593f, 0.3782925f), (7, "Tosa") }, - { new FloatRangeStruct(0.4357499f, 0.4546386f), (8, "Piratella") }, - { new FloatRangeStruct(0.4577822f, 0.4927896f), (9, "Piratella") }, - { new FloatRangeStruct(0.4951028f, 0.5294678f), (10, "Piratella") }, - { new FloatRangeStruct(0.5453337f, 0.5661795f), (11, "Acque Minerali") }, - { new FloatRangeStruct(0.568651f, 0.5879206f), (12, "Acque Minerali") }, - { new FloatRangeStruct(0.5892689f, 0.6074478f), (13, "Acque Minerali") }, - { new FloatRangeStruct(0.6652913f, 0.6895717f), (14, "Variante Alta") }, - { new FloatRangeStruct(0.6900202f, 0.7139801f), (15, "Variante Alta") }, - { new FloatRangeStruct(0.775421f, 0.8178471f), (16, "Rivazza") }, - { new FloatRangeStruct(0.8203523f, 0.855458f), (17, "Rivazza") }, - { new FloatRangeStruct(0.8595361f, 0.8906525f), (18, "Rivazza") }, - { new FloatRangeStruct(0.9167676f, 0.9699543f), (19, string.Empty) }, - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Indianapolis.cs b/Race_Element.Data.ACC/Tracks/Data/Indianapolis.cs deleted file mode 100644 index e735c9c81..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Indianapolis.cs +++ /dev/null @@ -1,36 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Indianapolis : AbstractTrackData - { - public override Guid Guid => new Guid("d3c246d2-edba-429e-af59-6e25357d59d4"); - public override string FullName => "Indianapolis Motor Speedway"; - public override int TrackLength => 4167; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.1243783f, 0.1692718f), (1, string.Empty) }, - { new FloatRangeStruct(0.1696899f, 0.195541f), (2, string.Empty) }, - { new FloatRangeStruct(0.195921f, 0.2312392f), (3, string.Empty) }, - { new FloatRangeStruct(0.2340903f, 0.2812699f), (4, string.Empty) }, - { new FloatRangeStruct(0.2904321f, 0.325332f), (5, string.Empty) }, - { new FloatRangeStruct(0.3372692f, 0.3911017f), (6, string.Empty) }, - { new FloatRangeStruct(0.3939147f, 0.4355434f), (7, string.Empty) }, - { new FloatRangeStruct(0.5369371f, 0.5751812f), (8, string.Empty) }, - { new FloatRangeStruct(0.5837724f, 0.6061648f), (9, string.Empty) }, - { new FloatRangeStruct(0.6077616f, 0.6273403f), (10, string.Empty) }, - { new FloatRangeStruct(0.6314081f, 0.6756219f), (11, string.Empty) }, - { new FloatRangeStruct(0.6912087f, 0.7700945f), (12, string.Empty) }, - { new FloatRangeStruct(0.7792981f, 0.8153729f), (13, string.Empty) }, - { new FloatRangeStruct(0.8205053f, 0.8587886f), (14, string.Empty) }, - { new FloatRangeStruct(0.8633122f, 0.9517404f), (15, string.Empty) }, - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Kyalami.cs b/Race_Element.Data.ACC/Tracks/Data/Kyalami.cs deleted file mode 100644 index 4386463c4..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Kyalami.cs +++ /dev/null @@ -1,37 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Kyalami : AbstractTrackData - { - public override Guid Guid => new Guid("65e00cd4-6c39-4cb4-acf9-f8977cd56ba1"); - public override string FullName => "Kyalami Grand Prix Circuit"; - public override int TrackLength => 4522; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.03799635f, 0.07576057f), (1, "The Kink")}, - { new FloatRangeStruct(0.1186805f, 0.1687038f), (2, "Crowthorne")}, - { new FloatRangeStruct(0.1716466f, 0.1938228f), (3, "Jukskei Sweep")}, - { new FloatRangeStruct(0.1972911f, 0.2116902f), (4, "Jukskei Sweep")}, - { new FloatRangeStruct(0.2149132f, 0.2511375f), (5, "Barbeque")}, - { new FloatRangeStruct(0.3214881f, 0.3990535f), (6, "Sunset")}, - { new FloatRangeStruct(0.4100153f, 0.4576957f), (7, "Clubhouse")}, - { new FloatRangeStruct(0.4831304f, 0.5110525f), (8, "The Esses")}, - { new FloatRangeStruct(0.5127696f, 0.5624465f), (9, "The Esses")}, - { new FloatRangeStruct(0.6093207f, 0.6448103f), (10, "Leeukop")}, - { new FloatRangeStruct(0.646807f, 0.6739212f), (11, "Leeukop")}, - { new FloatRangeStruct(0.7203508f, 0.7789884f), (12, "Mineshaft")}, - { new FloatRangeStruct(0.7924412f, 0.8349011f), (13, "The Crocodiles")}, - { new FloatRangeStruct(0.8374949f, 0.8632089f), (14, "The Crocodiles")}, - { new FloatRangeStruct(0.866816f, 0.8997451f), (15, "Cheetah")}, - { new FloatRangeStruct(0.9204187f, 0.962459f), (16, "Ingwe")}, - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/LagunaSeca.cs b/Race_Element.Data.ACC/Tracks/Data/LagunaSeca.cs deleted file mode 100644 index 1e908a1f0..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/LagunaSeca.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class LagunaSeca : AbstractTrackData - { - public override Guid Guid => new Guid("0c8d198c-608f-4beb-96f5-5eafb5d3ba6b"); - public override string FullName => "Weathertech Raceway Laguna Seca"; - public override int TrackLength => 3602; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Misano.cs b/Race_Element.Data.ACC/Tracks/Data/Misano.cs deleted file mode 100644 index a53e0ac0d..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Misano.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Misano : AbstractTrackData - { - public override Guid Guid => new Guid("e8ce417b-5f5c-4921-9b6b-9367e703d3f8"); - public override string FullName => "Misano World Circuit"; - public override int TrackLength => 4226; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Monza.cs b/Race_Element.Data.ACC/Tracks/Data/Monza.cs deleted file mode 100644 index 73d3ccac6..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Monza.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Monza : AbstractTrackData - { - public override Guid Guid => new Guid("5091ac88-c7c3-4cf1-ac46-e974bc7b73d5"); - public override string FullName => "Monza Circuit"; - public override int TrackLength => 5793; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/MountPanorama.cs b/Race_Element.Data.ACC/Tracks/Data/MountPanorama.cs deleted file mode 100644 index d8f377ff2..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/MountPanorama.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class MountPanorama : AbstractTrackData - { - public override Guid Guid => new Guid("c054299c-0e16-4094-8e76-a9a4da399268"); - public override string FullName => "Mount Panorama Circuit"; - public override int TrackLength => 6213; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Nurburgring.cs b/Race_Element.Data.ACC/Tracks/Data/Nurburgring.cs deleted file mode 100644 index e28cf5743..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Nurburgring.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Nurburgring : AbstractTrackData - { - public override Guid Guid => new Guid("20200ee1-89c1-4580-86f1-3ded3018e9e3"); - public override string FullName => "Nürburgring"; - public override int TrackLength => 5137; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/OultonPark.cs b/Race_Element.Data.ACC/Tracks/Data/OultonPark.cs deleted file mode 100644 index 8aa53b80a..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/OultonPark.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class OultonPark : AbstractTrackData - { - public override Guid Guid => new Guid("72794bc2-841c-40e1-8587-3e41f9228ea8"); - public override string FullName => "Oulton Park"; - public override int TrackLength => 4307; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/PaulRicard.cs b/Race_Element.Data.ACC/Tracks/Data/PaulRicard.cs deleted file mode 100644 index 1fb14e8dc..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/PaulRicard.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class PaulRicard : AbstractTrackData - { - public override Guid Guid => new Guid("c46a0299-b5d0-421f-90a7-0c5223deaa63"); - public override string FullName => "Circuit Paul Ricard"; - public override int TrackLength => 5770; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Silverstone.cs b/Race_Element.Data.ACC/Tracks/Data/Silverstone.cs deleted file mode 100644 index 7c31e2099..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Silverstone.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Silverstone : AbstractTrackData - { - public override Guid Guid => new Guid("8636837e-e916-4d4b-8f29-625cf6bf4695"); - public override string FullName => "Silverstone"; - public override int TrackLength => 5891; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Snetterton.cs b/Race_Element.Data.ACC/Tracks/Data/Snetterton.cs deleted file mode 100644 index fb4d96f49..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Snetterton.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Snetterton : AbstractTrackData - { - public override Guid Guid => new Guid("9248d360-e1ba-45be-bdec-dc939fb3959b"); - public override string FullName => "Snetterton Circuit"; - public override int TrackLength => 4779; - - public override Dictionary CornerNames => new Dictionary(); - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/SpaFrancorchamps.cs b/Race_Element.Data.ACC/Tracks/Data/SpaFrancorchamps.cs deleted file mode 100644 index 385b7f345..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/SpaFrancorchamps.cs +++ /dev/null @@ -1,36 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class SpaFrancorchamps : AbstractTrackData - { - public override Guid Guid => new Guid("a56b5381-6c59-4380-8a32-679c8734a9a9"); - public override string FullName => "Circuit De Spa-Francorchamps"; - public override int TrackLength => 7004; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.03371242f, 0.05937995f), (1, "La Source")}, - { new FloatRangeStruct(0.1435904f, 0.1541221f), (1, "Eau Rouge") }, - { new FloatRangeStruct(0.1541221f, 0.1960247f), (1, "Raidillon") }, - { new FloatRangeStruct(0.2178622f, 0.2374316f), (1, "Kemmel") }, - { new FloatRangeStruct(0.3228342f, 0.3612153f), (1, "Les Combes") }, - { new FloatRangeStruct(0.3668639f, 0.3903512f), (1, "Malmedy") }, - { new FloatRangeStruct(0.4134307f, 0.4498297f), (1, "Bruxelles") }, - { new FloatRangeStruct(0.4582162f, 0.4808743f), (1, "Speaker's Corner") }, - { new FloatRangeStruct(0.5299657f, 0.5979356f), (1, "Pouhon") }, - { new FloatRangeStruct(0.622636f, 0.6775055f), (1, "Les Fagnes") }, - { new FloatRangeStruct(0.6919841f, 0.7136846f), (1, "Campus") }, - { new FloatRangeStruct(0.7219031f, 0.7557863f), (1, "Stavelot") }, - { new FloatRangeStruct(0.7856864f, 0.8112493f), (1, "Courbe Paul Frere") }, - { new FloatRangeStruct(0.8585455f, 0.8978195f), (1, "Blanchimont") }, - { new FloatRangeStruct(0.9418995f, 0.978526f), (1, "Chicane") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Suzuka.cs b/Race_Element.Data.ACC/Tracks/Data/Suzuka.cs deleted file mode 100644 index 63dd5d67e..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Suzuka.cs +++ /dev/null @@ -1,33 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Suzuka : AbstractTrackData - { - public override Guid Guid => new Guid("1c9b35a5-dacb-40e2-adc9-134d75f75c3f"); - public override string FullName => "Suzuka Circuit"; - public override int TrackLength => 5807; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.03883164f, 0.08408849f), (1, "First Corner") }, - { new FloatRangeStruct(0.1298746f, 0.1984839f), (1, "Snake") }, - { new FloatRangeStruct(0.1984840f, 0.2325576f), (1, "Anti-Banked Curve") }, - { new FloatRangeStruct(0.2386938f, 0.3178378f), (1, "Dunlop") }, - { new FloatRangeStruct(0.3310606f, 0.3528073f), (1, "Degner 1") }, - { new FloatRangeStruct(0.3596497f, 0.3821299f), (1, "Degner 2") }, - { new FloatRangeStruct(0.4306207f, 0.4615963f), (1, "Hairpin") }, - { new FloatRangeStruct(0.4827491f, 0.5779635f), (1, "200R") }, - { new FloatRangeStruct(0.5862223f, 0.6618876f), (1, "Spoon Curve") }, - { new FloatRangeStruct(0.7896389f, 0.8385026f), (1, "130R") }, - { new FloatRangeStruct(0.8555256f, 0.8949211f), (1, "Casio Triangle") }, - { new FloatRangeStruct(0.8986408f, 0.9453408f), (1, "Last Curve") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/WatkinsGlen.cs b/Race_Element.Data.ACC/Tracks/Data/WatkinsGlen.cs deleted file mode 100644 index 73757db3d..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/WatkinsGlen.cs +++ /dev/null @@ -1,31 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class WatkinsGlen : AbstractTrackData - { - public override Guid Guid => new Guid("6c4d5fe4-105d-47b0-8699-49c10a92c591"); - public override string FullName => "Watkins Glen International"; - public override int TrackLength => 5552; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.03883164f, 0.08408849f), (1, "The 90") }, - { new FloatRangeStruct(0.1122197f, 0.2610424f), (1, "The Esses") }, - { new FloatRangeStruct(0.3331092f, 0.395433f), (1, "Inner Loop") }, - { new FloatRangeStruct(0.3954331f, 0.4644593f), (1, "Outer Loop") }, - { new FloatRangeStruct(0.4897895f, 0.5415458f), (1, "Chute") }, - { new FloatRangeStruct(0.583251f, 0.6384665f), (1, "Toe") }, - { new FloatRangeStruct(0.7093781f, 0.757032f), (1, "Heel") }, - { new FloatRangeStruct(0.776354f, 0.8196481f), (1, "Turn 9") }, - { new FloatRangeStruct(0.8520821f, 0.889021f), (1, "Turn 10") }, - { new FloatRangeStruct(0.9098449f, 0.9501061f), (1, "Turn 11") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Zandvoort.cs b/Race_Element.Data.ACC/Tracks/Data/Zandvoort.cs deleted file mode 100644 index ec70b9714..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Zandvoort.cs +++ /dev/null @@ -1,33 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Zandvoort : AbstractTrackData - { - public override Guid Guid => new Guid("e7a091a3-b2c1-4903-8768-591a937858ea"); - public override string FullName => "Circuit Zandvoort"; - public override int TrackLength => 4252; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.05284053f, 0.1141072f), (1, "Tarzanbocht") }, - { new FloatRangeStruct(0.1480813f, 0.1814992f), (1, "Gerlachbocht") }, - { new FloatRangeStruct(0.1887138f, 0.2235506f), (1, "Hugenholzbocht") }, - { new FloatRangeStruct(0.2407838f, 0.2725571f), (1, "Hunzerug") }, - { new FloatRangeStruct(0.3335241f, 0.3628302f), (1, "Rob Slotemakerbocht") }, - { new FloatRangeStruct(0.3733709f, 0.4406184f), (1, "Scheivlak") }, - { new FloatRangeStruct(0.4704477f, 0.5094342f), (1, "Mastersbocht") }, - { new FloatRangeStruct(0.5207254f, 0.558478f), (1, "Bocht 9") }, - { new FloatRangeStruct(0.5789623f, 0.6246402f), (1, "Bocht 10") }, - { new FloatRangeStruct(0.7076252f, 0.7710944f), (1, "Hans Ernst Bocht") }, - { new FloatRangeStruct(0.8137466f, 0.8532166f), (1, "Kumho") }, - { new FloatRangeStruct(0.85321661f, 0.9344479f), (1, "Arie Luyendijk Bocht") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/Data/Zolder.cs b/Race_Element.Data.ACC/Tracks/Data/Zolder.cs deleted file mode 100644 index f529ef599..000000000 --- a/Race_Element.Data.ACC/Tracks/Data/Zolder.cs +++ /dev/null @@ -1,32 +0,0 @@ -using RaceElement.Util.DataTypes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.Data.ACC.Tracks.Data -{ - internal class Zolder : AbstractTrackData - { - public override Guid Guid => new Guid("eaca1a4d-aa7e-4c31-bfc5-6035bfa30395"); - public override string FullName => "Circuit Zolder"; - public override int TrackLength => 4011; - - public override Dictionary CornerNames => new Dictionary() - { - { new FloatRangeStruct(0.04245049f, 0.0946003f), (1, "Earste Links") }, - { new FloatRangeStruct(0.1296046f, 0.1782782f), (1, "Sterrenwachtbocht") }, - { new FloatRangeStruct(0.17827821f, 0.2351831f), (1, "Kanaalbocht") }, - { new FloatRangeStruct(0.2595046f, 0.3127186f), (1, "Lucien Bianchibocht") }, - { new FloatRangeStruct(0.4122366f, 0.4614663f), (1, "Kleine Chicane") }, - { new FloatRangeStruct(0.5095074f, 0.5512679f), (1, "Butte") }, - { new FloatRangeStruct(0.5667552f, 0.6171156f), (1, "Gille Villeneuve Chicane") }, - { new FloatRangeStruct(0.6240816f, 0.6695773f), (1, "Terlamenbocht") }, - { new FloatRangeStruct(0.7329645f, 0.7745231f), (1, "Bolderberghaarspeldbocht") }, - { new FloatRangeStruct(0.7820684f, 0.8041771f), (1, "Jochen Rindtbocht") }, - { new FloatRangeStruct(0.8749502f, 0.9376088f), (1, "Jackie Ickxbocht") } - }; - } -} diff --git a/Race_Element.Data.ACC/Tracks/TrackData.cs b/Race_Element.Data.ACC/Tracks/TrackData.cs deleted file mode 100644 index a32ee9363..000000000 --- a/Race_Element.Data.ACC/Tracks/TrackData.cs +++ /dev/null @@ -1,53 +0,0 @@ -using RaceElement.Util.DataTypes; -using ACCManager.Data.ACC.Tracks.Data; -using System; -using System.Collections.Generic; -using System.Collections.Immutable; - -namespace RaceElement.Data.ACC.Tracks -{ - public class TrackData - { - public abstract class AbstractTrackData - { - public abstract Guid Guid { get; } - public abstract string FullName { get; } - public abstract int TrackLength { get; } - - /// - /// the float range is the normalized track position(spline position). - /// - public abstract Dictionary CornerNames { get; } - } - - /// - /// (folder/code name, Name ) - /// - public static readonly ImmutableDictionary Tracks = new Dictionary() { - {"Barcelona", new Barcelona() }, - {"brands_hatch", new BrandsHatch() }, - {"cota", new Cota() }, - {"donington", new Donington() }, - {"Hungaroring", new Hungaroring() }, - {"Imola", new Imola() }, - {"indianapolis", new Indianapolis() }, - {"Kyalami", new Kyalami() }, - {"Laguna_Seca", new LagunaSeca() }, - {"misano", new Misano() }, - {"monza", new Monza() }, - {"mount_panorama", new MountPanorama() }, - {"nurburgring", new Nurburgring() }, - {"oulton_park", new OultonPark() }, - {"Paul_Ricard", new PaulRicard() }, - {"Silverstone", new Silverstone() }, - {"snetterton", new Snetterton() }, - {"Spa", new SpaFrancorchamps() }, - {"Suzuka", new Suzuka() }, - {"watkins_glen", new WatkinsGlen() }, - {"Zandvoort", new Zandvoort() }, - {"Zolder", new Zolder() }, - }.ToImmutableDictionary(); - - - } -} diff --git a/Race_Element.Data.ACC/app.config b/Race_Element.Data.ACC/app.config deleted file mode 100644 index 3c508499f..000000000 --- a/Race_Element.Data.ACC/app.config +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element.Data.ACC/packages.config b/Race_Element.Data.ACC/packages.config deleted file mode 100644 index 9504c30f1..000000000 --- a/Race_Element.Data.ACC/packages.config +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element.HUD.ACC/Data/Tracker/Weather/WeatherTracker.cs b/Race_Element.HUD.ACC/Data/Tracker/Weather/WeatherTracker.cs deleted file mode 100644 index 7a6616781..000000000 --- a/Race_Element.HUD.ACC/Data/Tracker/Weather/WeatherTracker.cs +++ /dev/null @@ -1,106 +0,0 @@ -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.Threading; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.HUD.ACC.Data.Tracker.Weather -{ - public class WeatherInfo - { - public long TimeStamp = -1; - public AcRainIntensity Now { get; set; } - public AcRainIntensity In10 { get; set; } - public AcRainIntensity In20 { get; set; } - public AcRainIntensity In30 { get; set; } - - public override bool Equals(object obj) - { - if (obj == null) - return false; - - WeatherInfo other = obj as WeatherInfo; - return this.Now == other.Now && this.In10 == other.In10 && this.In30 == other.In30; - } - } - - internal class WeatherTracker - { - private static WeatherTracker _instance; - public static WeatherTracker Instance - { - get - { - if (_instance == null) _instance = new WeatherTracker(); - return _instance; - } - } - - private bool _isTracking = false; - - private WeatherInfo _lastWeather; - - public event EventHandler OnWeatherChanged; - - private WeatherTracker() - { - _lastWeather = new WeatherInfo(); - - Start(); - } - - private void Start() - { - if (_isTracking) - return; - - _isTracking = true; - new Thread(x => - { - while (_isTracking) - { - try - { - Thread.Sleep(1000 / 10); - - var graphicsPage = ACCSharedMemory.Instance.ReadGraphicsPageFile(true); - - - var newWeather = new WeatherInfo() - { - Now = graphicsPage.rainIntensity, - In10 = graphicsPage.rainIntensityIn10min, - In30 = graphicsPage.rainIntensityIn30min, - TimeStamp = DateTime.Now.ToFileTimeUtc() - }; - - if (!newWeather.Equals(_lastWeather)) - { - if (_lastWeather.TimeStamp != -1) - { - newWeather.In20 = _lastWeather.In30; - } - - OnWeatherChanged?.Invoke(this, newWeather); - _lastWeather = newWeather; - } - - } - catch (Exception ex) - { - Debug.WriteLine(ex); - LogWriter.WriteToLog(ex); - } - } - - _instance = null; - _isTracking = false; - }).Start(); - } - - internal void Stop() - { - _isTracking = false; - } - } -} diff --git a/Race_Element.HUD.ACC/Data/Trackers.cs b/Race_Element.HUD.ACC/Data/Trackers.cs deleted file mode 100644 index 8d365ae2f..000000000 --- a/Race_Element.HUD.ACC/Data/Trackers.cs +++ /dev/null @@ -1,19 +0,0 @@ -using RaceElement.Data.ACC.Tracker.Laps; -using RaceElement.HUD.ACC.Data.Tracker.Weather; - -namespace RaceElement.HUD.ACC.Data.Tracker -{ - public static class HudTrackers - { - - public static void StartAll() - { - _ = LapTracker.Instance; - } - - public static void StopAll() - { - WeatherTracker.Instance.Stop(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayAccelerometer/AccelerometerOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayAccelerometer/AccelerometerOverlay.cs deleted file mode 100644 index 656718a1a..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayAccelerometer/AccelerometerOverlay.cs +++ /dev/null @@ -1,182 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Linq; - -namespace RaceElement.HUD.ACC.Overlays.OverlayAccelerometer -{ - [Overlay(Name = "Accelerometer", Version = 1.00, OverlayType = OverlayType.Release, - Description = "G-meter showing lateral and longitudinal g-forces.")] - internal sealed class AccelerometerOverlay : AbstractOverlay - { - private readonly AccelleroConfig _config = new AccelleroConfig(); - private class AccelleroConfig : OverlayConfiguration - { - [ConfigGrouping("Accelerometer", "Additional options for the Accelerometer")] - public AccelerometerGrouping Accelerometer { get; set; } = new AccelerometerGrouping(); - public class AccelerometerGrouping - { - [ToolTip("Displays fading dots representing history of the g-forces.")] - public bool HistoryTrace { get; set; } = true; - - [ToolTip("Displays the lateral and longitudinal g-forces as text.")] - public bool GText { get; set; } = false; - } - - public AccelleroConfig() - { - this.AllowRescale = true; - } - } - - private CachedBitmap _cachedBackground; - private InfoPanel _panel; - private const int MaxG = 3; - private int _gMeterX = 22; - private int _gMeterY = 22; - private int _gMeterSize = 200; - private readonly LinkedList _trace = new LinkedList(); - - public AccelerometerOverlay(Rectangle rectangle) : base(rectangle, "Accelerometer") { } - - public sealed override void BeforeStart() - { - this.RefreshRateHz = 20; - - this.Width = 225; - this.Height = this.Width; - - if (!this._config.Accelerometer.GText) - { - this.Width = _gMeterSize + 1; - this.Height = this.Width; - _gMeterX = 0; - _gMeterY = 0; - } - else - _panel = new InfoPanel(10, 62) { DrawBackground = true, DrawRowLines = false }; - - RenderBackgroundBitmap(); - } - - private void RenderBackgroundBitmap() - { - int size = _gMeterSize; - - if (Scale != 1) - size = (int)Math.Floor(size * Scale); - - _cachedBackground = new CachedBitmap(size + 1, size + 1, g => - { - SolidBrush backgroundBrush = new SolidBrush(Color.FromArgb(140, Color.Black)); - g.FillEllipse(backgroundBrush, new Rectangle(0, 0, size, size)); - - // Draws the lines and circles - Pen AccPen = new Pen(Color.FromArgb(100, 255, 255, 255), 1); - Pen AccPen2 = new Pen(Color.FromArgb(30, 255, 255, 255), 3); - Pen AccPen3 = new Pen(Color.FromArgb(100, 255, 255, 255), 4); - Pen AccPen4 = new Pen(Color.FromArgb(200, 200, 200, 200), 5); - - int x = 0; - int y = 0; - - g.DrawLine(AccPen, x, y + size / 2, x + size, y + size / 2); - g.DrawLine(AccPen, x + size / 2, y, x + size / 2, y + size); - g.DrawEllipse(AccPen4, x + 2, y + 2, size - 4, size - 4); - g.DrawEllipse(AccPen3, x + size / 6, y + size / 6, (size / 3) * 2, (size / 3) * 2); - g.DrawEllipse(AccPen2, x + size / 3, y + size / 3, size / 3, size / 3); - }); - } - - public sealed override void BeforeStop() - { - if (_cachedBackground != null) - _cachedBackground.Dispose(); - } - - public sealed override void Render(Graphics g) - { - g.SmoothingMode = SmoothingMode.HighQuality; - if (_cachedBackground != null) - _cachedBackground.Draw(g, _gMeterX, _gMeterY, _gMeterSize, _gMeterSize); - - if (this._config.Accelerometer.GText) - { - string x = $"{pagePhysics.AccG[0]:F2}".FillStart(5, ' '); - string y = $"{pagePhysics.AccG[2]:F2}".FillStart(5, ' '); - _panel.AddLine("X ", x); - _panel.AddLine("Y ", y); - - _panel.Draw(g); - } - - DrawGMeter(_gMeterX, _gMeterY, _gMeterSize, g); - } - - /// - /// Returns a percentage, mininum -100% and max 100% - /// - /// - /// - /// a value between -1 and 1 (inclusive) - public float GetPercentage(float max, float value) - { - float percentage = value * 100 / max / 100; - percentage.Clip(-1, 1); - return percentage; - } - - private void DrawGMeter(int x, int y, int size, Graphics g) - { - g.SmoothingMode = SmoothingMode.AntiAlias; - //Draws the 'dot' - int gDotSize = 14; - - double xPercentage = GetPercentage(MaxG, pagePhysics.AccG[0]); - double yPercentage = GetPercentage(MaxG, pagePhysics.AccG[2]); - - double direction = Math.Atan2(xPercentage, yPercentage); - double magnitude = Math.Sqrt(xPercentage * xPercentage + yPercentage * yPercentage); - magnitude.Clip(-1, 1); - - double horizontalPlacement = Math.Sin(direction) * magnitude; - double verticalPlacement = Math.Cos(direction) * magnitude; - verticalPlacement.Clip(-1, 1); - horizontalPlacement.Clip(-1, 1); - - PointF middle = new PointF(x + size / 2, y + size / 2); - int gDotPosX = (int)(middle.X + (size / 2 * horizontalPlacement) - (gDotSize / 2)); - int gDotPosY = (int)(middle.Y + (size / 2 * verticalPlacement) - (gDotSize / 2)); - - g.FillEllipse(new SolidBrush(Color.FromArgb(224, 82, 2)), new Rectangle(gDotPosX, gDotPosY, gDotSize, gDotSize)); - - if (_config.Accelerometer.HistoryTrace) - { - lock (_trace) - { - _trace.AddFirst(new Point(gDotPosX, gDotPosY)); - if (_trace.Count > 10) - _trace.RemoveLast(); - - - for (int i = 0; i < _trace.Count; i++) - { - Point traceItem = _trace.ElementAt(i); - g.FillEllipse(new SolidBrush(Color.FromArgb(90 - i * 5, 242, 82, 2)), new Rectangle(traceItem.X, traceItem.Y, gDotSize, gDotSize)); - } - } - } - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayBoostGauge/BoostGaugeOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayBoostGauge/BoostGaugeOverlay.cs deleted file mode 100644 index c3bac081c..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayBoostGauge/BoostGaugeOverlay.cs +++ /dev/null @@ -1,56 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using RaceElement.Util.SystemExtensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ACCManager.HUD.ACC.Overlays.OverlayBoostGauge -{ - [Overlay(Name = "Boost Gauge", Version = 1.00, OverlayType = OverlayType.Release, - Description = "Progress bar showing boost percentage.")] - internal class BoostGaugeOverlay : AbstractOverlay - { - private readonly BoostConfiguration _config = new BoostConfiguration(); - private class BoostConfiguration : OverlayConfiguration - { - public BoostConfiguration() - { - AllowRescale = true; - } - } - - private readonly InfoPanel _panel; - - public BoostGaugeOverlay(Rectangle rectangle) : base(rectangle, "Boost Gauge") - { - this.Width = 130; - _panel = new InfoPanel(13, this.Width) - { - FirstRowLine = 1, - }; - this.Height = _panel.FontHeight * 1 + 1; - this.RefreshRateHz = 10; - } - - public override void BeforeStart() - { - } - - public override void BeforeStop() - { - } - - public override bool ShouldRender() => DefaultShouldRender(); - - public override void Render(Graphics g) - { - _panel.AddProgressBarWithCenteredText($"{pagePhysics.TurboBoost * 100f:F1}".FillStart(4, ' '), 0, 100, pagePhysics.TurboBoost * 100f); - _panel.Draw(g); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayCarInfo/CarInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayCarInfo/CarInfoOverlay.cs deleted file mode 100644 index 29e7bfa7c..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayCarInfo/CarInfoOverlay.cs +++ /dev/null @@ -1,99 +0,0 @@ -using RaceElement.Data.ACC.Cars; -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Data.ACC.Tracker.Laps; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlayCarInfo -{ - [Overlay(Name = "Car Info", Version = 1.00, OverlayType = OverlayType.Release, - Description = "A panel showing the damage time. Optionally showing current tyre set, fuel per lap, exhaust temp and water temp.")] - internal sealed class CarInfoOverlay : AbstractOverlay - { - private readonly CarInfoConfiguration _config = new CarInfoConfiguration(); - private class CarInfoConfiguration : OverlayConfiguration - { - [ConfigGrouping("Info Panel", "Show or hide additional information in the panel.")] - public InfoPanelGrouping InfoPanel { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - [ToolTip("Displays your current tyre set")] - public bool TyreSet { get; set; } = true; - - [ToolTip("Displays the average fuel usage over the past 3 laps.\n(uses last lap info if not enough data)")] - public bool FuelPerLap { get; set; } = false; - - [ToolTip("Displays the exhaust temperature.")] - public bool ExhaustTemp { get; set; } = false; - - [ToolTip("Displays the water temperature of the engine.")] - public bool WaterTemp { get; set; } = false; - } - - public CarInfoConfiguration() - { - this.AllowRescale = true; - } - } - - private readonly InfoPanel infoPanel; - - public CarInfoOverlay(Rectangle rectangle) : base(rectangle, "Car Info") - { - int panelWidth = 140; - - this.infoPanel = new InfoPanel(10, panelWidth); - this.Width = panelWidth + 1; - this.Height = this.infoPanel.FontHeight * 5 + 1; - this.RefreshRateHz = 3; - } - - public sealed override bool ShouldRender() => DefaultShouldRender(); - - public sealed override void BeforeStart() - { - if (!this._config.InfoPanel.FuelPerLap) - this.Height -= this.infoPanel.FontHeight; - - if (!this._config.InfoPanel.ExhaustTemp) - this.Height -= this.infoPanel.FontHeight; - - if (!this._config.InfoPanel.WaterTemp) - this.Height -= this.infoPanel.FontHeight; - - if (!this._config.InfoPanel.TyreSet) - this.Height -= this.infoPanel.FontHeight; - } - - public sealed override void BeforeStop() { } - - public sealed override void Render(Graphics g) - { - float totalRepairTime = Damage.GetTotalRepairTime(pagePhysics); - Brush damageBrush = Damage.HasAnyDamage(pagePhysics) ? Brushes.OrangeRed : Brushes.White; - infoPanel.AddLine("Damage", $"{totalRepairTime:F1}", damageBrush); - - if (_config.InfoPanel.TyreSet) - infoPanel.AddLine("Tyre Set", $"{pageGraphics.currentTyreSet}"); - - if (this._config.InfoPanel.FuelPerLap) - { - float fuelXLap = LapTracker.Instance.Laps.GetAverageFuelUsage(3); - if (fuelXLap != -1) - fuelXLap /= 1000f; - else fuelXLap = pageGraphics.FuelXLap; - infoPanel.AddLine("Fuel/Lap", $"{fuelXLap:F3}"); - } - - if (this._config.InfoPanel.WaterTemp) - infoPanel.AddLine("Water", $"{pagePhysics.WaterTemp:F0} C"); - - if (this._config.InfoPanel.ExhaustTemp) - infoPanel.AddLine("Exhaust", $"{pageGraphics.ExhaustTemperature:F0} C"); - - infoPanel.Draw(g); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayCornerNames/CornerNamesOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayCornerNames/CornerNamesOverlay.cs deleted file mode 100644 index 01f9b9ba8..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayCornerNames/CornerNamesOverlay.cs +++ /dev/null @@ -1,148 +0,0 @@ -using RaceElement.Util.DataTypes; -using RaceElement.Data.ACC.Session; -using RaceElement.Data.ACC.Tracks; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace ACCManager.HUD.ACC.Overlays.OverlayCornerNames -{ -#if DEBUG - [Overlay(Name = "Corners", Description = "Shows corner/sector names for each track.", OverlayType = OverlayType.Release, Version = 1.00)] -#endif - internal class CornersOverlay : AbstractOverlay - { - private readonly CornerNamesConfig _config = new CornerNamesConfig(); - private sealed class CornerNamesConfig : OverlayConfiguration - { - [ConfigGrouping("Names", "Configure options specific to the Corner Names HUD.")] - public CornerNamesGrouping CornerNames { get; set; } = new CornerNamesGrouping(); - public class CornerNamesGrouping - { - [ToolTip("Show corner names in addition to the already displayin corner numbers.\nNot Every corner has got a name and some tracks don't have corner names at all.")] - public bool Names { get; set; } = true; - } - - public CornerNamesConfig() - { - this.AllowRescale = true; - } - } - - private readonly int InitialWidth = 450; - private readonly int InitialHeight; - private readonly Font _font; - - private CachedBitmap _cachedBackground; - private AbstractTrackData _currentTrack; - - private float _maxTextWidth = 0; - - public CornersOverlay(Rectangle rectangle) : base(rectangle, "Corners") - { - this.Width = InitialWidth + 1; - - _font = FontUtil.FontOrbitron(13 * this.Scale); - InitialHeight = (int)(_font.Height * 1.3 + 1); - this.Height = InitialHeight; - } - - public override void BeforeStart() - { - - if (_currentTrack == null) - _currentTrack = TrackData.Tracks.FirstOrDefault(x => x.Key == pageStatic.Track).Value; - - RenderBackground(); - - RaceSessionTracker.Instance.OnNewSessionStarted += Instance_OnNewSessionStarted; - - if (_currentTrack == null) - _currentTrack = Tracks.FirstOrDefault(x => x.Key == pageStatic.Track).Value; - } - - private void Instance_OnNewSessionStarted(object sender, RaceElement.Data.ACC.Database.SessionData.DbRaceSession e) - { - _currentTrack = Tracks.FirstOrDefault(x => x.Key == pageStatic.Track).Value; - RenderBackground(); - } - - private void SetMaxTextWidth() - { - _maxTextWidth = 0; - new CachedBitmap((int)((InitialWidth + 1) * this.Scale), (int)((InitialHeight + 1) * this.Scale), g => - { - if (_currentTrack != null) - { - foreach ((int, string) value in _currentTrack.CornerNames.Values) - { - StringBuilder builder = new StringBuilder(); - builder.Append(" "); - builder.Append(value.Item1); - if (_config.CornerNames.Names && value.Item2 != string.Empty) - builder.Append(" - " + value.Item2); - builder.Append(" "); - - float textWidth = g.MeasureString(builder.ToString(), _font).Width; - - if (textWidth > _maxTextWidth) - _maxTextWidth = textWidth; - } - } - }).Render(); - } - - private void RenderBackground() - { - SetMaxTextWidth(); - _cachedBackground = new CachedBitmap((int)((InitialWidth + 1) * this.Scale), (int)((InitialHeight + 1) * this.Scale), g => - { - Rectangle rectangle = new Rectangle(0, 0, (int)(_maxTextWidth * this.Scale), (int)(InitialHeight * this.Scale)); - int cornerRadius = (int)(4 * this.Scale); - g.DrawRoundedRectangle(new Pen(new SolidBrush(Color.FromArgb(185, 0, 0, 0)), 3 * this.Scale), rectangle, cornerRadius); - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(185, 0, 0, 0)), rectangle, cornerRadius); - }); - } - - public override void BeforeStop() - { - RaceSessionTracker.Instance.OnNewSessionStarted -= Instance_OnNewSessionStarted; - } - - public override void Render(Graphics g) - { - if (_currentTrack != null) - { - (int, string) cornerName = _currentTrack.CornerNames.FirstOrDefault(x => x.Key.IsInRange(pageGraphics.NormalizedCarPosition)).Value; - - _cachedBackground.Draw(g, 0, 0, InitialWidth, InitialHeight); - - if (cornerName.Item1 != 0) - { - StringBuilder builder = new StringBuilder(); - builder.Append(" "); - builder.Append(cornerName.Item1); - if (_config.CornerNames.Names && cornerName.Item2 != string.Empty) - builder.Append(" - " + cornerName.Item2); - builder.Append(" "); - string text = builder.ToString(); - - float textWidth = g.MeasureString(text, _font).Width; - PointF location = new PointF(_maxTextWidth / 2 - textWidth / 2, InitialHeight / 2 - _font.Height / 2); - g.DrawStringWithShadow(text, _font, Color.White, location, 0.75f * this.Scale); - } - } - } - - public override bool ShouldRender() => DefaultShouldRender(); - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDamage/DamageOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDamage/DamageOverlay.cs deleted file mode 100644 index e7311e630..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDamage/DamageOverlay.cs +++ /dev/null @@ -1,372 +0,0 @@ -using System.Drawing; -using System.Drawing.Drawing2D; -using RaceElement.Data.ACC.Cars; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System.IO; -using RaceElement.Util.SystemExtensions; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDamage -{ - [Overlay(Name = "Damage", Version = 1.00, OverlayType = OverlayType.Release, - Description = "Total repair time is displayed in the center.\nSuspension damage is displayed in percentages, whilst bodywork damage is displayed in repair time.")] - internal sealed class DamageOverlay : AbstractOverlay - { - private readonly DamageConfiguration _config = new DamageConfiguration(); - private class DamageConfiguration : OverlayConfiguration - { - [ConfigGrouping("Damage", "Changes the behavior of the Damage HUD")] - public DamageGrouping Damage { get; set; } = new DamageGrouping(); - public class DamageGrouping - { - [ToolTip("Displays the total repair time in the center of the HUD with red colored text.")] - public bool TotalRepairTime { get; set; } = true; - - [ToolTip("Only show the HUD when there is actual damage on the car.")] - public bool AutoHide { get; set; } = true; - } - - public DamageConfiguration() - { - AllowRescale = true; - } - } - - private class PathShape - { - public RectangleF Shape { get; set; } - public GraphicsPath Path { get; set; } - public Brush Brush { get; set; } - } - - private readonly Font _font; - private const int OriginalWidth = 150; - private const int OriginalHeight = 220; - - private CachedBitmap _carOutline; - private CachedBitmap _suspensionDamage; - private CachedBitmap _bodyDamage; - - private PathShape _shapeBodyFront; - private PathShape _shapeBodyRear; - private PathShape _shapeBodyLeft; - private PathShape _shapeBodyRight; - - private PathShape _shapeSuspensionFrontLeft; - private PathShape _shapeSuspensionFrontRight; - private PathShape _shapeSuspensionRearLeft; - private PathShape _shapeSuspensionRearRight; - - private float _damageTime = 0; - - public DamageOverlay(Rectangle rectangle) : base(rectangle, "Damage") - { - this.RefreshRateHz = 1; - - _font = FontUtil.FontUnispace(11 * this.Scale); - this.Width = OriginalWidth; - this.Height = OriginalHeight; - } - - public override void BeforeStart() - { - CreatePathShapes(); - - int scaledWidth = (int)(this.Width * this.Scale) - 1; - int scaledHeight = (int)(this.Height * this.Scale) - 1; - _carOutline = new CachedBitmap(scaledWidth, scaledHeight, g => - { - GraphicsPath path = new GraphicsPath(); - - float horizontalPadding = scaledWidth * 0.05f; - float verticalPadding = scaledHeight * 0.025f; - - Pen bodyOutlinePen = new Pen(new SolidBrush(Color.FromArgb(185, 0, 0, 0)), 0.8f * this.Scale); - - float frontRearWidth = scaledWidth - horizontalPadding * 6; - g.FillRectangle(new SolidBrush(Color.FromArgb(125, 0, 0, 0)), new RectangleF(horizontalPadding + frontRearWidth / 7, verticalPadding * 3, frontRearWidth, scaledHeight - verticalPadding * 6)); - - g.FillPath(_shapeBodyFront.Brush, _shapeBodyFront.Path); - g.DrawPath(bodyOutlinePen, _shapeBodyFront.Path); - - g.FillPath(_shapeBodyRear.Brush, _shapeBodyRear.Path); - g.DrawPath(bodyOutlinePen, _shapeBodyRear.Path); - - g.FillPath(_shapeBodyLeft.Brush, _shapeBodyLeft.Path); - g.DrawPath(bodyOutlinePen, _shapeBodyLeft.Path); - - g.FillPath(_shapeBodyRight.Brush, _shapeBodyRight.Path); - g.DrawPath(bodyOutlinePen, _shapeBodyRight.Path); - - g.FillPath(_shapeSuspensionFrontLeft.Brush, _shapeSuspensionFrontLeft.Path); - g.DrawPath(bodyOutlinePen, _shapeSuspensionFrontLeft.Path); - - g.FillPath(_shapeSuspensionFrontRight.Brush, _shapeSuspensionFrontRight.Path); - g.DrawPath(bodyOutlinePen, _shapeSuspensionFrontRight.Path); - - g.FillPath(_shapeSuspensionRearLeft.Brush, _shapeSuspensionRearLeft.Path); - g.DrawPath(bodyOutlinePen, _shapeSuspensionRearLeft.Path); - - g.FillPath(_shapeSuspensionRearRight.Brush, _shapeSuspensionRearRight.Path); - g.DrawPath(bodyOutlinePen, _shapeSuspensionRearRight.Path); - }); - - _suspensionDamage = new CachedBitmap(scaledWidth, scaledHeight, g => { }); - _bodyDamage = new CachedBitmap(scaledWidth, scaledHeight, g => { }); - - UpdateShapeDamageColors(); - UpdateSuspensionDamage(); - UpdateBodyDamage(); - } - - public override void BeforeStop() - { - _carOutline?.Dispose(); - _suspensionDamage?.Dispose(); - _bodyDamage?.Dispose(); - } - - public override bool ShouldRender() => DefaultShouldRender(); - - public override void Render(Graphics g) - { - float newDamageTime = Damage.GetTotalRepairTime(pagePhysics); - if (newDamageTime != _damageTime) - { - _damageTime = newDamageTime; - UpdateShapeDamageColors(); - UpdateSuspensionDamage(); - UpdateBodyDamage(); - } - - if (newDamageTime == 0 && (_config.Damage.AutoHide && !this.AllowReposition)) - return; - - _carOutline?.Draw(g, 0, 0, OriginalWidth, OriginalHeight); - _suspensionDamage?.Draw(g, 0, 0, OriginalWidth, OriginalHeight); - _bodyDamage?.Draw(g, 0, 0, OriginalWidth, OriginalHeight); - } - - private void CreatePathShapes() - { - int scaledWidth = (int)(this.Width * this.Scale) - 1; - int scaledHeight = (int)(this.Height * this.Scale) - 1; - float horizontalPadding = scaledWidth * 0.05f; - float verticalPadding = scaledHeight * 0.025f; - Color baseColor = Color.FromArgb(185, 0, 0, 0); - - - //// BODY DAMAGE - float frontRearWidth = scaledWidth - horizontalPadding * 6; - - // body shapes Front - RectangleF bodyFront = new RectangleF(horizontalPadding + frontRearWidth / 7, verticalPadding, frontRearWidth, verticalPadding * 4); - GraphicsPath pathBodyFront = new GraphicsPath(); - pathBodyFront.AddArc(bodyFront, 180, 180); - _shapeBodyFront = new PathShape() - { - Shape = bodyFront, - Brush = new LinearGradientBrush(bodyFront, baseColor, Color.Transparent, LinearGradientMode.Vertical), - Path = pathBodyFront - }; - - // body shape rear - RectangleF bodyRear = new RectangleF(horizontalPadding + frontRearWidth / 7, scaledHeight - verticalPadding * 5, frontRearWidth, verticalPadding * 4); - GraphicsPath pathBodyRear = new GraphicsPath(); - pathBodyRear.AddArc(bodyRear, 180, -180); - _shapeBodyRear = new PathShape() - { - Shape = bodyRear, - Brush = new LinearGradientBrush(bodyRear, Color.Transparent, baseColor, LinearGradientMode.Vertical), - Path = pathBodyRear, - }; - - // body shapes left and right - float bodyLeftRightWidth = horizontalPadding * 4; - float bodyLeftRightHeight = verticalPadding * 34; - - // body shape left - RectangleF bodyLeft = new RectangleF(0 + horizontalPadding, scaledHeight / 2 - bodyLeftRightHeight / 2, bodyLeftRightWidth, bodyLeftRightHeight); - GraphicsPath pathBodyLeft = new GraphicsPath(); - pathBodyLeft.AddArc(bodyLeft, 90, 180); - _shapeBodyLeft = new PathShape() - { - Shape = bodyLeft, - Brush = new LinearGradientBrush(bodyLeft, baseColor, Color.Transparent, LinearGradientMode.Horizontal), - Path = pathBodyLeft - }; - - // Body shape right - RectangleF bodyRight = new RectangleF(scaledWidth - bodyLeftRightWidth - horizontalPadding, scaledHeight / 2 - bodyLeftRightHeight / 2, bodyLeftRightWidth, bodyLeftRightHeight); - GraphicsPath pathBodyRight = new GraphicsPath(); - pathBodyRight.AddArc(bodyRight, -90, 180); - _shapeBodyRight = new PathShape() - { - Shape = bodyRight, - Brush = new LinearGradientBrush(bodyRight, Color.Transparent, baseColor, LinearGradientMode.Horizontal), - Path = pathBodyRight - }; - - - //// SUSPENSION DAMAGE - float wheelWidth = verticalPadding * 5f; - float wheelHeight = wheelWidth * 1.6f; - float verticalWheelPadding = verticalPadding * 4; - - // wheel left front - RectangleF wheelFrontLeft = new RectangleF(bodyLeftRightWidth / 2 + horizontalPadding * 1.5f, verticalWheelPadding, wheelWidth, wheelHeight); - GraphicsPath pathWheelFrontLeft = new GraphicsPath(); - pathWheelFrontLeft.AddRectangle(wheelFrontLeft); - _shapeSuspensionFrontLeft = new PathShape() - { - Shape = wheelFrontLeft, - Brush = new LinearGradientBrush(wheelFrontLeft, baseColor, Color.Transparent, LinearGradientMode.Horizontal), - Path = pathWheelFrontLeft, - }; - - // wheel right front - RectangleF wheelFrontRight = new RectangleF(scaledWidth - (bodyLeftRightWidth / 2 + horizontalPadding * 1.5f + wheelWidth), verticalWheelPadding, wheelWidth, wheelHeight); - GraphicsPath pathWheelFrontRight = new GraphicsPath(); - pathWheelFrontRight.AddRectangle(wheelFrontRight); - _shapeSuspensionFrontRight = new PathShape() - { - Shape = wheelFrontRight, - Brush = new LinearGradientBrush(wheelFrontRight, Color.Transparent, baseColor, LinearGradientMode.Horizontal), - Path = pathWheelFrontRight, - }; - - // wheel left Rear - RectangleF wheelRearLeft = new RectangleF(bodyLeftRightWidth / 2 + horizontalPadding * 1.5f, scaledHeight - verticalWheelPadding - wheelHeight, wheelWidth, wheelHeight); - GraphicsPath pathWheelRearLeft = new GraphicsPath(); - pathWheelRearLeft.AddRectangle(wheelRearLeft); - _shapeSuspensionRearLeft = new PathShape() - { - Shape = wheelRearLeft, - Brush = new LinearGradientBrush(wheelRearLeft, baseColor, Color.Transparent, LinearGradientMode.Horizontal), - Path = pathWheelRearLeft, - }; - - // wheel right Rear - RectangleF wheelRearRight = new RectangleF(scaledWidth - (bodyLeftRightWidth / 2 + horizontalPadding * 1.5f + wheelWidth), scaledHeight - verticalWheelPadding - wheelHeight, wheelWidth, wheelHeight); - GraphicsPath pathWheelRearRight = new GraphicsPath(); - pathWheelRearRight.AddRectangle(wheelRearRight); - _shapeSuspensionRearRight = new PathShape() - { - Shape = wheelRearRight, - Brush = new LinearGradientBrush(wheelRearRight, Color.Transparent, baseColor, LinearGradientMode.Horizontal), - Path = pathWheelRearRight, - }; - } - - private void UpdateShapeDamageColors() - { - Color baseColor = Color.FromArgb(185, 0, 0, 0); - - /// BODY DAMAGE - /// - float bodyDamageFront = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Front); - float bodyDamageRear = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Rear); - float bodyDamageLeft = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Left); - float bodyDamageRight = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Right); - _shapeBodyFront.Brush = new LinearGradientBrush(_shapeBodyFront.Shape, bodyDamageFront > 0 ? Color.Red : baseColor, Color.Transparent, LinearGradientMode.Vertical); - _shapeBodyRear.Brush = new LinearGradientBrush(_shapeBodyRear.Shape, Color.Transparent, bodyDamageRear > 0 ? Color.Red : baseColor, LinearGradientMode.Vertical); - _shapeBodyLeft.Brush = new LinearGradientBrush(_shapeBodyLeft.Shape, bodyDamageLeft > 0 ? Color.Red : baseColor, Color.Transparent, LinearGradientMode.Horizontal); - _shapeBodyRight.Brush = new LinearGradientBrush(_shapeBodyRight.Shape, Color.Transparent, bodyDamageRight > 0 ? Color.Red : baseColor, LinearGradientMode.Horizontal); - - /// SUSPENSION DAMAGE - /// - float suspensionDamageFrontLeft = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.FrontLeft); - float suspensionDamageFrontRight = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.FrontRight); - float suspensionDamageRearLeft = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.RearLeft); - float suspensionDamageRearRight = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.RearRight); - - _shapeSuspensionFrontLeft.Brush = new LinearGradientBrush(_shapeSuspensionFrontLeft.Shape, suspensionDamageFrontLeft > 0 ? Color.Red : baseColor, Color.Transparent, LinearGradientMode.Horizontal); - _shapeSuspensionFrontRight.Brush = new LinearGradientBrush(_shapeSuspensionFrontRight.Shape, Color.Transparent, suspensionDamageFrontRight > 0 ? Color.Red : baseColor, LinearGradientMode.Horizontal); - _shapeSuspensionRearLeft.Brush = new LinearGradientBrush(_shapeSuspensionRearLeft.Shape, suspensionDamageRearLeft > 0 ? Color.Red : baseColor, Color.Transparent, LinearGradientMode.Horizontal); - _shapeSuspensionRearRight.Brush = new LinearGradientBrush(_shapeSuspensionRearRight.Shape, Color.Transparent, suspensionDamageRearRight > 0 ? Color.Red : baseColor, LinearGradientMode.Horizontal); - - // re-render car outline - _carOutline.Render(); - } - - private void UpdateSuspensionDamage() - { - float scaledWidth = (OriginalWidth * this.Scale) - 1; - float scaledHeight = (OriginalHeight * this.Scale) - 1; - float horizontalPadding = scaledWidth * 0.1f; - float verticalPadding = scaledHeight * 0.1f; - float halfFontHeight = _font.Height / 2f; - - _suspensionDamage?.SetRenderer(g => - { - float suspensionDamageFrontLeft = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.FrontLeft); - float suspensionDamageFrontRight = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.FrontRight); - float suspensionDamageRearLeft = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.RearLeft); - float suspensionDamageRearRight = Damage.GetSuspensionDamage(pagePhysics, RaceElement.Data.SetupConverter.Wheel.RearRight); - - if (suspensionDamageFrontLeft > 0) - DrawTextWithOutline(g, Color.White, $"{GetPercentage(suspensionDamageFrontLeft, 30):F0}%", (int)(horizontalPadding * 2.67f), (int)(verticalPadding * 2.0f - halfFontHeight)); - - if (suspensionDamageFrontRight > 0) - DrawTextWithOutline(g, Color.White, $"{GetPercentage(suspensionDamageFrontRight, 30):F0}%", (int)(scaledWidth - horizontalPadding * 2.67f), (int)(verticalPadding * 2.0f - halfFontHeight)); - - if (suspensionDamageRearLeft > 0) - DrawTextWithOutline(g, Color.White, $"{GetPercentage(suspensionDamageRearLeft, 30):F0}%", (int)(horizontalPadding * 2.67f), (int)(scaledHeight - verticalPadding * 2.0f - halfFontHeight)); - - if (suspensionDamageRearRight > 0) - DrawTextWithOutline(g, Color.White, $"{GetPercentage(suspensionDamageRearRight, 30):F0}%", (int)(scaledWidth - horizontalPadding * 2.67f), (int)(scaledHeight - verticalPadding * 2.0f - halfFontHeight)); - - if (_damageTime > 0 && _config.Damage.TotalRepairTime) - DrawTextWithOutline(g, Color.OrangeRed, $"{_damageTime:F1}", (int)(scaledWidth / 2), (int)(scaledHeight / 2 - halfFontHeight)); - }); - } - - private float GetPercentage(float current, float max) - { - float percentage = 100f * current / max; - percentage.Clip(0, 100); - return percentage; - } - - private void UpdateBodyDamage() - { - float scaledWidth = (OriginalWidth * this.Scale); - float scaledHeight = (OriginalHeight * this.Scale); - float horizontalPadding = scaledWidth * 0.1f; - float verticalPadding = scaledHeight * 0.1f; - - float halfFontHeight = _font.Height / 2f; - _bodyDamage?.SetRenderer(g => - { - float bodyDamageFront = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Front); - float bodyDamageRear = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Rear); - float bodyDamageLeft = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Left); - float bodyDamageRight = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Right); - float bodyDamageCentre = Damage.GetBodyWorkDamage(pagePhysics, Damage.CarDamagePosition.Centre); - - if (bodyDamageFront > 0) - DrawTextWithOutline(g, Color.White, $"{bodyDamageFront:F1}", (int)(scaledWidth / 2), (int)(verticalPadding * 1.2f - halfFontHeight * 2)); - - if (bodyDamageRear > 0) - DrawTextWithOutline(g, Color.White, $"{bodyDamageRear:F1}", (int)(scaledWidth / 2), (int)(scaledHeight - verticalPadding * 0.9f - halfFontHeight)); - - if (bodyDamageLeft > 0) - DrawTextWithOutline(g, Color.White, $"{bodyDamageLeft:F1}", (int)(horizontalPadding * 1.75f), (int)(scaledHeight / 2 - halfFontHeight)); - - if (bodyDamageRight > 0) - DrawTextWithOutline(g, Color.White, $"{bodyDamageRight:F1}", (int)(scaledWidth - horizontalPadding * 1.75f), (int)(scaledHeight / 2 - halfFontHeight)); - }); - } - - private void DrawTextWithOutline(Graphics g, Color textColor, string text, int x, int y) - { - int textWidth = (int)g.MeasureString(text, _font).Width; - Rectangle backgroundDimension = new Rectangle(x - textWidth / 2, y, (int)textWidth, _font.Height); - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(210, 0, 0, 0)), backgroundDimension, 2); - g.DrawRoundedRectangle(new Pen(Color.FromArgb(135, 230, 0, 0), 0.6f * this.Scale), backgroundDimension, 2); - g.DrawStringWithShadow(text, _font, textColor, new PointF(x - textWidth / 2, y + _font.GetHeight(g) / 11f), 0.75f * this.Scale); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/DebugInfoHelper.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/DebugInfoHelper.cs deleted file mode 100644 index 4174ace70..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/DebugInfoHelper.cs +++ /dev/null @@ -1,59 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using System; -using System.Collections.Generic; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo -{ - internal class DebugInfoHelper - { - public class DebugConfig : OverlayConfiguration - { - [ConfigGrouping("Dock", "Provides settings for overlay docking.")] - public DockConfigGrouping Dock { get; set; } = new DockConfigGrouping(); - public class DockConfigGrouping - { - [ToolTip("Allows you to reposition this debug panel.")] - public bool Undock { get; set; } = false; - } - - public DebugConfig() - { - this.AllowRescale = true; - } - } - - public static DebugInfoHelper Instance { get; } = new DebugInfoHelper(); - - private List _infoOverlays = new List(); - - public void AddOverlay(AbstractOverlay overlay) - { - _infoOverlays.Add(overlay); - WidthChanged.Invoke(this, true); - } - - public void RemoveOverlay(AbstractOverlay overlay) - { - _infoOverlays.Remove(overlay); - if (WidthChanged != null) - WidthChanged.Invoke(this, true); - } - - public int GetX(AbstractOverlay overlay) - { - int x = 0; - for (int i = 0; i < _infoOverlays.Count; i++) - { - if (_infoOverlays[i] == overlay) - { - return x; - } - x += _infoOverlays[i].Width + 5; - } - return 0; - } - - public event EventHandler WidthChanged; - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayACC/AccOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayACC/AccOverlay.cs deleted file mode 100644 index 936c94999..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayACC/AccOverlay.cs +++ /dev/null @@ -1,89 +0,0 @@ -using RaceElement.Data.ACC.Core; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayACC -{ -#if DEBUG - [Overlay(Name = "ACC Process", Version = 1.00, OverlayType = OverlayType.Debug, - Description = "A panel showing information about ACC.")] -#endif - internal class AccProcessOverlay : AbstractOverlay - { - private readonly AccOverlayConfiguration _config = new AccOverlayConfiguration(); - private class AccOverlayConfiguration : OverlayConfiguration - { - [ConfigGrouping("Dock", "Provides settings for overlay docking.")] - public DockConfigGrouping Dock { get; set; } = new DockConfigGrouping(); - public class DockConfigGrouping - { - [ToolTip("Allows you to reposition this debug panel.")] - public bool Undock { get; set; } = false; - } - - public AccOverlayConfiguration() - { - this.AllowRescale = true; - } - } - - private InfoPanel _panel; - - public AccProcessOverlay(Rectangle rectangle) : base(rectangle, "ACC Process") - { - this.AllowReposition = false; - this.RefreshRateHz = 10; - _panel = new InfoPanel(9, 350); - this.Width = 350; - this.Height = _panel.FontHeight * 10; - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - } - - public override void Render(Graphics g) - { - - _panel.AddLine("Process Alive", $"{AccProcess.IsRunning}"); - _panel.Draw(g); - } - - public override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayBroadcastRealtime/BroadcastRealtimeOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayBroadcastRealtime/BroadcastRealtimeOverlay.cs deleted file mode 100644 index 7166e6018..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayBroadcastRealtime/BroadcastRealtimeOverlay.cs +++ /dev/null @@ -1,88 +0,0 @@ -using RaceElement.Data.ACC.EntryList; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.Util; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Reflection; -using static RaceElement.Data.ACC.EntryList.EntryListTracker; -using static RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.DebugInfoHelper; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayBroadcastRealtime -{ -#if DEBUG - [Overlay(Name = "Broadcast Realtime", Version = 1.00, OverlayType = OverlayType.Debug, - Description = "A panel showing live broadcast realtime data.")] -#endif - internal sealed class BroadcastRealtimeOverlay : AbstractOverlay - { - private DebugConfig _config = new DebugConfig(); - - private InfoTable _table; - - public BroadcastRealtimeOverlay(Rectangle rectangle) : base(rectangle, "Broadcast Realtime") - { - this.AllowReposition = false; - this.RefreshRateHz = 10; - this.Width = 300; - this.Height = 300; - - _table = new InfoTable(9, new int[] { 200 }); - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - } - - public sealed override void Render(Graphics g) - { - foreach (KeyValuePair carData in EntryListTracker.Instance.Cars) - { - if (carData.Key == broadCastRealTime.FocusedCarIndex) - { - FieldInfo[] members = carData.Value.RealtimeCarUpdate.GetType().GetRuntimeFields().ToArray(); - foreach (FieldInfo member in members) - { - var value = member.GetValue(carData.Value.RealtimeCarUpdate); - value = ReflectionUtil.FieldTypeValue(member, value); - - if (value != null) - _table.AddRow($"{member.Name.Replace("<", "").Replace(">k__BackingField", "")}", new string[] { value.ToString() }); - } - - _table.Draw(g); - } - } - } - - public sealed override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayBroadcastTrackData/BroadcastTrackDataOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayBroadcastTrackData/BroadcastTrackDataOverlay.cs deleted file mode 100644 index 489913506..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayBroadcastTrackData/BroadcastTrackDataOverlay.cs +++ /dev/null @@ -1,77 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.Util; -using System.Drawing; -using System.Linq; -using System.Reflection; -using static RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.DebugInfoHelper; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayBroadcastRealtime -{ - - [Overlay(Name = "Broadcast Track Data", Version = 1.00, OverlayType = OverlayType.Debug, - Description = "A panel showing live broadcast track data.")] - internal sealed class BroadcastTrackDataOverlay : AbstractOverlay - { - private readonly DebugConfig _config = new DebugConfig(); - private InfoTable _table; - - public BroadcastTrackDataOverlay(Rectangle rectangle) : base(rectangle, "Broadcast Track Data") - { - this.AllowReposition = false; - this.RefreshRateHz = 5; - this.Width = 300; - this.Height = 80; - - _table = new InfoTable(9, new int[] { 200 }); - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - } - - public sealed override void Render(Graphics g) - { - FieldInfo[] members = broadCastTrackData.GetType().GetRuntimeFields().ToArray(); - foreach (FieldInfo member in members) - { - var value = member.GetValue(broadCastTrackData); - value = ReflectionUtil.FieldTypeValue(member, value); - - if (value != null) - _table.AddRow($"{member.Name.Replace("<", "").Replace(">k__BackingField", "")}", new string[] { value.ToString() }); - } - - _table.Draw(g); - } - - public sealed override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayDebugOutput/DebugOutputOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayDebugOutput/DebugOutputOverlay.cs deleted file mode 100644 index b9337911e..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayDebugOutput/DebugOutputOverlay.cs +++ /dev/null @@ -1,108 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Drawing; -using System.Linq; -using static RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayDebugOutput.TraceOutputListener; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayDebugOutput -{ - [Overlay(Name = "Debug Output", Version = 1.00, OverlayType = OverlayType.Debug, - Description = "A panel showing live debug output.")] - internal sealed class DebugOutputOverlay : AbstractOverlay - { - private readonly DebugOutputConfiguration _config = new DebugOutputConfiguration(); - private class DebugOutputConfiguration : OverlayConfiguration - { - [ConfigGrouping("Output", "Provides settings for overlay docking.")] - public OutputGrouping Output { get; set; } = new OutputGrouping(); - public class OutputGrouping - { - [ToolTip("The amount of lines displayed.")] - [IntRange(5, 50, 1)] - public int VisibleLines { get; set; } = 10; - - [ToolTip("Sets the width, allows you to see more.")] - [IntRange(400, 1000, 1)] - public int Width { get; set; } = 680; - } - - [ConfigGrouping("Dock", "Provides settings for overlay docking.")] - public DockConfigGrouping Dock { get; set; } = new DockConfigGrouping(); - public class DockConfigGrouping - { - [ToolTip("Allows you to reposition this debug panel.")] - public bool Undock { get; set; } = false; - } - - public DebugOutputConfiguration() - { - this.AllowRescale = true; - } - } - - private readonly Font _font; - private InfoTable _table; - - public DebugOutputOverlay(Rectangle rectangle) : base(rectangle, "Debug Output") - { - this.AllowReposition = false; - this.RefreshRateHz = 1; - - int fontSize = 9; - _font = FontUtil.FontOrbitron(fontSize); - _table = new InfoTable(fontSize, new int[] { _config.Output.Width - 66 }); - RefreshRateHz = 5; - this.Width = _config.Output.Width + 1; - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - - this.Height = (int)((_font.Height - 2) * _config.Output.VisibleLines) + 1; - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - } - - public sealed override void Render(Graphics g) - { - lock (TraceOutputListener.Instance.Outputs) - foreach (MessageOut output in TraceOutputListener.Instance.Outputs.Take(_config.Output.VisibleLines)) - { - DateTime time = DateTime.FromFileTime(output.time); - _table.AddRow($"{time:HH\\:mm\\:ss}", new string[] { output.message }); - } - - _table.Draw(g); - } - - public sealed override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayDebugOutput/TraceOutputListener.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayDebugOutput/TraceOutputListener.cs deleted file mode 100644 index f75c82ddf..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayDebugOutput/TraceOutputListener.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Threading; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayDebugOutput -{ - public class TraceOutputListener - { - public struct MessageOut - { - public long time; - public string message; - } - - - private Stream _outputStream; - private TextWriterTraceListener _traceListener; - private long lastPosition = -1; - - private LinkedList _outputs = new LinkedList(); - public LinkedList Outputs { get { lock (_outputs) return _outputs; } } - - private static TraceOutputListener _instance; - public static TraceOutputListener Instance - { - get - { - if (_instance == null) _instance = new TraceOutputListener(); return _instance; - } - } - - private bool _isRunning; - - public TraceOutputListener() - { - _outputStream = new MemoryStream(); - _traceListener = new TextWriterTraceListener(new StreamWriter(_outputStream)); - - Trace.Listeners.Add(_traceListener); - Debug.AutoFlush = true; - - Start(); - } - - public void Start() - { - _isRunning = true; - new Thread(x => - { - while (_isRunning) - { - Thread.Sleep(100); - - StreamReader reader = new StreamReader(_outputStream); - - if (lastPosition == -1) - lastPosition = 0; - else - _outputStream.Position = lastPosition; - - while (!reader.EndOfStream) - { - lock (_outputs) - { - if (_outputs.Count >= 100) - _outputs.RemoveLast(); - _outputs.AddFirst(new MessageOut() { message = reader.ReadLine(), time = DateTime.Now.ToFileTime() }); - } - } - - lastPosition = _outputStream.Position; - } - }).Start(); - } - - public void Stop() - { - _isRunning = false; - _traceListener.Flush(); - Trace.Listeners.Remove(_traceListener); - _outputStream.Close(); - - Debug.AutoFlush = false; - _outputStream.Position = 0; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayEntryList/EntryListOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayEntryList/EntryListOverlay.cs deleted file mode 100644 index e60539059..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayEntryList/EntryListOverlay.cs +++ /dev/null @@ -1,395 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Broadcast; -using RaceElement.Broadcast.Structs; -using RaceElement.Data; -using RaceElement.Data.ACC.EntryList; -using RaceElement.Data.ACC.EntryList.TrackPositionGraph; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using static RaceElement.Data.ACC.EntryList.EntryListTracker; -using static RaceElement.Data.SetupConverter; -using static RaceElement.HUD.Overlay.OverlayUtil.InfoTable; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayEntryList -{ -#if DEBUG - [Overlay(Name = "Entrylist Overlay", Version = 1.00, OverlayType = OverlayType.Debug, -Description = "A panel showing live broadcast track data.")] -#endif - internal sealed class EntryListOverlay : AbstractOverlay - { - private readonly EntryListDebugConfig _config = new EntryListDebugConfig(); - private class EntryListDebugConfig : OverlayConfiguration - { - [ConfigGrouping("EntryList", "Provides settings for overlay docking.")] - public EntryListGrouping Entrylist { get; set; } = new EntryListGrouping(); - public class EntryListGrouping - { - [ToolTip("Show extended data, adds a new row for each car.")] - public bool ExtendedData { get; set; } = false; - } - - [ConfigGrouping("Dock", "Provides settings for overlay docking.")] - public DockConfigGrouping Dock { get; set; } = new DockConfigGrouping(); - public class DockConfigGrouping - { - [ToolTip("Allows you to reposition this debug panel.")] - public bool Undock { get; set; } = false; - } - - public EntryListDebugConfig() - { - AllowRescale = true; - } - } - - private readonly InfoTable _table; - - private readonly Color Gt3Color = Color.FromArgb(255, Color.Black); - private readonly Color Gt4Color = Color.FromArgb(255, 24, 24, 72); - private readonly Color CupColor = Color.FromArgb(255, 30, 61, 26); - private readonly Color TcxColor = Color.FromArgb(255, 0, 96, 136); - private readonly Color StColor = Color.FromArgb(255, 0, 96, 136); - private readonly Color ChlColor = Color.FromArgb(255, 112, 110, 0); - - - - public EntryListOverlay(Rectangle rect) : base(rect, "Entrylist Overlay") - { - this.AllowReposition = false; - this.RefreshRateHz = 10; - - float fontSize = 9; - var font = FontUtil.FontUnispace(fontSize); - _table = new InfoTable(fontSize, new int[] { (int)(font.Size * 13), (int)(font.Size * 13), (int)(font.Size * 8), (int)(font.Size * 8) }); - - this.Width = 415; - this.Height = 800; - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - - } - - public sealed override void Render(Graphics g) - { - List> cars = EntryListTracker.Instance.Cars; - - if (cars.Count == 0) - return; - - SortEntryList(cars); - - CarData firstCar = GetFirstPositionCar(); - Car carAhead = null; - - if (firstCar.CarInfo != null) - carAhead = PositionGraph.Instance.GetCar(firstCar.CarInfo.CarIndex); - - - foreach (KeyValuePair kv in cars) - { - if (kv.Value.CarInfo != null) - { - AddCarFirstRow(kv); - - if (_config.Entrylist.ExtendedData) - { - string speed = $"{kv.Value.RealtimeCarUpdate.Kmh} km/h".FillStart(8, ' '); - - string distanceText = string.Empty; - - if (carAhead != null) - { - Car carCar = PositionGraph.Instance.GetCar(kv.Value.CarInfo.CarIndex); - if (carCar != null && carCar != carAhead) - { - - float carAheadDistance = 0; - if (carAhead != null) carAheadDistance = carAhead.LapIndex * broadCastTrackData.TrackMeters + broadCastTrackData.TrackMeters * carAhead.SplinePosition; - float carDistance = carCar.LapIndex * broadCastTrackData.TrackMeters + carCar.SplinePosition * broadCastTrackData.TrackMeters; - - if (carAheadDistance - carDistance < broadCastTrackData.TrackMeters) - { - distanceText = $"+{carAheadDistance - carDistance:F0}".FillStart(4, ' ') + "m"; - } - else - { - distanceText = $"+{carAhead.LapIndex - carCar.LapIndex} laps"; - } - } - - carAhead = carCar; - } - - _table.AddRow(String.Empty, new string[] { String.Empty, $"{distanceText}", speed }); - } - } - } - - _table._headerWidthSet = false; - - _table.Draw(g); - } - - private void AddCarFirstRow(KeyValuePair kv) - { - string[] firstRow = new string[] { String.Empty, String.Empty, String.Empty, String.Empty }; - Color[] firstRowColors = new Color[] { Color.White, Color.White, Color.White, Color.White }; - - DriverInfo currentDriver = kv.Value.CarInfo.Drivers[kv.Value.CarInfo.CurrentDriverIndex]; - string firstName = currentDriver.FirstName; - if (firstName.Length > 0) firstName = firstName.First() + ""; - firstRow[0] = $"{firstName}. {currentDriver.LastName}"; - - firstRow[1] = $"{kv.Value.CarInfo.RaceNumber}"; - - int bestSessionLapMS = -1; - if (broadCastRealTime.BestSessionLap != null) - bestSessionLapMS = broadCastRealTime.BestSessionLap.LaptimeMS.GetValueOrDefault(-1); - switch (broadCastRealTime.SessionType) - { - case RaceSessionType.Race: - { - if (kv.Value.RealtimeCarUpdate.LastLap != null) - if (kv.Value.RealtimeCarUpdate.LastLap.LaptimeMS.HasValue) - { - if (broadCastRealTime.BestSessionLap != null) - if (kv.Value.RealtimeCarUpdate.LastLap.LaptimeMS == bestSessionLapMS) - firstRowColors[2] = Color.FromArgb(255, 207, 97, 255); - - TimeSpan fastestLapTime = TimeSpan.FromMilliseconds(kv.Value.RealtimeCarUpdate.LastLap.LaptimeMS.Value); - firstRow[2] = $"{fastestLapTime:mm\\:ss\\.fff}"; - } - else - firstRow[2] = $"--:--.---"; - break; - } - - case RaceSessionType.Practice: - case RaceSessionType.Qualifying: - { - if (kv.Value.RealtimeCarUpdate.BestSessionLap != null) - if (kv.Value.RealtimeCarUpdate.BestSessionLap.LaptimeMS.HasValue) - { - if (broadCastRealTime.BestSessionLap != null) - if (kv.Value.RealtimeCarUpdate.LastLap.LaptimeMS == bestSessionLapMS) - firstRowColors[2] = Color.FromArgb(255, 207, 97, 255); - - TimeSpan fastestLapTime = TimeSpan.FromMilliseconds(kv.Value.RealtimeCarUpdate.BestSessionLap.LaptimeMS.Value); - firstRow[2] = $"{fastestLapTime:mm\\:ss\\.fff}"; - } - else - firstRow[2] = $"--:--.---"; - break; - } - default: break; - } - - switch (kv.Value.RealtimeCarUpdate.CarLocation) - { - case CarLocationEnum.PitEntry: - { - firstRow[3] += " (PI)"; - break; - } - case CarLocationEnum.PitExit: - { - firstRow[3] += " (PE)"; - break; - } - case CarLocationEnum.Pitlane: - { - firstRow[3] += " (P)"; - break; - } - - case CarLocationEnum.Track: - { - firstRow[3] = $"{kv.Value.RealtimeCarUpdate.Delta / 1000f:F2}".FillStart(6, ' '); - firstRowColors[3] = kv.Value.RealtimeCarUpdate.Delta > 0 ? Color.OrangeRed : Color.LimeGreen; - break; - } - default: break; - } - - var carModel = ConversionFactory.GetCarModels(kv.Value.CarInfo.CarModelType); - var carClass = ConversionFactory.GetConversion(carModel).CarClass; - - Color headerBackgroundColor = Color.FromArgb(90, Color.Black); - switch (carClass) - { - case CarClasses.GT3: - headerBackgroundColor = Gt3Color; - break; - case CarClasses.GT4: - headerBackgroundColor = Gt4Color; - break; - case CarClasses.CUP: - headerBackgroundColor = CupColor; - break; - case CarClasses.ST: - headerBackgroundColor = StColor; - break; - case CarClasses.TCX: - headerBackgroundColor = TcxColor; - break; - case CarClasses.CHL: - headerBackgroundColor = ChlColor; - break; - default: - break; - - } - - string cupPosition = $"{kv.Value.RealtimeCarUpdate.CupPosition}"; - TableRow row = new TableRow() - { - Header = $" {cupPosition}", - Columns = firstRow, - ColumnColors = firstRowColors, - HeaderBackground = headerBackgroundColor - }; - - if (kv.Key == pageGraphics.PlayerCarID) - row.HeaderBackground = Color.FromArgb(120, Color.Red); - else - if (kv.Key == broadCastRealTime.FocusedCarIndex) row.HeaderBackground = Color.FromArgb(90, Color.Red); - - _table.AddRow(row); - } - - private void SortEntryList(List> cars) - { - - switch (broadCastRealTime.SessionType) - { - case RaceSessionType.Practice: - case RaceSessionType.Race: - { - switch (broadCastRealTime.Phase) - { - case SessionPhase.SessionOver: - case SessionPhase.PreSession: - case SessionPhase.PreFormation: - { - cars.Sort((a, b) => - { - return a.Value.RealtimeCarUpdate.CupPosition.CompareTo(b.Value.RealtimeCarUpdate.CupPosition); - }); - break; - } - default: - { - cars.Sort((a, b) => - { - if (a.Value.CarInfo == null) - return -1; - - if (b.Value.CarInfo == null) - return 1; - - Car carCarA = PositionGraph.Instance.GetCar(a.Value.CarInfo.CarIndex); - Car carCarb = PositionGraph.Instance.GetCar(b.Value.CarInfo.CarIndex); - - if (carCarA == null) return -1; - if (carCarb == null) return 1; - - var aSpline = carCarA.SplinePosition; - var bSpline = carCarb.SplinePosition; - - var aLaps = carCarA.LapIndex; - var bLaps = carCarb.LapIndex; - - float aPosition = aLaps + aSpline / 10; - float bPosition = bLaps + bSpline / 10; - return aPosition.CompareTo(bPosition); - }); - cars.Reverse(); - break; - }; - } - break; - } - - - case RaceSessionType.Qualifying: - { - cars.Sort((a, b) => - { - return a.Value.RealtimeCarUpdate.CupPosition.CompareTo(b.Value.RealtimeCarUpdate.CupPosition); - }); - break; - } - - default: break; - } - } - - public CarData GetFirstPositionCar() - { - List> cars = EntryListTracker.Instance.Cars; - cars.Sort((a, b) => - { - if (a.Value.CarInfo == null) - return -1; - - if (b.Value.CarInfo == null) - return -1; - - var aSpline = PositionGraph.Instance.GetCar(a.Value.CarInfo.CarIndex)?.SplinePosition; - var bSpline = PositionGraph.Instance.GetCar(b.Value.CarInfo.CarIndex)?.SplinePosition; - - var aLaps = PositionGraph.Instance.GetCar(a.Value.CarInfo.CarIndex)?.LapIndex; - var bLaps = PositionGraph.Instance.GetCar(b.Value.CarInfo.CarIndex)?.LapIndex; - - float aPosition = aLaps.GetValueOrDefault(0) * 10 + aSpline.GetValueOrDefault(0); - float bPosition = bLaps.GetValueOrDefault(0) * 10 + bSpline.GetValueOrDefault(0); - return aPosition.CompareTo(bPosition); - }); - cars.Reverse(); - - - return cars.First().Value; - - - } - - public sealed override bool ShouldRender() - { - return true; - } - - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayFocusedCar/FocusedCarOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayFocusedCar/FocusedCarOverlay.cs deleted file mode 100644 index b2331dad5..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayFocusedCar/FocusedCarOverlay.cs +++ /dev/null @@ -1,135 +0,0 @@ -using RaceElement.Data.ACC.EntryList; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Linq; -using static RaceElement.Data.ACC.EntryList.EntryListTracker; - -namespace RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayFocusedCar -{ - [Overlay(Name = "Focused Car", Description = "Shows information regarding the focused car", - OverlayType = OverlayType.Debug, Version = 1.00)] - internal class FocusedCarOverlay : AbstractOverlay - { - private FocusedCarConfig _config = new FocusedCarConfig(); - private class FocusedCarConfig : OverlayConfiguration - { - public FocusedCarConfig() - { - this.AllowRescale = true; - } - } - - public FocusedCarOverlay(Rectangle rectangle) : base(rectangle, "Focused Car") - { - this.Width = 600; - this.Height = 600; - this.RefreshRateHz = 10; - } - - public override void BeforeStart() - { - } - - public override void BeforeStop() - { - } - - private float minX = float.MaxValue, maxX = float.MinValue; - private float minY = float.MaxValue, maxY = float.MinValue; - - private LinkedList _trajectory = new LinkedList(); - private int lastFocused = -1; - - public override void Render(Graphics g) - { - - foreach (KeyValuePair carData in EntryListTracker.Instance.Cars) - { - if (carData.Key == broadCastRealTime.FocusedCarIndex) - { - if (lastFocused != carData.Key) - { - _trajectory.Clear(); - lastFocused = carData.Key; - minX = float.MaxValue; maxX = float.MinValue; - minY = float.MaxValue; maxY = float.MinValue; - } - - int arrayIndex = -1; - for (int i = 0; i < pageGraphics.CarIds.Length; i++) - { - if (pageGraphics.CarIds[i] == lastFocused) - { - arrayIndex = i; - break; - } - } - - if (arrayIndex != -1) - { - float x = pageGraphics.CarCoordinates[arrayIndex].X; - float y = pageGraphics.CarCoordinates[arrayIndex].Z; - - // x, y > min = left, top - - if (x > maxX) - maxX = x; - if (x < minX) - minX = x; - - if (y > maxY) - maxY = y; - if (y < minY) - minY = y; - - _trajectory.AddLast(new PointF(x, y)); - } - } - } - - if (_trajectory.Count > 0) - { - float maxSize = 0; - if (minX * -1 > maxSize) - maxSize = minX * -1; - if (maxX > maxSize) - maxSize = maxX; - if (minY * -1 > maxSize) - maxSize = minY * -1; - if (maxY > maxSize) - maxSize = maxY; - - maxSize *= 1.05f; - - int halfWidth = (int)(this.Width / 2 / this.Scale); - int halfHeight = (int)(this.Height / 2 / this.Scale); - - var traj = _trajectory.Select(x => - { - x.X /= maxSize; - x.Y /= maxSize; - return new PointF(halfWidth + x.X * halfWidth, halfHeight + x.Y * halfHeight); - }).ToArray(); - GraphicsPath path = new GraphicsPath(FillMode.Winding); - path.AddLines(traj); - - Matrix transformMatrix = new Matrix(); - transformMatrix.RotateAt(-90, new PointF(halfWidth, halfHeight)); - path.Transform(transformMatrix); - - Pen pen = new Pen(Color.OrangeRed, 2f); - g.SmoothingMode = SmoothingMode.AntiAlias; - g.DrawPath(pen, path); - - } - } - - public override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayGraphicsInfo/GraphicsInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayGraphicsInfo/GraphicsInfoOverlay.cs deleted file mode 100644 index 943cc94c3..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayGraphicsInfo/GraphicsInfoOverlay.cs +++ /dev/null @@ -1,84 +0,0 @@ -using RaceElement.HUD.ACC.Overlays.OverlayDebugInfo; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.Util; -using System; -using System.Drawing; -using System.Reflection; -using static RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.DebugInfoHelper; - -namespace RaceElement.HUD.ACC.Overlays.OverlayGraphicsInfo -{ - [Overlay(Name = "Graphics Info", Version = 1.00, - Description = "Shared Memory Graphics Page", OverlayType = OverlayType.Debug)] - internal sealed class GraphicsInfoOverlay : AbstractOverlay - { - private readonly DebugConfig _config = new DebugConfig(); - private readonly InfoTable _table; - - public GraphicsInfoOverlay(Rectangle rectangle) : base(rectangle, "Graphics Info") - { - this.AllowReposition = false; - this.RefreshRateHz = 5; - this.Width = 275; - this.Height = 1105; - - _table = new InfoTable(9, new int[] { 250 }); - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - } - - public sealed override void Render(Graphics g) - { - FieldInfo[] members = pageGraphics.GetType().GetFields(); - foreach (FieldInfo member in members) - { - var value = member.GetValue(pageGraphics); - bool isObsolete = false; - foreach (CustomAttributeData cad in member.CustomAttributes) - { - if (cad.AttributeType == typeof(ObsoleteAttribute)) { isObsolete = true; break; } - } - - if (!isObsolete && !member.Name.Equals("Buffer") && !member.Name.Equals("Size")) - { - value = ReflectionUtil.FieldTypeValue(member, value); - _table.AddRow($"{member.Name}", new string[] { value.ToString() }); - } - } - - _table.Draw(g); - } - - public sealed override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayPhysicsInfo/PhysicsInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayPhysicsInfo/PhysicsInfoOverlay.cs deleted file mode 100644 index 12fe803fa..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayPhysicsInfo/PhysicsInfoOverlay.cs +++ /dev/null @@ -1,85 +0,0 @@ -using RaceElement.HUD.ACC.Overlays.OverlayDebugInfo; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.Util; -using System; -using System.Drawing; -using System.Reflection; -using static RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.DebugInfoHelper; - -namespace RaceElement.HUD.ACC.Overlays.OverlayPhysicsInfo -{ - - [Overlay(Name = "Physics Info", Version = 1.00, - Description = "Shared Memory Physics Page", OverlayType = OverlayType.Debug)] - internal sealed class PhysicsInfoOverlay : AbstractOverlay - { - private readonly DebugConfig _config = new DebugConfig(); - private readonly InfoTable _table; - - public PhysicsInfoOverlay(Rectangle rectangle) : base(rectangle, "Physics Info") - { - this.AllowReposition = false; - this.RefreshRateHz = 5; - this.Width = 600; - this.Height = 700; - - _table = new InfoTable(9, new int[] { 450 }); - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - } - - public sealed override void Render(Graphics g) - { - FieldInfo[] members = pagePhysics.GetType().GetFields(); - foreach (FieldInfo member in members) - { - var value = member.GetValue(pagePhysics); - bool isObsolete = false; - foreach (CustomAttributeData cad in member.CustomAttributes) - { - if (cad.AttributeType == typeof(ObsoleteAttribute)) { isObsolete = true; break; } - } - - if (!isObsolete && !member.Name.Equals("Buffer") && !member.Name.Equals("Size")) - { - value = ReflectionUtil.FieldTypeValue(member, value); - _table.AddRow($"{member.Name}", new string[] { value.ToString() }); - } - } - - _table.Draw(g); - } - - public sealed override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayStaticInfo/StaticInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayStaticInfo/StaticInfoOverlay.cs deleted file mode 100644 index dcab0191a..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayDebugInfo/OverlayStaticInfo/StaticInfoOverlay.cs +++ /dev/null @@ -1,84 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using RaceElement.Util; -using System; -using System.Drawing; -using System.Reflection; -using RaceElement.HUD.ACC.Overlays.OverlayDebugInfo; -using static RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.DebugInfoHelper; -using RaceElement.HUD.Overlay.OverlayUtil; - -namespace RaceElement.HUD.ACC.Overlays.OverlayStaticInfo -{ - [Overlay(Name = "Static Info", Version = 1.00, - Description = "Shared Memory Static Page", OverlayType = OverlayType.Debug)] - internal sealed class StaticInfoOverlay : AbstractOverlay - { - private readonly DebugConfig _config = new DebugConfig(); - private readonly InfoTable _table; - - public StaticInfoOverlay(Rectangle rectangle) : base(rectangle, "Static Info") - { - this.AllowReposition = false; - this.RefreshRateHz = 5; - this.Width = 340; - this.Height = 325; - - _table = new InfoTable(9, new int[] { 185 }); - } - - private void Instance_WidthChanged(object sender, bool e) - { - if (e) - this.X = DebugInfoHelper.Instance.GetX(this); - } - - public sealed override void BeforeStart() - { - if (this._config.Dock.Undock) - this.AllowReposition = true; - else - { - DebugInfoHelper.Instance.WidthChanged += Instance_WidthChanged; - DebugInfoHelper.Instance.AddOverlay(this); - this.X = DebugInfoHelper.Instance.GetX(this); - this.Y = 0; - } - } - - public sealed override void BeforeStop() - { - if (!this._config.Dock.Undock) - { - DebugInfoHelper.Instance.RemoveOverlay(this); - DebugInfoHelper.Instance.WidthChanged -= Instance_WidthChanged; - } - } - - public sealed override void Render(Graphics g) - { - FieldInfo[] members = pageStatic.GetType().GetFields(); - foreach (FieldInfo member in members) - { - var value = member.GetValue(pageStatic); - bool isObsolete = false; - foreach (CustomAttributeData cad in member.CustomAttributes) - { - if (cad.AttributeType == typeof(ObsoleteAttribute)) { isObsolete = true; break; } - } - - if (!isObsolete && !member.Name.Equals("Buffer") && !member.Name.Equals("Size")) - { - value = ReflectionUtil.FieldTypeValue(member, value); - _table.AddRow($"{member.Name}", new string[] { value.ToString() }); - } - } - - _table.Draw(g); - } - - public sealed override bool ShouldRender() - { - return true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayEcuMapInfo/EcuMapOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayEcuMapInfo/EcuMapOverlay.cs deleted file mode 100644 index 6657765b2..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayEcuMapInfo/EcuMapOverlay.cs +++ /dev/null @@ -1,78 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlayEcuMapInfo -{ - [Overlay(Name = "ECU Maps", Version = 1.00, OverlayType = OverlayType.Release, - Description = "A panel showing information about the current ECU Map.")] - internal sealed class EcuMapOverlay : AbstractOverlay - { - private const int PanelWidth = 270; - private readonly InfoPanel _panel = new InfoPanel(10, PanelWidth); - - private EcuMapConfiguration _config = new EcuMapConfiguration(); - private class EcuMapConfiguration : OverlayConfiguration - { - [ConfigGrouping("Info Panel", "Show or hide additional information in the panel.")] - public InfoPanelGrouping InfoPanel { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - [ToolTip("Displays the number of the ecu map.")] - public bool MapNumber { get; set; } = true; - } - - public EcuMapConfiguration() - { - this.AllowRescale = true; - } - } - - public EcuMapOverlay(Rectangle rectangle) : base(rectangle, "ECU Maps") - { - this.RefreshRateHz = 3; - - this.Width = PanelWidth + 1; - this.Height = _panel.FontHeight * 5 + 1; - } - - public sealed override void BeforeStart() - { - if (!this._config.InfoPanel.MapNumber) - { - this.Height -= _panel.FontHeight; - } - } - public sealed override void BeforeStop() { } - - public sealed override void Render(Graphics g) - { - EcuMap current = EcuMaps.GetMap(pageStatic.CarModel, pageGraphics.EngineMap); - - if (current != null) - { - if (this._config.InfoPanel.MapNumber) - _panel.AddLine("Map", $"{current.Index}"); - _panel.AddLine("Power", $"{current.Power}"); - _panel.AddLine("Condition", $"{current.Conditon}"); - _panel.AddLine("Fuel", $"{current.FuelConsumption}"); - _panel.AddLine("Throttle", $"{current.ThrottleMap}"); - } - else - { - _panel.AddLine("Car", "Not supported"); - _panel.AddLine("Model", pageStatic.CarModel); - _panel.AddLine("Condition", ""); - _panel.AddLine("Map", $"{pageGraphics.EngineMap + 1}"); - } - - _panel.Draw(g); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayEcuMapInfo/EcuMaps.cs b/Race_Element.HUD.ACC/Overlays/OverlayEcuMapInfo/EcuMaps.cs deleted file mode 100644 index d2e69c264..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayEcuMapInfo/EcuMaps.cs +++ /dev/null @@ -1,269 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.ConversionFactory.CarModels; - -namespace RaceElement.HUD.ACC.Overlays.OverlayEcuMapInfo -{ - internal class EcuMaps - { - // Data from: - // - https://www.acc-wiki.info/wiki/ECU_Maps - // - https://www.assettocorsa.net/forum/index.php?threads/ecu-maps-implementation.54472/ - public static Dictionary maps = new Dictionary - { - { new CarModels[]{ Aston_Martin_V8_Vantage_GT3_2019, Aston_Martin_Vantage_V12_GT3_2013 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Slightly progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "More progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ Audi_R8_LMS_2015, Audi_R8_LMS_Evo_2019, Audi_R8_LMS_Evo_II_2022}, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Slightly progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Different wet", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Different wet", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ Bentley_Continental_GT3_2015, Bentley_Continental_GT3_2018 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Slightly wet", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Progressive wet", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Different wet", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ BMW_M4_GT3_2021, BMW_M6_GT3_2017 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Reserved engineers", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Least progressive", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 6, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - } - }, - { new CarModels[]{ Ferrari_488_GT3_2018 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Moderate aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 5, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 9, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 10, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 11, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 12, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ Ferrari_488_GT3_Evo_2020 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Extreme aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Quite aggressive", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Moderate aggressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Almost linear", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 9, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 10, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 11, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 12, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ Honda_NSX_GT3_2017, Honda_NSX_GT3_Evo_2019 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Very aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Wet, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Wet, ThrottleMap = "More progressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ Lamborghini_Gallardo_G3_Reiter_2017 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - } - }, - { new CarModels[]{ Lamborghini_Huracan_GT3_2015, Lamborghini_Huracan_GT3_Evo_2019 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Different", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Different", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Same as map 3", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Slightly wet", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Different wet", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Different wet", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ Emil_Frey_Jaguar_G3_2021 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 4, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Low }, - } - }, - { new CarModels[]{ Nissan_GT_R_Nismo_GT3_2015, Nissan_GT_R_Nismo_GT3_2018 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ Lexus_RCF_GT3_2016 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Gradual", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[]{ McLaren_650S_GT3_2015 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 9, Power = PowerDelivery.Low, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Very Low", FuelConsumption = FuelConsumptions.Low }, - } - }, - { new CarModels[]{ McLaren_720S_GT3_2019 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 3, Power = PowerDelivery.High, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Lowest }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Cool down", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Damp, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 9, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Damp, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 10, Power = PowerDelivery.High, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.High }, - new EcuMap(){ Index = 11, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 12, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Wet", FuelConsumption = FuelConsumptions.Medium }, - } - }, - { new CarModels[]{ Mercedes_AMG_GT3_2015, Mercedes_AMG_GT3_Evo_2020 }, - new EcuMap[]{ - new EcuMap(){ Index = 1, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.PaceCar, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Lowest }, - } - }, - { new CarModels[] { Porsche_911_GT3_R_2018, Porsche_911_II_GT3_R_2019 }, - new EcuMap[] { - new EcuMap(){ Index = 1, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Least progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 2, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 3, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 4, Power = PowerDelivery.Medium, Conditon = EcuMapConditions.Wet, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Medium }, - new EcuMap(){ Index = 5, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Least progressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 6, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 7, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Aggressive", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 8, Power = PowerDelivery.Highest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Linear", FuelConsumption = FuelConsumptions.Highest }, - new EcuMap(){ Index = 9, Power = PowerDelivery.Low, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Low }, - new EcuMap(){ Index = 10, Power = PowerDelivery.Lowest, Conditon = EcuMapConditions.Dry, ThrottleMap = "Progressive", FuelConsumption = FuelConsumptions.Lowest } - } - } - }; - - public static EcuMap GetMap(string modelName, int map) - { - if (modelName.Length == 0) - { - return null; - } - - CarModels carModel = ParseNames[modelName]; - - EcuMap[] carMaps = null; - foreach (KeyValuePair maps in EcuMaps.maps.ToList()) - { - foreach (CarModels mapModel in maps.Key) - { - if (carModel == mapModel) - { - carMaps = maps.Value; - break; - } - } - if (carMaps != null) break; - } - if (carMaps == null) return null; - return carMaps[map]; - } - } - - public class EcuMap - { - public int Index; - public PowerDelivery Power; - public string ThrottleMap; - public FuelConsumptions FuelConsumption; - public EcuMapConditions Conditon; - - } - - public enum PowerDelivery - { - Lowest, - Low, - Medium, - High, - Highest, - } - - public enum FuelConsumptions - { - Lowest, - Low, - Medium, - High, - Highest - } - - public enum EcuMapConditions - { - Dry, - Damp, - Wet, - PaceCar, - LowPower - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayFuelInfo/FuelInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayFuelInfo/FuelInfoOverlay.cs deleted file mode 100644 index 9798c4ee5..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayFuelInfo/FuelInfoOverlay.cs +++ /dev/null @@ -1,124 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlayFuelInfo -{ - [Overlay(Name = "Fuel Info", Version = 1.00, OverlayType = OverlayType.Release, - Description = "A panel showing information about the fuel: laps left, fuel to end of race. Optionally showing stint information.")] - internal sealed class FuelInfoOverlay : AbstractOverlay - { - private readonly InfoPanel _infoPanel; - - private readonly FuelInfoConfig _config = new FuelInfoConfig(); - private class FuelInfoConfig : OverlayConfiguration - { - [ConfigGrouping("Info Panel", "Show or hide additional information in the panel.")] - public InfoPanelGrouping InfoPanel { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - [ToolTip("Sets the number of additional laps as a fuel buffer.")] - [IntRange(0, 3, 1)] - public int FuelBufferLaps { get; set; } = 0; - - [ToolTip("Displays Fuel time remaining which is green if it's higher than stint time or session time and red if it is not.")] - public bool FuelTime { get; set; } = true; - - [ToolTip("Displays stint time remaining and the suggested amount of fuel to the end of the stint or the session.")] - public bool StintInfo { get; set; } = true; - } - - public FuelInfoConfig() - { - this.AllowRescale = true; - } - } - - public FuelInfoOverlay(Rectangle rectangle) : base(rectangle, "Fuel Info") - { - this.Width = 222; - _infoPanel = new InfoPanel(10, this.Width - 1) { FirstRowLine = 1 }; - this.Height = this._infoPanel.FontHeight * 6 + 1; - RefreshRateHz = 2; - } - - public sealed override void BeforeStart() - { - if (!_config.InfoPanel.StintInfo) - this.Height -= _infoPanel.FontHeight * 2; - - if (!_config.InfoPanel.FuelTime) - this.Height -= _infoPanel.FontHeight; - } - - public sealed override void BeforeStop() { } - - public sealed override void Render(Graphics g) - { - // Some global variants - double lapBufferVar = pageGraphics.FuelXLap * this._config.InfoPanel.FuelBufferLaps; - double bestLapTime = pageGraphics.BestTimeMs; bestLapTime.ClipMax(180000); - double fuelTimeLeft = pageGraphics.FuelEstimatedLaps * bestLapTime; - double stintDebug = pageGraphics.DriverStintTimeLeft; stintDebug.ClipMin(-1); - //********************** - // Workings - double stintFuel = pageGraphics.DriverStintTimeLeft / bestLapTime * pageGraphics.FuelXLap + pageGraphics.UsedFuelSinceRefuel; - double fuelToEnd = pageGraphics.SessionTimeLeft / bestLapTime * pageGraphics.FuelXLap; - double fuelToAdd = FuelToAdd(lapBufferVar, stintDebug, stintFuel, fuelToEnd); - string fuelTime = $"{TimeSpan.FromMilliseconds(fuelTimeLeft):hh\\:mm\\:ss}"; - string stintTime = $"{TimeSpan.FromMilliseconds(stintDebug):hh\\:mm\\:ss}"; - //********************** - Brush fuelBarBrush = pagePhysics.Fuel / pageStatic.MaxFuel < 0.15 ? Brushes.Red : Brushes.OrangeRed; - Brush fuelTimeBrush = GetFuelTimeBrush(fuelTimeLeft, stintDebug); - //Start (Basic) - _infoPanel.AddProgressBarWithCenteredText($"{pagePhysics.Fuel:F2} L", 0, pageStatic.MaxFuel, pagePhysics.Fuel, fuelBarBrush); - _infoPanel.AddLine("Laps Left", $"{pageGraphics.FuelEstimatedLaps:F1} @ {pageGraphics.FuelXLap:F2}L"); - _infoPanel.AddLine("Fuel-End", $"{fuelToEnd + lapBufferVar:F1} : Add {fuelToAdd:F0}"); - //End (Basic) - //Magic Start (Advanced) - if (this._config.InfoPanel.FuelTime) - _infoPanel.AddLine("Fuel Time", fuelTime, fuelTimeBrush); - - if (_config.InfoPanel.StintInfo) - { - _infoPanel.AddLine("Stint Time", stintTime); - - if (stintDebug == -1) - _infoPanel.AddLine("Stint Fuel", "No Stints"); - else - _infoPanel.AddLine("Stint Fuel", $"{stintFuel + lapBufferVar:F1}"); - } - //Magic End (Advanced) - _infoPanel.Draw(g); - } - - private double FuelToAdd(double lapBufferVar, double stintDebug, double stintFuel, double fuelToEnd) - { - double fuel; - if (stintDebug == -1) - fuel = Math.Min(Math.Ceiling(fuelToEnd - pagePhysics.Fuel), pageStatic.MaxFuel) + lapBufferVar; - else - fuel = Math.Min(stintFuel - pagePhysics.Fuel, pageStatic.MaxFuel) + lapBufferVar; - fuel.ClipMin(0); - return fuel; - } - - private Brush GetFuelTimeBrush(double fuelTimeLeft, double stintDebug) - { - Brush brush; - if (stintDebug > -1) - brush = fuelTimeLeft <= stintDebug ? Brushes.Red : Brushes.LimeGreen; - else - brush = fuelTimeLeft <= pageGraphics.SessionTimeLeft ? Brushes.Red : Brushes.LimeGreen; - return brush; - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} \ No newline at end of file diff --git a/Race_Element.HUD.ACC/Overlays/OverlayInputBars/InputBarsOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayInputBars/InputBarsOverlay.cs deleted file mode 100644 index 77d9c15bf..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayInputBars/InputBarsOverlay.cs +++ /dev/null @@ -1,260 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.OverlayUtil.ProgressBars; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Drawing2D; - -namespace RaceElement.HUD.ACC.Overlays.OverlayInputBars -{ - [Overlay(Name = "Input Bars", Version = 1.00, OverlayType = OverlayType.Release, - Description = "Live input bars of throttle and brake.")] - internal sealed class InputBarsOverlay : AbstractOverlay - { - private readonly InputBarsConfiguration _config = new InputBarsConfiguration(); - private class InputBarsConfiguration : OverlayConfiguration - { - [ConfigGrouping("Bars", "The shape and spacing of the bars")] - public BarsGrouping Bars { get; set; } = new BarsGrouping(); - public class BarsGrouping - { - [ToolTip("Enables horizontal input bars.")] - public bool Horizontal { get; set; } = false; - - [ToolTip("Length of the input bars.")] - [IntRange(100, 250, 1)] - public int Length { get; set; } = 200; - - [ToolTip("Changes the thickness of each input bar.")] - [IntRange(10, 45, 1)] - public int Thickness { get; set; } = 20; - - [ToolTip("Changes the spacing between the input bars")] - [IntRange(1, 150, 1)] - public int Spacing { get; set; } = 5; - - [ToolTip("Defines the transparency of the bars.")] - [ByteRange(40, 255, 1)] - public byte Transparency { get; set; } = 185; - - [ToolTip("Changes the order of the bars, throttle first and brake second (left to right and top to bottom).")] - internal bool ThrottleFirst { get; set; } - } - - [ConfigGrouping("Electronics", "Color changes for the bars when electronics kick in.")] - public ElectronicsGrouping Electronics { get; set; } = new ElectronicsGrouping(); - public class ElectronicsGrouping - { - [ToolTip("Displays a color change on the throttle bar when traction control is activated.")] - public bool TractionControl { get; set; } = true; - - [ToolTip("Displays a color change on the brake bar when ABS is activated.")] - public bool AntiLockBrakes { get; set; } = true; - } - - public InputBarsConfiguration() - { - AllowRescale = true; - } - } - - private CachedBitmap _cachedBackground; - - private HorizontalProgressBar[] _horizontalBars; - private HorizontalProgressBar _horizontalGasBar; - private HorizontalProgressBar _horizontalBrakeBar; - - private VerticalProgressBar[] _verticalBars; - private VerticalProgressBar _verticalGasBar; - private VerticalProgressBar _verticalBrakeBar; - - public InputBarsOverlay(Rectangle rectangle) : base(rectangle, "Input Bars") - { - if (_config.Bars.Horizontal) - { - _horizontalBars = new HorizontalProgressBar[2]; - this.Width = _config.Bars.Length + 1; - this.Height = _config.Bars.Thickness * 2 + _config.Bars.Spacing + 1; - } - else - { - _verticalBars = new VerticalProgressBar[2]; - this.Width = _config.Bars.Thickness * 2 + _config.Bars.Spacing + 1; - this.Height = _config.Bars.Length + 1; - } - } - - public override bool ShouldRender() => DefaultShouldRender(); - - public override void BeforeStart() - { - int width = _config.Bars.Thickness * 2 + _config.Bars.Spacing; - int height = _config.Bars.Length; - - if (_config.Bars.Horizontal) - { - width = _config.Bars.Length; - height = _config.Bars.Thickness * 2 + _config.Bars.Spacing; - } - - _cachedBackground = new CachedBitmap((int)(width * this.Scale), (int)(height * this.Scale), g => - { - if (_config.Bars.Horizontal) - { - using (LinearGradientBrush gradientBrush = new LinearGradientBrush(new Rectangle(0, 0, (int)(_config.Bars.Length * this.Scale), (int)(_config.Bars.Thickness * this.Scale)), Color.FromArgb(120, Color.Black), Color.FromArgb(230, Color.Black), LinearGradientMode.Horizontal)) - { - g.FillRoundedRectangle(gradientBrush, new Rectangle(0, 0, (int)(_config.Bars.Length * this.Scale), (int)(_config.Bars.Thickness * this.Scale)), (int)(5 * this.Scale)); - g.FillRoundedRectangle(gradientBrush, new Rectangle(0, (int)((_config.Bars.Thickness + _config.Bars.Spacing) * this.Scale), (int)(_config.Bars.Length * this.Scale), (int)(_config.Bars.Thickness * this.Scale)), (int)(5 * this.Scale)); - } - } - else - { - using (LinearGradientBrush gradientBrush = new LinearGradientBrush(new Rectangle(0, 0, (int)(_config.Bars.Thickness * this.Scale), (int)(height * this.Scale)), Color.FromArgb(230, Color.Black), Color.FromArgb(120, Color.Black), LinearGradientMode.Vertical)) - { - g.FillRoundedRectangle(gradientBrush, new Rectangle(0, 0, (int)(_config.Bars.Thickness * this.Scale), (int)(height * this.Scale)), (int)(6 * this.Scale)); - g.FillRoundedRectangle(gradientBrush, new Rectangle((int)((_config.Bars.Thickness + _config.Bars.Spacing) * this.Scale), 0, (int)(_config.Bars.Thickness * this.Scale), (int)(height * this.Scale)), (int)(5 * this.Scale)); - } - } - }); - - Brush outlineBrush = new SolidBrush(Color.FromArgb(196, Color.Black)); - - _config.Bars.ThrottleFirst = _config.Bars.Horizontal; - if (_config.Bars.Horizontal) - { - _horizontalBrakeBar = new HorizontalProgressBar(_config.Bars.Length, _config.Bars.Thickness) - { - Value = 0, - Min = 0, - Max = 1, - FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.OrangeRed)), - OutlineBrush = outlineBrush, - Rounded = true, - Scale = this.Scale, - Rounding = 5, - }; - _horizontalGasBar = new HorizontalProgressBar(_config.Bars.Length, _config.Bars.Thickness) - { - Value = 0, - Min = 0, - Max = 1, - FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.LimeGreen)), - OutlineBrush = outlineBrush, - Rounded = true, - Scale = this.Scale, - Rounding = 5, - }; - if (_config.Bars.ThrottleFirst) - { - _horizontalBars[0] = _horizontalGasBar; - _horizontalBars[1] = _horizontalBrakeBar; - } - else - { - _horizontalBars[0] = _horizontalBrakeBar; - _horizontalBars[1] = _horizontalGasBar; - } - } - else - { - _verticalBrakeBar = new VerticalProgressBar(_config.Bars.Thickness, _config.Bars.Length) - { - Value = 0, - Min = 0, - Max = 1, - FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.OrangeRed)), - OutlineBrush = outlineBrush, - Rounded = true, - Scale = this.Scale, - Rounding = 5, - }; - _verticalGasBar = new VerticalProgressBar(_config.Bars.Thickness, _config.Bars.Length) - { - Value = 0, - Min = 0, - Max = 1, - FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.LimeGreen)), - OutlineBrush = outlineBrush, - Rounded = true, - Scale = this.Scale, - Rounding = 5, - }; - if (_config.Bars.ThrottleFirst) - { - _verticalBars[0] = _verticalGasBar; - _verticalBars[1] = _verticalBrakeBar; - } - else - { - _verticalBars[0] = _verticalBrakeBar; - _verticalBars[1] = _verticalGasBar; - } - } - } - - public override void BeforeStop() - { - _cachedBackground?.Dispose(); - } - - public override void Render(Graphics g) - { - - if (_config.Electronics.AntiLockBrakes || _config.Electronics.TractionControl) - ApplyFillColor(); - - if (_config.Bars.Horizontal) - { - _cachedBackground?.Draw(g, _config.Bars.Length, _config.Bars.Thickness * 2 + _config.Bars.Spacing); - - _horizontalGasBar.Value = pagePhysics.Gas; - _horizontalBrakeBar.Value = pagePhysics.Brake; - - _horizontalBars[0]?.Draw(g, 0, 0); - _horizontalBars[1]?.Draw(g, 0, _config.Bars.Thickness + _config.Bars.Spacing); - } - else - { - _cachedBackground?.Draw(g, _config.Bars.Thickness * 2 + _config.Bars.Spacing, _config.Bars.Length); - - _verticalBrakeBar.Value = pagePhysics.Brake; - _verticalGasBar.Value = pagePhysics.Gas; - - _verticalBars[0]?.Draw(g, 0, 0); - _verticalBars[1]?.Draw(g, _config.Bars.Thickness + _config.Bars.Spacing, 0); - } - } - - /// - /// Applies a fill color to the brake and gas bar based on electronics - /// - private void ApplyFillColor() - { - if (_config.Bars.Horizontal) - { - if (pagePhysics.Abs > 0) - _horizontalBrakeBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.Orange)); - else - _horizontalBrakeBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.OrangeRed)); - - if (pagePhysics.TC > 0) - _horizontalGasBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.Orange)); - else - _horizontalGasBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.LimeGreen)); - } - else - { - if (pagePhysics.Abs > 0) - _verticalBrakeBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.Orange)); - else - _verticalBrakeBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.OrangeRed)); - - if (pagePhysics.TC > 0) - _verticalGasBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.Orange)); - else - _verticalGasBar.FillBrush = new SolidBrush(Color.FromArgb(_config.Bars.Transparency, Color.LimeGreen)); - } - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputDataCollector.cs b/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputDataCollector.cs deleted file mode 100644 index d92b171ed..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputDataCollector.cs +++ /dev/null @@ -1,79 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System.Collections.Generic; -using System.Threading; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.HUD.ACC.Overlays.OverlayInputTrace -{ - internal class InputDataCollector - { - private bool IsCollecting = false; - public int TraceCount = 300; - public InputTraceOverlay.InputTraceConfig inputTraceConfig; - - public LinkedList Throttle = new LinkedList(); - public LinkedList Brake = new LinkedList(); - public LinkedList Steering = new LinkedList(); - - private AbstractOverlay _overlay; - - public InputDataCollector(AbstractOverlay overlay) - { - _overlay = overlay; - } - - public void Collect(SPageFilePhysics filePhysics) - { - lock (Throttle) - { - Throttle.AddFirst((int)(filePhysics.Gas * 100)); - if (Throttle.Count > TraceCount) - Throttle.RemoveLast(); - } - lock (Brake) - { - Brake.AddFirst((int)(filePhysics.Brake * 100)); - if (Brake.Count > TraceCount) - Brake.RemoveLast(); - } - - lock (Steering) - { - Steering.AddFirst((int)((filePhysics.SteerAngle + 1.0) / 2 * 100)); - if (Steering.Count > TraceCount) - Steering.RemoveLast(); - } - } - - public void Start() - { - IsCollecting = true; - - for (int i = 0; i < TraceCount; i++) - { - Throttle.AddLast(0); - Brake.AddLast(0); - Steering.AddLast(50); - } - - new Thread(x => - { - while (IsCollecting) - { - Thread.Sleep(1000 / inputTraceConfig.InfoPanel.Herz); - if (_overlay != null && _overlay.pagePhysics != null) - { - Collect(_overlay.pagePhysics); - _overlay.RequestRedraw(); - } - } - }).Start(); - } - - public void Stop() - { - IsCollecting = false; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputGraph.cs b/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputGraph.cs deleted file mode 100644 index 2387ef123..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputGraph.cs +++ /dev/null @@ -1,101 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.OverlayUtil; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Linq; -using static RaceElement.HUD.ACC.Overlays.OverlayInputTrace.InputTraceOverlay; - -namespace RaceElement.HUD.ACC.Overlays.OverlayInputTrace -{ - internal class InputGraph : IDisposable - { - private int _x, _y; - private int _width, _height; - private readonly InputTraceConfig _config; - private readonly InputDataCollector _collector; - - private readonly CachedBitmap _cachedBackground; - - public InputGraph(int x, int y, int width, int height, InputDataCollector collector, InputTraceConfig config) - { - _x = x; - _y = y; - _width = width; - _height = height; - _collector = collector; - _config = config; - - _cachedBackground = new CachedBitmap(_width + 1, _height + 1, g => - { - Rectangle graphRect = new Rectangle(_x, _y, _width, _height); - LinearGradientBrush gradientBrush = new LinearGradientBrush(graphRect, Color.FromArgb(230, Color.Black), Color.FromArgb(120, Color.Black), LinearGradientMode.Vertical); - g.FillRoundedRectangle(gradientBrush, graphRect, 3); - g.DrawRoundedRectangle(new Pen(Color.FromArgb(196, Color.Black)), graphRect, 3); - }); - } - - private int GetRelativeNodeY(int value) - { - double range = 100 - 0; - double percentage = 1d - (value - 0) / range; - return (int)(percentage * (_height - _height / 5)) - + _height / 10; - } - - public void Draw(Graphics g) - { - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.HighQuality; - - if (_cachedBackground != null) - _cachedBackground.Draw(g); - - if (this._config.InfoPanel.SteeringInput) - DrawData(g, _collector.Steering, Color.FromArgb(190, Color.White)); - - DrawData(g, _collector.Throttle, Color.ForestGreen); - DrawData(g, _collector.Brake, Color.Red); - - - g.SmoothingMode = previous; - } - - private void DrawData(Graphics g, LinkedList Data, Color color) - { - if (Data.Count > 0) - { - List points = new List(); - lock (Data) - for (int i = 0; i < Data.Count - 1; i++) - { - int x = _x + _width - i * (_width / Data.Count); - lock (Data) - { - int y = _y + GetRelativeNodeY(Data.ElementAt(i)); - y.ClipMax(_y + _height); - - if (x < _x) - break; - - points.Add(new Point(x, y)); - } - - } - - if (points.Count > 0) - { - GraphicsPath path = new GraphicsPath(); - path.AddLines(points.ToArray()); - g.DrawPath(new Pen(color, 2f), path); - } - } - } - - public void Dispose() - { - _cachedBackground.Dispose(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputTraceOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputTraceOverlay.cs deleted file mode 100644 index 7e1e0e2e3..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayInputTrace/InputTraceOverlay.cs +++ /dev/null @@ -1,75 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Configuration; -using System.Drawing; - - -namespace RaceElement.HUD.ACC.Overlays.OverlayInputTrace -{ - [Overlay(Name = "Input Trace", Version = 1.00, OverlayType = OverlayType.Release, - Description = "Live graph of steering, throttle and brake inputs.")] - internal sealed class InputTraceOverlay : AbstractOverlay - { - private readonly InputTraceConfig _config = new InputTraceConfig(); - internal class InputTraceConfig : OverlayConfiguration - { - [ConfigGrouping("Chart", "Customize the charts refresh rate, data points or hide the steering input.")] - public ChartGrouping InfoPanel { get; set; } = new ChartGrouping(); - public class ChartGrouping - { - [ToolTip("The amount of datapoints shown, this changes the width of the overlay.")] - [IntRange(150, 800, 10)] - public int DataPoints { get; set; } = 300; - - [ToolTip("Sets the data collection rate, this does affect cpu usage at higher values.")] - [IntRange(10, 70, 5)] - public int Herz { get; set; } = 30; - - [ToolTip("Displays the steering input as a white line in the trace.")] - public bool SteeringInput { get; set; } = true; - } - - public InputTraceConfig() - { - this.AllowRescale = true; - } - } - - private readonly int _originalHeight = 120; - private readonly int _originalWidth = 300; - - private InputGraph _graph; - private InputDataCollector _inputDataCollector; - - public InputTraceOverlay(Rectangle rectangle) : base(rectangle, "Input Trace") - { - _originalWidth = this._config.InfoPanel.DataPoints; - this.Width = _originalWidth; - this.Height = _originalHeight; - this.RequestsDrawItself = true; - } - - public sealed override void BeforeStart() - { - _inputDataCollector = new InputDataCollector(this) { TraceCount = this._originalWidth - 1, inputTraceConfig = _config }; - _inputDataCollector.Start(); - - _graph = new InputGraph(0, 0, this._originalWidth - 1, this._originalHeight - 1, _inputDataCollector, this._config); - } - - public sealed override void BeforeStop() - { - _inputDataCollector.Stop(); - _graph.Dispose(); - } - - public sealed override void Render(Graphics g) - { - _graph.Draw(g); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayInputs/InputsOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayInputs/InputsOverlay.cs deleted file mode 100644 index 4620e5ff5..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayInputs/InputsOverlay.cs +++ /dev/null @@ -1,223 +0,0 @@ -using RaceElement.Data.ACC.Cars; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; - -namespace RaceElement.HUD.ACC.Overlays.OverlayInputs -{ - [Overlay(Name = "Inputs", Version = 1.00, OverlayType = OverlayType.Release, - Description = "Live inputs of steering, throttle, brake and the selected gear.")] - internal sealed class InputsOverlay : AbstractOverlay - { - private readonly SteeringWheelConfig _config = new SteeringWheelConfig(); - private sealed class SteeringWheelConfig : OverlayConfiguration - { - [ConfigGrouping("Information", "Show or hide inputs or the current gear.")] - public InputsGrouping Inputs { get; set; } = new InputsGrouping(); - public class InputsGrouping - { - [ToolTip("Displays the selected gear.")] - public bool CurrentGear { get; set; } = true; - - [ToolTip("Displays the throttle input.")] - public bool ThrottleInput { get; set; } = false; - - [ToolTip("Displays the brake input.")] - public bool BrakeInput { get; set; } = false; - } - - public SteeringWheelConfig() - { - this.AllowRescale = true; - } - } - - private const int _size = 150; - private const int _wheelWidth = 15; - private const int indicatorWidth = 15; - private const int inputCircleMinAngle = 135; - private const int inputCircleSweepAngle = 270; - - private readonly int innerWheelWidth; - - private CachedBitmap _cachedBackground; - - private Font _gearIndicatorFont; - - public InputsOverlay(Rectangle rectangle) : base(rectangle, "Inputs") - { - this.Height = _size + 1; - this.Width = _size + 1; - - this.innerWheelWidth = _wheelWidth / 2; - } - - public sealed override void BeforeStart() - { - if (this._config.Inputs.CurrentGear) - _gearIndicatorFont = FontUtil.FontOrbitron(40); - - _cachedBackground = new CachedBitmap((int)(Width * this.Scale), (int)(Height * this.Scale), g => - { - GraphicsPath gradientPath = new GraphicsPath(); - gradientPath.AddEllipse(0, 0, (int)(_size * Scale), (int)(_size * Scale)); - PathGradientBrush pthGrBrush = new PathGradientBrush(gradientPath); - pthGrBrush.CenterColor = Color.FromArgb(40, 0, 0, 0); - pthGrBrush.SurroundColors = new Color[] { Color.FromArgb(220, 0, 0, 0) }; - - // background - g.FillEllipse(pthGrBrush, new Rectangle(0, 0, (int)(_size * Scale), (int)(_size * Scale))); - g.DrawEllipse(new Pen(Color.FromArgb(230, Color.Black)), new Rectangle(0, 0, (int)(_size * Scale), (int)(_size * Scale))); - - // steering background - g.DrawEllipse(new Pen(Color.FromArgb(80, Color.White), _wheelWidth / 2 * Scale), _size / 2 * Scale, _size / 2 * Scale, _size / 2 * Scale - _wheelWidth * Scale); - - // braking background - if (_config.Inputs.BrakeInput) - { - var brakeColor = Color.FromArgb(255, 240, 10, 10); - int x = (int)((_wheelWidth * 2 + (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0)) * Scale); - int y = (int)((_wheelWidth * 2 + (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0)) * Scale); - int width = (int)((_size - (4 * _wheelWidth) - (2 * (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0))) * Scale); - int height = (int)((_size - (4 * _wheelWidth) - (2 * (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0))) * Scale); - var brakingBackground = new Pen(Color.FromArgb(80, brakeColor), this.innerWheelWidth / 2 * Scale); - Rectangle rect = new Rectangle(x, y, width, height); - g.DrawArc(brakingBackground, rect, inputCircleMinAngle, inputCircleSweepAngle); - } - - // throttle background - if (_config.Inputs.ThrottleInput) - { - var throttleColor = Color.FromArgb(255, 10, 240, 10); - var penBackground = new Pen(Color.FromArgb(80, throttleColor), this.innerWheelWidth / 2 * Scale); - Rectangle throttleBackGroundRect = new Rectangle() - { - X = (int)(_wheelWidth * 2 * Scale), - Y = (int)(_wheelWidth * 2 * Scale), - Width = (int)((_size - 4 * _wheelWidth) * Scale), - Height = (int)((_size - 4 * _wheelWidth) * Scale), - }; - g.DrawArc(penBackground, throttleBackGroundRect, inputCircleMinAngle, inputCircleSweepAngle); - } - }); - } - - public sealed override void BeforeStop() - { - _cachedBackground?.Dispose(); - } - - public sealed override void Render(Graphics g) - { - g.SmoothingMode = SmoothingMode.AntiAlias; - - _cachedBackground?.Draw(g, 0, 0, (int)_size, (int)_size); - - DrawSteeringIndicator(g); - - if (this._config.Inputs.ThrottleInput) - DrawThrottleIndicator(g); - - if (this._config.Inputs.BrakeInput) - DrawBrakingIndicator(g); - - if (this._config.Inputs.CurrentGear) - DrawGearIndicator(g); - } - - private void DrawGearIndicator(Graphics g) - { - string gear; - switch (pagePhysics.Gear) - { - case 0: gear = "R"; break; - case 1: gear = "N"; break; - default: gear = $"{pagePhysics.Gear - 1}"; break; - } - - float gearStringWidth = g.MeasureString(gear, _gearIndicatorFont).Width; - int xPos = (int)(_size / 2 - gearStringWidth / 2); - int yPos = _size / 2 - _gearIndicatorFont.Height / 2; - - g.TextRenderingHint = TextRenderingHint.AntiAlias; - g.DrawStringWithShadow(gear, _gearIndicatorFont, Color.White, new PointF(xPos, yPos), 2.5f); - } - - private void DrawBrakingIndicator(Graphics g) - { - var brakeColor = Color.FromArgb(255, 240, 10, 10); - var brakingForeground = new Pen(brakeColor, this.innerWheelWidth); - - DrivingAssistanceIndicator((pagePhysics.Abs == 1), brakingForeground, brakeColor); - - Rectangle rect = new Rectangle() - { - X = _wheelWidth * 2 + (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0), - Y = _wheelWidth * 2 + (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0), - Width = _size - (4 * _wheelWidth) - (2 * (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0)), - Height = _size - (4 * _wheelWidth) - (2 * (_config.Inputs.ThrottleInput ? this.innerWheelWidth : 0)) - }; - float brakeAngle = Rescale(1, inputCircleSweepAngle, pagePhysics.Brake); - g.DrawArc(brakingForeground, rect, inputCircleMinAngle, brakeAngle); - } - - private void DrawThrottleIndicator(Graphics g) - { - var throttleColor = Color.FromArgb(255, 10, 240, 10); - var penForeground = new Pen(throttleColor, this.innerWheelWidth); - - DrivingAssistanceIndicator((pagePhysics.TC == 1), penForeground, throttleColor); - - Rectangle rect = new Rectangle(_wheelWidth * 2, _wheelWidth * 2, _size - 4 * _wheelWidth, _size - 4 * _wheelWidth); - float throttleAngle = Rescale(1, inputCircleSweepAngle, pagePhysics.Gas); - g.DrawArc(penForeground, rect, inputCircleMinAngle, throttleAngle); - } - - private void DrawSteeringIndicator(Graphics g) - { - float accSteering = (pagePhysics.SteerAngle / 2 + 1) * 100; // map acc value to 0 - 200 - float angle = Rescale(200, SteeringLock.Get(pageStatic.CarModel) * 2, accSteering) - (SteeringLock.Get(pageStatic.CarModel)); - - Rectangle rect = new Rectangle(0 + _wheelWidth, 0 + _wheelWidth, _size - (2 * _wheelWidth), _size - (2 * _wheelWidth)); - float drawAngle = angle + 270 - (indicatorWidth / 2); - g.DrawArc(new Pen(Color.White, _wheelWidth), rect, drawAngle, indicatorWidth); - } - - // map value input from range 0 - fromMax into range 0 - toMax - private float Rescale(float fromMax, float toMax, float input) - { - return toMax / fromMax * input; - } - - private Color SetRandomTransparency(int minTransparanxy, int maxTransparancy, Color color) - { - Random rd = new Random(); - int randomTransparancy = rd.Next(minTransparanxy, maxTransparancy); - return Color.FromArgb(randomTransparancy, color); - } - - private void DrivingAssistanceIndicator(bool active, Pen pen, Color inactiveColor) - { - if (active) - { - pen.Color = SetRandomTransparency(50, 255, inactiveColor); - } - else - { - if (pen.Color.A != 255) - pen.Color = inactiveColor; - } - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayLapInfo/LapInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayLapInfo/LapInfoOverlay.cs deleted file mode 100644 index a4e1c890f..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayLapInfo/LapInfoOverlay.cs +++ /dev/null @@ -1,238 +0,0 @@ -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Data.ACC.Tracker.Laps; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using System; -using System.Drawing; -using System.Drawing.Text; - -namespace RaceElement.HUD.ACC.Overlays.OverlayLapDelta -{ - [Overlay(Name = "Lap Info", Version = 1.00, OverlayType = OverlayType.Release, - Description = "A panel with a bar showing the current delta.\nOptionally showing the sector times, last lap, best lap and the potential best.")] - internal sealed class LapInfoOverlay : AbstractOverlay - { - private readonly LapInfoConfig _config = new LapInfoConfig(); - private class LapInfoConfig : OverlayConfiguration - { - [ConfigGrouping("Lap Info", "Show or hide inputs or the current gear.")] - public InfoPanelGrouping InfoPanel { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - [ToolTip("Sets the maximum range in seconds for the delta bar.")] - [IntRange(1, 5, 1)] - public int MaxDelta { get; set; } = 2; - - [ToolTip("Displays the time for each sector, green colored sectors are personal best.")] - public bool Sectors { get; set; } = true; - - [ToolTip("Displays the last lap time.")] - public bool LastLap { get; set; } = true; - - [ToolTip("Displays the best lap time.")] - public bool BestLap { get; set; } = true; - - [ToolTip("Displays the potential best lap time based on your fastest sector times.")] - public bool PotentialBest { get; set; } = true; - } - - public LapInfoConfig() : base() - { - this.AllowRescale = true; - } - } - - private const int _overlayWidth = 202; - private readonly InfoTable _table; - - private DbLapData _lastLap = null; - - public LapInfoOverlay(Rectangle rectangle) : base(rectangle, "Lap Info") - { - _table = new InfoTable(10, new int[] { 85, 83 }) { Y = 17 }; - this.Width = _overlayWidth + 1; - this.Height = _table.FontHeight * 7 + 2 + 4; - RefreshRateHz = 10; - } - - public sealed override void BeforeStart() - { - if (!this._config.InfoPanel.Sectors) - this.Height -= this._table.FontHeight * 3; - - if (!this._config.InfoPanel.PotentialBest) - this.Height -= this._table.FontHeight; - - if (!this._config.InfoPanel.LastLap) - this.Height -= this._table.FontHeight; - - if (!this._config.InfoPanel.BestLap) - this.Height -= this._table.FontHeight; - - LapTracker.Instance.LapFinished += Collector_LapFinished; - } - - public sealed override void BeforeStop() - { - LapTracker.Instance.LapFinished -= Collector_LapFinished; - } - - private void Collector_LapFinished(object sender, DbLapData newLap) - { - if (newLap.Sector1 != -1 && newLap.Sector2 != -1 && newLap.Sector3 != -1) - _lastLap = newLap; - } - - public sealed override void Render(Graphics g) - { - double delta = (double)pageGraphics.DeltaLapTimeMillis / 1000; - DeltaBar deltaBar = new DeltaBar(-this._config.InfoPanel.MaxDelta, this._config.InfoPanel.MaxDelta, delta) { DrawBackground = true, IsValidLap = pageGraphics.IsValidLap }; - deltaBar.Draw(g, 0, 0, _overlayWidth, _table.FontHeight); - - g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; - g.TextContrast = 1; - - string deltaText = $"{delta:F3}"; - SizeF textWidth = g.MeasureString(deltaText, _table.Font); - g.DrawStringWithShadow(deltaText, _table.Font, Color.White, new PointF(_overlayWidth / 2 - textWidth.Width + textWidth.Width / 2, _table.FontHeight / 8f)); - - if (this._config.InfoPanel.Sectors) - AddSectorLines(); - - if (this._config.InfoPanel.LastLap) - AddLastLap(); - - if (this._config.InfoPanel.BestLap) - AddBestLap(); - - if (this._config.InfoPanel.PotentialBest) - AddPotentialBest(); - - _table.Draw(g); - } - - private void AddPotentialBest() - { - string[] potentialValues = new string[2]; - - int potentialBest = LapTracker.Instance.Laps.GetPotentialFastestLapTime(); - if (potentialBest == -1) - potentialValues[0] = $"--:--.---"; - else - { - TimeSpan best = TimeSpan.FromMilliseconds(potentialBest); - potentialValues[0] = $"{best:mm\\:ss\\:fff}"; - } - - this._table.AddRow("Pot", potentialValues); - } - - private void AddSectorLines() - { - DbLapData lap = LapTracker.Instance.CurrentLap; - - if (_lastLap != null && pageGraphics.NormalizedCarPosition < 0.08 && lap.Index != _lastLap.Index && _lastLap.Sector3 != -1) - lap = _lastLap; - - int fastestSector1 = LapTracker.Instance.Laps.GetFastestSector(1); - int fastestSector2 = LapTracker.Instance.Laps.GetFastestSector(2); - int fastestSector3 = LapTracker.Instance.Laps.GetFastestSector(3); - - string[] rowSector1 = new string[2]; - string[] rowSector2 = new string[2]; - string[] rowSector3 = new string[2]; - rowSector1[0] = "-"; - rowSector2[0] = "-"; - rowSector3[0] = "-"; - - if (LapTracker.Instance.CurrentLap.Sector1 > -1) - { - rowSector1[0] = $"{lap.GetSector1():F3}"; - if (lap.Sector1 > fastestSector1) - rowSector1[1] = $"+{(float)(lap.Sector1 - fastestSector1) / 1000:F3}"; - } - else if (pageGraphics.CurrentSectorIndex == 0) - rowSector1[0] = $"{((float)pageGraphics.CurrentTimeMs / 1000):F3}"; - - - if (lap.Sector2 > -1) - { - rowSector2[0] = $"{lap.GetSector2():F3}"; - if (lap.Sector2 > fastestSector2) - rowSector2[1] = $"+{(float)(lap.Sector2 - fastestSector2) / 1000:F3}"; - } - else if (lap.Sector1 > -1) - { - rowSector2[0] = $"{(((float)pageGraphics.CurrentTimeMs - lap.Sector1) / 1000):F3}"; - } - - if (lap.Sector3 > -1) - { - rowSector3[0] = $"{lap.GetSector3():F3}"; - if (lap.Sector3 > fastestSector3) - rowSector3[1] = $"+{(float)(lap.Sector3 - fastestSector3) / 1000:F3}"; - } - else if (lap.Sector2 > -1 && pageGraphics.CurrentSectorIndex == 2) - { - rowSector3[0] = $"{(((float)pageGraphics.CurrentTimeMs - lap.Sector2 - lap.Sector1) / 1000):F3}"; - } - - - if (pageGraphics.CurrentSectorIndex != 0 && lap.Sector1 != -1 && lap.IsValid) - _table.AddRow("S1 ", rowSector1, new Color[] { LapTracker.Instance.Laps.IsSectorFastest(1, lap.Sector1) ? Color.LimeGreen : Color.White, Color.Orange }); - else - _table.AddRow("S1 ", rowSector1, new Color[] { Color.White }); - - if (pageGraphics.CurrentSectorIndex != 1 && lap.Sector2 != -1 && lap.IsValid) - _table.AddRow("S2 ", rowSector2, new Color[] { LapTracker.Instance.Laps.IsSectorFastest(2, lap.Sector2) ? Color.LimeGreen : Color.White, Color.Orange }); - else - _table.AddRow("S2 ", rowSector2, new Color[] { Color.White }); - - if (pageGraphics.CurrentSectorIndex != 2 && lap.Sector3 != -1 && lap.IsValid) - _table.AddRow("S3 ", rowSector3, new Color[] { LapTracker.Instance.Laps.IsSectorFastest(3, lap.Sector3) ? Color.LimeGreen : Color.White, Color.Orange }); - else - _table.AddRow("S3 ", rowSector3, new Color[] { Color.White }); - } - - private void AddLastLap() - { - string[] LastLapValues = new string[2]; - - int lastLap = LapTracker.Instance.Laps.GetLastLapTime(); - if (lastLap == -1) - LastLapValues[0] = $"--:--.---"; - else - { - TimeSpan best = TimeSpan.FromMilliseconds(lastLap); - LastLapValues[0] = $"{best:mm\\:ss\\:fff}"; - } - - this._table.AddRow("Last", LastLapValues); - } - - private void AddBestLap() - { - string[] bestLapValues = new string[2]; - - int bestLap = LapTracker.Instance.Laps.GetBestLapTime(); - if (bestLap == -1) - bestLapValues[0] = $"--:--.---"; - else - { - TimeSpan best = TimeSpan.FromMilliseconds(bestLap); - bestLapValues[0] = $"{best:mm\\:ss\\:fff}"; - } - - if (broadCastLocalCar.CarIndex == broadCastRealTime.BestLapCarIndex) - this._table.AddRow("Best", bestLapValues, new Color[] { Color.Purple }); - else - this._table.AddRow("Best", bestLapValues); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayMousePosition/MousePositionOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayMousePosition/MousePositionOverlay.cs deleted file mode 100644 index c091cbf71..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayMousePosition/MousePositionOverlay.cs +++ /dev/null @@ -1,116 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using System.Drawing; -using System.Windows.Forms; -using Gma.System.MouseKeyHook; -using System.Runtime.InteropServices; - -namespace RaceElement.HUD.ACC.Overlays.OverlayMousePosition -{ - public sealed class MousePositionOverlay : AbstractOverlay - { - private CachedBitmap _cachedCursor; - private IKeyboardMouseEvents _globalKbmHook; - - private const int _circleWidth = 6; - - private readonly CachedBitmap.Renderer MouseDownRenderer = g => - { - g.DrawEllipse(Pens.White, _circleWidth, _circleWidth, _circleWidth); - g.DrawEllipse(Pens.White, _circleWidth, _circleWidth, 3); - g.FillEllipse(new SolidBrush(Color.FromArgb(140, Color.Red)), 5, 5, 5); - }; - private readonly CachedBitmap.Renderer MouseUpRenderer = g => - { - g.DrawEllipse(Pens.White, _circleWidth, _circleWidth, _circleWidth); - g.DrawEllipse(Pens.White, _circleWidth, _circleWidth, 3); - g.FillEllipse(new SolidBrush(Color.FromArgb(140, Color.White)), 5, 5, 5); - }; - - public MousePositionOverlay(Rectangle rectangle, string Name) : base(rectangle, Name) - { - this.Width = _circleWidth * 2 + 1; - this.Height = Width; - this.RequestsDrawItself = true; - this.AllowReposition = false; - } - - public sealed override void BeforeStart() - { - _cachedCursor = new CachedBitmap(Width, Height, MouseUpRenderer); - _globalKbmHook = Hook.GlobalEvents(); - _globalKbmHook.MouseDown += GlobalMouseDown; - _globalKbmHook.MouseUp += GlobalMouseUp; - _globalKbmHook.MouseMove += GlobalMouseMove; - - this.X = GetCursorPosition().X - _circleWidth; - this.Y = GetCursorPosition().Y - _circleWidth; - this.RequestRedraw(); - } - - public sealed override void BeforeStop() - { - _globalKbmHook.MouseDown -= GlobalMouseDown; - _globalKbmHook.MouseUp -= GlobalMouseUp; - _globalKbmHook.MouseMove -= GlobalMouseMove; - _globalKbmHook.Dispose(); - - if (_cachedCursor != null) - _cachedCursor.Dispose(); - } - - private void GlobalMouseMove(object sender, MouseEventArgs e) - { - this.Location = new Point(e.Location.X - _circleWidth, e.Location.Y - _circleWidth); - } - - private void GlobalMouseUp(object sender, MouseEventArgs e) - { - _cachedCursor.SetRenderer(MouseUpRenderer); - this.RequestRedraw(); - } - - private void GlobalMouseDown(object sender, MouseEventArgs e) - { - _cachedCursor.SetRenderer(MouseDownRenderer); - this.RequestRedraw(); - } - - public sealed override void Render(Graphics g) => _cachedCursor?.Draw(g, Width, Height); - - public sealed override bool ShouldRender() - { - return true; - } - - [DllImport("user32.dll")] - private static extern bool GetCursorPos(out POINT lpPoint); - - private static Point GetCursorPosition() - { - POINT lpPoint; - GetCursorPos(out lpPoint); - // NOTE: If you need error handling - // bool success = GetCursorPos(out lpPoint); - // if (!success) - - return lpPoint; - } - - /// - /// Struct representing a point. - /// - [StructLayout(LayoutKind.Sequential)] - private struct POINT - { - public int X; - public int Y; - - public static implicit operator Point(POINT point) - { - return new Point(point.X, point.Y); - } - } - } -} - diff --git a/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerDataCollector.cs b/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerDataCollector.cs deleted file mode 100644 index e09df658c..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerDataCollector.cs +++ /dev/null @@ -1,93 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Internal; -using System.Collections.Generic; -using System.Threading; -using static RaceElement.ACCSharedMemory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.HUD.ACC.Overlays.OverlaySlipAngle -{ - internal class OversteerDataCollector - { - - private bool IsCollecting = false; - public int TraceCount = 300; - public int Herz = 30; - public int MaxSlipAngle { get; set; } - - public LinkedList OversteerData = new LinkedList(); - public LinkedList UndersteerData = new LinkedList(); - - private AbstractOverlay _overlay; - - public OversteerDataCollector(AbstractOverlay overlay) - { - _overlay = overlay; - } - - public void Collect(SPageFilePhysics pagePhysics) - { - float slipRatioFront = (pagePhysics.WheelSlip[(int)Wheel.FrontLeft] + pagePhysics.WheelSlip[(int)Wheel.FrontRight]) / 2; - float slipRatioRear = (pagePhysics.WheelSlip[(int)Wheel.RearLeft] + pagePhysics.WheelSlip[(int)Wheel.RearRight]) / 2; - - // understeer - if (slipRatioFront > slipRatioRear) - { - float diff = slipRatioFront - slipRatioRear; - diff.ClipMax(MaxSlipAngle); - lock (UndersteerData) - UndersteerData.AddFirst(diff); - lock (OversteerData) - OversteerData.AddFirst(0); - } - - // oversteer - if (slipRatioRear > slipRatioFront) - { - float diff = slipRatioRear - slipRatioFront; - diff.ClipMax(MaxSlipAngle); - lock (OversteerData) - OversteerData.AddFirst(diff); - lock (UndersteerData) - UndersteerData.AddFirst(0); - } - - lock (OversteerData) - if (OversteerData.Count > TraceCount) - OversteerData.RemoveLast(); - - lock (UndersteerData) - if (UndersteerData.Count > TraceCount) - UndersteerData.RemoveLast(); - } - - public void Start() - { - IsCollecting = true; - - for (int i = 0; i < TraceCount; i++) - { - OversteerData.AddLast(0); - UndersteerData.AddLast(0); - } - - new Thread(x => - { - while (IsCollecting) - { - Thread.Sleep(1000 / Herz); - if (_overlay != null && _overlay.pagePhysics != null) - { - Collect(_overlay.pagePhysics); - _overlay.RequestRedraw(); - } - } - }).Start(); - } - - public void Stop() - { - IsCollecting = false; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerGraph.cs b/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerGraph.cs deleted file mode 100644 index d9b3672da..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerGraph.cs +++ /dev/null @@ -1,96 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.OverlayUtil; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Linq; - -namespace RaceElement.HUD.ACC.Overlays.OverlaySlipAngle -{ - internal class OversteerGraph : IDisposable - { - private int _x, _y; - private int _width, _height; - private readonly OversteerDataCollector _collector; - - private readonly CachedBitmap _cachedBackground; - - public OversteerGraph(int x, int y, int width, int height, OversteerDataCollector collector) - { - _x = x; - _y = y; - _width = width; - _height = height; - _collector = collector; - - _cachedBackground = new CachedBitmap(_width + 1, _height + 1, g => - { - Rectangle graphRect = new Rectangle(0, 0, _width, _height); - LinearGradientBrush gradientBrush = new LinearGradientBrush(graphRect, Color.FromArgb(230, Color.Black), Color.FromArgb(120, Color.Black), LinearGradientMode.Vertical); - g.FillRoundedRectangle(gradientBrush, graphRect, 3); - g.DrawRoundedRectangle(new Pen(Color.FromArgb(196, Color.Black)), graphRect, 3); - }); - } - - private int GetRelativeNodeY(float value) - { - double range = _collector.MaxSlipAngle - 0; - double percentage = 1d - (value - 0) / range; - return (int)(percentage * (_height - _height / 5)) - + _height / 10; - } - - public void Draw(Graphics g) - { - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - g.CompositingQuality = CompositingQuality.GammaCorrected; - - if (_cachedBackground != null) - _cachedBackground.Draw(g, _x, _y, _width, _height); - - DrawData(g, _collector.OversteerData, Color.OrangeRed); - DrawData(g, _collector.UndersteerData, Color.DeepSkyBlue); - - - g.SmoothingMode = previous; - } - - private void DrawData(Graphics g, LinkedList Data, Color color) - { - if (Data.Count > 0) - { - List points = new List(); - lock (Data) - for (int i = 0; i < Data.Count - 1; i++) - { - int x = _x + _width - i * (_width / Data.Count); - lock (Data) - { - int y = _y + GetRelativeNodeY(Data.ElementAt(i)); - y.ClipMax(_y + _height); - - if (x < _x) - break; - - points.Add(new Point(x, y)); - } - - } - - if (points.Count > 0) - { - GraphicsPath path = new GraphicsPath(); - path.AddLines(points.ToArray()); - g.DrawPath(new Pen(color, 1f), path); - } - } - } - - public void Dispose() - { - _cachedBackground.Dispose(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerTraceOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerTraceOverlay.cs deleted file mode 100644 index 664f5d6c9..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayOversteerTrace/OversteerTraceOverlay.cs +++ /dev/null @@ -1,77 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlaySlipAngle -{ - [Overlay(Name = "Oversteer Trace", Version = 1.00, - Description = "Live graph of oversteer in red and understeer in blue.", OverlayType = OverlayType.Release)] - internal sealed class OversteerTraceOverlay : AbstractOverlay - { - private readonly OversteerTraceConfiguration _config = new OversteerTraceConfiguration(); - private class OversteerTraceConfiguration : OverlayConfiguration - { - [ConfigGrouping("Chart", "Customize the charts refresh rate, data points or change the max slip angle shown.")] - public ChartGrouping Chart { get; set; } = new ChartGrouping(); - public class ChartGrouping - { - [ToolTip("Sets the maximum amount of slip angle displayed.")] - [IntRange(1, 90, 1)] - public int MaxSlipAngle { get; set; } = 4; - - [ToolTip("The amount of datapoints shown, this changes the width of the overlay.")] - [IntRange(150, 800, 10)] - public int DataPoints { get; set; } = 300; - - [ToolTip("Sets the data collection rate, this does affect cpu usage at higher values.")] - [IntRange(10, 70, 5)] - public int Herz { get; set; } = 30; - } - - public OversteerTraceConfiguration() - { - this.AllowRescale = true; - } - } - - private OversteerDataCollector _collector; - private OversteerGraph _graph; - private readonly int _originalWidth; - private readonly int _originalHeight = 120; - - public OversteerTraceOverlay(Rectangle rectangle) : base(rectangle, "Oversteer Trace") - { - _originalWidth = this._config.Chart.DataPoints; - - this.Width = _originalWidth; - this.Height = _originalHeight; - this.RequestsDrawItself = true; - } - - public sealed override void BeforeStart() - { - _collector = new OversteerDataCollector(this) - { - TraceCount = _originalWidth - 1, - MaxSlipAngle = _config.Chart.MaxSlipAngle, - Herz = _config.Chart.Herz - }; - _collector.Start(); - - _graph = new OversteerGraph(0, 0, _originalWidth - 1, _originalHeight - 1, _collector); - } - - public sealed override void BeforeStop() - { - _collector.Stop(); - _graph.Dispose(); - } - - public sealed override void Render(Graphics g) - { - _graph.Draw(g); - } - - public sealed override bool ShouldRender() => DefaultShouldRender(); - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/PressureTraceOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/PressureTraceOverlay.cs deleted file mode 100644 index 25481c86b..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/PressureTraceOverlay.cs +++ /dev/null @@ -1,65 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlayPressureTrace -{ - [Overlay(Name = "Pressure Trace", Version = 1.00, OverlayType = OverlayType.Release, - Description = "Live graphs of the tyre pressures, green is within range, red is too high, blue is too low.")] - internal sealed class PressureTraceOverlay : AbstractOverlay - { - private PressureTraceOverlayConfig _config = new PressureTraceOverlayConfig(); - private class PressureTraceOverlayConfig : OverlayConfiguration - { - - public PressureTraceOverlayConfig() - { - AllowRescale = false; - } - } - - internal static PressureTraceOverlay Instance; - private TyrePressureDataCollector _dataCollector; - - public PressureTraceOverlay(Rectangle rectangle) : base(rectangle, "Pressure Trace") - { - this.Width = 140; - this.Height = 60 * 2; - this.RequestsDrawItself = true; - } - - public sealed override void BeforeStart() - { - Instance = this; - - TyrePressureGraph.PressureRange = TyrePressures.GetCurrentRange(pageGraphics.TyreCompound, pageStatic.CarModel); - _dataCollector = new TyrePressureDataCollector() { TraceCount = this.Width / 2 - 1 }; - _dataCollector.Start(); - } - - public sealed override void BeforeStop() - { - _dataCollector.Stop(); - Instance = null; - } - - public sealed override void Render(Graphics g) - { - TyrePressureGraph.PressureRange = TyrePressures.GetCurrentRange(pageGraphics.TyreCompound, pageStatic.CarModel); - TyrePressureGraph graph = new TyrePressureGraph(0, 0, this.Width / 2 - 1, (this.Height / 2) - 1, _dataCollector.FrontLeft); - TyrePressureGraph graph1 = new TyrePressureGraph(this.Width / 2, 0, this.Width / 2 - 1, (this.Height / 2) - 1, _dataCollector.FrontRight); - TyrePressureGraph graph2 = new TyrePressureGraph(0, (this.Height / 2) * 1, this.Width / 2 - 1, (this.Height / 2) - 1, _dataCollector.RearLeft); - TyrePressureGraph graph3 = new TyrePressureGraph(this.Width / 2, (this.Height / 2) * 1, this.Width / 2 - 1, (this.Height / 2) - 1, _dataCollector.RearRight); - - graph.Draw(g); - graph1.Draw(g); - graph2.Draw(g); - graph3.Draw(g); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressureDataCollector.cs b/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressureDataCollector.cs deleted file mode 100644 index 04ac14d14..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressureDataCollector.cs +++ /dev/null @@ -1,87 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using System.Collections.Generic; -using System.Threading; -using static RaceElement.ACCSharedMemory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.HUD.ACC.Overlays.OverlayPressureTrace -{ - internal class TyrePressureDataCollector - { - private bool IsCollecting = false; - public int TraceCount = 300; - - public LinkedList FrontLeft = new LinkedList(); - public LinkedList FrontRight = new LinkedList(); - public LinkedList RearLeft = new LinkedList(); - public LinkedList RearRight = new LinkedList(); - - public void Collect(SPageFilePhysics filePhysics) - { - lock (FrontLeft) - { - FrontLeft.AddFirst(CorrectToBounds(filePhysics.WheelPressure[(int)Wheel.FrontLeft])); - if (FrontLeft.Count > TraceCount) - { - FrontLeft.RemoveLast(); - } - } - lock (FrontRight) - { - FrontRight.AddFirst(CorrectToBounds(filePhysics.WheelPressure[(int)Wheel.FrontRight])); - if (FrontRight.Count > TraceCount) - { - FrontRight.RemoveLast(); - } - } - lock (RearLeft) - { - RearLeft.AddFirst(CorrectToBounds(filePhysics.WheelPressure[(int)Wheel.RearLeft])); - if (RearLeft.Count > TraceCount) - { - RearLeft.RemoveLast(); - } - } - lock (RearRight) - { - RearRight.AddFirst(CorrectToBounds(filePhysics.WheelPressure[(int)Wheel.RearRight])); - if (RearRight.Count > TraceCount) - { - RearRight.RemoveLast(); - } - } - - } - - private float CorrectToBounds(float value) - { - float min = (float)(TyrePressureGraph.PressureRange.OptimalMinimum - TyrePressureGraph.Padding); - float max = (float)(TyrePressureGraph.PressureRange.OptimalMaximum + TyrePressureGraph.Padding); - value.Clip(min, max); - return value; - } - - public void Start() - { - IsCollecting = true; - - new Thread(x => - { - while (IsCollecting) - { - Thread.Sleep(1000 / 3); - if (PressureTraceOverlay.Instance != null && PressureTraceOverlay.Instance.pagePhysics != null) - { - Collect(PressureTraceOverlay.Instance.pagePhysics); - PressureTraceOverlay.Instance.RequestRedraw(); - } - } - }).Start(); - } - - public void Stop() - { - IsCollecting = false; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressureGraph.cs b/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressureGraph.cs deleted file mode 100644 index e03bc012a..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressureGraph.cs +++ /dev/null @@ -1,105 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Linq; - -namespace RaceElement.HUD.ACC.Overlays.OverlayPressureTrace -{ - internal class TyrePressureGraph - { - private int X, Y; - private int Width, Height; - private LinkedList TirePressures; - - public static TyrePressureRange PressureRange { get; set; } = TyrePressures.DRY_DHE2020; - public static float Padding = 0.4f; - - public TyrePressureGraph(int x, int y, int width, int height, LinkedList tirePressures) - { - this.X = x; - this.Y = y; - this.Width = width; - this.Height = height; - this.TirePressures = tirePressures; - } - - private int GetRelativeNodeY(float value) - { - double range = (PressureRange.OptimalMaximum + Padding) - (PressureRange.OptimalMinimum - Padding); - double percentage = (PressureRange.OptimalMaximum + Padding - value) / range; - percentage.Clip(0.05, 0.95); - - return (int)(percentage * Height); - } - - public void Draw(Graphics g) - { - //this.SetMinAndMax(); - Rectangle graphRect = new Rectangle(X, Y, Width, Height); - // draw background - g.FillRectangle(new SolidBrush(Color.FromArgb(196, Color.Black)), graphRect); - - - - if (TirePressures.Count > 0) - { - g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; - DrawData(g, TirePressures); - g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default; - - g.DrawRectangle(new Pen(Color.FromArgb(196, Color.Black)), graphRect); - - } - } - - private void DrawData(Graphics g, LinkedList Data) - { - if (Data.Count > 0) - { - List points = new List(); - lock (Data) - for (int i = 0; i < Data.Count - 1; i++) - { - int x = X + Width - i * (Width / Data.Count); - lock (Data) - { - int y = Y + GetRelativeNodeY(Data.ElementAt(i)); - y.ClipMax(Y + Height); - - if (x < X) - break; - - - points.Add(new Point(x, y)); - - if (points.Count > 1) - { - GraphicsPath path = new GraphicsPath() { FillMode = FillMode.Winding }; - path.AddLines(points.ToArray()); - g.DrawPath(new Pen(GetLineColor(Data.ElementAt(i)), 2.5f), path); - points.Clear(); - points.Add(new Point(x, y)); - } - - } - - } - } - } - - private Brush GetLineColor(float pressure) - { - if (pressure < PressureRange.OptimalMinimum) - { - return Brushes.Blue; - } - if (pressure > PressureRange.OptimalMaximum) - { - return Brushes.Red; - } - - return Brushes.Green; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressures.cs b/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressures.cs deleted file mode 100644 index db0371fc3..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayPressureTrace/TyrePressures.cs +++ /dev/null @@ -1,54 +0,0 @@ -using RaceElement.Data; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.HUD.ACC.Overlays.OverlayPressureTrace -{ - internal static class TyrePressures - { - public static TyrePressureRange DRY_DHE2020_GT4 = new TyrePressureRange() - { - OptimalMinimum = 26.8, - OptimalMaximum = 27.4 - }; - - public static TyrePressureRange DRY_DHE2020 = new TyrePressureRange() - { - OptimalMinimum = 27.3, - OptimalMaximum = 27.9 - }; - public static TyrePressureRange WET_ALL = new TyrePressureRange() - { - OptimalMinimum = 29.5, - OptimalMaximum = 30.5 - }; - - - public static TyrePressureRange GetCurrentRange(string compound, string carModel) - { - if (compound == "wet_compound") - { - return WET_ALL; - } - - CarModels model = ConversionFactory.ParseCarName(carModel); - ICarSetupConversion setupConversion = GetConversion(model); - - if (setupConversion != null) - switch (setupConversion.DryTyreCompound) - { - case DryTyreCompounds.DHE2020: return DRY_DHE2020; - default: return DRY_DHE2020_GT4; - } - - // gotta return something.. I know isn't nice, but solutions.. - return DRY_DHE2020; - } - } - - public class TyrePressureRange - { - public double OptimalMinimum; - public double OptimalMaximum; - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayRaceInfo/RaceInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayRaceInfo/RaceInfoOverlay.cs deleted file mode 100644 index b8a20c650..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayRaceInfo/RaceInfoOverlay.cs +++ /dev/null @@ -1,88 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlayRaceInfo -{ - [Overlay(Name = "Race Info", Description = "(BETA) Provides information for the current race session.", OverlayType = OverlayType.Release, Version = 1.00)] - internal class RaceInfoOverlay : AbstractOverlay - { - private readonly RaceInfoConfig _config = new RaceInfoConfig(); - private class RaceInfoConfig : OverlayConfiguration - { - [ConfigGrouping("Info Panel", "Show or hide additional information in the panel.")] - public InfoPanelGrouping InfoPanel { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - [ToolTip("Shows a timer when the pit window starts and ends.")] - public bool PitWindow { get; set; } = true; - - [ToolTip("Shows the current location on track.")] - public bool TrackLocation { get; set; } = true; - } - - public RaceInfoConfig() - { - this.AllowRescale = true; - } - } - - private readonly InfoPanel _panel = new InfoPanel(10, 240); - - public RaceInfoOverlay(Rectangle rectangle) : base(rectangle, "Race Info") - { - this.Width = 230; - this.Height = _panel.FontHeight * 6; - RefreshRateHz = 1; - } - - public sealed override void BeforeStart() - { - if (!_config.InfoPanel.PitWindow) - this.Height -= _panel.FontHeight; - - if (!_config.InfoPanel.TrackLocation) - this.Height -= _panel.FontHeight; - } - - public sealed override void BeforeStop() - { - } - - public sealed override void Render(Graphics g) - { - if (_config.InfoPanel.PitWindow) - if (pageGraphics.SessionType == ACCSharedMemory.AcSessionType.AC_RACE && !pageGraphics.MandatoryPitDone) - { - TimeSpan pitWindowStart = TimeSpan.FromMilliseconds(pageStatic.PitWindowStart); - TimeSpan pitWindowEnd = TimeSpan.FromMilliseconds(pageStatic.PitWindowEnd); - - if (broadCastRealTime.SessionTime < pitWindowStart) - this._panel.AddLine("Pit Open In", $"{pitWindowStart.Subtract(broadCastRealTime.SessionTime):hh\\:mm\\:ss}"); - else if (broadCastRealTime.SessionTime < pitWindowEnd) - this._panel.AddLine("Pit Closing", $"{pitWindowEnd.Subtract(broadCastRealTime.SessionTime):hh\\:mm\\:ss}"); - else this._panel.AddLine("Pit", "Closed"); - } - - TimeSpan sessionLength = broadCastRealTime.SessionEndTime.Add(broadCastRealTime.SessionTime); - - - _panel.AddLine("Position", $"{pageGraphics.Position}"); - _panel.AddLine("Laps", $"{broadCastLocalCar.Laps}"); - - _panel.AddLine("Session End", $"{broadCastRealTime.SessionEndTime:hh\\:mm\\:ss}"); - _panel.AddLine("Session Time", $"{broadCastRealTime.SessionTime:hh\\:mm\\:ss}"); - _panel.AddLine("Session Length", $"{sessionLength:hh\\:mm\\:ss}"); - - if (_config.InfoPanel.TrackLocation) - this._panel.AddLine("Location", $"{broadCastLocalCar.CarLocation}"); - - - _panel.Draw(g); - } - - public sealed override bool ShouldRender() => DefaultShouldRender(); - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayRefuel/OverlayRefuel.cs b/Race_Element.HUD.ACC/Overlays/OverlayRefuel/OverlayRefuel.cs deleted file mode 100644 index e33c393c6..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayRefuel/OverlayRefuel.cs +++ /dev/null @@ -1,329 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Data.ACC.Tracker.Laps; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.HUD.ACC.Overlays.OverlayRefuel -{ -#if DEBUG - [Overlay(Name = "Refuel Info", Version = 1.00, - Description = "Overlay to verify the fuel calculation during the race and help with pit stop strategy.", OverlayType = OverlayType.Release)] -#endif - internal sealed class RefuelInfoOverlay : AbstractOverlay - { - private readonly RefuelConfiguration _config = new RefuelConfiguration(); - private class RefuelConfiguration : OverlayConfiguration - { - [ConfigGrouping("Refuel Info", "Show or hide additional information in the panel.")] - public InfoPanelGrouping RefuelInfoGrouping { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - public bool SolidProgressBar { get; set; } = false; - - [ToolTip("Amount of extra laps for fuel calculation.")] - [IntRange(1, 5, 1)] - public int ExtraLaps { get; set; } = 2; - } - - public RefuelConfiguration() - { - this.AllowRescale = true; - } - } - - private SolidBrush _whiteBrush = new SolidBrush(Color.White); - private SolidBrush _greenBrush = new SolidBrush(Color.Green); - - private const int windowWidth = 400; - private const int windowHeight = 100; - private const int padding = 10; - private const int barYPos = 30; - private const int progressBarHeight = 20; - private const int pitBarHeight = 5; - private const int amountOfLapsForAverageCalculation = 3; - - private AcSessionType _lastSessionType = AcSessionType.AC_UNKNOWN; - private float _sessionLength = 0; - private float _pitWindowStartPercentage = 0; - private float _pitWindowEndPercentage = 0; - private float _raceProgressWithFuelPercentage = 0; - private float _refuelTimeWithMaxFuelPercentage = 0; - private float _lapsWithFuel = 0; - private float _refuelToTheEnd = 0; - - private float _avgFuelConsumption = 0; - private float _lastFuelConsumption = 0; - - public RefuelInfoOverlay(Rectangle rect) : base(rect, "Refuel Info") - { - this.Width = windowWidth; - this.Height = windowHeight; - this.RefreshRateHz = 5; - } - - - public sealed override void BeforeStart() - { - LapTracker.Instance.LapFinished += FuelHelperLapFinished; - } - - public sealed override void BeforeStop() - { - LapTracker.Instance.LapFinished -= FuelHelperLapFinished; - } - - public sealed override void Render(Graphics g) - { - - int widgetMinXPos = 0 + padding; - int widgetMaxXPos = windowWidth - padding; - int widgetMaxWidth = widgetMaxXPos - widgetMinXPos; - - UpdateSessionData(); - - StringFormat drawFormat = new StringFormat(); - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - TextRenderingHint previousHint = g.TextRenderingHint; - g.TextContrast = 2; - g.TextRenderingHint = TextRenderingHint.AntiAlias; - - // transparent background - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(100, 0, 0, 0)), new Rectangle(0, 0, windowWidth, windowHeight), 10); - - // complete progress bar - DrawProgressBarBackground(g, widgetMinXPos, widgetMaxWidth, this._config.RefuelInfoGrouping.SolidProgressBar); - - // checkered flag - for (int i = 0; i < 4; i++) - { - if (i % 2 == 0) - { - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 255, 255, 255)), new Rectangle(widgetMaxXPos - 5, barYPos + (i * 5), 5, 5)); - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 0, 0, 0)), new Rectangle(widgetMaxXPos - 10, barYPos + (i * 5), 5, 5)); - } - else - { - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 0, 0, 0)), new Rectangle(widgetMaxXPos - 5, barYPos + (i * 5), 5, 5)); - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 255, 255, 255)), new Rectangle(widgetMaxXPos - 10, barYPos + (i * 5), 5, 5)); - } - - } - - if (this._sessionLength == 0) return; - - // pit window - int pitWindowStartPxl = PercentageToPxl(widgetMaxWidth, this._pitWindowStartPercentage); - if (pitWindowStartPxl < widgetMinXPos) pitWindowStartPxl = widgetMinXPos; - int pitWindowEndPxl = PercentageToPxl(widgetMaxWidth, this._pitWindowEndPercentage); - if (pitWindowEndPxl > widgetMaxXPos) pitWindowEndPxl = widgetMaxXPos; - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 0, 255, 0)), new Rectangle(pitWindowStartPxl, barYPos + progressBarHeight - pitBarHeight, (int)(pitWindowEndPxl - pitWindowStartPxl), pitBarHeight)); - - // race progress - float raceProgressPercentage = GetRaceProgressPercentage(); - int raceProgressPercentagePxl = PercentageToPxl(widgetMaxWidth, raceProgressPercentage); - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 255, 255, 255)), new Rectangle(widgetMinXPos, barYPos, (int)raceProgressPercentagePxl, progressBarHeight)); - - // earliest pit stop bar - int maxFuelPx = PercentageToPxl(widgetMaxWidth, this._refuelTimeWithMaxFuelPercentage); - maxFuelPx += widgetMinXPos; - maxFuelPx = (maxFuelPx > widgetMaxWidth) ? widgetMaxWidth : maxFuelPx; - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 0, 255, 0)), new Rectangle(maxFuelPx, barYPos - 10, 2, progressBarHeight + 16)); - - // latest pit stop bar - int raceProgressWithFuelPx = PercentageToPxl(widgetMaxWidth, this._raceProgressWithFuelPercentage); - raceProgressWithFuelPx += widgetMinXPos; - raceProgressWithFuelPx = (raceProgressWithFuelPx > widgetMaxWidth) ? widgetMaxWidth : raceProgressWithFuelPx; - g.FillRectangle(new SolidBrush(Color.FromArgb(200, 255, 0, 0)), new Rectangle(raceProgressWithFuelPx, barYPos - 10, 2, progressBarHeight + 16)); - - // latest pit stop lap info - string pitStopInfo = $"in {(int)this._lapsWithFuel} laps"; - if ((int)this._lapsWithFuel < 2) - { - pitStopInfo = "box THIS lap!"; - } - - // if text does not fit into the overlay, move text to the left - Font drawFont = FontUtil.FontOrbitron(10); - SizeF pitStopTextSize = g.MeasureString(pitStopInfo, drawFont); - float textPosition = raceProgressWithFuelPx + 6; - if ((textPosition + pitStopTextSize.Width) > widgetMaxXPos) - { - textPosition -= pitStopTextSize.Width - 5; - } - g.DrawString(pitStopInfo, drawFont, new SolidBrush(Color.Red), textPosition, barYPos - 20, drawFormat); - - // fuel consumption indicator - float fuelDifference = this._avgFuelConsumption - this._lastFuelConsumption; - string fuelConsumptionIndicator = " "; - SolidBrush drawBrush; - if (fuelDifference > 0.01) - { - drawBrush = _greenBrush; - fuelConsumptionIndicator = "\u23F7"; - } - else if (fuelDifference < -0.01) - { - drawBrush = new SolidBrush(Color.Red); - fuelConsumptionIndicator = "\u23F6"; - } - else - { - drawBrush = _whiteBrush; - fuelConsumptionIndicator = "="; - } - - drawFont = FontUtil.FontOrbitron(15); - g.DrawString($"[{fuelConsumptionIndicator}] {fuelDifference.ToString("0.00")}l", drawFont, drawBrush, widgetMinXPos + 200, barYPos + pitBarHeight + 30, drawFormat); - - // refuel - drawFont = FontUtil.FontOrbitron(15); - g.DrawString($"Refuel:", drawFont, _whiteBrush, widgetMinXPos, barYPos + pitBarHeight + 30, drawFormat); - if (this._refuelToTheEnd <= 0) drawBrush = _greenBrush; - g.DrawString($"{this._refuelToTheEnd.ToString("0.0")}l ", drawFont, drawBrush, widgetMinXPos + 110, barYPos + pitBarHeight + 30, drawFormat); - - drawFont = FontUtil.FontOrbitron(8); - g.DrawString($"{_config.RefuelInfoGrouping.ExtraLaps} extra laps", drawFont, _whiteBrush, widgetMinXPos, barYPos + pitBarHeight + 50, drawFormat); - - g.TextRenderingHint = previousHint; - g.SmoothingMode = previous; - } - - private void FuelHelperLapFinished(object sender, DbLapData lap) - { - - float fuelLevel = (int)(pagePhysics.Fuel); - this._avgFuelConsumption = GetAverageFuelConsumption(); - this._lastFuelConsumption = GetLastFuelConsumption(); - int averageLapTime = GetAverageLapTime(); - - this._lapsWithFuel = fuelLevel / _lastFuelConsumption; - - float sessionTimeLeft = pageGraphics.SessionTimeLeft; - float lapsUntilTheEnd = sessionTimeLeft / averageLapTime; - float fuelUntilTheEnd = _lastFuelConsumption * (lapsUntilTheEnd + _config.RefuelInfoGrouping.ExtraLaps); - this._refuelToTheEnd = fuelUntilTheEnd - fuelLevel; - this._raceProgressWithFuelPercentage = ((averageLapTime * this._lapsWithFuel) * 100) / _sessionLength; - this._raceProgressWithFuelPercentage += GetRaceProgressPercentage(); - - - // the time where we will make it to the end with a full tank. - float lapsWithMaxFuel = (int)(pageStatic.MaxFuel) / _lastFuelConsumption; - lapsWithMaxFuel -= _config.RefuelInfoGrouping.ExtraLaps; - //float lapsInSession = sessionLength / averageLapTime; - int timeWithMaxFuel = (int)(lapsWithMaxFuel * averageLapTime); - float refuelTimeWithMaxFuel = _sessionLength - timeWithMaxFuel; - if (refuelTimeWithMaxFuel < 0) - { - refuelTimeWithMaxFuel = 0; - } - this._refuelTimeWithMaxFuelPercentage = RaceTimeToRacePercentage(_sessionLength - refuelTimeWithMaxFuel); - - } - - private void DrawProgressBarBackground(Graphics g, int xPos, int width, bool solid) - { - if (solid) - { - g.FillRectangle(new SolidBrush(Color.FromArgb(100, 255, 255, 255)), new Rectangle(xPos, barYPos, width, progressBarHeight)); - } - else - { - int noOfBars = width / 10; - int barWidthPx = width / noOfBars; - for (int i = 0; i < noOfBars; i++) - { - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(100, 255, 255, 255)), new Rectangle(xPos + (i * barWidthPx), barYPos, (barWidthPx / 2) + 2, progressBarHeight), 1); - } - } - } - - private float RaceTimeToRacePercentage(float raceTime) - { - float percentage = 100 - (raceTime * 100) / this._sessionLength; - return percentage.ClipMax((float)100); - } - - private float GetRaceProgressPercentage() - { - return RaceTimeToRacePercentage(pageGraphics.SessionTimeLeft); - } - - private float GetLastFuelConsumption() - { - return pageGraphics.FuelXLap; - } - - private int GetAverageLapTime() - { - return LapDataExtensions.GetAverageLapTime(LapTracker.Instance.Laps, amountOfLapsForAverageCalculation); - } - - private float GetAverageFuelConsumption() - { - if (LapTracker.Instance.Laps.Count < 2) - { - return GetLastFuelConsumption(); - } - return (float)(LapDataExtensions.GetAverageFuelUsage(LapTracker.Instance.Laps, amountOfLapsForAverageCalculation)) / 1000; - } - - private int PercentageToPxl(float width, float percentage) - { - return (int)((width * percentage) / 100); - } - - private void UpdateSessionData() - { - if (_lastSessionType != pageGraphics.SessionType) - { - // new session, reset - this._sessionLength = 0; - this._lastSessionType = pageGraphics.SessionType; - //return; - } - - // new session started - if (this._sessionLength < pageGraphics.SessionTimeLeft) - { - // we will not get the session length after race start, save the session length. { - this._sessionLength = pageGraphics.SessionTimeLeft; - - // calculate pit window length - if (pageStatic.PitWindowStart <= 0 || pageStatic.PitWindowStart >= pageStatic.PitWindowEnd || pageGraphics.SessionType != AcSessionType.AC_RACE) - { - this._pitWindowStartPercentage = 0; - this._pitWindowEndPercentage = 0; - } - else - { - int pitWindowLength = pageStatic.PitWindowEnd - pageStatic.PitWindowStart; - float pitWindowStartTime = (this._sessionLength - pitWindowLength) / 2; - float pitWindowEndTime = pitWindowStartTime + pitWindowLength; - this._pitWindowStartPercentage = (pitWindowStartTime * 100) / this._sessionLength; - this._pitWindowEndPercentage = (pitWindowEndTime * 100) / this._sessionLength; - - } - - } - - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - - } - - - -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayShiftIndicator/ShiftIndicatorOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayShiftIndicator/ShiftIndicatorOverlay.cs deleted file mode 100644 index 1c0095d0a..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayShiftIndicator/ShiftIndicatorOverlay.cs +++ /dev/null @@ -1,209 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; - -namespace RaceElement.HUD.ACC.Overlays.OverlayShiftIndicator -{ - [Overlay(Name = "Shift Indicator", Version = 1.00, - Description = "A bar showing the current RPM, optionally showing when the pit limiter is enabled.")] - internal class ShiftIndicatorOverlay : AbstractOverlay - { - private readonly ShiftIndicatorConfig _config = new ShiftIndicatorConfig(); - private class ShiftIndicatorConfig : OverlayConfiguration - { - [ConfigGrouping("Bar", "The shape and options of the shift indicator bar.")] - public BarsGrouping Bar { get; set; } = new BarsGrouping(); - public class BarsGrouping - { - [ToolTip("Sets the Width of the shift indicator bar.")] - [IntRange(160, 800, 10)] - public int Width { get; set; } = 300; - - [ToolTip("Sets the Height of the shift indicator bar.")] - [IntRange(20, 45, 5)] - public int Height { get; set; } = 30; - - [ToolTip("Displays the current RPM inside of the shift indicator bar.")] - public bool ShowRpm { get; set; } = true; - - [ToolTip("Displays when the pit limiter is active.")] - public bool ShowPitLimiter { get; set; } = true; - - [ToolTip("Sets the refresh rate.")] - [IntRange(20, 80, 5)] - public int RefreshRate { get; set; } = 50; - } - - public ShiftIndicatorConfig() - { - this.AllowRescale = true; - } - } - - private string _lastCar = string.Empty; - private CachedBitmap _cachedBackground; - private CachedBitmap _cachedRpmLines; - private CachedBitmap _cachedPitLimiterOutline; - - private Font _font; - private float _halfRpmStringWidth = -1; - private float _halfPitLimiterStringWidth = -1; - - public ShiftIndicatorOverlay(Rectangle rectangle) : base(rectangle, "Shift Indicator") - { - this.RefreshRateHz = this._config.Bar.RefreshRate; - AllowReposition = true; - this.Height = _config.Bar.Height + 1; - this.Width = _config.Bar.Width + 1; - } - - public sealed override void BeforeStart() - { - if (_config.Bar.ShowRpm || _config.Bar.ShowPitLimiter) - _font = FontUtil.FontUnispace(15); - - _cachedBackground = new CachedBitmap((int)(_config.Bar.Width * this.Scale + 1), (int)(_config.Bar.Height * this.Scale + 1), g => - { - - int midHeight = (int)(_config.Bar.Height * this.Scale) / 2; - var linerBrush = new LinearGradientBrush(new Point(0, midHeight), new Point((int)(_config.Bar.Width * this.Scale), midHeight), Color.FromArgb(160, 0, 0, 0), Color.FromArgb(230, 0, 0, 0)); - g.FillRoundedRectangle(linerBrush, new Rectangle(0, 0, (int)(_config.Bar.Width * this.Scale), (int)(_config.Bar.Height * this.Scale)), (int)(6 * Scale)); - g.DrawRoundedRectangle(new Pen(Color.Black, 1 * this.Scale), new Rectangle(0, 0, (int)(_config.Bar.Width * this.Scale), (int)(_config.Bar.Height * this.Scale)), (int)(6 * Scale)); - }); - - _cachedRpmLines = new CachedBitmap((int)(_config.Bar.Width * this.Scale + 1), (int)(_config.Bar.Height * this.Scale + 1), g => - { - int lineCount = (int)Math.Floor(pageStatic.MaxRpm / 1000d); - - int leftOver = pageStatic.MaxRpm % 1000; - if (leftOver < 70) - lineCount--; - - Pen linePen = new Pen(new SolidBrush(Color.FromArgb(90, Color.White)), 2 * this.Scale); - - double thousandPercent = 1000d / pageStatic.MaxRpm * lineCount; - double baseX = (_config.Bar.Width * this.Scale) / lineCount * thousandPercent; - for (int i = 1; i <= lineCount; i++) - { - int x = (int)(i * baseX); - - g.DrawLine(linePen, x, 1, x, (_config.Bar.Height * this.Scale) - 1); - - //if (i == lineCount - 1) - //{ - - - //} - } - - }); - - if (_config.Bar.ShowPitLimiter) - _cachedPitLimiterOutline = new CachedBitmap((int)(_config.Bar.Width * this.Scale + 1), (int)(_config.Bar.Height * this.Scale + 1), g => - { - g.DrawRoundedRectangle(new Pen(Color.Yellow, 2.5f), new Rectangle(0, 0, (int)(_config.Bar.Width * this.Scale), (int)(_config.Bar.Height * this.Scale)), (int)(8 * Scale)); - }); - } - - public sealed override void BeforeStop() - { - if (_cachedBackground != null) - _cachedBackground.Dispose(); - - if (_cachedRpmLines != null) - _cachedRpmLines.Dispose(); - } - - public sealed override void Render(Graphics g) - { - g.SmoothingMode = SmoothingMode.AntiAlias; - g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; - g.TextContrast = 1; - - if (_cachedBackground != null) - _cachedBackground.Draw(g, _config.Bar.Width, _config.Bar.Height); - - if (_config.Bar.ShowPitLimiter && pagePhysics.PitLimiterOn) - DrawPitLimiterBar(g); - - DrawRpmBar(g); - - if (_config.Bar.ShowRpm) - DrawRpmText(g); - } - - private int _limiterColorSwitch = 0; - private void DrawPitLimiterBar(Graphics g) - { - if (_limiterColorSwitch > this.RefreshRateHz / 5) - _cachedPitLimiterOutline?.Draw(g, 0, 0, _config.Bar.Width, _config.Bar.Height); - - if (_limiterColorSwitch > this.RefreshRateHz / 2) // makes this flash 3 times a second - _limiterColorSwitch = 0; - - _limiterColorSwitch++; - } - - private void DrawRpmText(Graphics g) - { - string currentRpm = $"{pagePhysics.Rpms}".FillStart(4, ' '); - - if (_halfRpmStringWidth < 0) - _halfRpmStringWidth = g.MeasureString(currentRpm, _font).Width / 2; - - g.DrawStringWithShadow(currentRpm, _font, Brushes.White, new PointF(_config.Bar.Width / 2 - _halfRpmStringWidth, _config.Bar.Height / 2 - _font.Height / 2 + 1)); - } - - private void DrawRpmBar(Graphics g) - { - double maxRpm = pageStatic.MaxRpm; - double currentRpm = pagePhysics.Rpms; - double percent = 0; - - if (maxRpm > 0 && currentRpm > 0) - percent = currentRpm / maxRpm; - - if (percent > 0) - { - Color rpmColor = Color.FromArgb(125, 255, 255, 255); - if (percent > 0.7 && percent <= 0.94) - rpmColor = Color.FromArgb(135, 5, 255, 5); - else if (percent > 0.94) - rpmColor = Color.FromArgb(165, 255, 7, 7); - else if (percent > 0.973) - rpmColor = Color.FromArgb(225, 255, 4, 4); - - if (percent >= 1) - rpmColor = Color.Red; - - percent.Clip(0.05d, 1d); - - g.FillRoundedRectangle(new SolidBrush(rpmColor), new Rectangle(0, 0, (int)(_config.Bar.Width * percent), _config.Bar.Height), 6); - } - - DrawRpmBar1kLines(g); - } - - private void DrawRpmBar1kLines(Graphics g) - { - if (_lastCar != pageStatic.CarModel) - { - _cachedRpmLines.Render(); - _lastCar = pageStatic.CarModel; - } - - _cachedRpmLines.Draw(g, _config.Bar.Width, _config.Bar.Height); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlaySpeedometer/SpeedometerOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlaySpeedometer/SpeedometerOverlay.cs deleted file mode 100644 index 09b41830d..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlaySpeedometer/SpeedometerOverlay.cs +++ /dev/null @@ -1,97 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Data.ACC.Tracker.Laps; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlaySpeedometer -{ - [Overlay(Name = "Speedometer", Description = "Shows a speedometer", Version = 1.00, OverlayType = OverlayType.Release)] - internal sealed class SpeedometerOverlay : AbstractOverlay - { - private readonly SpeedometerConfiguration _config = new SpeedometerConfiguration(); - private class SpeedometerConfiguration : OverlayConfiguration - { - [ConfigGrouping("Info Panel", "Show or hide additional information in the panel.")] - public InfoPanelGrouping InfoPanel { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - [ToolTip("Displays the maximum speed reached on each lap.")] - public bool MaxSpeed { get; set; } = false; - - [ToolTip("Displays the minimum speed reached on each lap.")] - public bool MinSpeed { get; set; } = false; - } - - public SpeedometerConfiguration() - { - AllowRescale = true; - } - } - - private readonly InfoPanel _panel; - private float _maxSpeed = 0; - private float _minSpeed = 0; - - public SpeedometerOverlay(Rectangle rectangle) : base(rectangle, "Speedometer") - { - this.Width = 130; - _panel = new InfoPanel(13, this.Width) - { - FirstRowLine = 1 - }; - this.Height = _panel.FontHeight * 3 + 1; - this.RefreshRateHz = 10; - } - - public sealed override void BeforeStart() - { - - if (_config.InfoPanel.MaxSpeed || _config.InfoPanel.MinSpeed) - LapTracker.Instance.LapFinished += OnLapFinished; - - if (!_config.InfoPanel.MinSpeed) - this.Height -= _panel.FontHeight; - if (!_config.InfoPanel.MaxSpeed) - this.Height -= _panel.FontHeight; - } - - public sealed override void BeforeStop() - { - if (_config.InfoPanel.MinSpeed || _config.InfoPanel.MaxSpeed) - LapTracker.Instance.LapFinished -= OnLapFinished; - } - - private void OnLapFinished(object sender, DbLapData e) - { - _maxSpeed.ClipMax(pagePhysics.SpeedKmh); - _minSpeed.ClipMin(pagePhysics.SpeedKmh); - } - - public sealed override void Render(Graphics g) - { - _panel.AddProgressBarWithCenteredText($"{pagePhysics.SpeedKmh:F0}".FillStart(3, ' '), 0, 320, pagePhysics.SpeedKmh); - - if (_config.InfoPanel.MaxSpeed) - { - _maxSpeed.ClipMin(pagePhysics.SpeedKmh); - _panel.AddLine("Max", $"{_maxSpeed:F2}"); - } - - if (_config.InfoPanel.MinSpeed) - { - _minSpeed.ClipMax(pagePhysics.SpeedKmh); - _panel.AddLine("Min", $"{_minSpeed:F2}"); - } - - _panel.Draw(g); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlaySpotter/OverlaySpotter.cs b/Race_Element.HUD.ACC/Overlays/OverlaySpotter/OverlaySpotter.cs deleted file mode 100644 index 05a621b6f..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlaySpotter/OverlaySpotter.cs +++ /dev/null @@ -1,35 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.HUD.ACC.Overlays.OverlaySpotter -{ -#if DEBUG - [Overlay(Name = "Spotter", Version = 1.00, OverlayType = OverlayType.Release, - Description = "TODO (spots things?)")] -#endif - internal sealed class SpotterOverlay : AbstractOverlay - { - public SpotterOverlay(Rectangle rectangle) : base(rectangle, "Spotter") - { - } - - public override bool ShouldRender() => DefaultShouldRender(); - - public override void BeforeStart() - { - } - - public override void BeforeStop() - { - } - - public override void Render(Graphics g) - { - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayStandings/StandingsConfiguration.cs b/Race_Element.HUD.ACC/Overlays/OverlayStandings/StandingsConfiguration.cs deleted file mode 100644 index 17aa7a7f5..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayStandings/StandingsConfiguration.cs +++ /dev/null @@ -1,44 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.HUD.ACC.Overlays.OverlayStandings -{ - internal sealed class StandingsConfiguration : OverlayConfiguration - { - [ConfigGrouping("Information", "Show or hide additional information in the standings.")] - public InformationGrouping Information { get; set; } = new InformationGrouping(); - public class InformationGrouping - { - [ToolTip("Multiclass")] - public bool MultiClass { get; set; } = true; - - [ToolTip("Time Delta")] - public bool TimeDelta { get; set; } = true; - - [ToolTip("Show an indicator for invalid laps.")] - public bool InvalidLap { get; set; } = true; - } - - [ConfigGrouping("Layout", "Change the layout of the standings.")] - public LayoutGrouping Layout { get; set; } = new LayoutGrouping(); - public class LayoutGrouping - { - [ToolTip("Additional Rows in front and behind.")] - [IntRange(1, 5, 1)] - public int AdditionalRows { get; set; } = 2; - - [ToolTip("Multiclass Rows")] - [IntRange(1, 10, 1)] - public int MulticlassRows { get; set; } = 4; - } - - public StandingsConfiguration() - { - this.AllowRescale = true; - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayStandings/StandingsOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayStandings/StandingsOverlay.cs deleted file mode 100644 index 29b493c8b..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayStandings/StandingsOverlay.cs +++ /dev/null @@ -1,731 +0,0 @@ -using RaceElement.Broadcast; -using RaceElement.Broadcast.Structs; -using RaceElement.Data; -using RaceElement.Data.ACC.EntryList; -using RaceElement.Data.ACC.EntryList.TrackPositionGraph; -using RaceElement.Data.ACC.Session; -using RaceElement.Data.ACC.Tracker; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Linq; -using static RaceElement.ACCSharedMemory; -using static RaceElement.Data.ACC.EntryList.EntryListTracker; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.HUD.ACC.Overlays.OverlayStandings -{ -#if DEBUG - [Overlay(Name = "Live Standings", Version = 1.00, - Description = "Shows race standings table for different car classes.", OverlayType = OverlayType.Release)] -#endif - - public sealed class StandingsOverlay : AbstractOverlay - { - private readonly StandingsConfiguration _config = new StandingsConfiguration(); - private const int _height = 800; - private const int _width = 800; - private float _trackMeter = 0; - - private readonly Dictionary _carClassToBrush = new Dictionary() - { - {CarClasses.GT3, new SolidBrush(Color.FromArgb(150, Color.Yellow))}, - {CarClasses.GT4, new SolidBrush(Color.FromArgb(150, Color.LightBlue))}, - {CarClasses.CUP, new SolidBrush(Color.FromArgb(150, Color.Cyan))}, - {CarClasses.ST, new SolidBrush(Color.FromArgb(150, Color.DarkGoldenrod))}, - {CarClasses.TCX, new SolidBrush(Color.FromArgb(150, Color.DarkRed))}, - {CarClasses.CHL, new SolidBrush(Color.FromArgb(150, Color.DarkBlue))}, - - }; - - private CarClasses _driversClass = CarClasses.GT3; - private String _driverLastName = ""; - private AcStatus _currentAcStatus = AcStatus.AC_OFF; - - // the entry list splint into separate lists for every car class - private Dictionary>> _entryListForCarClass = new Dictionary>>(); - - public StandingsOverlay(Rectangle rectangle) : base(rectangle, "Live Standings") - { - this.Height = _height; - this.Width = _width; - this.RefreshRateHz = 1; - } - - public sealed override void BeforeStart() - { - InitCarClassEntryLists(); - RaceSessionTracker.Instance.OnACStatusChanged += StatusChanged; - RaceSessionTracker.Instance.OnACSessionTypeChanged += SessionTypeChanged; - BroadcastTracker.Instance.OnTrackDataUpdate += TrackDataUpdate; - _currentAcStatus = pageGraphics.Status; - } - - public sealed override void BeforeStop() - { - RaceSessionTracker.Instance.OnACStatusChanged -= StatusChanged; - RaceSessionTracker.Instance.OnACSessionTypeChanged -= SessionTypeChanged; - BroadcastTracker.Instance.OnTrackDataUpdate -= TrackDataUpdate; - - } - - - private void TrackDataUpdate(object sender, TrackData e) - { - _trackMeter = e.TrackMeters; - Debug.WriteLine($"standings overlay - TrackDataUpdate {_trackMeter}"); - } - - private void SessionTypeChanged(object sender, ACCSharedMemory.AcSessionType e) - { - ClearCarClassEntryList(); - } - - private void StatusChanged(object sender, ACCSharedMemory.AcStatus e) - { - _currentAcStatus = e; - if (e.Equals(AcStatus.AC_OFF)) - { - ClearCarClassEntryList(); - } - } - - private void ClearCarClassEntryList() - { - foreach (CarClasses carClass in Enum.GetValues(typeof(CarClasses))) - { - _entryListForCarClass[carClass].Clear(); - } - } - - private void InitCarClassEntryLists() - { - _entryListForCarClass.Clear(); - foreach (CarClasses carClass in Enum.GetValues(typeof(CarClasses))) - { - _entryListForCarClass[carClass] = new List>(); - } - } - - public sealed override bool ShouldRender() => DefaultShouldRender(); - - public sealed override void Render(Graphics g) - { - g.TextRenderingHint = TextRenderingHint.AntiAlias; - g.SmoothingMode = SmoothingMode.AntiAlias; - - if (!_currentAcStatus.Equals(AcStatus.AC_LIVE)) return; - - List> cars = EntryListTracker.Instance.Cars; - if (cars.Count == 0) return; - - DetermineDriversClass(cars); - SplitEntryList(cars); - SortAllEntryLists(); - - //int bestSessionLapMS = GetBestSessionLap(); - - Dictionary> tableRows = new Dictionary>(); - - if (_config.Information.MultiClass) - { - foreach (CarClasses carClass in Enum.GetValues(typeof(CarClasses))) - { - tableRows[carClass] = new List(); - EntryListToTableRow(tableRows[carClass], _entryListForCarClass[carClass]); - } - } - else - { - tableRows[_driversClass] = new List(); - EntryListToTableRow(tableRows[_driversClass], _entryListForCarClass[_driversClass]); - } - - AddDriversRow(tableRows[_driversClass], _entryListForCarClass[_driversClass]); - - OverlayStandingsTable ost = new OverlayStandingsTable(10, 10, 13); - - int height = 0; - foreach (KeyValuePair> kvp in tableRows) - { - ost.Draw(g, height, kvp.Value, _config.Layout.MulticlassRows, _carClassToBrush[kvp.Key], $"{kvp.Key} / {_entryListForCarClass[kvp.Key].Count()} Cars", _driverLastName, _config.Information.TimeDelta, _config.Information.InvalidLap); - height = ost.Height; - } - } - - private void AddDriversRow(List standingsTableRows, List> list) - { - var playersIndex = GetDriversIndex(list); - if (playersIndex == -1 || playersIndex < _config.Layout.MulticlassRows) - { - return; - } - - int startIdx = (playersIndex - _config.Layout.AdditionalRows) < 0 ? 0 : (playersIndex + _config.Layout.AdditionalRows - _config.Layout.MulticlassRows); - int endIdx = (playersIndex + _config.Layout.AdditionalRows + 1) > list.Count() ? list.Count() : (playersIndex + _config.Layout.AdditionalRows + 1); - - if (startIdx < _config.Layout.MulticlassRows) startIdx = _config.Layout.MulticlassRows; - - for (int i = startIdx; i < endIdx; i++) - { - CarData carData = list[i].Value; - //AddCarDataTableRow(carData, tableRows[carClass], (carData.RealtimeCarUpdate.LastLap.LaptimeMS == bestSessionLapMS)); - var gab = GetGapToCarInFront(list, i); - AddCarDataTableRow(carData, standingsTableRows, gab, false); - } - } - - private int GetDriversIndex(List> list) - { - for (int i = 0; i < list.Count(); i++) - { - CarData carData = list[i].Value; - - if (pageGraphics.PlayerCarID == carData.CarInfo.CarIndex) - { - return i; - } - } - return -1; - } - - private void EntryListToTableRow(List tableRows, List> entryList) - { - for (int i = 0; i < (entryList.Count() < _config.Layout.MulticlassRows ? entryList.Count() : _config.Layout.MulticlassRows); i++) - { - CarData carData = entryList[i].Value; - //AddCarDataTableRow(carData, tableRows[carClass], (carData.RealtimeCarUpdate.LastLap.LaptimeMS == bestSessionLapMS)); - var gab = GetGapToCarInFront(entryList, i); - AddCarDataTableRow(carData, tableRows, gab, false); - } - } - - private string GetGapToCarInFront(List> list, int i) - { - // inspired by acc bradcasting client - - if (i < 1 || _trackMeter == 0) return "---"; - - var carInFront = list[i - 1].Value.RealtimeCarUpdate; - var currentCar = list[i].Value.RealtimeCarUpdate; - var splineDistance = Math.Abs(carInFront.SplinePosition - currentCar.SplinePosition); - while (splineDistance > 1f) - splineDistance -= 1f; - var gabMeters = splineDistance * _trackMeter; - - if (currentCar.Kmh < 10) - { - return "---"; - } - return $"{gabMeters / currentCar.Kmh * 3.6:F1}s ⇅"; - - } - - private int GetBestSessionLap() - { - int bestSessionLapMS = -1; - if (broadCastRealTime.BestSessionLap != null) - { - bestSessionLapMS = broadCastRealTime.BestSessionLap.LaptimeMS.GetValueOrDefault(-1); - } - return bestSessionLapMS; - } - - private void AddCarDataTableRow(CarData carData, List standingsTableRows, String gab, bool fastestLapTime) - { - DriverInfo driverInfo = carData.CarInfo.Drivers[carData.CarInfo.CurrentDriverIndex]; - string firstName = driverInfo.FirstName; - if (firstName.Length > 0) firstName = firstName.First() + ""; - string diverName = $"{firstName}. {driverInfo.LastName}"; - int cupPosition = carData.RealtimeCarUpdate.CupPosition; - - String lapTime = GetLastLapTime(carData.RealtimeCarUpdate); - String additionInfo = AdditionalInfo(carData.RealtimeCarUpdate); - - standingsTableRows.Add(new StandingsTableRow() - { - Position = cupPosition, - RaceNumber = carData.CarInfo.RaceNumber, - DriverName = diverName, - LapTime = lapTime, - Delta = carData.RealtimeCarUpdate.Delta, - Gab = gab, - AdditionalInfo = additionInfo, - FastestLapTime = fastestLapTime - }); - } - - private String AdditionalInfo(RealtimeCarUpdate realtimeCarUpdate) - { - if (broadCastRealTime.SessionType != RaceSessionType.Race - && broadCastRealTime.SessionType != RaceSessionType.Qualifying) return ""; - - switch (realtimeCarUpdate.CarLocation) - { - case CarLocationEnum.PitEntry: - { - return "PIT Entry"; - } - case CarLocationEnum.PitExit: - { - return "PIT Exit"; - } - case CarLocationEnum.Pitlane: - { - return "Box"; - } - } - - if (realtimeCarUpdate.CurrentLap != null && realtimeCarUpdate.CurrentLap.IsInvalid) - { - return "X"; - } - - return ""; - } - - private String GetLastLapTime(RealtimeCarUpdate realtimeCarUpdate) - { - if (realtimeCarUpdate.LastLap == null || !realtimeCarUpdate.LastLap.LaptimeMS.HasValue) - { - return "--:--.---"; - } - - TimeSpan lapTime = TimeSpan.FromMilliseconds(realtimeCarUpdate.LastLap.LaptimeMS.Value); - return $"{lapTime:mm\\:ss\\.fff}"; - } - - private void SortAllEntryLists() - { - foreach (CarClasses carClass in Enum.GetValues(typeof(CarClasses))) - { - SortEntryList(_entryListForCarClass[carClass]); - } - } - - private void SortEntryList(List> cars) - { - if (cars.Count == 0) return; - - switch (broadCastRealTime.SessionType) - { - case RaceSessionType.Practice: - case RaceSessionType.Race: - { - switch (broadCastRealTime.Phase) - { - case SessionPhase.SessionOver: - case SessionPhase.PreSession: - case SessionPhase.PreFormation: - { - cars.Sort((a, b) => - { - return a.Value.RealtimeCarUpdate.CupPosition.CompareTo(b.Value.RealtimeCarUpdate.CupPosition); - }); - break; - } - default: - { - cars.Sort((a, b) => - { - if (a.Value.CarInfo == null) - return -1; - - if (b.Value.CarInfo == null) - return 1; - - Car carCarA = PositionGraph.Instance.GetCar(a.Value.CarInfo.CarIndex); - Car carCarb = PositionGraph.Instance.GetCar(b.Value.CarInfo.CarIndex); - - if (carCarA == null) return -1; - if (carCarb == null) return 1; - - var aSpline = carCarA.SplinePosition; - var bSpline = carCarb.SplinePosition; - - var aLaps = carCarA.LapIndex; - var bLaps = carCarb.LapIndex; - - float aPosition = aLaps + aSpline / 10; - float bPosition = bLaps + bSpline / 10; - return aPosition.CompareTo(bPosition); - }); - cars.Reverse(); - break; - }; - } - break; - } - - - case RaceSessionType.Qualifying: - { - cars.Sort((a, b) => - { - return a.Value.RealtimeCarUpdate.CupPosition.CompareTo(b.Value.RealtimeCarUpdate.CupPosition); - }); - break; - } - - default: break; - } - } - - private void DetermineDriversClass(List> cars) - { - - if (!_currentAcStatus.Equals(AcStatus.AC_LIVE)) return; - - foreach (KeyValuePair kvp in cars) - { - if (kvp.Key == pageGraphics.PlayerCarID) - { - var carModel = ConversionFactory.GetCarModels(kvp.Value.CarInfo.CarModelType); - _driversClass = ConversionFactory.GetConversion(carModel).CarClass; - - //DriverInfo driverInfo = kvp.Value.CarInfo.Drivers[kvp.Value.CarInfo.CurrentDriverIndex]; - - DriverInfo driverInfo = kvp.Value.CarInfo.Drivers[kvp.Value.CarInfo.CurrentDriverIndex]; - string firstName = driverInfo.FirstName; - if (firstName.Length > 0) firstName = firstName.First() + ""; - _driverLastName = $"{firstName}. {driverInfo.LastName}"; - - //_driverLastName = driverInfo.LastName; - //Debug.WriteLine($"standings overlay - car class {_ownClass} driver name {_driverLastName}"); - - } - } - } - - private void SplitEntryList(List> cars) - { - ClearCarClassEntryList(); - - foreach (KeyValuePair kvp in cars) - { - if (kvp.Value.CarInfo == null) - { - return; - } - - var carModel = ConversionFactory.GetCarModels(kvp.Value.CarInfo.CarModelType); - var carClass = ConversionFactory.GetConversion(carModel).CarClass; - - switch (carClass) - { - case CarClasses.GT3: - _entryListForCarClass[CarClasses.GT3].Add(kvp); - break; - case CarClasses.GT4: - _entryListForCarClass[CarClasses.GT4].Add(kvp); - break; - case CarClasses.CUP: - _entryListForCarClass[CarClasses.CUP].Add(kvp); - break; - case CarClasses.ST: - _entryListForCarClass[CarClasses.ST].Add(kvp); - break; - case CarClasses.TCX: - _entryListForCarClass[CarClasses.TCX].Add(kvp); - break; - case CarClasses.CHL: - _entryListForCarClass[CarClasses.CHL].Add(kvp); - break; - default: - break; - } - } - - } - - } - - public class StandingsTableRow - { - public int Position { get; set; } - public int RaceNumber { get; set; } - public String DriverName { get; set; } - public String LapTime { get; set; } - public int Delta { get; set; } - public String Gab { get; set; } - public bool FastestLapTime { get; set; } - public String AdditionalInfo { get; set; } - } - - public class OverlayStandingsTable - { - public int Height { get; set; } - private readonly int _x; - private readonly int _y; - private readonly int _columnGab = 5; - private readonly int _rowGab = 3; - private readonly int _fontSize = 0; - - private readonly SolidBrush _oddBackground = new SolidBrush(Color.FromArgb(100, Color.Black)); - private readonly SolidBrush _evenBackground = new SolidBrush(Color.FromArgb(180, Color.Black)); - private readonly SolidBrush _driversCarBackground = new SolidBrush(Color.FromArgb(180, Color.DarkSeaGreen)); - - public OverlayStandingsTable(int x, int y, int fontSize) - { - _x = x; - _y = y; - _fontSize = fontSize; - } - - public void Draw(Graphics g, int y, List tableData, int splitRowIndex, SolidBrush classBackground, string header, string ownName, bool showDeltaRow, bool showInvalidLapIndicator) - { - var rowPosY = _y + y; - - if (tableData.Count == 0) return; - - OverlayStandingTableHeaderLabel tableHeader = new OverlayStandingTableHeaderLabel(g, _x, rowPosY, classBackground, FontUtil.FontUnispace(_fontSize)); - tableHeader.Draw(g, Brushes.White, header); - rowPosY += tableHeader.Height + _rowGab; - - for (int i = 0; i < tableData.Count; i++) - { - - var columnPosX = _x; - - SolidBrush backgroundColor = _oddBackground; - if (i % 2 == 0) - { - backgroundColor = _evenBackground; - } - - if (tableData[i].DriverName.Equals(ownName)) - { - backgroundColor = _driversCarBackground; - } - - //String deltaString = $"{tableData[i].Delta / 1000f:F2}".FillStart(6, ' '); - String deltaString = $"{TimeSpan.FromMilliseconds(tableData[i].Delta):ss\\.f}"; - - OverlayStandingsTablePositionLabel position = new OverlayStandingsTablePositionLabel(g, columnPosX, rowPosY, backgroundColor, classBackground, FontUtil.FontUnispace(_fontSize)); - position.Draw(g, tableData[i].Position.ToString()); - - columnPosX += position.Width + _columnGab; - OverlayStandingsTableTextLabel raceNumber = new OverlayStandingsTableTextLabel(g, columnPosX, rowPosY, 4, FontUtil.FontUnispace(_fontSize)); - raceNumber.Draw(g, backgroundColor, (SolidBrush)Brushes.White, Brushes.White, "#" + tableData[i].RaceNumber.ToString(), false); - - columnPosX += raceNumber.Width + _columnGab; - OverlayStandingsTableTextLabel driverName = new OverlayStandingsTableTextLabel(g, columnPosX, rowPosY, 20, FontUtil.FontUnispace(_fontSize)); - driverName.Draw(g, backgroundColor, (SolidBrush)Brushes.Purple, Brushes.White, tableData[i].DriverName, false); - - columnPosX += driverName.Width + _columnGab; - OverlayStandingsTableTextLabel deltaTime = new OverlayStandingsTableTextLabel(g, columnPosX, rowPosY, 5, FontUtil.FontUnispace(_fontSize)); - if (tableData[i].Delta < -100) - { - deltaTime.Draw(g, backgroundColor, (SolidBrush)Brushes.DarkGreen, Brushes.White, "-" + deltaString, true); - } - else if (tableData[i].Delta > 100) - { - deltaTime.Draw(g, backgroundColor, (SolidBrush)Brushes.DarkRed, Brushes.White, "+" + deltaString, true); - } - else - { - deltaTime.Draw(g, backgroundColor, (SolidBrush)Brushes.Red, Brushes.White, " " + deltaString, false); - } - - - columnPosX += deltaTime.Width + _columnGab; - if (showDeltaRow) - { - OverlayStandingsTableTextLabel gabTime = new OverlayStandingsTableTextLabel(g, columnPosX, rowPosY, 3, FontUtil.FontUnispace(_fontSize)); - gabTime.Draw(g, backgroundColor, (SolidBrush)Brushes.Green, Brushes.White, tableData[i].Gab, false); - columnPosX += gabTime.Width + _columnGab; - } - - - OverlayStandingsTableTextLabel laptTime = new OverlayStandingsTableTextLabel(g, columnPosX, rowPosY, 9, FontUtil.FontUnispace(_fontSize)); - laptTime.Draw(g, backgroundColor, (SolidBrush)Brushes.Purple, Brushes.White, tableData[i].LapTime, tableData[i].FastestLapTime); - - if (tableData[i].AdditionalInfo != "") - { - if (tableData[i].AdditionalInfo == "X") - { - if (showInvalidLapIndicator) laptTime.DrawAdditionalInfo(g, Brushes.DarkRed, ""); - } - else - { - laptTime.DrawAdditionalInfo(g, Brushes.DarkGreen, tableData[i].AdditionalInfo); - } - - } - - rowPosY += position.Height + _rowGab; - - if (i == splitRowIndex - 1) rowPosY += 10; - - } - Height = rowPosY; - } - } - - public class OverlayStandingTableHeaderLabel - { - private readonly int _x; - private readonly int _y; - private CachedBitmap _cachedBackground; - private SolidBrush _backgroundBrush; - public int Height { get; } - private readonly Font _fontFamily; - - public OverlayStandingTableHeaderLabel(Graphics g, int x, int y, SolidBrush backgroundBrush, Font font) - { - _x = x; - _y = y; - _fontFamily = font; - _backgroundBrush = backgroundBrush; - var fontSize = g.MeasureString(" ", _fontFamily); - Height = (int)fontSize.Height; - - } - - public void Draw(Graphics g, Brush fontBruch, String text) - { - var fontSize = g.MeasureString(text, _fontFamily); - - if (_cachedBackground == null || fontSize.Width > _cachedBackground.Width) - { - if (_cachedBackground != null) _cachedBackground.Dispose(); - _cachedBackground = new CachedBitmap((int)(fontSize.Width + 10), (int)fontSize.Height, gr => - { - var rectanle = new Rectangle(_x, _y, (int)(fontSize.Width + 10), (int)fontSize.Height); - g.FillRoundedRectangle(_backgroundBrush, rectanle, 3); - }); - } - - _cachedBackground.Draw(g, _x, _y); - var textOffset = 2; - g.DrawStringWithShadow(text, _fontFamily, fontBruch, new PointF(_x, _y + textOffset)); - } - } - - public class OverlayStandingsTableTextLabel - { - private readonly int _x; - private readonly int _y; - private readonly int _height; - private readonly int _maxStringLength; - private readonly Font _fontFamily; - - private readonly int _spacing = 10; // possible to set value in contructor - - public int Width { get; } - - - public OverlayStandingsTableTextLabel(Graphics g, int x, int y, int maxStringLength, Font font) - { - _fontFamily = font; - _maxStringLength = maxStringLength; - _x = x; - _y = y; - - string maxString = new string('K', _maxStringLength); - var fontSize = g.MeasureString(maxString, _fontFamily); - Width = (int)fontSize.Width + _spacing; - _height = (int)fontSize.Height; - - } - - public void Draw(Graphics g, SolidBrush backgroundBrush, SolidBrush highlightBrush, Brush fontBruch, String text, bool highlight) - { - Rectangle graphRect = new Rectangle(_x - (_spacing / 2), _y, (int)Width, (int)_height); - - if (highlight) - { - LinearGradientBrush lgb = new LinearGradientBrush(graphRect, backgroundBrush.Color, highlightBrush.Color, 0f, true); - lgb.SetBlendTriangularShape(.5f, .6f); - g.FillRectangle(lgb, graphRect); - Rectangle hightlightRect = new Rectangle(_x - (_spacing / 2), _y + (int)_height - 4, (int)Width, 4); - g.FillRoundedRectangle(highlightBrush, hightlightRect, 3); - } - else - { - g.FillRoundedRectangle(backgroundBrush, graphRect, 3); - } - - var textOffset = 2; - g.DrawStringWithShadow(TruncateString(text), _fontFamily, fontBruch, new PointF(_x, _y + textOffset)); - - } - - public void DrawAdditionalInfo(Graphics g, Brush brush, String text) - { - var fontSize = g.MeasureString(text, _fontFamily); - - var rectanle = new Rectangle(_x + Width, _y, (int)(fontSize.Width + 10), _height); - var path = GraphicsExtensions.CreateRoundedRectangle(rectanle, 0, _height / 4, _height / 4, 0); - g.FillPath(brush, path); - var textOffset = 2; - g.DrawString(text, _fontFamily, Brushes.White, new PointF(_x + (int)(Width + 5), _y + textOffset)); - - } - - private string TruncateString(String text) - { - return text.Length <= _maxStringLength ? text : text.Substring(0, _maxStringLength); - } - } - - - public class OverlayStandingsTablePositionLabel - { - private readonly int _spacing = 10; - private readonly Font _fontFamily; - - private readonly int _x; - private readonly int _y; - public int Width { get; } - public int Height { get; } - private readonly int _maxFontWidth; - private CachedBitmap _cachedBackground; - - private readonly GraphicsPath _path; - - public OverlayStandingsTablePositionLabel(Graphics g, int x, int y, SolidBrush background, SolidBrush highlight, Font font) - { - - _x = x; - _y = y; - _fontFamily = font; - - string maxString = new string('K', 2); // max two figures are allowed :-) - var fontSize = g.MeasureString(maxString, _fontFamily); - _maxFontWidth = (int)fontSize.Width; - Width = (int)(fontSize.Width) + _spacing; - Height = (int)(fontSize.Height); - - - var rectanle = new Rectangle(_x, _y, Width - (_spacing / 2), Height); - _path = GraphicsExtensions.CreateRoundedRectangle(rectanle, 0, 0, Height / 3, 0); - - _cachedBackground = new CachedBitmap((int)(fontSize.Width + _spacing), (int)fontSize.Height, gr => - { - LinearGradientBrush lgb = new LinearGradientBrush(new Point() { X = _x - _spacing, Y = _y }, new Point() { X = Width + _spacing, Y = _y }, highlight.Color, background.Color); - g.FillPath(lgb, _path); - - var highlightRectanle = new Rectangle(_x, _y, 4, Height); - g.FillRectangle(highlight, highlightRectanle); - }); - - } - - public void Draw(Graphics g, String number) - { - - _cachedBackground.Draw(g, _x, _y); - var numberWidth = g.MeasureString(number, _fontFamily).Width; - var textOffset = 2; - g.DrawString(number, _fontFamily, Brushes.White, new PointF(_x + _spacing / 2 + _maxFontWidth / 2 - numberWidth / 2, _y + textOffset)); - - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayTrackInfo/TrackInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayTrackInfo/TrackInfoOverlay.cs deleted file mode 100644 index 239a701bd..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayTrackInfo/TrackInfoOverlay.cs +++ /dev/null @@ -1,86 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlayTrackInfo -{ - [Overlay(Name = "Track Info", Version = 1.00, OverlayType = OverlayType.Release, - Description = "A panel showing information about the track state: grip, temperatures and wind.\nOptionally showing the global flag, session type and time of day.")] - internal sealed class TrackInfoOverlay : AbstractOverlay - { - private readonly TrackInfoConfig _config = new TrackInfoConfig(); - private class TrackInfoConfig : OverlayConfiguration - { - [ConfigGrouping("Info Panel", "Show or hide additional information in the panel.")] - public InfoPanelGrouping InfoPanel { get; set; } = new InfoPanelGrouping(); - public class InfoPanelGrouping - { - [ToolTip("Shows the global track flag.")] - public bool GlobalFlag { get; set; } = true; - - [ToolTip("Shows the type of the session.")] - public bool SessionType { get; set; } = true; - - [ToolTip("Displays the actual time on track.")] - public bool TimeOfDay { get; set; } = true; - } - - public TrackInfoConfig() - { - this.AllowRescale = true; - } - } - - private readonly InfoPanel _panel = new InfoPanel(10, 240); - - public TrackInfoOverlay(Rectangle rectangle) : base(rectangle, "Track Info") - { - this.Width = 230; - this.Height = _panel.FontHeight * 6; ; - RefreshRateHz = 5; - } - - public sealed override void BeforeStart() - { - if (!this._config.InfoPanel.GlobalFlag) - this.Height -= this._panel.FontHeight; - - if (!this._config.InfoPanel.SessionType) - this.Height -= this._panel.FontHeight; - - if (!this._config.InfoPanel.TimeOfDay) - this.Height -= this._panel.FontHeight; - } - - public sealed override void BeforeStop() { } - - public sealed override void Render(Graphics g) - { - if (this._config.InfoPanel.TimeOfDay) - { - TimeSpan time = TimeSpan.FromMilliseconds(broadCastRealTime.TimeOfDay.TotalMilliseconds * 1000); - this._panel.AddLine("Time", $"{time:hh\\:mm\\:ss}"); - } - - if (this._config.InfoPanel.GlobalFlag) - _panel.AddLine("Flag", ACCSharedMemory.FlagTypeToString(pageGraphics.Flag)); - - if (this._config.InfoPanel.SessionType) - _panel.AddLine("Session", ACCSharedMemory.SessionTypeToString(pageGraphics.SessionType)); - - _panel.AddLine("Grip", pageGraphics.trackGripStatus.ToString()); - string airTemp = Math.Round(pagePhysics.AirTemp, 2).ToString("F2"); - string roadTemp = Math.Round(pagePhysics.RoadTemp, 2).ToString("F2"); - _panel.AddLine("Air - Track", $"{airTemp} C - {roadTemp} C"); - _panel.AddLine("Wind", $"{Math.Round(pageGraphics.WindSpeed, 2)} km/h"); - _panel.Draw(g); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayTyreInfo/TyreInfoOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayTyreInfo/TyreInfoOverlay.cs deleted file mode 100644 index f82b0721d..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayTyreInfo/TyreInfoOverlay.cs +++ /dev/null @@ -1,289 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using System.Drawing; -using System.Drawing.Drawing2D; -using RaceElement.HUD.Overlay.Util; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.ACC.Overlays.OverlayPressureTrace; -using RaceElement.HUD.Overlay.OverlayUtil; -using static RaceElement.Data.SetupConverter; -using System.Drawing.Text; -using System; - -namespace RaceElement.HUD.ACC.Overlays.OverlayTyreInfo -{ - [Overlay(Name = "Tyre Info", Version = 1.00, OverlayType = OverlayType.Release, - Description = "Shows tyre pressures. Additionally shows tyre temperature, brake temps and pad life. Overlays the in-game tyre info.")] - internal sealed class TyreInfoOverlay : AbstractOverlay - { - private readonly TyreInfoConfig _config = new TyreInfoConfig(); - private class TyreInfoConfig : OverlayConfiguration - { - [ConfigGrouping("Info", "Show additional information about the condition of the tyres.")] - public InfoGrouping Information { get; set; } = new InfoGrouping(); - public class InfoGrouping - { - [ToolTip("Displays the percentage of brake pad life above the brake pads.")] - public bool PadLife { get; set; } = true; - - [ToolTip("Displays the average of front and rear brake temperatures under the brake pads.")] - public bool BrakeTemps { get; set; } = true; - - [ToolTip("Displays the tyre temperature for each tyre whilst displaying colors." + - "\nGreen is optimal, Red is too hot, Blue is too cold.")] - public bool TyreTemps { get; set; } = true; - - [ToolTip("Defines the amount of decimals for the tyre pressure text.")] - [IntRange(1, 2, 1)] - public int Decimals { get; set; } = 1; - } - - public TyreInfoConfig() - { - this.AllowRescale = true; - } - } - - private const int InitialWidth = 135; - private const int InitialHeight = 190; - - private const double MaxPadLife = 29; - private readonly Font _fontFamilyLarge; - private readonly Font _fontFamily; - private readonly Font _fontFamilySmall; - private readonly int _yMono; - private readonly int _yMonoSmall; - - public TyreInfoOverlay(Rectangle rectangle) : base(rectangle, "Tyre Info") - { - _fontFamilyLarge = FontUtil.FontUnispace(12); - _fontFamily = FontUtil.FontUnispace(10); - _yMono = _fontFamily.Height / 6; - _fontFamilySmall = FontUtil.FontUnispace(9); - _yMonoSmall = _fontFamilySmall.Height / 5; - this.Width = InitialWidth; - this.Height = InitialHeight; - this.RefreshRateHz = 10; - } - - public sealed override void BeforeStart() - { - } - - public sealed override void BeforeStop() - { - } - - public sealed override void Render(Graphics g) - { - if (this.IsRepositioning) - { - Pen repositionLinePen = new Pen(Brushes.Red, 2 * this.Scale); - g.DrawLine(repositionLinePen, new Point(InitialWidth / 2, 0), new Point(InitialWidth / 2, InitialHeight)); - g.DrawLine(repositionLinePen, new Point(0, InitialHeight / 2), new Point(InitialWidth, InitialHeight / 2)); - } - - DrawTyrePressures(g); - - if (this._config.Information.PadLife) - { - DrawPadWearText(g, 68, 19, Position.Front); - DrawPadWearText(g, 68, 103, Position.Rear); - } - - if (this._config.Information.BrakeTemps) - { - DrawBrakeTemps(g, 68, 71, Position.Front); - DrawBrakeTemps(g, 68, 156, Position.Rear); - } - - if (this._config.Information.TyreTemps) - { - DrawTyreTemp(g, 28, 45, Wheel.FrontLeft); - DrawTyreTemp(g, 106, 45, Wheel.FrontRight); - DrawTyreTemp(g, 28, 129, Wheel.RearLeft); - DrawTyreTemp(g, 106, 129, Wheel.RearRight); - } - } - - private void DrawTyrePressures(Graphics g) - { - TyrePressureRange range = TyrePressures.GetCurrentRange(pageGraphics.TyreCompound, pageStatic.CarModel); - - if (range != null) - { - DrawTyrePressure(g, 0, 0, Wheel.FrontLeft, range); - DrawTyrePressure(g, 76, 0, Wheel.FrontRight, range); - DrawTyrePressure(g, 0, 169, Wheel.RearLeft, range); - DrawTyrePressure(g, 76, 169, Wheel.RearRight, range); - } - } - - private void DrawTyreTemp(Graphics g, int x, int y, Wheel wheel) - { - float temp = pagePhysics.TyreCoreTemperature[(int)wheel]; - - Brush tyreBrush = Brushes.DarkOliveGreen; - - if (temp > 90) - tyreBrush = Brushes.DarkRed; - if (temp < 75) - tyreBrush = Brushes.DarkCyan; - - if (pageGraphics.TyreCompound == "wet_compound") - { - tyreBrush = Brushes.DarkOliveGreen; - if (temp > 65) - tyreBrush = Brushes.DarkRed; - if (temp < 25) - tyreBrush = Brushes.DarkCyan; - } - - - g.SmoothingMode = SmoothingMode.AntiAlias; - g.CompositingQuality = CompositingQuality.HighQuality; - g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; - g.TextContrast = 1; - - - string text = $"{temp:F1}"; - int textWidth = (int)g.MeasureString(text, _fontFamily).Width; - - Rectangle backgroundDimension = new Rectangle(x - textWidth / 2, y, (int)textWidth, _fontFamily.Height); - - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(210, 255, 255, 255)), backgroundDimension, 2); - g.DrawRoundedRectangle(new Pen(tyreBrush), backgroundDimension, 2); - - g.DrawStringWithShadow(text, _fontFamily, tyreBrush, new PointF(x - textWidth / 2, y + _yMono - 1)); - } - - private void DrawBrakeTemps(Graphics g, int x, int y, Position position) - { - float averageBrakeTemps = 0; - switch (position) - { - case Position.Front: - { - float brakeTempLeft = pagePhysics.BrakeTemperature[(int)Wheel.FrontLeft]; - float brakeTempRight = pagePhysics.BrakeTemperature[(int)Wheel.FrontRight]; - averageBrakeTemps = (brakeTempLeft + brakeTempRight) / 2; - break; - } - case Position.Rear: - { - float brakeTempLeft = pagePhysics.BrakeTemperature[(int)Wheel.RearLeft]; - float brakeTempRight = pagePhysics.BrakeTemperature[(int)Wheel.RearRight]; - averageBrakeTemps = (brakeTempLeft + brakeTempRight) / 2; - break; - } - } - - string text = $"{averageBrakeTemps:F0} C"; - int textWidth = (int)g.MeasureString(text, _fontFamilySmall).Width; - - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - TextRenderingHint previousHint = g.TextRenderingHint; - g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; - g.TextContrast = 1; - - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(120, 0, 0, 0)), new Rectangle(x - textWidth / 2, y, (int)textWidth, _fontFamilySmall.Height), 2); - g.DrawStringWithShadow(text, _fontFamilySmall, Brushes.White, new PointF(x - textWidth / 2, y + _yMonoSmall)); - - g.SmoothingMode = previous; - g.TextRenderingHint = previousHint; - } - - private void DrawPadWearText(Graphics g, int x, int y, Position position) - { - double percentage = 0; - switch (position) - { - case Position.Front: - { - float padLifeLeft = pagePhysics.PadLife[(int)Wheel.FrontLeft]; - float padLifeRight = pagePhysics.PadLife[(int)Wheel.FrontRight]; - - float averagePadLife = (padLifeLeft + padLifeRight) / 2; - - percentage = averagePadLife / MaxPadLife; - break; - } - case Position.Rear: - { - float padLifeLeft = pagePhysics.PadLife[(int)Wheel.RearRight]; - float padLifeRight = pagePhysics.PadLife[(int)Wheel.RearRight]; - - float averagePadLife = (padLifeLeft + padLifeRight) / 2; - - percentage = averagePadLife / MaxPadLife; - break; - } - } - - string text = $"{percentage * 100:F0} %"; - int textWidth = (int)g.MeasureString(text, _fontFamilySmall).Width; - - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - TextRenderingHint previousHint = g.TextRenderingHint; - g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; - g.TextContrast = 1; - - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(120, 0, 0, 0)), new Rectangle(x - textWidth / 2, y, (int)textWidth, _fontFamilySmall.Height), 2); - - g.DrawStringWithShadow(text, _fontFamilySmall, Brushes.White, new PointF(x - textWidth / 2, y + _yMonoSmall / 2)); - - g.SmoothingMode = previous; - g.TextRenderingHint = previousHint; - } - - private void DrawTyrePressure(Graphics g, int x, int y, Wheel wheel, TyrePressureRange range) - { - int alpha = 255; - - Color brushColor = Color.FromArgb(alpha, 0, 255, 0); - - if (pagePhysics.WheelPressure[(int)wheel] >= range.OptimalMaximum) - brushColor = Color.FromArgb(alpha, 255, 0, 0); - - if (pagePhysics.WheelPressure[(int)wheel] <= range.OptimalMinimum) - brushColor = Color.FromArgb(alpha, 0, 0, 255); - - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - int width = 58; - g.FillRoundedRectangle(new SolidBrush(brushColor), new Rectangle(x, y, width, 20), 3); - - - CompositingQuality previousComposingQuality = g.CompositingQuality; - TextRenderingHint previousTextRenderingHint = g.TextRenderingHint; - int previousTextContrast = g.TextContrast; - - g.CompositingQuality = CompositingQuality.HighQuality; - g.TextRenderingHint = TextRenderingHint.AntiAlias; - g.TextContrast = 1; - DrawTextWithOutline(g, Color.White, pagePhysics.WheelPressure[(int)wheel].ToString($"F{_config.Information.Decimals}"), x + width / 2, y + 1); - - g.SmoothingMode = previous; - g.CompositingQuality = previousComposingQuality; - g.TextContrast = previousTextContrast; - g.TextRenderingHint = previousTextRenderingHint; - } - - private void DrawTextWithOutline(Graphics g, Color textColor, string text, int x, int y) - { - int textWidth = (int)g.MeasureString(text, _fontFamilyLarge).Width; - Rectangle backgroundDimension = new Rectangle(x - textWidth / 2, y, (int)textWidth, _fontFamilyLarge.Height); - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(210, 0, 0, 0)), backgroundDimension, 2); - g.DrawRoundedRectangle(new Pen(Color.FromArgb(135, 0, 0, 0), 0.6f * this.Scale), backgroundDimension, 2); - g.DrawStringWithShadow(text, _fontFamilyLarge, textColor, new PointF(x - textWidth / 2, y + _fontFamilyLarge.GetHeight(g) / 11f), 1.3f * this.Scale); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/Overlays/OverlayWeather/WeatherOverlay.cs b/Race_Element.HUD.ACC/Overlays/OverlayWeather/WeatherOverlay.cs deleted file mode 100644 index 21543eead..000000000 --- a/Race_Element.HUD.ACC/Overlays/OverlayWeather/WeatherOverlay.cs +++ /dev/null @@ -1,108 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Session; -using RaceElement.HUD.ACC.Data.Tracker.Weather; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Diagnostics; -using System.Drawing; - -namespace RaceElement.HUD.ACC.Overlays.OverlayWeather -{ - internal class WeatherOverlay : AbstractOverlay - { - private readonly WeatherConfiguration _config = new WeatherConfiguration(); - private class WeatherConfiguration : OverlayConfiguration - { - public WeatherConfiguration() - { - this.AllowRescale = true; - } - } - - private readonly InfoPanel _panel; - private WeatherInfo _weather; - private int _timeMultiplier = -1; - - public WeatherOverlay(Rectangle rectangle) : base(rectangle, "Overlay Weather") - { - this.RefreshRateHz = 1; - int panelWidth = 200; - _panel = new InfoPanel(10, panelWidth); - - this.Width = panelWidth + 1; - this.Height = _panel.FontHeight * 5; - - - } - - private void Instance_OnMultiplierChanged(object sender, int e) - { - _timeMultiplier = e; - } - - private void Instance_OnWeatherChanged(object sender, WeatherInfo e) - { - Debug.WriteLine("Weather has changed"); - _weather = e; - } - - public sealed override void BeforeStart() - { - SessionTimeTracker.Instance.OnMultiplierChanged += Instance_OnMultiplierChanged; - WeatherTracker.Instance.OnWeatherChanged += Instance_OnWeatherChanged; - } - - public sealed override void BeforeStop() - { - SessionTimeTracker.Instance.OnMultiplierChanged -= Instance_OnMultiplierChanged; - WeatherTracker.Instance.OnWeatherChanged -= Instance_OnWeatherChanged; - } - - public sealed override void Render(Graphics g) - { - if (_weather != null && _timeMultiplier > 0) - { - float minutesFromChange = (DateTime.Now.ToFileTimeUtc() - _weather.TimeStamp) / 10000000f / 60f; - - TimeSpan timeSpan = TimeSpan.FromSeconds(minutesFromChange * 60f); - _panel.AddLine("last change", $"{timeSpan:mm\\:ss}"); - - _panel.AddLine("Now", _weather.Now.ToString()); - - float in10 = 10f / _timeMultiplier - minutesFromChange; - in10.ClipMin(0); - float in10secondsOnly = in10 % 1; - in10 -= in10secondsOnly; - in10secondsOnly *= 60; - _panel.AddLine($"In {in10:F0}:{in10secondsOnly:F0}", _weather.In10.ToString()); - - - float in20 = 20f / _timeMultiplier - minutesFromChange; - in20.ClipMin(0); - float in20Seconds = in20 % 1; - in20 -= in20Seconds; - in20Seconds *= 60; - _panel.AddLine($"In {in20:F0}:{in20Seconds:F0}", _weather.In20.ToString()); - - float in30 = 30f / _timeMultiplier - minutesFromChange; - in30.ClipMin(0); - float in30Seconds = in30 % 1; - in30 -= in30Seconds; - in30Seconds *= 60; - _panel.AddLine($"In {in30:F0}:{in30Seconds:F0}", _weather.In30.ToString()); - } - - string multiplierText = _timeMultiplier > 0 ? $"{_timeMultiplier}x" : "Detecting"; - _panel.AddLine("Multiplier", $"{multiplierText}"); - - _panel.Draw(g); - } - - public sealed override bool ShouldRender() - { - return DefaultShouldRender(); - } - } -} diff --git a/Race_Element.HUD.ACC/OverlaysACC.cs b/Race_Element.HUD.ACC/OverlaysACC.cs deleted file mode 100644 index 23903b48e..000000000 --- a/Race_Element.HUD.ACC/OverlaysACC.cs +++ /dev/null @@ -1,37 +0,0 @@ -using RaceElement.HUD.Overlay.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - -namespace RaceElement.HUD.ACC -{ - public class OverlaysACC - { - public static SortedDictionary AbstractOverlays = new SortedDictionary(); - public static List ActiveOverlays = new List(); - - public static void GenerateDictionary() - { - AbstractOverlays.Clear(); - - foreach (var type in Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsDefined(typeof(OverlayAttribute)))) - { - var overlayType = type.GetCustomAttribute(); - if (overlayType != null && !AbstractOverlays.ContainsKey(overlayType.Name)) - AbstractOverlays.Add(overlayType.Name, type); - } - } - - public static void CloseAll() - { - lock (ActiveOverlays) - while (ActiveOverlays.Count > 0) - { - //ActiveOverlays.ElementAt(0).EnableReposition(false); - ActiveOverlays.ElementAt(0).Stop(); - ActiveOverlays.Remove(ActiveOverlays.ElementAt(0)); - } - } - } -} diff --git a/Race_Element.HUD.ACC/Properties/AssemblyInfo.cs b/Race_Element.HUD.ACC/Properties/AssemblyInfo.cs deleted file mode 100644 index c97f33703..000000000 --- a/Race_Element.HUD.ACC/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("RaceElement.HUD.ACC")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Element Future")] -[assembly: AssemblyProduct("RaceElement.HUD.ACC")] -[assembly: AssemblyCopyright("Copyright 2022 © Reinier Klarenberg")] -[assembly: AssemblyTrademark("Element Future")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f1699f70-54a1-49f2-896d-b70b1edabf74")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Race_Element.HUD.ACC/Race Element.HUD.ACC.csproj b/Race_Element.HUD.ACC/Race Element.HUD.ACC.csproj deleted file mode 100644 index 2d78c9785..000000000 --- a/Race_Element.HUD.ACC/Race Element.HUD.ACC.csproj +++ /dev/null @@ -1,148 +0,0 @@ - - - - - Debug - AnyCPU - {F1699F70-54A1-49F2-896D-B70B1EDABF74} - Library - Properties - RaceElement.HUD.ACC - RaceElement.HUD.ACC - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - true - - - true - bin\Debug Minimized\ - DEBUG;TRACE - full - AnyCPU - 7.3 - prompt - - - - ..\packages\MouseKeyHook.5.6.0\lib\net40\Gma.System.MouseKeyHook.dll - - - - ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - ..\packages\System.Collections.Immutable.7.0.0\lib\net462\System.Collections.Immutable.dll - - - - - ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll - - - - ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .editorconfig - - - - - - - {840220BD-8469-4A04-A6EC-1ED2BC743EFB} - Race Element.Broadcast - - - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE} - Race Element.Data.ACC - - - {3717A55E-4629-40ED-9C93-24058D9EF18C} - Race Element.HUD - - - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F} - Race Element.SharedMemory - - - {AAB23116-299B-415B-8305-96CB86148CE7} - Race Element.Util - - - - \ No newline at end of file diff --git a/Race_Element.HUD.ACC/app.config b/Race_Element.HUD.ACC/app.config deleted file mode 100644 index 3c508499f..000000000 --- a/Race_Element.HUD.ACC/app.config +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element.HUD.ACC/packages.config b/Race_Element.HUD.ACC/packages.config deleted file mode 100644 index 7ac3e399d..000000000 --- a/Race_Element.HUD.ACC/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/Race_Element.HUD/Fonts/orbitron-medium.ttf b/Race_Element.HUD/Fonts/orbitron-medium.ttf deleted file mode 100644 index 88499ffb6..000000000 Binary files a/Race_Element.HUD/Fonts/orbitron-medium.ttf and /dev/null differ diff --git a/Race_Element.HUD/Fonts/unispace.bold.ttf b/Race_Element.HUD/Fonts/unispace.bold.ttf deleted file mode 100644 index 89a1aadcd..000000000 Binary files a/Race_Element.HUD/Fonts/unispace.bold.ttf and /dev/null differ diff --git a/Race_Element.HUD/Overlay/Configuration/ByteRangeAttribute.cs b/Race_Element.HUD/Overlay/Configuration/ByteRangeAttribute.cs deleted file mode 100644 index 95c5055e5..000000000 --- a/Race_Element.HUD/Overlay/Configuration/ByteRangeAttribute.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.HUD.Overlay.Configuration -{ - public class ByteRangeAttribute : Attribute - { - public byte Min; - public byte Max; - public byte Increment; - - public ByteRangeAttribute(byte min, byte max, byte increment) - { - Min = min; - Max = max; - Increment = increment; - } - - public static byte[] GetOptionsCollection(ByteRangeAttribute intRange) - { - List collection = new List(); - - for (byte i = intRange.Min; i < intRange.Max + intRange.Increment; i += intRange.Increment) - { - collection.Add(i); - } - - return collection.ToArray(); - } - } -} diff --git a/Race_Element.HUD/Overlay/Configuration/FloatRangeAttribute.cs b/Race_Element.HUD/Overlay/Configuration/FloatRangeAttribute.cs deleted file mode 100644 index 3f15738c6..000000000 --- a/Race_Element.HUD/Overlay/Configuration/FloatRangeAttribute.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace RaceElement.HUD.Overlay.Configuration -{ - public class FloatRangeAttribute : Attribute - { - public float Min; - public float Max; - public float Increment; - public int Decimals; - - public FloatRangeAttribute(float min, float max, float increment, int decimals) - { - Min = min; - Max = max; - Increment = increment; - Decimals = decimals; - } - - public static float[] GetOptionsCollection(FloatRangeAttribute floatRange) - { - List collection = new List(); - - for (float i = floatRange.Min; i < floatRange.Max + floatRange.Increment; i += floatRange.Increment) - { - collection.Add(i); - } - - return collection.ToArray(); - } - } -} diff --git a/Race_Element.HUD/Overlay/Configuration/IntRangeAttribute.cs b/Race_Element.HUD/Overlay/Configuration/IntRangeAttribute.cs deleted file mode 100644 index 9116bd509..000000000 --- a/Race_Element.HUD/Overlay/Configuration/IntRangeAttribute.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace RaceElement.HUD.Overlay.Configuration -{ - public class IntRangeAttribute : Attribute - { - public int Min; - public int Max; - public int Increment; - - public IntRangeAttribute(int min, int max, int increment) - { - Min = min; - Max = max; - Increment = increment; - } - - public static int[] GetOptionsCollection(IntRangeAttribute intRange) - { - List collection = new List(); - - for (int i = intRange.Min; i < intRange.Max + intRange.Increment; i += intRange.Increment) - { - collection.Add(i); - } - - return collection.ToArray(); - } - } -} diff --git a/Race_Element.HUD/Overlay/Configuration/OverlayConfiguration.cs b/Race_Element.HUD/Overlay/Configuration/OverlayConfiguration.cs deleted file mode 100644 index 504fda57f..000000000 --- a/Race_Element.HUD/Overlay/Configuration/OverlayConfiguration.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; - -namespace RaceElement.HUD.Overlay.Configuration -{ - public abstract class OverlayConfiguration - { - public bool AllowRescale = false; - - [ConfigGrouping("HUD", "General settings")] - public GenericConfig GenericConfiguration { get; set; } = new GenericConfig(); - public class GenericConfig - { - [ToolTip("Defines the scale of the overlay.")] - [FloatRange(0.50f, 2.00f, 0.01f, 2)] - public float Scale { get; set; } = 1.00f; - - [ToolTip("Sets the transparency of the HUD. This will become noticeable once you active the HUD.")] - [FloatRange(0.25f, 1f, 0.01f, 2)] - public float Opacity { get; set; } = 1f; - - [ToolTip("Allows other software to to detect this overlay as a Window, can be used for streaming apps.")] - public bool Window { get; set; } = false; - - [ToolTip("When streaming with Window enabled turn this off when you don't want to see the actual overlay on top of your game.")] - public bool AlwaysOnTop { get; set; } = true; - } - - public OverlayConfiguration() - { - } - - public class ConfigField - { - public string Name { get; set; } - public object Value { get; set; } - } - - public static List GetConfigFields(OverlayConfiguration overlayConfiguration) - { - List configFields = new List(); - var runtimeProperties = overlayConfiguration.GetType().GetRuntimeProperties(); - foreach (PropertyInfo nested in runtimeProperties) - { - ConfigGroupingAttribute groupingAttribute; - if ((groupingAttribute = nested.GetCustomAttribute()) != null) - { - var nestedValue = nested.GetValue(overlayConfiguration); - foreach (PropertyInfo subNested in nested.PropertyType.GetRuntimeProperties()) - { - configFields.Add(new ConfigField() { Name = $"{nested.Name}.{subNested.Name}", Value = subNested.GetValue(nestedValue) }); - } - } - else - { - configFields.Add(new ConfigField() { Name = nested.Name, Value = nested.GetValue(overlayConfiguration) }); - } - } - - return configFields; - } - - internal void SetConfigFields(List configFields) - { - if (configFields == null) - return; - - Type type = this.GetType(); - var runtimeProperties = type.GetRuntimeProperties(); - - foreach (var field in configFields) - { - bool isGrouped = field.Name.Contains("."); - if (isGrouped) - { - string[] groupSplit = field.Name.Split('.'); - string groupName = groupSplit[0]; - string propName = groupSplit[1]; - //Debug.WriteLine($"Group: {groupName}, PropName: {propName}"); - foreach (var prop in runtimeProperties) - { - if (prop.Name == groupName) - { - var nestedValue = prop.GetValue(this); - foreach (PropertyInfo subNested in nestedValue.GetType().GetRuntimeProperties()) - { - if (subNested.Name == propName) - { - if (subNested.PropertyType == typeof(Single)) - subNested.SetValue(nestedValue, Single.Parse(field.Value.ToString())); - else - if (subNested.PropertyType == typeof(int)) - subNested.SetValue(nestedValue, int.Parse(field.Value.ToString())); - else - if (subNested.PropertyType == typeof(bool)) - subNested.SetValue(nestedValue, field.Value); - else - if (subNested.PropertyType == typeof(byte)) - subNested.SetValue(nestedValue, byte.Parse(field.Value.ToString())); - } - } - - - } - } - } - else - { - foreach (var prop in runtimeProperties) - { - if (prop.Name == field.Name) - { - if (prop.PropertyType == typeof(Single)) - prop.SetValue(this, Single.Parse(field.Value.ToString())); - else - if (prop.PropertyType == typeof(int)) - prop.SetValue(this, int.Parse(field.Value.ToString())); - else - if (prop.PropertyType == typeof(bool)) - prop.SetValue(this, field.Value); - else - if (prop.PropertyType == typeof(byte)) - prop.SetValue(this, byte.Parse(field.Value.ToString())); - } - } - } - } - } - - public List GetProperties() - { - List properties = this.GetType().GetRuntimeProperties().ToList(); - return properties; - } - - } -} diff --git a/Race_Element.HUD/Overlay/Configuration/OverlayConfigurationGrouping.cs b/Race_Element.HUD/Overlay/Configuration/OverlayConfigurationGrouping.cs deleted file mode 100644 index bf25b1da0..000000000 --- a/Race_Element.HUD/Overlay/Configuration/OverlayConfigurationGrouping.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.HUD.Overlay.Configuration -{ - public class ConfigGroupingAttribute : Attribute - { - public string Title; - public string Description; - - public ConfigGroupingAttribute(string title, string description) - { - Title = title; - Description = description; - } - } -} diff --git a/Race_Element.HUD/Overlay/Configuration/OverlaySettings.cs b/Race_Element.HUD/Overlay/Configuration/OverlaySettings.cs deleted file mode 100644 index 8fe866c52..000000000 --- a/Race_Element.HUD/Overlay/Configuration/OverlaySettings.cs +++ /dev/null @@ -1,154 +0,0 @@ -using RaceElement.Util; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; - -namespace RaceElement.HUD.Overlay.Configuration -{ - public class OverlaySettings - { - public class OverlaySettingsJson - { - public bool Enabled; - public int X, Y; - public List Config; - } - - private static DirectoryInfo GetOverlayDirectory() - { - DirectoryInfo overlayDir = new DirectoryInfo(FileUtil.RaceElementOverlayPath); - - if (!overlayDir.Exists) - { - overlayDir.Create(); - } - - return overlayDir; - } - - public static OverlaySettingsJson LoadOverlaySettings(string overlayName) - { - DirectoryInfo overlayDir = GetOverlayDirectory(); - - FileInfo[] overlayFiles = overlayDir.GetFiles($"*.json"); - foreach (FileInfo overlayFile in overlayFiles) - { - if (overlayFile.Name.Replace(".json", "") == overlayName) - { - OverlaySettingsJson overlay = LoadSettings(overlayFile); - - if (overlay == null) - { - overlay = new OverlaySettingsJson(); - } - - return overlay; - } - } - - return new OverlaySettingsJson(); ; - } - - public static OverlaySettingsJson SaveOverlaySettings(string overlayName, OverlaySettingsJson settings) - { - DirectoryInfo tagDir = GetOverlayDirectory(); - - FileInfo[] tagFiles = tagDir.GetFiles($"{overlayName}.json"); - FileInfo overlaySettingsFile = null; - - if (tagFiles.Length == 0) - { - overlaySettingsFile = new FileInfo($"{FileUtil.RaceElementOverlayPath}{overlayName}.json"); - } - else - { - foreach (FileInfo file in tagFiles) - { - if (file.Name == $"{overlayName}.json") - { - overlaySettingsFile = file; - break; - } - } - } - - if (overlaySettingsFile == null) - overlaySettingsFile = new FileInfo($"{FileUtil.RaceElementOverlayPath}{overlayName}.json"); - - string jsonString = JsonConvert.SerializeObject(settings, Formatting.Indented); - - try - { - if (overlaySettingsFile != null) - { - overlaySettingsFile.Delete(); - } - - File.WriteAllText(overlaySettingsFile.FullName, jsonString); - } - catch (Exception) - { - return settings; - } - - return settings; - } - - - private static OverlaySettingsJson LoadSettings(FileInfo file) - { - if (!file.Exists) - return null; - - try - { - using (FileStream fileStream = file.OpenRead()) - { - OverlaySettingsJson settings = LoadSettings(fileStream); - fileStream.Close(); - return settings; - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - return null; - } - - private static OverlaySettingsJson LoadSettings(Stream stream) - { - string jsonString = string.Empty; - OverlaySettingsJson settings = null; - try - { - using (StreamReader reader = new StreamReader(stream)) - { - jsonString = reader.ReadToEnd(); - jsonString = jsonString.Replace("\0", ""); - reader.Close(); - stream.Close(); - } - - settings = JsonConvert.DeserializeObject(jsonString); - } - catch (Exception e) - { - Debug.WriteLine(e); - } - finally - { - if (stream != null) - { - stream.Close(); - stream.Dispose(); - } - } - - return settings; - } - } -} diff --git a/Race_Element.HUD/Overlay/Configuration/ToolTipAttribute.cs b/Race_Element.HUD/Overlay/Configuration/ToolTipAttribute.cs deleted file mode 100644 index f87740b60..000000000 --- a/Race_Element.HUD/Overlay/Configuration/ToolTipAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace RaceElement.HUD.Overlay.Configuration -{ - public class ToolTipAttribute : Attribute - { - public string ToolTip { get; private set; } = string.Empty; - public ToolTipAttribute(string toolTip) - { - this.ToolTip = toolTip; - } - } -} diff --git a/Race_Element.HUD/Overlay/Internal/AbstractOverlay.cs b/Race_Element.HUD/Overlay/Internal/AbstractOverlay.cs deleted file mode 100644 index 35f82afc0..000000000 --- a/Race_Element.HUD/Overlay/Internal/AbstractOverlay.cs +++ /dev/null @@ -1,394 +0,0 @@ -using RaceElement.Util.Settings; -using RaceElement.Broadcast.Structs; -using RaceElement.Data.ACC.Core; -using RaceElement.Data.ACC.Session; -using RaceElement.Data.ACC.Tracker; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Linq; -using System.Reflection; -using System.Threading; -using System.Windows.Forms; -using static RaceElement.ACCSharedMemory; -using static RaceElement.HUD.Overlay.Configuration.OverlaySettings; -using Point = System.Drawing.Point; - -namespace RaceElement.HUD.Overlay.Internal -{ - public abstract class AbstractOverlay : FloatingWindow - { - public abstract void BeforeStart(); - public abstract void BeforeStop(); - public abstract bool ShouldRender(); - public abstract void Render(Graphics g); - - private bool Draw = false; - - public bool IsRepositioning { get; internal set; } - - public int RefreshRateHz = 30; - - public SPageFilePhysics pagePhysics; - public SPageFileGraphic pageGraphics; - public SPageFileStatic pageStatic; - public RealtimeUpdate broadCastRealTime; - public TrackData broadCastTrackData; - public RealtimeCarUpdate broadCastLocalCar; - - public bool RequestsDrawItself = false; - - public bool AllowReposition { get; set; } = true; - - public float Scale { get; private set; } = 1f; - private bool _allowRescale = false; - - protected AbstractOverlay(Rectangle rectangle, string Name) - { - this.X = rectangle.X; - this.Y = rectangle.Y; - this.Width = rectangle.Width; - this.Height = rectangle.Height; - this.Name = Name; - - try - { - if (AllowReposition) - ApplyOverlaySettings(); - - LoadFieldConfig(); - } - catch (Exception) { } - - - - } - - public bool DefaultShouldRender() - { - if (HudSettings.Cached.DemoMode) - return true; - - if (IsRepositioning) - return true; - - if (!AccProcess.IsRunning) - return false; - - bool shouldRender = true; - - if (pageGraphics != null) - { - if (pageGraphics.Status == ACCSharedMemory.AcStatus.AC_OFF || pageGraphics.Status == ACCSharedMemory.AcStatus.AC_PAUSE || (pageGraphics.IsInPitLane == true && !pagePhysics.IgnitionOn)) - shouldRender = false; - - if (pageGraphics.GlobalRed) - shouldRender = false; - - if (RaceSessionState.IsFormationLap(pageGraphics.GlobalRed, broadCastRealTime.Phase)) - shouldRender = true; - - if (pageGraphics.Status == ACCSharedMemory.AcStatus.AC_PAUSE) - shouldRender = false; - } - - return shouldRender; - } - - private void LoadFieldConfig() - { - FieldInfo[] fields = this.GetType().GetRuntimeFields().ToArray(); - foreach (var nested in fields) - { - if (nested.FieldType.BaseType == typeof(OverlayConfiguration)) - { - var overlayConfig = (OverlayConfiguration)Activator.CreateInstance(nested.FieldType, new object[] { }); - - string name = this.GetType().GetCustomAttribute().Name; - OverlaySettingsJson savedSettings = OverlaySettings.LoadOverlaySettings(name); - - if (savedSettings == null) - return; - - overlayConfig.SetConfigFields(savedSettings.Config); - - nested.SetValue(this, overlayConfig); - - if (overlayConfig.AllowRescale) - { - this._allowRescale = true; - this.Scale = overlayConfig.GenericConfiguration.Scale; - } - - this.Alpha = (byte)(255 * overlayConfig.GenericConfiguration.Opacity); - - if (overlayConfig.GenericConfiguration.Window) - this.WindowMode = overlayConfig.GenericConfiguration.Window; - - this.AlwaysOnTop = overlayConfig.GenericConfiguration.AlwaysOnTop; - } - } - } - - private void ApplyOverlaySettings() - { - OverlaySettingsJson settings = OverlaySettings.LoadOverlaySettings(this.Name); - if (settings != null) - { - this.X = settings.X; - this.Y = settings.Y; - } - } - - public bool hasClosed = true; - public void Start(bool addTrackers = true) - { - try - { - if (addTrackers) - { - PageStaticTracker.Tracker += PageStaticChanged; - PageGraphicsTracker.Instance.Tracker += PageGraphicsChanged; - PagePhysicsTracker.Instance.Tracker += PagePhysicsChanged; - BroadcastTracker.Instance.OnRealTimeUpdate += BroadCastRealTimeChanged; - BroadcastTracker.Instance.OnTrackDataUpdate += BroadCastTrackDataChanged; - BroadcastTracker.Instance.OnRealTimeLocalCarUpdate += BroadCastRealTimeLocalCarUpdateChanged; - } - - pageStatic = ACCSharedMemory.Instance.ReadStaticPageFile(false); - pageGraphics = ACCSharedMemory.Instance.ReadGraphicsPageFile(false); - pagePhysics = ACCSharedMemory.Instance.ReadPhysicsPageFile(false); - - try - { - BeforeStart(); - } - catch (Exception ex) - { - Debug.WriteLine(ex); - LogWriter.WriteToLog(ex); - } - if (_allowRescale) - { - this.Width = (int)Math.Ceiling(this.Width * Scale); - this.Height = (int)Math.Ceiling(this.Height * Scale); - } - - - Draw = true; - this.Show(); - this.hasClosed = false; - if (!RequestsDrawItself) - { - new Thread(x => - { - double refreshRate = 1.0 / this.RefreshRateHz; - DateTime lastRefreshTime = DateTime.UtcNow; - - while (Draw) - { - DateTime nextRefreshTime = lastRefreshTime.AddSeconds(refreshRate); - TimeSpan waitTime = nextRefreshTime - DateTime.UtcNow; - lastRefreshTime = nextRefreshTime; - if (waitTime.Ticks > 0) - Thread.Sleep(waitTime); - - if (this == null || this._disposed) - { - this.Stop(); - return; - } - - if (ShouldRender() || IsRepositioning) - this.UpdateLayeredWindow(); - else - { - if (!hasClosed) - { - hasClosed = true; - if (WindowMode) // Don't destroy the handle of this window since some stream/vr apps cannot "redetect" the hud window. - this.UpdateLayeredWindow(); - else - this.Hide(); - } - } - } - - Debug.WriteLine("Render loop finished"); - //this.Stop(); - }).Start(); - } - } - catch (Exception ex) { Debug.WriteLine(ex); } - } - - private void BroadCastRealTimeLocalCarUpdateChanged(object sender, RealtimeCarUpdate e) - { - broadCastLocalCar = e; - } - - private void BroadCastTrackDataChanged(object sender, TrackData e) - { - broadCastTrackData = e; - } - - private void BroadCastRealTimeChanged(object sender, Broadcast.Structs.RealtimeUpdate e) - { - broadCastRealTime = e; - } - - public void RequestRedraw() - { - if (hasClosed) - { - this.Show(); - hasClosed = false; - } - - this.UpdateLayeredWindow(); - } - - private void PagePhysicsChanged(object sender, SPageFilePhysics e) - { - pagePhysics = e; - } - - private void PageGraphicsChanged(object sender, SPageFileGraphic e) - { - pageGraphics = e; - } - - private void PageStaticChanged(object sender, SPageFileStatic e) - { - pageStatic = e; - } - - public void Stop(bool animate = false) - { - if (animate) - this.HideAnimate(AnimateMode.Blend | AnimateMode.ExpandCollapse, 200); - - //this.EnableReposition(false); - try - { - BeforeStop(); - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - PageStaticTracker.Tracker -= PageStaticChanged; - PageGraphicsTracker.Instance.Tracker -= PageGraphicsChanged; - PagePhysicsTracker.Instance.Tracker -= PagePhysicsChanged; - BroadcastTracker.Instance.OnRealTimeUpdate -= BroadCastRealTimeChanged; - BroadcastTracker.Instance.OnTrackDataUpdate -= BroadCastTrackDataChanged; - BroadcastTracker.Instance.OnRealTimeLocalCarUpdate -= BroadCastRealTimeLocalCarUpdateChanged; - - Draw = false; - - this.Close(); - } - - protected sealed override void PerformPaint(PaintEventArgs e) - { - if (base.Handle == IntPtr.Zero) - return; - - if (Draw) - { - if (ShouldRender() || IsRepositioning) - { - try - { - if (hasClosed) - { - this.Show(); - hasClosed = false; - } - - if (IsRepositioning) - e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(95, Color.Red)), new Rectangle(0, 0, Width, Height)); - - if (_allowRescale) - e.Graphics.ScaleTransform(Scale, Scale); - - CompositingQuality previousComposingQuality = e.Graphics.CompositingQuality; - SmoothingMode previousSmoothingMode = e.Graphics.SmoothingMode; - TextRenderingHint previousTextRenderHint = e.Graphics.TextRenderingHint; - int previousTextConstrast = e.Graphics.TextContrast; - - - Render(e.Graphics); - - e.Graphics.CompositingQuality = previousComposingQuality; - e.Graphics.SmoothingMode = previousSmoothingMode; - e.Graphics.TextRenderingHint = previousTextRenderHint; - e.Graphics.TextContrast = previousTextConstrast; - e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; - } - catch (Exception ex) - { - Debug.WriteLine(ex); - LogWriter.WriteToLog(ex); - } - } - else - { - if (!hasClosed) - { - e.Graphics.Clear(Color.Transparent); - hasClosed = true; - } - } - } - } - - public void EnableReposition(bool enabled) - { - if (!AllowReposition) - return; - - lock (this) - { - try - { - if (enabled) - { - this.IsRepositioning = enabled; - this.SetDraggy(true); - } - else - { - if (base.Handle == null) - { - this.Show(); - return; - } - - // save overlay settings - OverlaySettingsJson settings = OverlaySettings.LoadOverlaySettings(this.Name); - if (settings == null) - return; - Point point = Monitors.IsInsideMonitor(X, Y, this.Size.Width, this.Size.Height, this.Handle); - settings.X = point.X; - settings.Y = point.Y; - - OverlaySettings.SaveOverlaySettings(this.Name, settings); - - this.SetDraggy(false); - this.IsRepositioning = enabled; - UpdateLayeredWindow(); - } - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - } - } -} diff --git a/Race_Element.HUD/Overlay/Internal/FloatingWindow.cs b/Race_Element.HUD/Overlay/Internal/FloatingWindow.cs deleted file mode 100644 index 6f30fb450..000000000 --- a/Race_Element.HUD/Overlay/Internal/FloatingWindow.cs +++ /dev/null @@ -1,1107 +0,0 @@ -using System; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using static RaceElement.HUD.Overlay.Internal.WindowStructs; - -namespace RaceElement.HUD.Overlay.Internal -{ - public class FloatingWindow : NativeWindow, IDisposable - { - public string Name { get; internal set; } - internal bool WindowMode { get; set; } = false; - internal bool AlwaysOnTop { get; set; } = true; - - - - #region # Enums # - public enum AnimateMode - { - Blend, - SlideRightToLeft, - SlideLeftToRight, - SlideTopToBottom, - SlideBottmToTop, - RollRightToLeft, - RollLeftToRight, - RollTopToBottom, - RollBottmToTop, - ExpandCollapse - } - #endregion - - #region # Fields # - protected bool _disposed = false; - private byte _alpha = 255; - private Size _size = new Size(250, 50); - private Point _location = new Point(50, 50); - #endregion - - #region # Methods # - - #region == Painting == - /// - /// Performs the painting of the window. Overide this method to provide custom painting - /// - /// A containing the event data. - protected virtual void PerformPaint(PaintEventArgs e) - { - } - #endregion - - #region == Updating == - protected internal void Invalidate() - { - this.UpdateLayeredWindow(); - } - - protected void UpdateLayeredWindow() - { - try - { - Bitmap bitmap1 = new Bitmap(this.Size.Width, this.Size.Height, PixelFormat.Format32bppPArgb); - using (Graphics graphics1 = Graphics.FromImage(bitmap1)) - { - Rectangle rectangle1; - SIZE size1; - POINT point1; - POINT point2; - BLENDFUNCTION blendfunction1; - rectangle1 = new Rectangle(0, 0, this.Size.Width, this.Size.Height); - this.PerformPaint(new PaintEventArgs(graphics1, rectangle1)); - IntPtr ptr1 = User32.GetDC(IntPtr.Zero); - IntPtr ptr2 = Gdi32.CreateCompatibleDC(ptr1); - IntPtr ptr3 = bitmap1.GetHbitmap(Color.FromArgb(0)); - IntPtr ptr4 = Gdi32.SelectObject(ptr2, ptr3); - size1.cx = this.Size.Width; - size1.cy = this.Size.Height; - point1.X = this.Location.X; - point1.Y = this.Location.Y; - point2.X = 0; - point2.Y = 0; - blendfunction1 = new BLENDFUNCTION(); - blendfunction1.BlendOp = 0; - blendfunction1.BlendFlags = 0; - blendfunction1.SourceConstantAlpha = this._alpha; - blendfunction1.AlphaFormat = 1; - User32.UpdateLayeredWindow(base.Handle, ptr1, ref point1, ref size1, ptr2, ref point2, 0, ref blendfunction1, 2); //2=ULW_ALPHA - Gdi32.SelectObject(ptr2, ptr4); - User32.ReleaseDC(IntPtr.Zero, ptr1); - Gdi32.DeleteObject(ptr3); - Gdi32.DeleteDC(ptr2); - } - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - - #endregion - - #region == Show / Hide == - /// - /// Shows the window. Position determined by Location property in screen coordinates - /// - public virtual void Show() - { - //Debug.WriteLine("base handle: " + base.Handle); - if (base.Handle == IntPtr.Zero) - { //if handle don't equal to zero - window was created and just hided - //Debug.WriteLine("Creating window only with normal style"); - this.CreateWindowOnly(GetExStyle()); - } - - User32.ShowWindow(base.Handle, User32.SW_SHOWNOACTIVATE); - //Debug.WriteLine("Showing window"); - //SetBoundsCore(X, Y, Width, Height); - } - - public virtual void SetDraggy(bool toggle) - { - if (base.Handle == IntPtr.Zero) - { //if handle don't equal to zero - window was created and just hided - //Debug.WriteLine($"Creating window only with draggy style: {toggle}"); - this.CreateWindowOnly(toggle ? GetExStyleDrag() : GetExStyle()); - } - - //Debug.WriteLine($"Settings Draggy style: {toggle}"); - - //Debug.WriteLine("Current style" + User32.GetWindowLong(this.Handle, -20)); - //Debug.WriteLine("Drag style " + GetExStyleDrag()); - //Debug.WriteLine("Normal style" + GetExStyle()); - - if (toggle) - User32.SetWindowLong(base.Handle, -20, (uint)GetExStyleDrag()); - else - User32.SetWindowLong(base.Handle, -20, (uint)GetExStyle()); - - //SetBoundsCore(X, Y, Width, Height); - User32.ShowWindow(base.Handle, User32.SW_SHOWNOACTIVATE); - } - - /// - /// Shows the window. - /// - /// x-coordinate of window in screen coordinates - /// x-coordinate of window in screen coordinates - public virtual void Show(int x, int y) - { - this._location.X = x; - this._location.Y = y; - this.Show(); - } - /// - /// Shows the window with animation effect. Position determined by Location property in screen coordinates - /// - /// Effect to be applied - /// Time, in milliseconds, for effect playing - public virtual void ShowAnimate(AnimateMode mode, uint time) - { - uint dwFlag = 0; - switch (mode) - { - case AnimateMode.Blend: - dwFlag = User32.AW_BLEND; - break; - case AnimateMode.ExpandCollapse: - dwFlag = User32.AW_CENTER; - break; - case AnimateMode.SlideLeftToRight: - dwFlag = User32.AW_HOR_POSITIVE | User32.AW_SLIDE; - break; - case AnimateMode.SlideRightToLeft: - dwFlag = User32.AW_HOR_NEGATIVE | User32.AW_SLIDE; - break; - case AnimateMode.SlideTopToBottom: - dwFlag = User32.AW_VER_POSITIVE | User32.AW_SLIDE; - break; - case AnimateMode.SlideBottmToTop: - dwFlag = User32.AW_VER_NEGATIVE | User32.AW_SLIDE; - break; - case AnimateMode.RollLeftToRight: - dwFlag = User32.AW_HOR_POSITIVE; - break; - case AnimateMode.RollRightToLeft: - dwFlag = User32.AW_HOR_NEGATIVE; - break; - case AnimateMode.RollBottmToTop: - dwFlag = User32.AW_VER_NEGATIVE; - break; - case AnimateMode.RollTopToBottom: - dwFlag = User32.AW_VER_POSITIVE; - break; - } - if (base.Handle == IntPtr.Zero) - this.CreateWindowOnly(GetExStyle()); - if ((dwFlag & User32.AW_BLEND) != 0) - this.AnimateWithBlend(true, time); - else - User32.AnimateWindow(base.Handle, time, dwFlag); - } - /// - /// Shows the window with animation effect. - /// - /// x-coordinate of window in screen coordinates - /// x-coordinate of window in screen coordinates - /// Effect to be applied - /// Time, in milliseconds, for effect playing - public virtual void ShowAnimate(int x, int y, AnimateMode mode, uint time) - { - this._location.X = x; - this._location.Y = y; - this.ShowAnimate(mode, time); - } - /// - /// Hides the window and release it's handle. - /// - public virtual void Hide() - { - if (base.Handle == IntPtr.Zero) - return; - - //Debug.WriteLine("Hiding Window"); - User32.ShowWindow(base.Handle, User32.SW_HIDE); - } - /// - /// Hides the window with animation effect and release it's handle. - /// - /// Effect to be applied - /// Time, in milliseconds, for effect playing - public virtual void HideAnimate(AnimateMode mode, uint time) - { - if (base.Handle == IntPtr.Zero) - return; - uint dwFlag = 0; - switch (mode) - { - case AnimateMode.Blend: - dwFlag = User32.AW_BLEND; - break; - case AnimateMode.ExpandCollapse: - dwFlag = User32.AW_CENTER; - break; - case AnimateMode.SlideLeftToRight: - dwFlag = User32.AW_HOR_POSITIVE | User32.AW_SLIDE; - break; - case AnimateMode.SlideRightToLeft: - dwFlag = User32.AW_HOR_NEGATIVE | User32.AW_SLIDE; - break; - case AnimateMode.SlideTopToBottom: - dwFlag = User32.AW_VER_POSITIVE | User32.AW_SLIDE; - break; - case AnimateMode.SlideBottmToTop: - dwFlag = User32.AW_VER_NEGATIVE | User32.AW_SLIDE; - break; - case AnimateMode.RollLeftToRight: - dwFlag = User32.AW_HOR_POSITIVE; - break; - case AnimateMode.RollRightToLeft: - dwFlag = User32.AW_HOR_NEGATIVE; - break; - case AnimateMode.RollBottmToTop: - dwFlag = User32.AW_VER_NEGATIVE; - break; - case AnimateMode.RollTopToBottom: - dwFlag = User32.AW_VER_POSITIVE; - break; - } - dwFlag |= User32.AW_HIDE; - if ((dwFlag & User32.AW_BLEND) != 0) - this.AnimateWithBlend(false, time); - else - User32.AnimateWindow(base.Handle, time, dwFlag); - this.Hide(); - } - /// - /// Close the window and destroy it's handle. - /// - public virtual void Close() - { - if (this.Handle != IntPtr.Zero) - this.Hide(); - this.Dispose(); - } - - private void AnimateWithBlend(bool show, uint time) - { - byte originalAplha = this._alpha; - byte p = (byte)(originalAplha / (time / 10)); - if (p == 0) p++; - if (show) - { - this._alpha = 0; - this.UpdateLayeredWindow(); - User32.ShowWindow(base.Handle, User32.SW_SHOWNOACTIVATE); - } - for (byte i = show ? (byte)0 : originalAplha; (show ? i <= originalAplha : i >= (byte)0); i += (byte)(p * (show ? 1 : -1))) - { - this._alpha = i; - this.UpdateLayeredWindow(); - if ((show && i > originalAplha - p) || (!show && i < p)) - break; - } - this._alpha = originalAplha; - if (show) - this.UpdateLayeredWindow(); - } - - private void CreateWindowOnly(int exStyle) - { - int nX = this._location.X; - int nY = this._location.Y; - this._location = Monitors.IsInsideMonitor(nX, nY, this._size.Width, this._size.Height, this.Handle); - Size size1 = this._size; - Point point1 = this._location; - CreateParams params1 = new CreateParams(); - params1.Caption = Name; - params1.X = _location.X; - params1.Y = _location.Y; - params1.Height = size1.Height; - params1.Width = size1.Width; - params1.Parent = IntPtr.Zero; - uint ui = User32.WS_POPUP; - params1.Style = (int)ui; - params1.ExStyle = (int)exStyle; - - try - { - this.CreateHandle(params1); - this.UpdateLayeredWindow(); - } - catch (InvalidOperationException) { } - } - #endregion - - public int GetExStyle() - { - int exStyle = User32.WS_EX_LAYERED | User32.WS_EX_TRANSPARENT; - - if (!WindowMode) - { - exStyle |= User32.WS_EX_TOOLWINDOW; - exStyle |= User32.WS_EX_NOACTIVATE; - } - - if (AlwaysOnTop) - exStyle |= User32.WS_EX_TOPMOST; - - return exStyle; - } - - public int GetExStyleDrag() - { - int exStyle = User32.WS_EX_LAYERED | User32.WS_EX_TOPMOST | User32.WS_EX_NOACTIVATE | 0x00020000; - return exStyle; - } - - #region == Other messages == - private void PerformWmPaint_WmPrintClient(ref Message m, bool isPaintMessage) - { - try - { - PAINTSTRUCT paintstruct1; - RECT rect1; - Rectangle rectangle1; - paintstruct1 = new PAINTSTRUCT(); - IntPtr ptr1 = isPaintMessage ? User32.BeginPaint(m.HWnd, ref paintstruct1) : m.WParam; - rect1 = new RECT(); - User32.GetWindowRect(base.Handle, ref rect1); - rectangle1 = new Rectangle(0, 0, rect1.right - rect1.left, rect1.bottom - rect1.top); - using (Graphics graphics1 = Graphics.FromHdc(ptr1)) - { - Bitmap bitmap1 = new Bitmap(rectangle1.Width, rectangle1.Height); - using (Graphics graphics2 = Graphics.FromImage(bitmap1)) - this.PerformPaint(new PaintEventArgs(graphics2, rectangle1)); - graphics1.DrawImageUnscaled(bitmap1, 0, 0); - } - if (isPaintMessage) - User32.EndPaint(m.HWnd, ref paintstruct1); - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - - [DllImport("user32.dll")] - private static extern bool GetCursorPos(out POINT lpPoint); - - private static POINT GetCursorPosition() - { - POINT lpPoint; - GetCursorPos(out lpPoint); - // NOTE: If you need error handling - // bool success = GetCursorPos(out lpPoint); - // if (!success) - - return lpPoint; - } - - private bool PerformWmNcHitTest(ref Message m) - { - POINT point1 = GetCursorPosition(); - point1.X -= _location.X; - point1.Y -= _location.Y; - Rectangle rect = new Rectangle(_location.Y, _location.X, _size.Width, _size.Height); - if (!rect.Contains(point1.X, point1.Y)) - return false; - - m.Result = (IntPtr)(-1); - return true; - } - - - protected override void WndProc(ref Message m) - { - - if (m.Msg == 15) // WM_PAINT - { - this.PerformWmPaint_WmPrintClient(ref m, true); - //return; - } - - else if (m.Msg == 0x318) // WM_PRINTCLIENT - { - this.PerformWmPaint_WmPrintClient(ref m, false); - return; - } - - switch (m.Msg) - { - case 0x21: // WM_MOUSEACTIVATE - { - this.PerformWmMouseActivate(ref m); - return; - } - //case 0x84: // WM_NCHITTEST - // { - // Debug.WriteLine("WM_NCHITTEST"); - // //if (!this.PerformWmNcHitTest(ref m)) - // //{ - // // Debug.WriteLine("not in"); - // //} - // } - case 0x200: // WM_MOUSEMOVE - //Debug.WriteLine("WM_MOUSEMOVE"); - - if (!this.isMouseIn) - { - this.OnMouseEnter(); - this.isMouseIn = true; - } - Point p6 = new Point(m.LParam.ToInt32()); - this.OnMouseMove(new MouseEventArgs(Control.MouseButtons, 1, p6.X, p6.X, 0)); - if (this.onMouseMove) - { - this.PerformWmMouseMove(ref m); - this.onMouseMove = false; - } - break; - case 0x201: // WM_MOUSEDOWN - { - //Debug.WriteLine("WM_MOUSEDOWN"); - POINT point1; - this.lastMouseDown = new Point(m.LParam.ToInt32()); - point1 = new POINT(); - point1.X = this.lastMouseDown.X; - point1.Y = this.lastMouseDown.Y; - point1 = this.MousePositionToScreen(point1); - deltaX = point1.X - this.Location.X; - deltaY = point1.Y - this.Location.Y; - //Debug.WriteLine($"mouse is in {lastMouseDown}"); - - - this.OnMouseDown(new MouseEventArgs(Control.MouseButtons, 1, lastMouseDown.X, lastMouseDown.Y, 0)); - if (this.onMouseDown) - { - //Debug.WriteLine(""); - this.PerformWmMouseDown(ref m); - this.onMouseDown = false; - } - - return; - } - case 0x202: // WM_LBUTTONUP - { - //Debug.WriteLine("WM_LBUTTONUP"); - Point p = new Point(m.LParam.ToInt32()); - this.OnMouseUp(new MouseEventArgs(Control.MouseButtons, 1, p.X, p.Y, 0)); - if (this.onMouseUp) - { - this.PerformWmMouseUp(ref m); - this.onMouseUp = false; - } - return; - } - case 0x02A3: // WM_MOUSELEAVE - { - //Debug.WriteLine("WM_MOUSELEAVE"); - if (this.isMouseIn) - { - this.OnMouseLeave(); - this.isMouseIn = false; - } - break; - } - - //case 0x0100: // WM_KEYDOWN - // { - // Debug.WriteLine("Key down"); - // break; - // } - - //case 0x001c: // WM_ACTIVATEAPP - // { - // //Debug.WriteLine("WM_ACTIVATEAPP"); - - // return; - // } - - //case 0x002: //WM_Destroy - // { - // //Debug.WriteLine("WM_Destroy"); - - // return; - // } - - //case 0x0046: - // { - // //Debug.WriteLine("WM_WINDOWPOSCHANGING"); - // return; - // } - - //case 0x0047: - // { - // //Debug.WriteLine("WM_WINDOWPOSCHANGED"); - // return; - // } - - //case 0x007C: - // { - - // //Debug.WriteLine("WM_STYLECHANGING"); - // return; - // } - - //case 0x007D: - // { - // //Debug.WriteLine("WM_STYLECHANGED"); - // return; - // } - } - - //Debug.WriteLine($"{m.Msg}"); - - base.WndProc(ref m); - } - #endregion - - #region == Mouse == - - private int deltaX; - private int deltaY; - private bool captured; - private bool isMouseIn; - private bool onMouseMove; - private bool onMouseDown; - private bool onMouseUp; - - private Point lastMouseDown = Point.Empty; - - private POINT MousePositionToClient(POINT point) - { - POINT point1; - point1.X = point.X; - point1.Y = point.Y; - User32.ScreenToClient(base.Handle, ref point1); - return point1; - } - private POINT MousePositionToScreen(MSG msg) - { - POINT point1; - point1.X = (short)(((int)msg.lParam) & 0xffff); - point1.Y = (short)((((int)msg.lParam) & -65536) >> 0x10); - if ((((msg.message != 0xa2) && (msg.message != 0xa8)) && ((msg.message != 0xa5) && (msg.message != 0xac))) && (((msg.message != 0xa1) && (msg.message != 0xa7)) && ((msg.message != 0xa4) && (msg.message != 0xab)))) - { - User32.ClientToScreen(msg.hwnd, ref point1); - } - return point1; - } - private POINT MousePositionToScreen(POINT point) - { - POINT point1; - point1.X = point.X; - point1.Y = point.Y; - User32.ClientToScreen(base.Handle, ref point1); - return point1; - } - private POINT MousePositionToScreen(Message msg) - { - POINT point1; - point1.X = (short)(((int)msg.LParam) & 0xffff); - point1.Y = (short)((((int)msg.LParam) & -65536) >> 0x10); - if ((((msg.Msg != 0xa2) && (msg.Msg != 0xa8)) && ((msg.Msg != 0xa5) && (msg.Msg != 0xac))) && (((msg.Msg != 0xa1) && (msg.Msg != 0xa7)) && ((msg.Msg != 0xa4) && (msg.Msg != 0xab)))) - { - User32.ClientToScreen(msg.HWnd, ref point1); - } - return point1; - } - - private void PerformWmMouseDown(ref Message m) - { - POINT location = MousePositionToClient(new POINT() { X = Location.X, Y = Location.Y }); - if (new Rectangle(location, Size).Contains(this.lastMouseDown)) - { - this.captured = true; - User32.SetCapture(base.Handle); - } - } - private void PerformWmMouseMove(ref Message m) - { - Point p = Control.MousePosition; - POINT point1 = new POINT(); - point1.X = p.X; - point1.Y = p.Y; - point1 = this.MousePositionToClient(point1); - - if (new Rectangle(0, 0, Size.Width, Size.Height).Contains(point1.X, point1.Y)) - Cursor.Current = Cursors.Hand; - else - Cursor.Current = Cursors.Arrow; - - //Debug.WriteLine($"{deltaX}, {deltaY}"); - - - if (this.captured) - { - - //if (this.resizing) - //{ - // int w = System.Math.Max(50, (p.X + deltaX) - this.Location.X); - // int h = System.Math.Max(50, (p.Y + deltaY) - this.Location.Y); - // this.Size = new Size(w, h); - //} - //else - //{ - this.Location = new Point(p.X - deltaX, p.Y - deltaY); - //} - } - } - private void PerformWmMouseUp(ref Message m) - { - //this.resizing = false; - if (this.captured) - { - this.captured = false; - User32.ReleaseCapture(); - } - } - private void PerformWmMouseActivate(ref Message m) - { - m.Result = (IntPtr)3; - } - - - protected virtual void OnMouseMove(MouseEventArgs e) - { - if (this.MouseMove != null) - { - this.MouseMove(this, e); - } - this.onMouseMove = true; - } - protected virtual void OnMouseDown(MouseEventArgs e) - { - if (this.MouseDown != null) - { - this.MouseDown(this, e); - } - this.onMouseDown = true; - } - protected virtual void OnMouseUp(MouseEventArgs e) - { - if (this.MouseUp != null) - { - this.MouseUp(this, e); - } - this.onMouseUp = true; - } - - protected virtual void OnMouseEnter() - { - if (this.MouseEnter != null) - { - this.MouseEnter(this, EventArgs.Empty); - } - } - protected virtual void OnMouseLeave() - { - if (this.MouseLeave != null) - { - this.MouseLeave(this, EventArgs.Empty); - } - } - - #endregion - - #region # Events # - - public event PaintEventHandler Paint; - public event EventHandler SizeChanged; - public event EventHandler LocationChanged; - public event EventHandler Move; - public event EventHandler Resize; - public event MouseEventHandler MouseDown; - public event MouseEventHandler MouseUp; - public event MouseEventHandler MouseMove; - public event EventHandler MouseEnter; - public event EventHandler MouseLeave; - - #endregion - - #region == Event Methods == - - protected virtual void OnLocationChanged(EventArgs e) - { - this.OnMove(EventArgs.Empty); - if (this.LocationChanged != null) - { - this.LocationChanged(this, e); - } - } - protected virtual void OnSizeChanged(EventArgs e) - { - this.OnResize(EventArgs.Empty); - if (this.SizeChanged != null) - { - this.SizeChanged(this, e); - } - } - protected virtual void OnMove(EventArgs e) - { - if (this.Move != null) - { - this.Move(this, e); - } - } - protected virtual void OnResize(EventArgs e) - { - if (this.Resize != null) - { - this.Resize(this, e); - } - } - - #endregion - - #region == Size and Location == - protected virtual void SetBoundsCore(int x, int y, int width, int height) - { - if (((this.X != x) || (this.Y != y)) || ((this.Width != width) || (this.Height != height))) - { - if (base.Handle != IntPtr.Zero) - { - int num1 = 20; - if ((this.X == x) && (this.Y == y)) - { - num1 |= 2; - } - if ((this.Width == width) && (this.Height == height)) - { - num1 |= 1; - } - User32.SetWindowPos(base.Handle, IntPtr.Zero, x, y, width, height, (uint)num1); - } - else - { - this.Location = new Point(x, y); - this.Size = new Size(width, height); - } - } - } - #endregion - - #endregion - - #region # Properties # - /// - /// Get or set position of top-left corner of floating native window in screen coordinates - /// - public virtual Point Location - { - get { return this._location; } - set - { - if (base.Handle != IntPtr.Zero) - { - this.SetBoundsCore(value.X, value.Y, this._size.Width, this._size.Height); - RECT rect = new RECT(); - User32.GetWindowRect(base.Handle, ref rect); - this._location = new Point(rect.left, rect.top); - //this.UpdateLayeredWindow(); - } - else - { - this._location = value; - } - } - } - /// - /// Get or set size of client area of floating native window - /// - public virtual Size Size - { - get { return this._size; } - set - { - if (base.Handle != IntPtr.Zero) - { - this.SetBoundsCore(this._location.X, this._location.Y, value.Width, value.Height); - RECT rect = new RECT(); - User32.GetWindowRect(base.Handle, ref rect); - this._size = new Size(rect.right - rect.left, rect.bottom - rect.top); - //this.UpdateLayeredWindow(); - } - else - { - this._size = value; - } - } - } - /// - /// Gets or sets the height of the floating native window - /// - public int Height - { - get { return this._size.Height; } - set - { - this._size = new Size(this._size.Width, value); - } - } - /// - /// Gets or sets the width of the floating native window - /// - public int Width - { - get { return this._size.Width; } - set - { - this._size = new Size(value, this._size.Height); - } - } - /// - /// Get or set x-coordinate of top-left corner of floating native window in screen coordinates - /// - public int X - { - get { return this._location.X; } - set - { - this.Location = new Point(value, this.Location.Y); - } - } - /// - /// Get or set y-coordinate of top-left corner of floating native window in screen coordinates - /// - public int Y - { - get { return this._location.Y; } - set - { - this.Location = new Point(this.Location.X, value); - } - } - /// - /// Get rectangle represented client area of floating native window in client coordinates(top-left corner always has coord. 0,0) - /// - public Rectangle Bound - { - get - { - return new Rectangle(new Point(0, 0), this._size); - } - } - /// - /// Get or set full opacity(255) or full transparency(0) or any intermediate state for floating native window transparency - /// - public byte Alpha - { - get { return this._alpha; } - set - { - if (this._alpha == value) return; - this._alpha = value; - this.UpdateLayeredWindow(); - } - } - #endregion - - #region IDisposable Members - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - private void Dispose(bool disposing) - { - if (!this._disposed) - { - this.DestroyHandle(); - this._disposed = true; - } - } - #endregion - } - - #region # Win32 # - internal struct PAINTSTRUCT - { - public IntPtr hdc; - public int fErase; - public Rectangle rcPaint; - public int fRestore; - public int fIncUpdate; - public int Reserved1; - public int Reserved2; - public int Reserved3; - public int Reserved4; - public int Reserved5; - public int Reserved6; - public int Reserved7; - public int Reserved8; - } - [StructLayout(LayoutKind.Sequential)] - internal struct TRACKMOUSEEVENTS - { - public uint cbSize; - public uint dwFlags; - public IntPtr hWnd; - public uint dwHoverTime; - } - [StructLayout(LayoutKind.Sequential)] - internal struct MSG - { - public IntPtr hwnd; - public int message; - public IntPtr wParam; - public IntPtr lParam; - public int time; - public int pt_x; - public int pt_y; - } - [StructLayout(LayoutKind.Sequential, Pack = 1)] - internal struct BLENDFUNCTION - { - public byte BlendOp; - public byte BlendFlags; - public byte SourceConstantAlpha; - public byte AlphaFormat; - } - internal class User32 - { - public const uint WS_POPUP = 0x80000000; - public const int WS_EX_TOPMOST = 0x8; - public const int WS_EX_TOOLWINDOW = 0x80; - public const int WS_EX_LAYERED = 0x80000; - public const int WS_EX_TRANSPARENT = 0x20; - public const int WS_EX_NOACTIVATE = 0x08000000; - public const int SW_SHOWNOACTIVATE = 4; - public const int SW_HIDE = 0; - public const uint AW_HOR_POSITIVE = 0x1; - public const uint AW_HOR_NEGATIVE = 0x2; - public const uint AW_VER_POSITIVE = 0x4; - public const uint AW_VER_NEGATIVE = 0x8; - public const uint AW_CENTER = 0x10; - public const uint AW_HIDE = 0x10000; - public const uint AW_ACTIVATE = 0x20000; - public const uint AW_SLIDE = 0x40000; - public const uint AW_BLEND = 0x80000; - // Methods - private User32() - { - } - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool AnimateWindow(IntPtr hWnd, uint dwTime, uint dwFlags); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr BeginPaint(IntPtr hWnd, ref PAINTSTRUCT ps); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool ClientToScreen(IntPtr hWnd, ref POINT pt); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool DispatchMessage(ref MSG msg); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool DrawFocusRect(IntPtr hWnd, ref RECT rect); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT ps); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr GetDC(IntPtr hWnd); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr GetFocus(); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern ushort GetKeyState(int virtKey); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool GetMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr GetParent(IntPtr hWnd); - [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - public static extern bool GetClientRect(IntPtr hWnd, [In, Out] ref RECT rect); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr GetWindow(IntPtr hWnd, int cmd); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool HideCaret(IntPtr hWnd); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool InvalidateRect(IntPtr hWnd, ref RECT rect, bool erase); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr LoadCursor(IntPtr hInstance, uint cursor); - [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - public static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, [In, Out] ref RECT rect, int cPoints); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool PeekMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax, uint wFlag); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool PostMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool ReleaseCapture(); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool ScreenToClient(IntPtr hWnd, ref POINT pt); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern uint SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr SetCursor(IntPtr hCursor); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr SetFocus(IntPtr hWnd); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint newLong); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndAfter, int X, int Y, int Width, int Height, uint flags); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool redraw); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool ShowCaret(IntPtr hWnd); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool SetCapture(IntPtr hWnd); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern int ShowWindow(IntPtr hWnd, short cmdShow); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int bRetValue, uint fWinINI); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool TrackMouseEvent(ref TRACKMOUSEEVENTS tme); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool TranslateMessage(ref MSG msg); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref POINT pptDst, ref SIZE psize, IntPtr hdcSrc, ref POINT pprSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool UpdateWindow(IntPtr hwnd); - [DllImport("User32.dll", CharSet = CharSet.Auto)] - internal static extern bool WaitMessage(); - [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - public static extern bool AdjustWindowRectEx(ref RECT lpRect, int dwStyle, bool bMenu, int dwExStyle); - } - - internal class Gdi32 - { - // Methods - private Gdi32() - { - } - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern int CombineRgn(IntPtr dest, IntPtr src1, IntPtr src2, int flags); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr CreateBrushIndirect(ref LOGBRUSH brush); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr CreateCompatibleDC(IntPtr hDC); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr CreateRectRgnIndirect(ref RECT rect); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern bool DeleteDC(IntPtr hDC); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr DeleteObject(IntPtr hObject); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern int GetClipBox(IntPtr hDC, ref RECT rectBox); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern bool PatBlt(IntPtr hDC, int x, int y, int width, int height, uint flags); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern int SelectClipRgn(IntPtr hDC, IntPtr hRgn); - [DllImport("gdi32.dll", CharSet = CharSet.Auto)] - internal static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); - } - [StructLayout(LayoutKind.Sequential)] - public struct LOGBRUSH - { - public uint lbStyle; - public uint lbColor; - public uint lbHatch; - } - - #endregion -} diff --git a/Race_Element.HUD/Overlay/Internal/Monitors.cs b/Race_Element.HUD/Overlay/Internal/Monitors.cs deleted file mode 100644 index d918e21c9..000000000 --- a/Race_Element.HUD/Overlay/Internal/Monitors.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using static RaceElement.HUD.Overlay.Internal.WindowStructs; - -namespace RaceElement.HUD.Overlay.Internal -{ - // from https://xcalibursystems.com/accessing-monitor-information-with-c-part-2-getting-a-monitor-associated-with-a-window-handle/ - public class Monitors - { - private static List _monitorInfos; - - /// - /// Gets the monitors. - /// - /// - public static MonitorInfoWithHandle[] GetMonitors() - { - if (_monitorInfos == null) - // New List - _monitorInfos = new List(); - else if (_monitorInfos.Count > 0) - return _monitorInfos.ToArray(); - - - // Enumerate monitors - EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnum, IntPtr.Zero); - -#if DEBUG - Debug.WriteLine("\nLogging Monitors"); - foreach (MonitorInfoWithHandle monitor in _monitorInfos) - { - Debug.WriteLine($"Handle: {monitor.MonitorHandle}"); - Debug.WriteLine($"Monitor: {monitor.MonitorInfo.monitor}"); - Debug.WriteLine($"Work: {monitor.MonitorInfo.monitor}"); - Debug.WriteLine($"Size: {monitor.MonitorInfo.size}"); - } -#endif - - // Return list - return _monitorInfos.ToArray(); - } - - public static Point IsInsideMonitor(int nX, int nY, int width, int height, IntPtr baseHandle) - { - var monitors = Monitors.GetMonitors(); - bool isInsideMonitor = false; - - foreach (var monitor in monitors) - { - int monitorWidth = monitor.MonitorInfo.monitor.right - monitor.MonitorInfo.monitor.left; - int monitorHeight = monitor.MonitorInfo.monitor.bottom - monitor.MonitorInfo.monitor.top; - int monitorX = monitor.MonitorInfo.monitor.left; - int monitorY = monitor.MonitorInfo.monitor.top; - - if (nX > monitorX && nX < monitorX + monitorWidth) - { - if (nY > monitorY && nY < monitorY + monitorHeight) - { - isInsideMonitor = true; - - if ((nX + width) > monitorX + monitorWidth) - { - nX = monitorX + monitorWidth - width; - } - if ((nY + height) > monitorY + monitorHeight) - { - nY = monitorY + monitorHeight - height; - } - - break; - } - } - } - - if (!isInsideMonitor) - { - Screen screen1 = Screen.FromHandle(baseHandle); - if ((nX + width) > screen1.Bounds.Width) - { - nX = screen1.Bounds.Width - width; - } - if ((nY + height) > screen1.Bounds.Height) - { - nY = screen1.Bounds.Height - height; - } - } - - return new Point(nX, nY); - } - - /// - /// Monitor Enum Delegate - /// - /// A handle to the display monitor. - /// A handle to a device context. - /// A pointer to a RECT structure. - /// Application-defined data that EnumDisplayMonitors passes directly to the enumeration function. - /// - public static bool MonitorEnum(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData) - { - var mi = new MONITORINFO(); - mi.size = (uint)Marshal.SizeOf(mi); - GetMonitorInfo(hMonitor, ref mi); - - - var miwh = new MonitorInfoWithHandle(hMonitor, mi); - // Add to monitor info - if (!_monitorInfos.Contains(miwh)) - _monitorInfos.Add(miwh); - return true; - } - - /// - /// Monitor information with handle interface. - /// - public interface IMonitorInfoWithHandle - { - IntPtr MonitorHandle { get; } - MONITORINFO MonitorInfo { get; } - } - - /// - /// Monitor information with handle. - /// - public class MonitorInfoWithHandle : IMonitorInfoWithHandle - { - /// - /// Gets the monitor handle. - /// - /// - /// The monitor handle. - /// - public IntPtr MonitorHandle { get; private set; } - - /// - /// Gets the monitor information. - /// - /// - /// The monitor information. - /// - public MONITORINFO MonitorInfo { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - /// The monitor handle. - /// The monitor information. - public MonitorInfoWithHandle(IntPtr monitorHandle, MONITORINFO monitorInfo) - { - MonitorHandle = monitorHandle; - MonitorInfo = monitorInfo; - } - - public override bool Equals(object obj) - { - if (obj is MonitorInfoWithHandle) - return this.MonitorHandle == ((MonitorInfoWithHandle)obj).MonitorHandle; - - return false; - } - } - - /// - /// Monitor Enum Delegate - /// - /// A handle to the display monitor. - /// A handle to a device context. - /// A pointer to a RECT structure. - /// Application-defined data that EnumDisplayMonitors passes directly to the enumeration function. - /// - public delegate bool MonitorEnumDelegate(IntPtr hMonitor, IntPtr hdcMonitor, - ref RECT lprcMonitor, IntPtr dwData); - - /// - /// Enumerates through the display monitors. - /// - /// A handle to a display device context that defines the visible region of interest. - /// A pointer to a RECT structure that specifies a clipping rectangle. - /// A pointer to a MonitorEnumProc application-defined callback function. - /// Application-defined data that EnumDisplayMonitors passes directly to the MonitorEnumProc function. - /// - [DllImport("user32.dll")] - public static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, - MonitorEnumDelegate lpfnEnum, IntPtr dwData); - - /// - /// Gets the monitor information. - /// - /// A handle to the display monitor of interest. - /// A pointer to a MONITORINFO instance created by this method. - /// - [DllImport("user32.dll")] - public static extern bool GetMonitorInfo(IntPtr hmon, ref MONITORINFO mi); - - } -} diff --git a/Race_Element.HUD/Overlay/Internal/OverlayAttribute.cs b/Race_Element.HUD/Overlay/Internal/OverlayAttribute.cs deleted file mode 100644 index 74ab74414..000000000 --- a/Race_Element.HUD/Overlay/Internal/OverlayAttribute.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace RaceElement.HUD.Overlay.Internal -{ - public class OverlayAttribute : Attribute - { - public string Name { get; set; } - public double Version { get; set; } - public string Description { get; set; } - public OverlayType OverlayType { get; set; } - } - - public enum OverlayType - { - Release, - Debug, - } -} diff --git a/Race_Element.HUD/Overlay/Internal/WindowStructs.cs b/Race_Element.HUD/Overlay/Internal/WindowStructs.cs deleted file mode 100644 index c90f878b6..000000000 --- a/Race_Element.HUD/Overlay/Internal/WindowStructs.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Drawing; -using System.Runtime.InteropServices; - -namespace RaceElement.HUD.Overlay.Internal -{ - public class WindowStructs - { - /// - /// Monitor information. - /// - [StructLayout(LayoutKind.Sequential)] - public struct MONITORINFO - { - public uint size; - public RECT monitor; - public RECT work; - public uint flags; - } - - [StructLayout(LayoutKind.Sequential)] - public struct POINT - { - public int X; - public int Y; - - public static implicit operator Point(POINT point) - { - return new Point(point.X, point.X); - } - } - [StructLayout(LayoutKind.Sequential)] - public struct RECT - { - public int left; - public int top; - public int right; - public int bottom; - - public override string ToString() - { - return $"X: {left}, Y: {top}, Width: {right - left}, Height: {bottom - top}"; - } - } - [StructLayout(LayoutKind.Sequential)] - public struct SIZE - { - public int cx; - public int cy; - } - } -} diff --git a/Race_Element.HUD/Overlay/Internal/Windows.cs b/Race_Element.HUD/Overlay/Internal/Windows.cs deleted file mode 100644 index 5703357f9..000000000 --- a/Race_Element.HUD/Overlay/Internal/Windows.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using static RaceElement.HUD.Overlay.Internal.WindowStructs; - -namespace RaceElement.HUD.Overlay.Internal -{ - public class Windows - { - #region Members - - private const uint MONITOR_DEFAULTTONEAREST = 0x00000002; - private static IList _windowAndMonitorHandles; - - #endregion - - #region Methods - - /// - /// Retrieves a list of all main window handles and their associated process id's. - /// - /// - public static WindowAndMonitorHandle[] GetWindowAndMonitorHandles() - { - if (_windowAndMonitorHandles == null) - _windowAndMonitorHandles = new List(); - - lock (_windowAndMonitorHandles) - { - // Enumerate windows - EnumWindows(EnumTheWindows, IntPtr.Zero); - - // Return list - return _windowAndMonitorHandles.ToArray(); - } - } - - /// - /// Enumerates through each window. - /// - /// The window handle. - /// The l parameter. - /// - private static bool EnumTheWindows(IntPtr windowHandle, IntPtr lParam) - { - // Get window area - var rect = new RECT(); - GetWindowRect(windowHandle, ref rect); - - // Get current monitor - var monitorHandle = MonitorFromRect(ref rect, MONITOR_DEFAULTTONEAREST); - - // Add to enumerated windows - lock (_windowAndMonitorHandles) - { - var wamh = new WindowAndMonitorHandle(windowHandle, monitorHandle); - - if (!_windowAndMonitorHandles.Contains(wamh)) - _windowAndMonitorHandles.Add(wamh); - } - return true; - } - - #endregion - - #region Native Methods - - /// - /// EnumWindows Processor (delegate) - /// - /// The window handle. - /// The lparameter. - /// - public delegate bool EnumWindowsProc(IntPtr windowHandle, IntPtr lParam); - - /// - /// Enums the windows. - /// - /// The enum windows processor delegate. - /// The lparameter. - /// - [DllImport("user32.dll")] - public static extern bool EnumWindows(EnumWindowsProc enumWindowsProcessorDelegate, IntPtr lParam); - - /// - /// Gets the rectangle representing the frame of a window. - /// - /// The window handle. - /// The rectangle. - /// - [DllImport("user32.dll")] - public static extern bool GetWindowRect(IntPtr windowHandle, ref RECT rectangle); - - /// - /// Monitors from rect. - /// - /// The RECT pointer. - /// The flags. - /// - [DllImport("user32.dll")] - public static extern IntPtr MonitorFromRect([In] ref RECT rectPointer, uint flags); - - #endregion - - /// - /// A simple class to group our handles. - /// - /// - public class WindowAndMonitorHandle - { - public IntPtr WindowHandle { get; } - public IntPtr MonitorHandle { get; } - - public WindowAndMonitorHandle(IntPtr windowHandle, IntPtr monitorHandle) - { - WindowHandle = windowHandle; - MonitorHandle = monitorHandle; - } - - public override bool Equals(object obj) - { - if (obj is WindowAndMonitorHandle) - { - var wamh = (WindowAndMonitorHandle)obj; - return this.MonitorHandle == wamh.MonitorHandle && this.WindowHandle == wamh.WindowHandle; - } - - return false; - } - } - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/CachedBitmap.cs b/Race_Element.HUD/Overlay/OverlayUtil/CachedBitmap.cs deleted file mode 100644 index b8a3b8e32..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/CachedBitmap.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; - -namespace RaceElement.HUD.Overlay.OverlayUtil -{ - public class CachedBitmap : IDisposable - { - public readonly int Width; - public readonly int Height; - public delegate void Renderer(Graphics g); - - private readonly Bitmap _bitmap; - private Renderer _renderer; - - /// - /// Creates a cached bitmap using the given renderer - /// - /// The Width of the bitmap - /// The Height of the bitmap - /// The render function - /// Default true, calls the renderer delegate - public CachedBitmap(int width, int height, Renderer renderer, bool preRender = true) - { - this.Width = width; - this.Height = height; - _renderer = renderer; - _bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppPArgb); - - if (preRender) - Render(); - - - } - - /// - /// Sets the renderer - /// - /// The render function - /// Default true, calls the renderer delegate - public void SetRenderer(Renderer renderer, bool render = true) - { - if (_renderer == renderer) - return; - - _renderer = renderer; - - if (render) - Render(); - } - - public void Render() - { - lock (_bitmap) - { - using (Graphics g = Graphics.FromImage(_bitmap)) - { - g.Clear(Color.Transparent); - g.SmoothingMode = SmoothingMode.AntiAlias; - g.CompositingQuality = CompositingQuality.GammaCorrected; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - - _renderer(g); - } - } - } - - public void Draw(Graphics g) - { - Draw(g, 0, 0, Width, Height); - } - - public void Draw(Graphics g, Point p) - { - Draw(g, p.X, p.Y, Width, Height); - } - - public void Draw(Graphics g, int width, int height) - { - Draw(g, 0, 0, width, height); - } - - public void Draw(Graphics g, int x, int y, int width, int height) - { - if (_bitmap == null) - return; - - lock (_bitmap) - { - g.DrawImage(_bitmap, x, y, width, height); - } - } - - public void Dispose() - { - _bitmap.Dispose(); - } - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/DeltaBar.cs b/Race_Element.HUD/Overlay/OverlayUtil/DeltaBar.cs deleted file mode 100644 index b094894be..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/DeltaBar.cs +++ /dev/null @@ -1,91 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using System.Drawing; -using System.Drawing.Drawing2D; - -namespace RaceElement.HUD.Overlay.OverlayUtil -{ - public class DeltaBar - { - - internal double Min { get; set; } - internal double Max { get; set; } - internal double Value { get; set; } - - private double Average { get; set; } - - public bool DrawBackground = false; - public bool IsValidLap = false; - public bool DrawOutline = true; - public Color PositiveColor = Color.OrangeRed; - public Color NegativeColor = Color.LimeGreen; - - public DeltaBar(double min, double max, double value) - { - Min = min; - Max = max; - Value = value.Clip(Min, Max); - Average = (Min + Max) / 2; - } - - public void Draw(Graphics g, int x, int y, int width, int height) - { - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - double percent = Value / Max; - - Color drawingColor = Color.White; - - if (DrawBackground) { - if (IsValidLap) - g.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Black)), new Rectangle(x, y, width, height)); - else - g.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.DarkRed)), new Rectangle(x, y, width, height)); - } - - if (Value < Average) - { - drawingColor = NegativeColor; - - double range = Average + Min; - double relativeValue = Value - Min; - if (range < 0) range *= -1; - double fillPercent = relativeValue / range; - - int fillWidth = width / 2 - (int)(width / 2 * fillPercent); - g.FillRectangle(new SolidBrush(drawingColor), new Rectangle(width / 2 - fillWidth, y, fillWidth, height)); - } - - if (Value == Average) - { - - } - - if (Value > Average) - { - drawingColor = PositiveColor; - - double range = Average + Max; - double relativeValue = Max - Value; - if (range < 0) range *= -1; - double fillPercent = relativeValue / range; - - int fillWidth = width / 2 - (int)(width / 2 * fillPercent); - g.FillRectangle(new SolidBrush(drawingColor), new Rectangle(width / 2, y, fillWidth, height)); - } - - if (DrawOutline) - { - Brush outlineBrush = new SolidBrush(drawingColor); - - if (!IsValidLap) - outlineBrush = new SolidBrush(Color.DarkRed); - - g.DrawRectangle(new Pen(outlineBrush), new Rectangle(x, y, width, height)); - } - - g.SmoothingMode = previous; - } - - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/FontUtil.cs b/Race_Element.HUD/Overlay/OverlayUtil/FontUtil.cs deleted file mode 100644 index 110c5f8f6..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/FontUtil.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Text; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; - -namespace RaceElement.HUD.Overlay.Util -{ - public class FontUtil - { - // Adding a private font (Win2000 and later) - [DllImport("gdi32.dll", ExactSpelling = true)] - private static extern IntPtr AddFontMemResourceEx(byte[] pbFont, int cbFont, IntPtr pdv, out uint pcFonts); - - // Cleanup of a private font (Win2000 and later) - [DllImport("gdi32.dll", ExactSpelling = true)] - internal static extern bool RemoveFontMemResourceEx(IntPtr fh); - - // Some private holders of font information we are loading - static private PrivateFontCollection m_pfc = null; - - public static Font FontOrbitron(float size) - { - return GetSpecialFont(size, "RaceElement.HUD.Fonts.orbitron-medium.ttf", "Orbitron"); - } - - public static Font FontUnispace(float size) - { - return GetSpecialFont(size - 1, "RaceElement.HUD.Fonts.unispace.bold.ttf", "Unispace"); - } - - private static Font GetSpecialFont(float size, string resourceName, string fontName) - { - Font font = null; - - if (m_pfc != null) - lock (m_pfc) - if (m_pfc.Families.Length > 0) - { - // Handy how one of the Font constructors takes a - // FontFamily object, huh? :-) - for (int i = 0; i < m_pfc.Families.Length; i++) - { - if (m_pfc.Families[i].Name == fontName) - font = new Font(m_pfc.Families[i], size); - } - } - - if (font == null) - using (Stream stmFont = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) - { - if (stmFont != null) - { - - // - // GDI+ wants a pointer to memory, GDI wants the memory. - // We will make them both happy. - // - - // First read the font into a buffer - byte[] rgbyt = new Byte[stmFont.Length]; - stmFont.Read(rgbyt, 0, rgbyt.Length); - - // Then do the unmanaged font (Windows 2000 and later) - // The reason this works is that GDI+ will create a font object for - // controls like the RichTextBox and this call will make sure that GDI - // recognizes the font name, later. - AddFontMemResourceEx(rgbyt, rgbyt.Length, IntPtr.Zero, out _); - - // Now do the managed font - IntPtr pbyt = Marshal.AllocCoTaskMem(rgbyt.Length); - if (null != pbyt) - { - Marshal.Copy(rgbyt, 0, pbyt, rgbyt.Length); - if (m_pfc == null) - m_pfc = new PrivateFontCollection(); - m_pfc.AddMemoryFont(pbyt, rgbyt.Length); - Marshal.FreeCoTaskMem(pbyt); - } - } - - stmFont.Close(); - return GetSpecialFont(size, resourceName, fontName); - } - - return font; - } - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/GraphicsExtensions.cs b/Race_Element.HUD/Overlay/OverlayUtil/GraphicsExtensions.cs deleted file mode 100644 index 2b4a64b9c..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/GraphicsExtensions.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Drawing2D; - -namespace RaceElement.HUD.Overlay.OverlayUtil -{ - public static class GraphicsExtensions - { - public static void DrawStringWithShadow(this Graphics g, string text, Font font, Color color, PointF location) - { - DrawStringWithShadow(g, text, font, color, Color.FromArgb(60, Color.Black), location, 0.75f); - } - - public static void DrawStringWithShadow(this Graphics g, string text, Font font, Brush brush, PointF location) - { - DrawStringWithShadow(g, text, font, brush, Color.FromArgb(60, Color.Black), location, 0.75f); - } - - public static void DrawStringWithShadow(this Graphics g, string text, Font font, Color color, PointF location, float shadowDistance) - { - DrawStringWithShadow(g, text, font, color, Color.FromArgb(60, Color.Black), location, shadowDistance); - } - - public static void DrawStringWithShadow(this Graphics g, string text, Font font, Color color, Color shadowColor, PointF location) - { - DrawStringWithShadow(g, text, font, color, shadowColor, location, 0.75f); - } - - public static void DrawStringWithShadow(this Graphics g, string text, Font font, Brush brush, Color shadowColor, PointF location, float shadowDistance) - { - g.DrawString(text, font, new SolidBrush(shadowColor), new PointF(location.X + shadowDistance, location.Y + shadowDistance)); - g.DrawString(text, font, brush, location); - } - - public static void DrawStringWithShadow(this Graphics g, string text, Font font, Color color, Color shadowColor, PointF location, float shadowDistance) - { - g.DrawString(text, font, new SolidBrush(shadowColor), new PointF(location.X + shadowDistance, location.Y + shadowDistance)); - g.DrawString(text, font, new SolidBrush(color), location); - } - - public static void DrawEllipse(this Graphics graphics, Pen pen, - float centerX, float centerY, float radius) - { - if (graphics == null) - throw new ArgumentNullException("graphics"); - if (pen == null) - throw new ArgumentNullException("pen"); - - graphics.DrawEllipse(pen, centerX - radius, centerY - radius, - radius + radius, radius + radius); - } - - public static void FillEllipse(this Graphics graphics, Brush brush, - float centerX, float centerY, float radius) - { - if (graphics == null) - throw new ArgumentNullException("graphics"); - if (brush == null) - throw new ArgumentNullException("pen"); - - graphics.FillEllipse(brush, centerX - radius, centerY - radius, - radius + radius, radius + radius); - } - - public static void DrawRoundedRectangle(this Graphics graphics, Pen pen, Rectangle bounds, int cornerRadius) - { - if (graphics == null) - throw new ArgumentNullException("graphics"); - if (pen == null) - throw new ArgumentNullException("pen"); - - using (GraphicsPath path = CreateRoundedRectangle(bounds, cornerRadius)) - { - graphics.DrawPath(pen, path); - } - } - - public static void FillRoundedRectangle(this Graphics graphics, Brush brush, Rectangle bounds, int cornerRadius) - { - if (graphics == null) - throw new ArgumentNullException("graphics"); - if (brush == null) - throw new ArgumentNullException("brush"); - - using (GraphicsPath path = CreateRoundedRectangle(bounds, cornerRadius)) - { - graphics.FillPath(brush, path); - } - } - - /// - /// Returns the path for a rounded rectangle specified by a bounding structure and four corner radius values. - /// - /// A structure that bounds the rounded rectangle. - /// Size of the top-left radius. - /// Size of the top-right radius. - /// Size of the bottom-right radius. - /// Size of the bottom-left radius. - public static GraphicsPath CreateRoundedRectangle(Rectangle bounds, int radiusTopLeft, int radiusTopRight, int radiusBottomRight, int radiusBottomLeft) - { - var size = new Size(radiusTopLeft << 1, radiusTopLeft << 1); - var arc = new Rectangle(bounds.Location, size); - var path = new GraphicsPath(); - - // top left arc - if (radiusTopLeft == 0) - path.AddLine(arc.Location, arc.Location); - else - path.AddArc(arc, 180, 90); - - // top right arc - if (radiusTopRight != radiusTopLeft) - { - size = new Size(radiusTopRight << 1, radiusTopRight << 1); - arc.Size = size; - } - - arc.X = bounds.Right - size.Width; - if (radiusTopRight == 0) - path.AddLine(arc.Location, arc.Location); - else - path.AddArc(arc, 270, 90); - - // bottom right arc - if (radiusTopRight != radiusBottomRight) - { - size = new Size(radiusBottomRight << 1, radiusBottomRight << 1); - arc.X = bounds.Right - size.Width; - arc.Size = size; - } - - arc.Y = bounds.Bottom - size.Height; - if (radiusBottomRight == 0) - path.AddLine(arc.Location, arc.Location); - else - path.AddArc(arc, 0, 90); - - // bottom left arc - if (radiusBottomRight != radiusBottomLeft) - { - arc.Size = new Size(radiusBottomLeft << 1, radiusBottomLeft << 1); - arc.Y = bounds.Bottom - arc.Height; - } - - arc.X = bounds.Left; - if (radiusBottomLeft == 0) - path.AddLine(arc.Location, arc.Location); - else - path.AddArc(arc, 90, 90); - - path.CloseFigure(); - return path; - } - - #region Private Methods - - /// - /// Returns the path for a rounded rectangle specified by a bounding structure and a common corner radius value for each corners. - /// - /// A structure that bounds the rounded rectangle. - /// Size of the corner radius for each corners. - private static GraphicsPath CreateRoundedRectangle(Rectangle bounds, int radius) - { - var path = new GraphicsPath(); - if (radius == 0) - { - path.AddRectangle(bounds); - return path; - } - - int diameter = radius * 2; - var size = new Size(diameter, diameter); - var arc = new Rectangle(bounds.Location, size); - - // top left arc - path.AddArc(arc, 180, 90); - - // top right arc - arc.X = bounds.Right - diameter; - path.AddArc(arc, 270, 90); - - // bottom right arc - arc.Y = bounds.Bottom - diameter; - path.AddArc(arc, 0, 90); - - // bottom left arc - arc.X = bounds.Left; - path.AddArc(arc, 90, 90); - - path.CloseFigure(); - return path; - } - - #endregion - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/InfoPanel.cs b/Race_Element.HUD/Overlay/OverlayUtil/InfoPanel.cs deleted file mode 100644 index c9cef1e62..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/InfoPanel.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Text; -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.OverlayUtil; - -namespace RaceElement.HUD.Overlay.Util -{ - public class InfoPanel - { - private readonly Font _font; - private readonly int MaxWidth; - public int X = 0; - public int Y = 0; - - public int FontHeight { get; private set; } - - public bool DrawBackground = true; - public bool DrawValueBackground = true; - public bool DrawRowLines { get; set; } = true; - public int FirstRowLine { get; set; } = 0; - public int ExtraLineSpacing { get; set; } = 0; - - - private bool MaxTitleWidthSet = false; - public float MaxTitleWidth { get; private set; } = 0; - - private readonly int _addMonoY = 0; - - private CachedBitmap _cachedBackground; - private CachedBitmap _cachedLine; - - private int previousLineCount = 0; - - public InfoPanel(double fontSize, int maxWidth) - { - fontSize.ClipMin(10); - this.MaxWidth = maxWidth; - this._font = FontUtil.FontUnispace((float)fontSize); - this.FontHeight = _font.Height; - _addMonoY = _font.Height / 8; - } - - private List Lines = new List(); - - public void SetBackground() - { - _cachedBackground = new CachedBitmap(MaxWidth, Lines.Count * (this.FontHeight + ExtraLineSpacing), g => - { - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(158, 0, 0, 0)), new Rectangle(X, Y, this.MaxWidth, Lines.Count * (this.FontHeight + ExtraLineSpacing)), 4); - - if (DrawValueBackground) - { - int y = Y + _font.Height * FirstRowLine; - int height = (Lines.Count - FirstRowLine) * (this.FontHeight + ExtraLineSpacing) + (int)_addMonoY - 2; - - int characterWidth = (int)g.MeasureString("M", _font).Width / 2; - int x = (int)(MaxTitleWidth + characterWidth); - int width = (int)(MaxWidth - MaxTitleWidth - characterWidth); - - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(80, Color.Black)), new Rectangle(x, y, width, height), 4); - } - }); - } - - public void Draw(Graphics g) - { - if (!MaxTitleWidthSet) - { - UpdateMaxTitleWidth(g); - MaxTitleWidthSet = true; - } - - if (DrawBackground) - { - if (Lines.Count != previousLineCount) - { - SetBackground(); - previousLineCount = Lines.Count; - } - - _cachedBackground.Draw(g); - } - - TextRenderingHint previousHint = g.TextRenderingHint; - g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; - g.TextContrast = 1; - - lock (Lines) - { - int length = Lines.Count; - int counter = 0; - - while (counter < length) - { - if (DrawRowLines && counter > FirstRowLine) - { - float rowY = counter * (this.FontHeight + ExtraLineSpacing); - - if (_cachedLine == null) - { - _cachedLine = new CachedBitmap(this.MaxWidth - 2, 1, cr => - { - cr.DrawLine(new Pen(Color.FromArgb(42, Color.White)), new Point(1, 0), new Point(this.MaxWidth - 2, 0)); - }); - } - _cachedLine.Draw(g, new Point(X + 1, (int)rowY)); - } - - IPanelLine line = Lines[counter]; - - if (line.GetType() == typeof(TextLine)) - { - TextLine textLine = (TextLine)line; - - g.DrawStringWithShadow($"{textLine.Title}", _font, Color.White, new PointF(X, Y + counter * (this.FontHeight + ExtraLineSpacing) + _addMonoY)); - g.DrawStringWithShadow($"{textLine.Value}", _font, textLine.ValueBrush, new PointF(X + MaxTitleWidth + _font.Size, Y + counter * (this.FontHeight + ExtraLineSpacing) + _addMonoY)); - } - - if (line.GetType() == typeof(TitledProgressBarLine)) - { - TitledProgressBarLine bar = (TitledProgressBarLine)line; - g.DrawStringWithShadow($"{bar.Title}", _font, Brushes.White, new PointF(X, Y + counter * FontHeight)); - - ProgressBar progressBar = new ProgressBar(bar.Min, bar.Max, bar.Value); - progressBar.Draw(g, bar.BarColor, Brushes.Transparent, new Rectangle((int)(X + MaxTitleWidth + _font.Size), Y + counter * (this.FontHeight + ExtraLineSpacing) + 1, (int)(MaxWidth - MaxTitleWidth - _font.Size) - 4, (int)FontHeight - 2), false, false); - - string percent = $"{(bar.Max / bar.Value * 100):F1}%"; - SizeF textWidth = g.MeasureString(percent, _font); - g.DrawStringWithShadow($"{percent}", _font, Brushes.White, new PointF((int)(X + (MaxWidth - MaxTitleWidth)) - textWidth.Width / 2, Y + counter * (this.FontHeight + ExtraLineSpacing) + _addMonoY)); - } - - if (line.GetType() == typeof(CenterTextedProgressBarLine)) - { - CenterTextedProgressBarLine bar = (CenterTextedProgressBarLine)line; - - ProgressBar progressBar = new ProgressBar(bar.Min, bar.Max, bar.Value); - progressBar.Draw(g, bar.BarColor, Brushes.Transparent, new Rectangle(X + 3, Y + counter * FontHeight + 1, (int)MaxWidth - 6, (int)FontHeight - 2), false, false); - - SizeF textWidth = g.MeasureString(bar.CenteredText, _font); - g.DrawStringWithShadow($"{bar.CenteredText}", _font, Color.White, new PointF(X + MaxWidth / 2 - textWidth.Width / 2, Y + counter * (this.FontHeight + ExtraLineSpacing) + _addMonoY), 1f); - } - - if (line.GetType() == typeof(CenteredTextedDeltabarLine)) - { - CenteredTextedDeltabarLine bar = (CenteredTextedDeltabarLine)line; - - DeltaBar deltaBar = new DeltaBar(bar.Min, bar.Max, bar.Value); - deltaBar.Draw(g, X + 1, Y + counter * FontHeight + 1, (int)MaxWidth - 2, (int)FontHeight - 2); - - SizeF textWidth = g.MeasureString(bar.CenteredText, _font); - g.DrawStringWithShadow($"{bar.CenteredText}", _font, Brushes.White, new PointF(X + MaxWidth / 2 - textWidth.Width / 2, Y + counter * (this.FontHeight + ExtraLineSpacing) + _addMonoY)); - } - - - counter++; - length = Lines.Count; - } - } - - g.TextRenderingHint = previousHint; - - lock (Lines) - Lines.Clear(); - } - - private void UpdateMaxTitleWidth(Graphics g) - { - lock (Lines) - { - int length = Lines.Count; - int counter = 0; - while (counter < length) - { - IPanelLine line = Lines[counter]; - - if (line.GetType() == typeof(TextLine)) - { - TextLine textLine = (TextLine)line; - SizeF titleWidth; - if ((titleWidth = g.MeasureString(textLine.Title, _font)).Width > MaxTitleWidth) - MaxTitleWidth = titleWidth.Width; - } - - if (line.GetType() == typeof(TitledProgressBarLine)) - { - TitledProgressBarLine titledProgressBar = (TitledProgressBarLine)line; - SizeF titleWidth; - if ((titleWidth = g.MeasureString(titledProgressBar.Title, _font)).Width > MaxTitleWidth) - MaxTitleWidth = titleWidth.Width; - } - - counter++; - length = Lines.Count; - } - } - } - - - public void AddLine(string title, string value, bool valueIsMonoFont = true) - { - Lines.Add(new TextLine() { Title = title, Value = value }); - } - - public void AddLine(string title, string value, Brush valueBrush) - { - Lines.Add(new TextLine() { Title = title, Value = value, ValueBrush = valueBrush }); - } - - public void AddProgressBar(string title, double min, double max, double value) - { - Lines.Add(new TitledProgressBarLine() { Title = title, Min = min, Max = max, Value = value }); - } - - public void AddProgressBar(string title, double min, double max, double value, Brush barColor) - { - Lines.Add(new TitledProgressBarLine() { Title = title, Min = min, Max = max, Value = value, BarColor = barColor }); - } - - public void AddProgressBarWithCenteredText(string centeredText, double min, double max, double value) - { - Lines.Add(new CenterTextedProgressBarLine() { CenteredText = centeredText, Min = min, Max = max, Value = value }); - } - - public void AddProgressBarWithCenteredText(string centeredText, double min, double max, double value, Brush barColor) - { - Lines.Add(new CenterTextedProgressBarLine() { CenteredText = centeredText, Min = min, Max = max, Value = value, BarColor = barColor }); - } - - public void AddDeltaBarWithCenteredText(string centeredText, double min, double max, double value) - { - Lines.Add(new CenteredTextedDeltabarLine() { CenteredText = centeredText, Min = min, Max = max, Value = value }); - } - - private class TextLine : IPanelLine - { - internal string Title { get; set; } - internal string Value { get; set; } - internal Brush ValueBrush { get; set; } = Brushes.White; - } - - private class TitledProgressBarLine : IPanelLine - { - internal string Title { get; set; } - internal double Min { get; set; } - internal double Max { get; set; } - internal double Value { get; set; } - internal Brush BarColor { get; set; } = Brushes.OrangeRed; - } - - private class CenterTextedProgressBarLine : IPanelLine - { - internal string CenteredText { get; set; } - internal double Min { get; set; } - internal double Max { get; set; } - internal double Value { get; set; } - internal Brush BarColor { get; set; } = Brushes.OrangeRed; - } - - private class CenteredTextedDeltabarLine : IPanelLine - { - internal string CenteredText { get; set; } - internal double Min { get; set; } - internal double Max { get; set; } - internal double Value { get; set; } - } - - private interface IPanelLine { } - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/InfoTable.cs b/Race_Element.HUD/Overlay/OverlayUtil/InfoTable.cs deleted file mode 100644 index 6f088fd3e..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/InfoTable.cs +++ /dev/null @@ -1,206 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Util; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Text; -using System.Linq; - -namespace RaceElement.HUD.Overlay.OverlayUtil -{ - public class InfoTable - { - private const float _shadowDistance = 0.75f; - - private float _yMono; - public bool _headerWidthSet; - private float _maxHeaderWidth; - private int[] _columnWidths; - private List _rows = new List(); - - public int X = 0; - public int Y = 0; - - public Font Font { get; } - public int FontHeight { get; private set; } - - public bool DrawBackground { get; set; } = true; - public bool DrawValueBackground { get; set; } = true; - public bool DrawRowLines { get; set; } = true; - - private CachedBitmap _cachedBackground; - private CachedBitmap _cachedLine; - - private int previousRowCount = 0; - - public InfoTable(float fontSize, int[] columnWidths) - { - fontSize.ClipMin(9); - _columnWidths = columnWidths; - Font = FontUtil.FontUnispace(fontSize); - FontHeight = Font.Height; - _yMono = Font.Height / 8; - } - - public void Draw(Graphics g) - { - if (!_headerWidthSet) UpdateMaxheaderWidth(g); - - if (DrawBackground && _rows.Count > 0) - { - if (previousRowCount != _rows.Count) - { - _cachedBackground = new CachedBitmap((int)Math.Ceiling(GetTotalWidth()), _rows.Count * FontHeight + (int)_yMono, bg => - { - bg.FillRoundedRectangle(new SolidBrush(Color.FromArgb(158, Color.Black)), new Rectangle(0, 0, (int)GetTotalWidth(), _rows.Count * this.Font.Height + (int)_yMono), 4); - }); - previousRowCount = _rows.Count; - } - - _cachedBackground.Draw(g, new Point(X, Y)); - } - - TextRenderingHint previousHint = g.TextRenderingHint; - g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; - g.TextContrast = 1; - lock (_rows) - { - int length = _rows.Count; - int counter = 0; - int totalWidth = (int)GetTotalWidth(); - int valueWidth = (int)(totalWidth - this._maxHeaderWidth); - - if (DrawValueBackground) - { - g.FillRoundedRectangle(new SolidBrush(Color.FromArgb(80, Color.Black)), new Rectangle((int)_maxHeaderWidth + 5, Y, valueWidth - 4, _rows.Count * this.Font.Height + (int)_yMono + 1), 4); - } - while (counter < length) - { - TableRow row = _rows[counter]; - float rowY = Y + counter * Font.Height; - - if (row.HeaderBackground != Color.Transparent) - g.FillRoundedRectangle(new SolidBrush(row.HeaderBackground), new Rectangle(X, (int)rowY, (int)_maxHeaderWidth + 5, Font.Height), 4); - - if (DrawRowLines && counter > 0) - { - if (_cachedLine == null) - { - _cachedLine = new CachedBitmap(totalWidth - 2, 1, lg => - { - lg.DrawLine(new Pen(Color.FromArgb(42, Color.White)), new Point(1, 0), new Point(totalWidth - 1, 0)); - }); - } - - _cachedLine.Draw(g, new Point(X + 1, (int)rowY)); - } - - g.DrawStringWithShadow(row.Header, this.Font, Color.White, new PointF(X, rowY + _yMono), _shadowDistance); - - for (int i = 0; i < row.Columns.Length; i++) - { - float columnX = GetColumnX(i); - if (i == 0) columnX += Font.Size; - g.DrawStringWithShadow(row.Columns[i], this.Font, row.ColumnColors[i], new PointF(columnX, rowY + _yMono), _shadowDistance); - } - counter++; - } - - _rows.Clear(); - } - - g.TextRenderingHint = previousHint; - } - - private float GetColumnX(int columnIndex) - { - float x = this.X; - x += this._maxHeaderWidth; - - for (int i = 0; i < columnIndex; i++) - x += this._columnWidths[i]; - - return x; - } - - private float GetTotalWidth() - { - float totalWidth = this._maxHeaderWidth; - for (int i = 0; i < _columnWidths.Length; i++) - totalWidth += this._columnWidths[i]; - - return totalWidth; - } - - public void AddRow(string header, string[] columns, Color[] columnColors = null) - { - this.AddRow(new TableRow() { Header = header, Columns = columns, ColumnColors = columnColors }); ; - } - - public void AddRow(TableRow row) - { - if (row == null) return; - if (row.Header == null) row.Header = string.Empty; - if (row.Columns == null) row.Columns = new string[this._columnWidths.Length]; - if (row.ColumnColors == null) - { - row.ColumnColors = new Color[this._columnWidths.Length]; - for (int i = 0; i < this._columnWidths.Length; i++) - row.ColumnColors[i] = Color.White; - } - - if (row.ColumnColors.Length != this._columnWidths.Length) - { - Color[] givenColors = row.ColumnColors; - row.ColumnColors = new Color[this._columnWidths.Length]; - for (int i = 0; i < this._columnWidths.Length; i++) - if (i >= givenColors.Length) - row.ColumnColors[i] = Color.White; - else - row.ColumnColors[i] = givenColors[i]; - } - - if (row.Columns.Length > this._columnWidths.Length) - row.Columns = row.Columns.Take(this._columnWidths.Length).ToArray(); - - this._rows.Add(row); - } - - public class TableRow - { - public string Header { get; set; } - public Color HeaderBackground { get; set; } = Color.Transparent; - public string[] Columns { get; set; } - public Color[] ColumnColors { get; set; } - } - - private void UpdateMaxheaderWidth(Graphics g) - { - lock (_rows) - { - _maxHeaderWidth = 0; - - int length = _rows.Count; - int counter = 0; - while (counter < length) - { - TableRow line = _rows[counter]; - if (line != null) - { - SizeF titleWidth; - if ((titleWidth = g.MeasureString(line.Header, Font)).Width > _maxHeaderWidth) - _maxHeaderWidth = titleWidth.Width; - - counter++; - length = _rows.Count; - } - } - if (_maxHeaderWidth == 0) - return; - - _maxHeaderWidth += Font.Size; - _headerWidthSet = true; - } - } - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/ProgressBar.cs b/Race_Element.HUD/Overlay/OverlayUtil/ProgressBar.cs deleted file mode 100644 index ee5cdb320..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/ProgressBar.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Drawing; -using System.Drawing.Drawing2D; - -namespace RaceElement.HUD.Overlay.OverlayUtil -{ - internal class ProgressBar - { - internal double Min { get; set; } - internal double Max { get; set; } - internal double Value { get; set; } - - public ProgressBar(double min, double max, double value) - { - Min = min; - Max = max; - Value = value; - } - - public void Draw(Graphics g, int x, int y, int width, int height, Brush fillBrush, Brush outlineBrush, bool drawRounded, bool drawOutline) - { - Draw(g, fillBrush, outlineBrush, new Rectangle(x, y, width, height), drawRounded, drawOutline); - } - - public void Draw(Graphics g, Brush fillBrush, Brush outlineBrush, Rectangle rectangle, bool drawRounded, bool drawOutline) - { - int x = rectangle.X; - int y = rectangle.Y; - int width = rectangle.Width; - int height = rectangle.Height; - - SmoothingMode previous = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - double percent = Value / Max; - if (drawRounded) - g.FillRoundedRectangle(fillBrush, new Rectangle(x, y, (int)(width * percent), height), 1); - else - g.FillRectangle(fillBrush, new Rectangle(x, y, (int)(width * percent), height)); - - if (drawOutline) - { - Brush brush = new SolidBrush(Color.White); - if (drawRounded) - g.DrawRoundedRectangle(new Pen(brush), new Rectangle(x, y, width, height), 1); - else - g.DrawRectangle(new Pen(brush), new Rectangle(x, y, width, height)); - } - g.SmoothingMode = previous; - } - - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/ProgressBars/HorizontalProgressBar.cs b/Race_Element.HUD/Overlay/OverlayUtil/ProgressBars/HorizontalProgressBar.cs deleted file mode 100644 index 8f71bcd18..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/ProgressBars/HorizontalProgressBar.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.HUD.Overlay.OverlayUtil.ProgressBars -{ - public class HorizontalProgressBar - { - // dimension - private int _width; - private int _height; - public float Scale { private get; set; } = 1f; - - // values - public double Min { private get; set; } = 0; - public double Max { private get; set; } = 1; - public double Value { private get; set; } = 0; - - // style - public bool Rounded { private get; set; } - public float Rounding { private get; set; } = 3; - public Brush OutlineBrush { private get; set; } = Brushes.White; - public Brush FillBrush { private get; set; } = Brushes.OrangeRed; - - private CachedBitmap _cachedOutline; - - public HorizontalProgressBar(int width, int height) - { - _width = width; - _height = height; - } - - public void Draw(Graphics g, int x, int y) - { - if (_cachedOutline == null) - RenderCachedOutline(); - - double percent = Value / Max; - - int scaledHeight = (int)(_height * Scale); - int scaledWidth = (int)(_width * Scale); - - CachedBitmap barBitmap = new CachedBitmap(scaledWidth + 1, scaledHeight + 1, bg => - { - if (Rounded) - { - if (percent >= 0.035f) - { - int width = (int)(scaledWidth * percent); - bg.FillRoundedRectangle(FillBrush, new Rectangle(0, 0, width, scaledHeight), (int)(Rounding * Scale)); - } - } - else - bg.FillRectangle(FillBrush, new Rectangle(0, 0, (int)(scaledWidth * percent), (int)(scaledHeight))); - }); - - barBitmap?.Draw(g, x, y, _width, _height); - _cachedOutline?.Draw(g, x, y, _width, _height); - } - - private void RenderCachedOutline() - { - int scaledWidth = (int)(_width * Scale); - int scaledHeight = (int)(_height * Scale); - if (Rounded) - _cachedOutline = new CachedBitmap(scaledWidth + 1, scaledHeight + 1, g => g.DrawRoundedRectangle(new Pen(OutlineBrush, 1 * Scale), new Rectangle(0, 0, scaledWidth, scaledHeight), (int)(Rounding * Scale))); - else - _cachedOutline = new CachedBitmap(scaledWidth + 1, scaledHeight + 1, g => g.DrawRectangle(new Pen(OutlineBrush, 1 * Scale), new Rectangle(0, 0, scaledWidth, scaledHeight))); - } - } -} diff --git a/Race_Element.HUD/Overlay/OverlayUtil/ProgressBars/VerticalProgressBar.cs b/Race_Element.HUD/Overlay/OverlayUtil/ProgressBars/VerticalProgressBar.cs deleted file mode 100644 index 513d665ac..000000000 --- a/Race_Element.HUD/Overlay/OverlayUtil/ProgressBars/VerticalProgressBar.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Drawing; - -namespace RaceElement.HUD.Overlay.OverlayUtil.ProgressBars -{ - public class VerticalProgressBar - { - // dimension - private int _width; - private int _height; - public float Scale { private get; set; } = 1f; - - // values - public double Min { private get; set; } = 0; - public double Max { private get; set; } = 1; - public double Value { private get; set; } = 0; - - // style - public bool Rounded { private get; set; } - public float Rounding { private get; set; } = 3; - public Brush OutlineBrush { private get; set; } = Brushes.White; - public Brush FillBrush { private get; set; } = Brushes.OrangeRed; - - private CachedBitmap _cachedOutline; - - public VerticalProgressBar(int width, int height) - { - _width = width; - _height = height; - } - - public void Draw(Graphics g, int x, int y) - { - if (_cachedOutline == null) - RenderCachedOutline(); - - double percent = Value / Max; - - int scaledHeight = (int)(_height * Scale); - int scaledWidth = (int)(_width * Scale); - - CachedBitmap barBitmap = new CachedBitmap(scaledWidth + 1, scaledHeight + 1, bg => - { - if (Rounded) - { - if (percent >= 0.035f) - { - int height = (int)(scaledHeight * percent); - bg.FillRoundedRectangle(FillBrush, new Rectangle(0, 0 + scaledHeight - height, scaledWidth, height), (int)(Rounding * Scale)); - } - } - else - bg.FillRectangle(FillBrush, new Rectangle(0 + scaledWidth - (int)(scaledWidth * percent), 0 , scaledWidth, (int)(scaledHeight))); - }); - - barBitmap?.Draw(g, x, y, _width, _height); - _cachedOutline?.Draw(g, x, y, _width, _height); - } - - private void RenderCachedOutline() - { - int scaledWidth = (int)(_width * Scale); - int scaledHeight = (int)(_height * Scale); - if (Rounded) - _cachedOutline = new CachedBitmap(scaledWidth + 1, scaledHeight + 1, g => g.DrawRoundedRectangle(new Pen(OutlineBrush, 1 * Scale), new Rectangle(0, 0, scaledWidth, scaledHeight), (int)(Rounding * Scale))); - else - _cachedOutline = new CachedBitmap(scaledWidth + 1, scaledHeight + 1, g => g.DrawRectangle(new Pen(OutlineBrush, 1 * Scale), new Rectangle(0, 0, scaledWidth, scaledHeight))); - } - } -} diff --git a/Race_Element.HUD/Properties/AssemblyInfo.cs b/Race_Element.HUD/Properties/AssemblyInfo.cs deleted file mode 100644 index db28b9ac6..000000000 --- a/Race_Element.HUD/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("RaceElement.HUD")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Element Future")] -[assembly: AssemblyProduct("RaceElement.HUD")] -[assembly: AssemblyCopyright("Copyright 2022 © Reinier Klarenberg")] -[assembly: AssemblyTrademark("Element Future")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("3717a55e-4629-40ed-9c93-24058d9ef18c")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Race_Element.HUD/Race Element.HUD.csproj b/Race_Element.HUD/Race Element.HUD.csproj deleted file mode 100644 index 5067f2092..000000000 --- a/Race_Element.HUD/Race Element.HUD.csproj +++ /dev/null @@ -1,109 +0,0 @@ - - - - - Debug - AnyCPU - {3717A55E-4629-40ED-9C93-24058D9EF18C} - Library - Properties - RaceElement.HUD - RaceElement.HUD - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\Debug Minimized\ - DEBUG;TRACE - full - AnyCPU - 7.3 - prompt - - - - ..\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {840220BD-8469-4A04-A6EC-1ED2BC743EFB} - Race Element.Broadcast - - - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE} - Race Element.Data.ACC - - - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F} - Race Element.SharedMemory - - - {AAB23116-299B-415B-8305-96CB86148CE7} - Race Element.Util - - - - \ No newline at end of file diff --git a/Race_Element.HUD/app.config b/Race_Element.HUD/app.config deleted file mode 100644 index 3c508499f..000000000 --- a/Race_Element.HUD/app.config +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element.HUD/packages.config b/Race_Element.HUD/packages.config deleted file mode 100644 index 4de699c93..000000000 --- a/Race_Element.HUD/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/IWheelSteerLockSetter.cs b/Race_Element.Hardware/ACC/SteeringLock/IWheelSteerLockSetter.cs deleted file mode 100644 index ac6c00595..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/IWheelSteerLockSetter.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace RaceElement.Hardware.ACC.SteeringLock -{ - internal interface IWheelSteerLockSetter - { - string ControllerName { get; } - - bool Test(string productGuid); - bool Apply(int angle, bool isReset, out int appliedValue); - - int MaximumSteerLock { get; } - int MinimumSteerLock { get; } - } -} diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/MMos.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/MMos.cs deleted file mode 100644 index 370c41668..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/MMos.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Linq; -using System.Runtime.InteropServices; -using HidLibrary; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class MMos : IWheelSteerLockSetter - { - public virtual string ControllerName => "MMos"; - - public virtual bool Test(string productGuid) - { - return string.Equals(productGuid, "0FFBF055-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - public int MaximumSteerLock => 65535; - public int MinimumSteerLock => 40; - - private enum ScReportId : byte - { - Out = 0x6B - } - - private enum ScCommand : byte - { - SetTemporaryVariable = 100 - } - - private enum ScValue1 : ushort - { - TemporarySteeringAngle = 1, - UnsetTemporarySteeringAngle = 2 - } - - [StructLayout(LayoutKind.Sequential, Pack = 1),] - struct CommandPacket - { - public ScReportId ReportId; - public ScCommand Command; - public ScValue1 Value1; - public ushort Value2; - - public static readonly int Size = Marshal.SizeOf(typeof(CommandPacket)); - } - - public bool Apply(int steerLock, bool isReset, out int appliedValue) - { - appliedValue = Math.Min(Math.Max(steerLock, MinimumSteerLock), MaximumSteerLock); - - var packet = new CommandPacket - { - ReportId = ScReportId.Out, - Command = ScCommand.SetTemporaryVariable, - Value1 = isReset ? ScValue1.UnsetTemporarySteeringAngle : ScValue1.TemporarySteeringAngle, - Value2 = (ushort)appliedValue - }; - - var ptr = Marshal.AllocHGlobal(CommandPacket.Size); - var data = new byte[60]; - Marshal.StructureToPtr(packet, ptr, false); - Marshal.Copy(ptr, data, 0, CommandPacket.Size); - Marshal.FreeHGlobal(ptr); - - var result = HidDevices.Enumerate(0xF055, 0x0FFB).Aggregate(false, (a, b) => - { - using (b) - { - return a | b.Write(data); - } - }); - - return result; - } - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/SimuCube.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/SimuCube.cs deleted file mode 100644 index dcd90711a..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/SimuCube.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Linq; -using System.Runtime.InteropServices; -using HidLibrary; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class SimuCube : IWheelSteerLockSetter - { - public virtual string ControllerName => "SimuCUBE"; - - public virtual bool Test(string productGuid) - { - return string.Equals(productGuid, "0D5A16D0-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase) - || string.Equals(productGuid, "0D5F16D0-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase) - || string.Equals(productGuid, "0D6016D0-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase) - || string.Equals(productGuid, "0D6116D0-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - public int MaximumSteerLock => 65535; - public int MinimumSteerLock => 40; - - private enum ScReportId : byte - { - Out = 0x6B - } - - private enum ScCommand : byte - { - SetTemporaryVariable = 100 - } - - private enum ScValue1 : ushort - { - TemporarySteeringAngle = 1, - UnsetTemporarySteeringAngle = 2 - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct CommandPacket - { - public ScReportId ReportId; - public ScCommand Command; - public ScValue1 Value1; - public ushort Value2; - - public static readonly int Size = Marshal.SizeOf(typeof(CommandPacket)); - } - - public bool Apply(int steerLock, bool isReset, out int appliedValue) - { - appliedValue = Math.Min(Math.Max(steerLock, MinimumSteerLock), MaximumSteerLock); - - var packet = new CommandPacket - { - ReportId = ScReportId.Out, - Command = ScCommand.SetTemporaryVariable, - Value1 = isReset ? ScValue1.UnsetTemporarySteeringAngle : ScValue1.TemporarySteeringAngle, - Value2 = (ushort)appliedValue - }; - - var ptr = Marshal.AllocHGlobal(CommandPacket.Size); - var data = new byte[60]; - Marshal.StructureToPtr(packet, ptr, false); - Marshal.Copy(ptr, data, 0, CommandPacket.Size); - Marshal.FreeHGlobal(ptr); - - var result = HidDevices.Enumerate(0x16d0, 0x0d5a, 0x0d5f, 0x0d60, 0x0d61).Aggregate(false, (a, b) => - { - using (b) - { - return a | b.Write(data); - } - }); - - return result; - } - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterF1.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterF1.cs deleted file mode 100644 index b5ed5e272..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterF1.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterF1 : ThrustmasterT500 - { - public override string ControllerName => "Thrustmaster F1"; - - public override bool Test(string productGuid) - { - return string.Equals(productGuid, "B662044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb662; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1Advanced1.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1Advanced1.cs deleted file mode 100644 index 730677768..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1Advanced1.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterFerrariF1Advanced1 : ThrustmasterT500 - { - public override string ControllerName => "Thrustmaster Ferrari F1 Advanced"; - - public override bool Test(string productGuid) - { - return string.Equals(productGuid, "B66B044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb66b; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1Advanced2.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1Advanced2.cs deleted file mode 100644 index 6c0f2f13c..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1Advanced2.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterFerrariF1Advanced2 : ThrustmasterT500 - { - public override string ControllerName => "Thrustmaster Ferrari F1 Advanced"; - - public override bool Test(string productGuid) - { - return string.Equals(productGuid, "B66F044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb66f; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1TSPC.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1TSPC.cs deleted file mode 100644 index 448d73278..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterFerrariF1TSPC.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterFerrariF1TSPC : ThrustmasterT500 - { - public override string ControllerName => "Thrustmaster Ferrari F1 TS-PC Racer"; - - public override bool Test(string productGuid) - { - return string.Equals(productGuid, "B68A044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb689; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterSF1000TSPC.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterSF1000TSPC.cs deleted file mode 100644 index 71c724d17..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterSF1000TSPC.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterSF1000TSPC : ThrustmasterT500 { - public override string ControllerName => "Thrustmaster SF1000 TS-PC Racer"; - - public override bool Test(string productGuid) { - return string.Equals(productGuid, "B696044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb696; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT150.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT150.cs deleted file mode 100644 index 7ea470f60..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT150.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterT150 : ThrustmasterT500 - { - public override string ControllerName => "Thrustmaster T150RS"; - - public override bool Test(string productGuid) - { - return string.Equals(productGuid, "B677044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb677; - } -} diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT300.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT300.cs deleted file mode 100644 index 0b62f3e2c..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT300.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterT300 : ThrustmasterT500 { - public override string ControllerName => "Thrustmaster T300RS"; - - public override bool Test(string productGuid) { - return string.Equals(productGuid, "B66E044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb66e; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT500.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT500.cs deleted file mode 100644 index c2a2fbea5..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterT500.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Linq; -using HidLibrary; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterT500 : IWheelSteerLockSetter { - public virtual string ControllerName => "Thrustmaster T500RS"; - - public virtual bool Test(string productGuid) { - return string.Equals(productGuid, "B65E044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected virtual int ProductId => 0xb65e; - - public int MaximumSteerLock => 1080; - public int MinimumSteerLock => 40; - - public bool Apply(int steerLock, bool isReset, out int appliedValue) { - appliedValue = Math.Min(Math.Max(steerLock, MinimumSteerLock), MaximumSteerLock); - var cmd = new byte[] { 0x40, 0x11 }.Concat(BitConverter.GetBytes((ushort)(65535d / 1080d * (appliedValue - 1)))).ToArray(); - return HidDevices.Enumerate(0x44f, ProductId).Aggregate(false, (a, b) => { - using (b) { - return a | b.Write(cmd); - } - }); - } - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTGT.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTGT.cs deleted file mode 100644 index e50297a0d..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTGT.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterTGT : ThrustmasterT500 { - public override string ControllerName => "Thrustmaster T-GT"; - - public override bool Test(string productGuid) { - return string.Equals(productGuid, "B684044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb684; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTMX.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTMX.cs deleted file mode 100644 index 5e931cbd7..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTMX.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterTMX : ThrustmasterT500 { - public override string ControllerName => "Thrustmaster TMX"; - - public override bool Test(string productGuid) { - return string.Equals(productGuid, "B67F044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb67f; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTSPC.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTSPC.cs deleted file mode 100644 index 0d491eac6..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTSPC.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterTSPC : ThrustmasterT500 { - public override string ControllerName => "Thrustmaster TS-PC Racer"; - - public override bool Test(string productGuid) { - return string.Equals(productGuid, "B689044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb689; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTSXW.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTSXW.cs deleted file mode 100644 index 881d11630..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTSXW.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterTSXW : ThrustmasterT500 { - public override string ControllerName => "Thrustmaster TS-XW Racer"; - - public override bool Test(string productGuid) { - return string.Equals(productGuid, "B692044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb692; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTX.cs b/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTX.cs deleted file mode 100644 index 244afdf75..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/Implementations/ThrustmasterTX.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace RaceElement.Hardware.ACC.SteeringLock.Implementations -{ - internal class ThrustmasterTX : ThrustmasterT500 - { - public override string ControllerName => "Thrustmaster TX"; - - public override bool Test(string productGuid) - { - return string.Equals(productGuid, "B669044F-0000-0000-0000-504944564944", StringComparison.OrdinalIgnoreCase); - } - - protected override int ProductId => 0xb669; - } -} \ No newline at end of file diff --git a/Race_Element.Hardware/ACC/SteeringLock/SteeringLockTracker.cs b/Race_Element.Hardware/ACC/SteeringLock/SteeringLockTracker.cs deleted file mode 100644 index ccbeeb4fb..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/SteeringLockTracker.cs +++ /dev/null @@ -1,149 +0,0 @@ -using RaceElement.Data.ACC.Core; -using SharpDX.DirectInput; -using System; -using System.Diagnostics; -using System.Threading; - -namespace RaceElement.Hardware.ACC.SteeringLock -{ - /// - /// Partially From https://github.com/Havner/acc-steering-lock - /// - public class SteeringLockTracker : IDisposable - { - private static SteeringLockTracker _instance; - public static SteeringLockTracker Instance - { - get - { - if (_instance == null) _instance = new SteeringLockTracker(); - return _instance; - } - } - - public bool IsTracking = false; - - private string _lastCar; - private int _lastRotation; - private IWheelSteerLockSetter _wheel; - - private SteeringLockTracker() - { - } - - public void Dispose() - { - IsTracking = false; - - ResetRotation(); - - Debug.WriteLine("Disposed steering hardware lock tracker."); - _instance = null; - } - - public void StartTracking() - { - Debug.WriteLine("Started steering hardware lock tracker"); - IsTracking = true; - new Thread(() => - { - while (IsTracking) - { - Thread.Sleep(1000); - - try - { - if (AccProcess.IsRunning) - if (ACCSharedMemory.Instance.ReadGraphicsPageFile(true).Status != ACCSharedMemory.AcStatus.AC_OFF) - { - SetHardwareLock(); - } - else - { - _lastCar = null; - ResetRotation(); - } - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - - ResetRotation(); - }).Start(); - - } - - private void SetHardwareLock() - { - string currentModel = ACCSharedMemory.Instance.ReadStaticPageFile(true).CarModel; - if (_lastCar == currentModel) return; - - // car has changed, if we have no wheel, try to re-detect - if (_wheel == null) - DetectDevices(); - _lastCar = currentModel; - if (_wheel == null) return; - - ResetRotation(); - int rotation = Data.ACC.Cars.SteeringLock.Get(_lastCar); - - Trace.WriteLine($"Set wheelbase rotation for {_lastCar} to {rotation}"); - - if (!_wheel.Apply(rotation, false, out _lastRotation)) - Debug.WriteLine("AccSteeringLock: IWheelSteerLockSetter::Apply() failed."); - else if (rotation != _lastRotation) - Debug.WriteLine("AccSteeringLock: rotation had to be clamped due to hardware limitations to: " + _lastRotation); - - } - - public static string GetSupportedDeviceName() - { - DirectInput di = new DirectInput(); - - foreach (DeviceInstance device in di.GetDevices(DeviceClass.GameControl, DeviceEnumerationFlags.AttachedOnly)) - { - Debug.WriteLine("AccSteeringLock: detected: " + device.ProductGuid + " " + device.ProductName); - var _wheel = WheelSteerLock.Get(device.ProductGuid.ToString()); - if (_wheel != null) - { - return device.ProductName; - } - } - - return String.Empty; - } - - private void DetectDevices() - { - DirectInput di = new DirectInput(); - - foreach (DeviceInstance device in di.GetDevices(DeviceClass.GameControl, DeviceEnumerationFlags.AttachedOnly)) - { - Debug.WriteLine("AccSteeringLock: detected: " + device.ProductGuid + " " + device.ProductName); - _wheel = WheelSteerLock.Get(device.ProductGuid.ToString()); - if (_wheel != null) - { - Debug.WriteLine("AccSteeringLock: found supported wheel: " + device.ProductName + " handled by: " + _wheel.ControllerName); - break; - } - } - - if (_wheel == null) - Debug.WriteLine(" no supported wheel found."); - } - - private void ResetRotation() - { - if (_wheel == null) return; - if (_lastRotation <= 0) return; - - Debug.WriteLine("AccSteeringLock: resetting rotation from: " + _lastRotation); - if (!_wheel.Apply(_lastRotation, true, out _lastRotation)) - Debug.WriteLine("AccSteeringLock: IWheelSteerLockSetter::Apply() failed."); - _lastRotation = 0; - } - - } -} diff --git a/Race_Element.Hardware/ACC/SteeringLock/WheelSteerLock.cs b/Race_Element.Hardware/ACC/SteeringLock/WheelSteerLock.cs deleted file mode 100644 index 82a831ed4..000000000 --- a/Race_Element.Hardware/ACC/SteeringLock/WheelSteerLock.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - -namespace RaceElement.Hardware.ACC.SteeringLock -{ - /// - /// From https://github.com/Havner/acc-steering-lock - /// - internal static class WheelSteerLock - { - private static IWheelSteerLockSetter[] _instances; - - private static void Initialize() - { - if (_instances == null) - { - _instances = Assembly.GetExecutingAssembly().GetTypes() - .Where(x => !x.IsAbstract && x.GetInterfaces().Contains(typeof(IWheelSteerLockSetter))) - .Select(x => (IWheelSteerLockSetter)Activator.CreateInstance(x)).ToArray(); - } - } - - public static IWheelSteerLockSetter Get(string productGuid) - { - Initialize(); - return _instances.FirstOrDefault(x => x.Test(productGuid)); - } - - public static bool IsSupported(string productGuid) - { - Initialize(); - return _instances.Any(x => x.Test(productGuid)); - } - - public static IEnumerable GetSupportedNames() - { - Initialize(); - return _instances.Select(x => x.ControllerName); - } - } -} diff --git a/Race_Element.Hardware/Properties/AssemblyInfo.cs b/Race_Element.Hardware/Properties/AssemblyInfo.cs deleted file mode 100644 index f4cb70c33..000000000 --- a/Race_Element.Hardware/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("RaceElement.Hardware")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Element Future")] -[assembly: AssemblyProduct("RaceElement.Hardware")] -[assembly: AssemblyCopyright("Copyright 2022 © Reinier Klarenberg")] -[assembly: AssemblyTrademark("Element Future")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8a7a4857-2f0a-4e85-98c5-3ea1228a8ce2")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Race_Element.Hardware/Race Element.Hardware.csproj b/Race_Element.Hardware/Race Element.Hardware.csproj deleted file mode 100644 index 2ca14e95b..000000000 --- a/Race_Element.Hardware/Race Element.Hardware.csproj +++ /dev/null @@ -1,82 +0,0 @@ - - - - - Debug - AnyCPU - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2} - Library - Properties - RaceElement.Hardware - RaceElement.Hardware - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\hidlibrary.3.3.40\lib\net45\HidLibrary.dll - - - ..\packages\SharpDX.4.2.0\lib\net45\SharpDX.dll - - - ..\packages\SharpDX.DirectInput.4.2.0\lib\net45\SharpDX.DirectInput.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE} - Race Element.Data.ACC - - - {9f9be520-14c4-4ab6-8119-5e14bcca9a0f} - Race Element.SharedMemory - - - - \ No newline at end of file diff --git a/Race_Element.Hardware/app.config b/Race_Element.Hardware/app.config deleted file mode 100644 index 3c508499f..000000000 --- a/Race_Element.Hardware/app.config +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element.Hardware/packages.config b/Race_Element.Hardware/packages.config deleted file mode 100644 index 673d82e3d..000000000 --- a/Race_Element.Hardware/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Race_Element.SharedMemory/ACCSharedMemory.cs b/Race_Element.SharedMemory/ACCSharedMemory.cs deleted file mode 100644 index f193e377d..000000000 --- a/Race_Element.SharedMemory/ACCSharedMemory.cs +++ /dev/null @@ -1,700 +0,0 @@ -using System; -using System.IO.MemoryMappedFiles; -using System.Runtime.InteropServices; -using RaceElement.Controls.Telemetry.SharedMemory; - -namespace RaceElement -{ - /// - /// Used certain shared memory from https://github.com/gro-ove/actools - /// - public unsafe class ACCSharedMemory - { - private readonly string physicsMap = "Local\\acpmf_physics"; - private readonly string graphicsMap = "Local\\acpmf_graphics"; - private readonly string staticMap = "Local\\acpmf_static"; - - public SPageFileStatic PageFileStatic { get; private set; } - public SPageFilePhysics PageFilePhysics { get; private set; } - public SPageFileGraphic PageFileGraphic { get; private set; } - - private static ACCSharedMemory _instance; - public static ACCSharedMemory Instance - { - get - { - if (_instance == null) - _instance = new ACCSharedMemory(); - - return _instance; - } - } - - private ACCSharedMemory() - { - ReadStaticPageFile(); - ReadPhysicsPageFile(); - ReadGraphicsPageFile(); - } - - public enum AcStatus : int - { - AC_OFF, - AC_REPLAY, - AC_LIVE, - AC_PAUSE, - } - - public enum AcSessionType : int - { - AC_UNKNOWN = -1, - AC_PRACTICE = 0, - AC_QUALIFY = 1, - AC_RACE = 2, - AC_HOTLAP = 3, - AC_TIME_ATTACK = 4, - AC_DRIFT = 5, - AC_DRAG = 6, - AC_HOTSTINT = 7, - AC_HOTLAPSUPERPOLE = 8 - } - - - public static string SessionTypeToString(AcSessionType sessionType) - { - switch (sessionType) - { - case AcSessionType.AC_UNKNOWN: return "Unknown"; - case AcSessionType.AC_PRACTICE: return "Practice"; - case AcSessionType.AC_QUALIFY: return "Qualify"; - case AcSessionType.AC_RACE: return "Race"; - case AcSessionType.AC_HOTLAP: return "Hotlap"; - case AcSessionType.AC_TIME_ATTACK: return "Time attack"; - case AcSessionType.AC_DRIFT: return "Drift"; - case AcSessionType.AC_DRAG: return "Drag"; - case AcSessionType.AC_HOTSTINT: return "Hotstint"; - case AcSessionType.AC_HOTLAPSUPERPOLE: return "Hotlap superpole"; - - default: return sessionType.ToString(); - } - } - - public enum AcFlagType : int - { - AC_NO_FLAG, - AC_BLUE_FLAG, - AC_YELLOW_FLAG, - AC_BLACK_FLAG, - AC_WHITE_FLAG, - AC_CHECKERED_FLAG, - AC_PENALTY_FLAG, - AC_GREEN_FLAG, - AC_BLACK_FLAG_WITH_ORANGE_CIRCLE, - - } - - public static string FlagTypeToString(AcFlagType flagType) - { - switch (flagType) - { - case AcFlagType.AC_NO_FLAG: return "Green"; - case AcFlagType.AC_BLUE_FLAG: return "Blue"; - case AcFlagType.AC_YELLOW_FLAG: return "Yellow"; - case AcFlagType.AC_BLACK_FLAG: return "Black"; - case AcFlagType.AC_WHITE_FLAG: return "White"; - case AcFlagType.AC_CHECKERED_FLAG: return "Checkered"; - case AcFlagType.AC_PENALTY_FLAG: return "Penalty"; - case AcFlagType.AC_GREEN_FLAG: return "Green"; - case AcFlagType.AC_BLACK_FLAG_WITH_ORANGE_CIRCLE: return "Orange"; - - default: return flagType.ToString(); - } - } - - public enum PenaltyShortcut : int - { - None, - DriveThrough_Cutting, - StopAndGo_10_Cutting, - StopAndGo_20_Cutting, - StopAndGo_30_Cutting, - Disqualified_Cutting, - RemoveBestLaptime_Cutting, - - DriveThrough_PitSpeeding, - StopAndGo_10_PitSpeeding, - StopAndGo_20_PitSpeeding, - StopAndGo_30_PitSpeeding, - Disqualified_PitSpeeding, - RemoveBestLaptime_PitSpeeding, - - Disqualified_IgnoredMandatoryPit, - - PostRaceTime, - Disqualified_Trolling, - Disqualified_PitEntry, - Disqualified_PitExit, - Disqualified_WrongWay, - - DriveThrough_IgnoredDriverStint, - Disqualified_IgnoredDriverStint, - - Disqualified_ExceededDriverStintLimit, - }; - - public enum AcTrackGripStatus : int - { - Green, - Fast, - Optimum, - Greasy, - Damp, - Wet, - Flooded - }; - - public enum AcRainIntensity : int - { - No_Rain, - Drizzle, - Light_Rain, - Medium_Rain, - Heavy_Rain, - Thunderstorm, - } - - [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode), Serializable] - public class SPageFileGraphic - { - public int PacketId; - public AcStatus Status; - public AcSessionType SessionType; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string CurrentTime; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string LastTime; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string BestTime; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string Split; - - public int CompletedLaps; - public int Position; - public int CurrentTimeMs; - public int LastTimeMs; - public int BestTimeMs; - public float SessionTimeLeft; - public float DistanceTraveled; - - [MarshalAs(UnmanagedType.Bool)] - public bool IsInPits; - - public int CurrentSectorIndex; - public int LastSectorTime; - public int NumberOfLaps; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string TyreCompound; - - [Obsolete] - public float ReplayTimeMultiplier; - public float NormalizedCarPosition; - - public int ActiveCars; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 60)] - public StructVector3[] CarCoordinates; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 60)] - public int[] CarIds; - - public int PlayerCarID; - - public float PenaltyTime; - public AcFlagType Flag; - - public PenaltyShortcut PenaltyType; - - [MarshalAs(UnmanagedType.Bool)] - public bool IdealLineOn; - - [MarshalAs(UnmanagedType.Bool)] - public bool IsInPitLane; - public float SurfaceGrip; - - [MarshalAs(UnmanagedType.Bool)] - public bool MandatoryPitDone; - - public float WindSpeed; - public float WindDirection; - - [MarshalAs(UnmanagedType.Bool)] - public bool IsSetupMenuVisible; - - public int MainDisplayIndex; - public int SecondaryDisplayIndex; - public int TC; - public int TCCut; - public int EngineMap; - public int ABS; - public float FuelXLap; - public int RainLights; - public int FlashingLights; - public int LightsStage; - public float ExhaustTemperature; - public int WiperLV; - public int DriverStintTotalTimeLeft; - public int DriverStintTimeLeft; - public int RainTyres; - - public int SessionIndex; - public float UsedFuelSinceRefuel; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string DeltaLapTime; - - public int DeltaLapTimeMillis; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string EstimatedLapTime; - public int EstimatedLapTimeMillis; - - [MarshalAs(UnmanagedType.Bool)] - public bool IsDeltaPositive; - public int SplitTimeMillis; - - [MarshalAs(UnmanagedType.Bool)] - public bool IsValidLap; - public float FuelEstimatedLaps; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string TrackStatus; - - public int MandatoryPitStopsLeft; - float ClockTimeDaySeconds; - - [MarshalAs(UnmanagedType.Bool)] - public bool BlinkerLeftOn; - - [MarshalAs(UnmanagedType.Bool)] - public bool BlinkerRightOn; - - [MarshalAs(UnmanagedType.Bool)] - public bool GlobalYellow; - - [MarshalAs(UnmanagedType.Bool)] - public bool GlobalYellowSector1; - - [MarshalAs(UnmanagedType.Bool)] - public bool GlobalYellowSector2; - - [MarshalAs(UnmanagedType.Bool)] - public bool GlobalYellowSector3; - - [MarshalAs(UnmanagedType.Bool)] - public bool GlobalWhite; - - [MarshalAs(UnmanagedType.Bool)] - public bool GreenFlag; - - [MarshalAs(UnmanagedType.Bool)] - public bool GlobalChequered; - - [MarshalAs(UnmanagedType.Bool)] - public bool GlobalRed; - - public int mfdTyreSet; - public float mfdFuelToAdd; - - public float mfdTyrePressureLF; - public float mfdTyrePressureRF; - public float mfdTyrePressureLR; - public float mfdTyrePressureRR; - public AcTrackGripStatus trackGripStatus; - public AcRainIntensity rainIntensity; - public AcRainIntensity rainIntensityIn10min; - public AcRainIntensity rainIntensityIn30min; - public int currentTyreSet; - public int strategyTyreSet; - public int gapAheadMillis; - public int gapBehindMillis; - - - public static readonly int Size = Marshal.SizeOf(typeof(SPageFileGraphic)); - public static readonly byte[] Buffer = new byte[Size]; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode), Serializable] - public struct StructVector3 - { - public float X; - public float Y; - public float Z; - - public override string ToString() => $"X: {X}, Y: {Y}, Z: {Z}"; - } - - [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode), Serializable] - public class SPageFilePhysics - { - public int PacketId; - public float Gas; - public float Brake; - public float Fuel; - public int Gear; - public int Rpms; - public float SteerAngle; - public float SpeedKmh; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] - public float[] Velocity; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] - public float[] AccG; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] WheelSlip; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] WheelLoad; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] WheelPressure; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] WheelAngularSpeed; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreWear; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreDirtyLevel; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreCoreTemperature; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] CamberRad; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] SuspensionTravel; - - [Obsolete] - public float Drs; - public float TC; - public float Heading; - public float Pitch; - public float Roll; - - [Obsolete] - public float CgHeight; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] - public float[] CarDamage; - - [Obsolete] - public int NumberOfTyresOut; - - [MarshalAs(UnmanagedType.Bool)] - public bool PitLimiterOn; - public float Abs; - - [Obsolete] - public float KersCharge; - - [Obsolete] - public float KersInput; - - [MarshalAs(UnmanagedType.Bool)] - public bool AutoShifterOn; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] - public float[] RideHeight; - - public float TurboBoost; - - [Obsolete] - public float Ballast; - [Obsolete] - public float AirDensity; - - public float AirTemp; - public float RoadTemp; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] - public float[] LocalAngularVelocity; - - public float finalFF; - - [Obsolete] - public float PerformanceMeter; - [Obsolete] - public int EngineBrake; - [Obsolete] - public int ErsRecoveryLevel; - [Obsolete] - public int ErsPowerLevel; - [Obsolete] - public int ErsHeatCharging; - [Obsolete] - public int ErsIsCharging; - [Obsolete] - public float KersCurrentKJ; - - [Obsolete] - [MarshalAs(UnmanagedType.Bool)] - public bool DrsAvailable; - - [Obsolete] - [MarshalAs(UnmanagedType.Bool)] - public bool DrsEnabled; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] BrakeTemperature; - - public float Clutch; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreTempI; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreTempM; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreTempO; - - [MarshalAs(UnmanagedType.Bool)] - public bool IsAiControlled; - - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public StructVector3[] TyreContactPoint; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public StructVector3[] TyreContactNormal; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public StructVector3[] TyreContactHeading; - - public float BrakeBias; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] - public float[] LocalVelocity; - - [Obsolete] - public int P2PActivations; - [Obsolete] - public int P2PStatus; - - [Obsolete] - public int CurrentMaxRpm; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] mz; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] fx; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] fy; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] SlipRatio; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] SlipAngle; - - [Obsolete] - public int TcinAction; - [Obsolete] - public int AbsInAction; - - //[Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] SuspensionDamage; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreTemp; - - public float WaterTemp; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] brakePressure; - public int frontBrakeCompound; - public int rearBrakeCompound; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] PadLife; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] DiscLife; - - [MarshalAs(UnmanagedType.Bool)] - public bool IgnitionOn; - - [MarshalAs(UnmanagedType.Bool)] - public bool StarterEngineOn; - - [MarshalAs(UnmanagedType.Bool)] - public bool IsEngineRunning; - - public float KerbVibration; - public float SlipVibrations; - public float Gvibrations; - public float AbsVibrations; - - public static readonly int Size = Marshal.SizeOf(typeof(SPageFilePhysics)); - public static readonly byte[] Buffer = new byte[Size]; - }; - - [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode), Serializable] - public class SPageFileStatic - { - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string SharedMemoryVersion; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] - public string AssettoCorsaVersion; - - public int NumberOfSessions; - public int NumberOfCars; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string CarModel; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string Track; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string PlayerName; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string PlayerSurname; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string PlayerNickname; - - public int SectorCount; - - // car static info - [Obsolete] - public float MaxTorque; - [Obsolete] - public float MaxPower; - public int MaxRpm; - public float MaxFuel; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] SuspensionMaxTravel; - - [Obsolete] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public float[] TyreRadius; - - public float MaxTurboBoost; - - [Obsolete] - public float AirTemperature; - - [Obsolete] - public float RoadTemperature; - - [MarshalAs(UnmanagedType.Bool)] - public bool PenaltiesEnabled; - public float AidFuelRate; - public float AidTireRate; - public float AidMechanicalDamage; - [MarshalAs(UnmanagedType.Bool)] - public bool AidAllowTyreBlankets; - public float AidStability; - [MarshalAs(UnmanagedType.Bool)] - public bool AidAutoClutch; - [MarshalAs(UnmanagedType.Bool)] - public bool AidAutoBlip; - - [Obsolete] - [MarshalAs(UnmanagedType.Bool)] - public bool HasDRS; - - [Obsolete] - [MarshalAs(UnmanagedType.Bool)] - public bool HasERS; - - [Obsolete] - [MarshalAs(UnmanagedType.Bool)] - public bool HasKERS; - [Obsolete] - public float KersMaxJoules; - [Obsolete] - public int EngineBrakeSettingsCount; - [Obsolete] - public int ErsPowerControllerCount; - [Obsolete] - public float TrackSplineLength; - [Obsolete] - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string TrackConfiguration; - [Obsolete] - public float ErsMaxJ; - [Obsolete] - [MarshalAs(UnmanagedType.Bool)] - public bool IsTimedRace; - [Obsolete] - [MarshalAs(UnmanagedType.Bool)] - public bool HasExtraLap; - [Obsolete] - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string CarSkin; - [Obsolete] - public int ReversedGridPositions; - - public int PitWindowStart; - public int PitWindowEnd; - - - [MarshalAs(UnmanagedType.Bool)] - public bool isOnline; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string DryTyresName; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] - public string WetTyresName; - - public static readonly int Size = Marshal.SizeOf(typeof(SPageFileStatic)); - public static readonly byte[] Buffer = new byte[Size]; - }; - - public SPageFileGraphic ReadGraphicsPageFile(bool fromCache = false) - { - if (fromCache) return PageFileGraphic; - return PageFileGraphic = StructExtension.ToStruct(MemoryMappedFile.CreateOrOpen(graphicsMap, sizeof(byte), MemoryMappedFileAccess.ReadWrite), SPageFileGraphic.Buffer); - } - - public SPageFileStatic ReadStaticPageFile(bool fromCache = false) - { - if (fromCache) return PageFileStatic; - return PageFileStatic = StructExtension.ToStruct(MemoryMappedFile.CreateOrOpen(staticMap, sizeof(byte), MemoryMappedFileAccess.ReadWrite), SPageFileStatic.Buffer); - } - - public SPageFilePhysics ReadPhysicsPageFile(bool fromCache = false) - { - if (fromCache) return PageFilePhysics; - return PageFilePhysics = StructExtension.ToStruct(MemoryMappedFile.CreateOrOpen(physicsMap, sizeof(byte), MemoryMappedFileAccess.ReadWrite), SPageFilePhysics.Buffer); - } - } -} diff --git a/Race_Element.SharedMemory/Properties/AssemblyInfo.cs b/Race_Element.SharedMemory/Properties/AssemblyInfo.cs deleted file mode 100644 index 69067b2c8..000000000 --- a/Race_Element.SharedMemory/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("RaceElement.SharedMemory")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Element Future")] -[assembly: AssemblyProduct("RaceElement.SharedMemory")] -[assembly: AssemblyCopyright("Copyright 2022 © Reinier Klarenberg")] -[assembly: AssemblyTrademark("Element Future")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("9f9be520-14c4-4ab6-8119-5e14bcca9a0f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Race_Element.SharedMemory/Race Element.SharedMemory.csproj b/Race_Element.SharedMemory/Race Element.SharedMemory.csproj deleted file mode 100644 index e5e7c3634..000000000 --- a/Race_Element.SharedMemory/Race Element.SharedMemory.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Debug - AnyCPU - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F} - Library - Properties - RaceElement.SharedMemory - RaceElement.SharedMemory - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - true - - - true - bin\Debug Minimized\ - DEBUG;TRACE - true - full - AnyCPU - 7.3 - prompt - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element.SharedMemory/StructExtensions.cs b/Race_Element.SharedMemory/StructExtensions.cs deleted file mode 100644 index 2d9cce985..000000000 --- a/Race_Element.SharedMemory/StructExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.IO.MemoryMappedFiles; -using System.Runtime.InteropServices; - -namespace RaceElement.Controls.Telemetry.SharedMemory -{ - /// - /// From ACManager.Tools https://github.com/gro-ove/actools/blob/master/AcManager.Tools/SharedMemory/StructExtension.cs - /// - public static class StructExtension - { - public static T ToStruct(this MemoryMappedFile file, byte[] buffer) - { - using (var stream = file.CreateViewStream()) - { - stream.Read(buffer, 0, buffer.Length); - var handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); - var data = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); - handle.Free(); - return data; - } - } - - public static T ToStruct(this TimestampedBytes timestampedBytes) - { - var handle = GCHandle.Alloc(timestampedBytes.RawData, GCHandleType.Pinned); - var data = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); - handle.Free(); - return data; - } - - public static TimestampedBytes ToTimestampedBytes(this T s, byte[] buffer) where T : struct - { - var ptr = Marshal.AllocHGlobal(buffer.Length); - Marshal.StructureToPtr(s, ptr, false); - Marshal.Copy(ptr, buffer, 0, buffer.Length); - Marshal.FreeHGlobal(ptr); - return new TimestampedBytes(buffer, DateTime.Now); - } - } - - public class TimestampedBytes - { - public byte[] RawData; - public DateTime IncomingDate; - - public TimestampedBytes(byte[] rawData) - { - RawData = rawData; - IncomingDate = DateTime.Now; - } - - public TimestampedBytes(byte[] rawData, DateTime incomingDate) - { - RawData = rawData; - IncomingDate = incomingDate; - } - } - -} diff --git a/Race_Element.Util/AbstractSettingsJson.cs b/Race_Element.Util/AbstractSettingsJson.cs deleted file mode 100644 index 12dcd09a6..000000000 --- a/Race_Element.Util/AbstractSettingsJson.cs +++ /dev/null @@ -1,111 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Diagnostics; -using System.IO; - -namespace RaceElement.Util -{ - public interface IGenericSettingsJson - { - } - - public abstract class AbstractSettingsJson - where T : IGenericSettingsJson - { - public abstract T Default(); - public abstract string Path { get; } - public abstract string FileName { get; } - private FileInfo SettingsFile => new FileInfo(Path + FileName); - - public static T Cached { get; private set; } - - public AbstractSettingsJson() - { - Cached = Get(false); - } - - public T Get(bool cached = true) - { - if (cached && Cached != null) - return Cached; - - if (!SettingsFile.Exists) - return Default(); - - try - { - using (FileStream fileStream = SettingsFile.OpenRead()) - { - Cached = ReadJson(fileStream); - return Cached; - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - - return Default(); - } - - public void Save(T genericJson) - { - try - { - string jsonString = JsonConvert.SerializeObject(genericJson, Formatting.Indented); - - if (!SettingsFile.Exists && !Directory.Exists(Path)) - Directory.CreateDirectory(Path); - - File.WriteAllText(Path + "\\" + FileName, jsonString); - - Cached = genericJson; - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - - private T ReadJson(Stream stream) - { - string jsonString = string.Empty; - try - { - using (StreamReader reader = new StreamReader(stream)) - { - jsonString = reader.ReadToEnd(); - jsonString = jsonString.Replace("\0", ""); - reader.Close(); - stream.Close(); - } - - T t = JsonConvert.DeserializeObject(jsonString); - - if (t == null) - return Default(); - - return t; - } - catch (Exception e) - { - Debug.WriteLine(e); - } - - return Default(); - } - - public void Delete() - { - try - { - if (SettingsFile.Exists) - SettingsFile.Delete(); - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - } -} diff --git a/Race_Element.Util/DataTypes/FloatRangeStruct.cs b/Race_Element.Util/DataTypes/FloatRangeStruct.cs deleted file mode 100644 index ef6f75bcd..000000000 --- a/Race_Element.Util/DataTypes/FloatRangeStruct.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.Util.DataTypes -{ - public struct FloatRangeStruct - { - readonly float From; - readonly float To; - - public FloatRangeStruct(float from, float to) - { - From = from; - To = to; - } - - public bool IsInRange(float value) => value >= From && value <= To; - } -} diff --git a/Race_Element.Util/FileUtil.cs b/Race_Element.Util/FileUtil.cs deleted file mode 100644 index a1e464947..000000000 --- a/Race_Element.Util/FileUtil.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.IO; -using System.Security.Cryptography; - -namespace RaceElement.Util -{ - public class FileUtil - { - public static string RaceElementAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\" + "Race Element\\"; - public static string RaceElementLogPath = RaceElementAppDataPath + "Log\\"; - public static string RaceElementTagsPath = RaceElementAppDataPath + "Tag\\"; - public static string RaceElementOverlayPath = RaceElementAppDataPath + "Overlay\\"; - public static string RaceElementSettingsPath = RaceElementAppDataPath + "Settings\\"; - public static string RaceElementDataPath = RaceElementAppDataPath + "Data\\"; - - - public static string AccPath => Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\" + "Assetto Corsa Competizione\\"; - public static string CustomsPath => AccPath + "Customs\\"; - public static string CarsPath => CustomsPath + "Cars\\"; - public static string LiveriesPath => CustomsPath + "Liveries\\"; - public static string AccConfigPath => AccPath + "Config\\"; - - public static string AppDirectory => StripFileName(System.Reflection.Assembly.GetEntryAssembly().Location); - public static string AppFullName => AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName; - - - /// - /// Strips the file name from a windows directory path - /// - /// - /// removed the filename from the path is what it returns - public static string StripFileName(string fileName) - { - string[] dashSplit = fileName.Split('\\'); - string result = String.Empty; - - for (int i = 0; i < dashSplit.Length - 1; i++) - { - result += dashSplit[i] + '\\'; - } - - return result; - } - - public static string GetFileName(string fullName) - { - string[] split = fullName.Split('/'); - - if (split.Length == 1 && split[0].Contains("\\")) - { - split = fullName.Split('\\'); - } - - return split[split.Length - 1].Replace("\\", ""); - } - - /// - /// Calculates the SHA256 Hash of given file - /// - /// - /// base64 string of SHA256 hash, or empty string if file doesn't exist or when exception occurs - public static string GetBase64Hash(string file) - { - FileInfo fileInfo = new FileInfo(file); - if (!fileInfo.Exists) return string.Empty; - - try - { - using (FileStream fileStream = File.OpenRead(file)) - { - byte[] hash = SHA256Managed.Create().ComputeHash((Stream)fileStream); - fileStream.Close(); - return Convert.ToBase64String(hash); - } - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - return string.Empty; - } - } - } -} diff --git a/Race_Element.Util/LogWriter.cs b/Race_Element.Util/LogWriter.cs deleted file mode 100644 index 9a02fb17c..000000000 --- a/Race_Element.Util/LogWriter.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace RaceElement.Util -{ - /// - /// Simple thread safe logging helper - /// - public class LogWriter - { - -#pragma warning disable IDE1006 // Naming Styles - private static LogWriter _instance { get; set; } -#pragma warning restore IDE1006 // Naming Styles - /// - /// Single instance of logwriter - /// - private static LogWriter Instance - { - get - { - if (_instance == null) - { - _instance = new LogWriter(); - _instance.LogQueue = new Queue(); - FlushedAt = DateTime.Now; - } - return _instance; - } - } - - /// - /// Queue used to store logs - /// - private Queue LogQueue; - - /// - /// Path to save log files - /// - private static string LogPath = FileUtil.RaceElementLogPath; - - /// - /// Lof file name - /// - private static string LogFile = "ACC_Manager_Log.txt"; - - /// - /// Flush log when time reached - /// - private static int FlushAtAge = 1000 * 60 * 60; - - /// - /// Flush log when quantity reached - /// - private static int FlushAtQty = 0; - - /// - /// Timestamp of last flush - /// - private static DateTime FlushedAt; - - /// - /// Private constructor -> prevent instantiation - /// - private LogWriter() { } - - /// - /// Log message - /// - /// Message to log - public static void WriteToLog(string message) - { - lock (Instance.LogQueue) - { - // Create log - Log log = new Log(message); - Instance.LogQueue.Enqueue(log); - - // Check if should flush - if (Instance.LogQueue.Count >= FlushAtQty || CheckTimeToFlush()) - { - FlushLogToFile(); - } - - } - } - - /// - /// Log exception - /// - /// Exception to log - public static void WriteToLog(Exception e) - { - lock (Instance.LogQueue) - { - // Create log - Log msg = new Log(e.Source.ToString().Trim() + " " + e.Message.ToString().Trim()); - Log stack = new Log("Stack: " + e.StackTrace.ToString().Trim()); - Instance.LogQueue.Enqueue(msg); - Instance.LogQueue.Enqueue(stack); - - // Check if should flush - if (Instance.LogQueue.Count >= FlushAtQty || CheckTimeToFlush()) - { - FlushLogToFile(); - } - - } - } - - /// - /// Force flush of log queue - /// - public static void ForceFlush() - { - FlushLogToFile(); - } - - /// - /// Check if time to flush to file - /// - /// - private static bool CheckTimeToFlush() - { - TimeSpan time = DateTime.Now - FlushedAt; - if (time.TotalSeconds >= FlushAtAge) - { - FlushedAt = DateTime.Now; - return true; - } - return false; - } - - /// - /// Flush log queue to file - /// - private static void FlushLogToFile() - { - while (Instance.LogQueue.Count > 0) - { - // Get entry to log - Log entry = Instance.LogQueue.Dequeue(); - string path = LogPath + entry.GetDate() + "_" + LogFile; - - - FileInfo fileInfo = new FileInfo(path); - - if (!fileInfo.Directory.Exists) - new DirectoryInfo(fileInfo.DirectoryName).Create(); - - FileStream stream; - if (!fileInfo.Exists) - stream = new FileStream(new FileInfo(path).FullName, FileMode.Append, FileAccess.Write); - else - stream = new FileStream(path, FileMode.Append, FileAccess.Write); - // Crete filestream - - using (var writer = new StreamWriter(stream)) - { - // Log to file - writer.WriteLine($"{entry.GetTime()}\t{entry.GetMessage()}"); - } - - stream.Close(); - } - } - - } - - /// - /// Log container object - /// - public class Log - { - - /// - /// Content of log - /// - private string LogMessage; - - /// - /// Log timestamp - /// - private DateTime LogTime; - - /// - /// Constructor - /// - /// Logged message - public Log(string message) - { - LogMessage = message; - LogTime = DateTime.Now; - } - - /// - /// Log message accessor - /// - /// Log message - public string GetMessage() - { - return LogMessage; - } - - /// - /// Get the time from log timestamp - /// - /// Time - public string GetTime() - { - return LogTime.ToString("hh:mm:ss.fff tt"); - } - - /// - /// Get the date from log timestamp - /// - /// Date - public string GetDate() - { - return LogTime.ToString("yyyy-MM-dd"); - } - - } -} diff --git a/Race_Element.Util/Properties/AssemblyInfo.cs b/Race_Element.Util/Properties/AssemblyInfo.cs deleted file mode 100644 index 3b958a480..000000000 --- a/Race_Element.Util/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("RaceElement.Util")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Element Future")] -[assembly: AssemblyProduct("RaceElement.Util")] -[assembly: AssemblyCopyright("Copyright 2022 © Reinier Klarenberg")] -[assembly: AssemblyTrademark("Element Future")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("aab23116-299b-415b-8305-96cb86148ce7")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Race_Element.Util/Race Element.Util.csproj b/Race_Element.Util/Race Element.Util.csproj deleted file mode 100644 index 091083508..000000000 --- a/Race_Element.Util/Race Element.Util.csproj +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Debug - AnyCPU - {AAB23116-299B-415B-8305-96CB86148CE7} - Library - Properties - RaceElement.Util - RaceElement.Util - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\Debug Minimized\ - DEBUG;TRACE - full - AnyCPU - 7.3 - prompt - - - - ..\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F} - Race Element.SharedMemory - - - - \ No newline at end of file diff --git a/Race_Element.Util/ReflectionUtil.cs b/Race_Element.Util/ReflectionUtil.cs deleted file mode 100644 index fe1ac6950..000000000 --- a/Race_Element.Util/ReflectionUtil.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Reflection; -using static RaceElement.ACCSharedMemory; - -namespace RaceElement.Util -{ - public class ReflectionUtil - { - public static object FieldTypeValue(FieldInfo member, object value) - { - - if (member.FieldType.Name == typeof(byte[]).Name) - { - byte[] arr = (byte[])value; - value = string.Empty; - foreach (byte v in arr) - { - value += $"{{{v}}}, "; - } - } - - - if (member.FieldType.Name == typeof(Int32[]).Name) - { - Int32[] arr = (Int32[])value; - value = string.Empty; - foreach (Int32 v in arr) - { - value += $"{{{v}}}, "; - } - } - - if (member.FieldType.Name == typeof(Single[]).Name) - { - Single[] arr = (Single[])value; - value = string.Empty; - foreach (Single v in arr) - { - value += $"{{{v}}}, "; - } - } - - if (member.FieldType.Name == typeof(StructVector3[]).Name) - { - StructVector3[] arr = (StructVector3[])value; - value = string.Empty; - foreach (StructVector3 v in arr) - { - value += $"{{{v}}}, "; - } - } - - if (member.FieldType.Name == typeof(StructVector3).Name) - { - value = (StructVector3)value; - } - - return value; - } - } -} diff --git a/Race_Element.Util/Settings/AccManagerSettings.cs b/Race_Element.Util/Settings/AccManagerSettings.cs deleted file mode 100644 index 108eec335..000000000 --- a/Race_Element.Util/Settings/AccManagerSettings.cs +++ /dev/null @@ -1,26 +0,0 @@ -using RaceElement.Util; - -namespace RaceElement.Util.Settings -{ - public class AccManagerSettingsJson : IGenericSettingsJson - { - public bool MinimizeToSystemTray { get; set; } - public bool TelemetryRecordDetailed { get; set; } = false; - public int TelemetryDetailedHerz { get; set; } - } - - public class AccManagerSettings : AbstractSettingsJson - { - public override string Path => FileUtil.RaceElementSettingsPath; - - public override string FileName => "AccManager.json"; - - public override AccManagerSettingsJson Default() => new AccManagerSettingsJson() - { - MinimizeToSystemTray = false, - TelemetryRecordDetailed = false, - TelemetryDetailedHerz = 20, - }; - - } -} diff --git a/Race_Element.Util/Settings/AccSettings.cs b/Race_Element.Util/Settings/AccSettings.cs deleted file mode 100644 index 7b745c5ac..000000000 --- a/Race_Element.Util/Settings/AccSettings.cs +++ /dev/null @@ -1,23 +0,0 @@ -using RaceElement.Util; -using System; - -namespace RaceElement.Util.Settings -{ - public class AccSettingsJson : IGenericSettingsJson - { - public bool AutoRecordReplay { get; set; } = false; - public Guid UnlistedAccServer { get; set; } - } - - public class AccSettings : AbstractSettingsJson - { - public override string Path => FileUtil.RaceElementSettingsPath; - public override string FileName => "ACC.json"; - - public override AccSettingsJson Default() => new AccSettingsJson() - { - UnlistedAccServer = Guid.Empty, - AutoRecordReplay = false, - }; - } -} diff --git a/Race_Element.Util/Settings/HardwareSettings.cs b/Race_Element.Util/Settings/HardwareSettings.cs deleted file mode 100644 index 61f8b37af..000000000 --- a/Race_Element.Util/Settings/HardwareSettings.cs +++ /dev/null @@ -1,25 +0,0 @@ -using RaceElement.Util; - -namespace RaceElement.Util.Settings -{ - public class HardwareSettingsJson : IGenericSettingsJson - { - public bool UseHardwareSteeringLock = false; - } - - public class HardwareSettings : AbstractSettingsJson - { - public override string Path => FileUtil.RaceElementSettingsPath; - - public override string FileName => "Hardware.json"; - - public override HardwareSettingsJson Default() - { - var settings = new HardwareSettingsJson() - { - UseHardwareSteeringLock = false - }; - return settings; - } - } -} diff --git a/Race_Element.Util/Settings/HudSettings.cs b/Race_Element.Util/Settings/HudSettings.cs deleted file mode 100644 index 857e7a1e6..000000000 --- a/Race_Element.Util/Settings/HudSettings.cs +++ /dev/null @@ -1,24 +0,0 @@ -using RaceElement.Util; - -namespace RaceElement.Util.Settings -{ - public class HudSettingsJson : IGenericSettingsJson - { - public bool DemoMode { get; set; } - } - - public class HudSettings : AbstractSettingsJson - { - public override string Path => FileUtil.RaceElementSettingsPath; - - public override string FileName => "HudSettings.json"; - - public override HudSettingsJson Default() - { - return new HudSettingsJson() - { - DemoMode = false - }; - } - } -} diff --git a/Race_Element.Util/Settings/StreamSettings.cs b/Race_Element.Util/Settings/StreamSettings.cs deleted file mode 100644 index 3f6a8985a..000000000 --- a/Race_Element.Util/Settings/StreamSettings.cs +++ /dev/null @@ -1,35 +0,0 @@ -using RaceElement.Util; -using System; - -namespace RaceElement.Util.Settings -{ - public class StreamingSettingsJson : IGenericSettingsJson - { - public string StreamingSoftware { get; set; } - public string StreamingWebSocketIP { get; set; } - public string StreamingWebSocketPort { get; set; } - public string StreamingWebSocketPassword { get; set; } - - public bool SetupHider { get; set; } - } - - public class StreamSettings : AbstractSettingsJson - { - public override string Path => FileUtil.RaceElementSettingsPath; - public override string FileName => "Streaming.json"; - - - public override StreamingSettingsJson Default() - { - var settings = new StreamingSettingsJson() - { - StreamingSoftware = "OBS", - StreamingWebSocketIP = "localhost", - StreamingWebSocketPort = "4444", - StreamingWebSocketPassword = String.Empty, - SetupHider = false - }; - return settings; - } - } -} diff --git a/Race_Element.Util/Settings/UiSettings.cs b/Race_Element.Util/Settings/UiSettings.cs deleted file mode 100644 index 1e9b32e81..000000000 --- a/Race_Element.Util/Settings/UiSettings.cs +++ /dev/null @@ -1,31 +0,0 @@ -using RaceElement.Util; -using System.Windows; - -namespace RaceElement.Util.Settings -{ - public class UiSettingsJson : IGenericSettingsJson - { - public int SelectedTabIndex; - public int X; - public int Y; - } - - public class UiSettings : AbstractSettingsJson - { - public override string Path => FileUtil.RaceElementSettingsPath; - - public override string FileName => "UI.json"; - - public override UiSettingsJson Default() - { - var settings = new UiSettingsJson() - { - SelectedTabIndex = 0, - X = (int)SystemParameters.PrimaryScreenWidth / 2, - Y = (int)SystemParameters.PrimaryScreenHeight / 2 - }; - - return settings; - } - } -} diff --git a/Race_Element.Util/SystemExtensions/DoubleExtensions.cs b/Race_Element.Util/SystemExtensions/DoubleExtensions.cs deleted file mode 100644 index 810d6fd5d..000000000 --- a/Race_Element.Util/SystemExtensions/DoubleExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Text; - -namespace RaceElement.Util.SystemExtensions -{ - public static class DoubleExtensions - { - /// - /// Sets this value or returns it, clipped by min and max (inclusive) - /// - /// - /// - /// - /// - public static double Clip(ref this double value, double min, double max) - { - if (value < min) value = min; - if (value > max) value = max; - return value; - } - - /// - /// Sets this value or returns it, clipped by max (inclusive) - /// - /// - /// - /// - /// - public static double ClipMax(ref this double value, double max) - { - if (value > max) value = max; - return value; - } - - /// - /// Sets this value or returns it, clipped by min (inclusive) - /// - /// - /// - /// - /// - public static double ClipMin(ref this double value, double min) - { - if (value < min) value = min; - return value; - } - - public static string ToString(this double[] values, int decimals) - { - var builder = new StringBuilder(); - for (int i = 0; i < values.Length; i++) - { - double v = values[i]; - builder.Append($"{{{v.ToString($"F{decimals}")}}}"); - if (i < values.Length - 1) - builder.Append(", "); - } - return builder.ToString(); - } - } -} diff --git a/Race_Element.Util/SystemExtensions/FloatExtensions.cs b/Race_Element.Util/SystemExtensions/FloatExtensions.cs deleted file mode 100644 index 427501492..000000000 --- a/Race_Element.Util/SystemExtensions/FloatExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Text; - -namespace RaceElement.Util.SystemExtensions -{ - public static class FloatExtensions - { - /// - /// Sets this value or returns it, clipped by min and max (inclusive) - /// - /// - /// - /// - /// - public static float Clip(ref this float value, float min, float max) - { - if (value < min) value = min; - if (value > max) value = max; - return value; - } - - /// - /// Sets this value or returns it, clipped by max (inclusive) - /// - /// - /// - /// - /// - public static float ClipMax(ref this float value, float max) - { - if (value > max) value = max; - return value; - } - - /// - /// Sets this value or returns it, clipped by min (inclusive) - /// - /// - /// - /// - /// - public static float ClipMin(ref this float value, float min) - { - if (value < min) value = min; - return value; - } - - public static string ToString(this float[] values, int decimals) - { - var builder = new StringBuilder(); - for (int i = 0; i < values.Length; i++) - { - double v = values[i]; - builder.Append($"{{{v.ToString($"F{decimals}")}}}"); - if (i < values.Length - 1) - builder.Append(", "); - } - return builder.ToString(); - } - } -} diff --git a/Race_Element.Util/SystemExtensions/IntegerExtensions.cs b/Race_Element.Util/SystemExtensions/IntegerExtensions.cs deleted file mode 100644 index 36920f91f..000000000 --- a/Race_Element.Util/SystemExtensions/IntegerExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Text; - -namespace RaceElement.Util.SystemExtensions -{ - public static class IntegerExtensions - { - /// - /// Sets this value or returns it, clipped by min and max (inclusive) - /// - /// - /// - /// - /// - public static int Clip(ref this int value, int min, int max) - { - if (value < min) value = min; - if (value > max) value = max; - return value; - } - - /// - /// Sets this value or returns it, clipped by max (inclusive) - /// - /// - /// - /// - /// - public static int ClipMax(ref this int value, int max) - { - if (value > max) value = max; - return value; - } - - /// - /// Sets this value or returns it, clipped by min (inclusive) - /// - /// - /// - /// - /// - public static int ClipMin(ref this int value, int min) - { - if (value < min) value = min; - return value; - } - - public static string ToString(this int[] values) - { - var builder = new StringBuilder(); - for (int i = 0; i < values.Length; i++) - { - double v = values[i]; - builder.Append($"{{{v}}}"); - if (i < values.Length - 1) - builder.Append(", "); - } - return builder.ToString(); - } - } -} diff --git a/Race_Element.Util/SystemExtensions/StringExtensions.cs b/Race_Element.Util/SystemExtensions/StringExtensions.cs deleted file mode 100644 index e49dc0875..000000000 --- a/Race_Element.Util/SystemExtensions/StringExtensions.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -namespace RaceElement.Util.SystemExtensions -{ - public static class StringExtensions - { - public static string FillStart(this String text, int maxLength, char filler) - { - int length = text.Length; - - if (length < maxLength) - { - int missing = maxLength - length; - for (int i = 0; i < missing; i++) - text = filler + text; - } - - return text; - } - - public static string FillEnd(this String text, int maxLength, char filler) - { - int length = text.Length; - - if (length < maxLength) - { - int missing = maxLength - length; - for (int i = 0; i < missing; i++) - text += filler; - } - - return text; - } - } -} diff --git a/Race_Element.Util/packages.config b/Race_Element.Util/packages.config deleted file mode 100644 index 4de699c93..000000000 --- a/Race_Element.Util/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Race_Element/App.config b/Race_Element/App.config deleted file mode 100644 index 27867d369..000000000 --- a/Race_Element/App.config +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element/App.xaml b/Race_Element/App.xaml deleted file mode 100644 index 4d573b039..000000000 --- a/Race_Element/App.xaml +++ /dev/null @@ -1,90 +0,0 @@ - - - "pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/#Roboto-Medium - pack://application:,,,./Fonts/#Conthrax Sb - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/App.xaml.cs b/Race_Element/App.xaml.cs deleted file mode 100644 index 5a95dd0d8..000000000 --- a/Race_Element/App.xaml.cs +++ /dev/null @@ -1,54 +0,0 @@ -using ACCManager.Data.ACC.Core.Game; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Quartz; -using Quartz.Impl; -using RaceElement.Data.ACC.Core.Game.Jobs; -using System.Globalization; -using System.Windows; - -namespace RaceElement -{ - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application - { - public static App Instance { get; private set; } - public bool StartMinimized = false; - - public App() - { - this.Startup += App_Startup; - CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; - Instance = this; - - var builder = Host.CreateDefaultBuilder().ConfigureServices((cxt, services) => - { - services.AddQuartz(q => - { - q.UseMicrosoftDependencyInjectionJobFactory(); - - AccScheduler.RegisterJobs(); - }); - services.AddQuartzHostedService(opt => - { - opt.WaitForJobsToComplete = false; - opt.AwaitApplicationStarted = true; - }); - }).Build(); - - builder.RunAsync(); - } - - private void App_Startup(object sender, StartupEventArgs e) - { - for (int i = 0; i != e.Args.Length; ++i) - { - if (e.Args[i] == "/StartMinimized") - StartMinimized = true; - } - } - - } -} diff --git a/Race_Element/Controls/About/About.xaml b/Race_Element/Controls/About/About.xaml deleted file mode 100644 index 71de3dbdc..000000000 --- a/Race_Element/Controls/About/About.xaml +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Race Element - - - Provides tooling for Sim Racing. - - - - Developed by RiddleTime. Contributors: KrisV147, Floriwan, Pelice, Mominon, Fbalazs and Jubka. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Guide - - - - - - - - - Start Race Element before you join a session. - - - - - HUD - - - - HUDs will become visible as soon as the engine is running. - - When the game is in Fullscreen mode, hit F11 twice to display the overlays. - - Activate the HUDs you want to see, activated HUDs will be green in the list. - - Mouse Right Click: (De)Activate HUD. (you can also click the title) - - Mouse Middle Click or Ctrl + Home: Toggle move mode. - - Scrolling the sliders will change their value. - - - - - - - Data - - - Race Weekends: - - Displays each session of a Race Weekend recorded when Race Element is running. - - Select a Race Weekend and go to the Current tab. - - Reload the Local race weekends list by re-opening the Telemetry tab. - - Drag and drop .rwdb(Race weekend databases) ontop of the app to view them. - - Race weekend databases are saved in %appdata%/Race Element/Data. - - - - - - - - Setups - - - - Drag and Drop setup json files on top of the app to import them. - - View setups. - - Compare setups, right click in the browser to add them. - - Open car/track directories quickly by right clicking. - - Right click the setup browser tab to refresh the setups. - - All cars supported. - - - - - - - - Liveries - - - Browser: - - Drag and Drop proper .zip/7.zip/.rar skin packs or single liveries on top of the app to import them. - - Right click cars/teams to add to skin pack. - - Right click skins to add to skin pack. - - Right click skins to browse livery folder. - - Right click skins to open json file. - - Right click skins to delete (or press Delete key). - - Right click skins to tag them. - DDS(DirectDraw Surface) Generator: - - Button is visible in viewer when dds_1 do not exist. - - Generate dds_1 files. - - Bulk generate dds_1 files, click the button below the livery browser. - - Importer: - - Import archives, supports multi-select and archives with multiple liveries. - - Supported archives: 7z, rar, zip. - - Select multiple archives to import at once. - Exporter: - - Once you add 1 skin to skin pack a new panel opens. - - Click items in the exporter to remove them from the pack. - - Export with or without dds_1 files. - - Exports as zip. - - - - - - - Tools - - - Fuel calculator: - - Simple fuel calculator, enter duration, fuel per lap and lap-time. Has button to load these from your active in-game session. - - - - - - - - - - - - -  Changelog - - - - - - - - - - - - - - - - - - - -  License - - - - - - - - diff --git a/Race_Element/Controls/About/About.xaml.cs b/Race_Element/Controls/About/About.xaml.cs deleted file mode 100644 index 941029348..000000000 --- a/Race_Element/Controls/About/About.xaml.cs +++ /dev/null @@ -1,192 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Controls.Util.Updater; -using RaceElement.Util; -using Octokit; -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Threading; -using System.Windows; -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for About.xaml - /// - public partial class About : UserControl - { - private bool HasAddedDownloadButton = false; - - - public About() - { - InitializeComponent(); - - buttonDiscord.Click += (sender, e) => Process.Start(new ProcessStartInfo() - { - FileName = "cmd", - Arguments = $"/c start https://discord.gg/26AAEW5mUq", - WindowStyle = ProcessWindowStyle.Hidden, - }); - buttonGithub.Click += (sender, e) => Process.Start(new ProcessStartInfo() - { - FileName = "cmd", - Arguments = $"/c start https://github.com/RiddleTime/Race-Element", - WindowStyle = ProcessWindowStyle.Hidden, - }); - buttonDonate.Click += (sender, e) => Process.Start(new ProcessStartInfo() - { - FileName = "cmd", - Arguments = $"/c start https://paypal.me/CompetizioneManager", - WindowStyle = ProcessWindowStyle.Hidden, - }); - - new Thread(() => CheckNewestVersion()).Start(); - - this.IsVisibleChanged += (s, e) => - { - if ((bool)e.NewValue) - FillReleaseNotes(); - else - stackPanelReleaseNotes.Children.Clear(); - - ThreadPool.QueueUserWorkItem(x => - { - Thread.Sleep(5 * 1000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); - }); - }; - } - - private async void CheckNewestVersion() - { - Thread.Sleep(2000); - - RemoveTempVersionFile(); -#if DEBUG - TitleBar.Instance.SetAppTitle("Dev"); - return; -#endif -#pragma warning disable CS0162 // Unreachable code detected - - try - { - if (HasAddedDownloadButton) - return; - - GitHubClient client = new GitHubClient(new ProductHeaderValue("Race-Element"), new Uri("https://github.com/RiddleTime/Race-Element.git")); - var allTags = await client.Repository.GetAllTags("RiddleTime", "Race-Element"); - - if (allTags != null && allTags.Count > 0) - { - RepositoryTag latest = allTags.First(); - - long localVersion = VersionToLong(Assembly.GetEntryAssembly().GetName().Version); - long remoteVersion = VersionToLong(new Version(latest.Name)); - - if (localVersion > remoteVersion) - TitleBar.Instance.SetAppTitle("Beta"); - - if (remoteVersion > localVersion) - { - Release release = await client.Repository.Release.GetLatest("RiddleTime", "Race-Element"); - - if (release != null) - { - var accManagerAsset = release.Assets.Where(x => x.Name == "RaceElement.exe").First(); - - await Dispatcher.BeginInvoke(new Action(() => - { - MainWindow.Instance.EnqueueSnackbarMessage($"A new version of Race Element is available: {latest.Name}", " Open About tab ", new Action(() => { MainWindow.Instance.tabAbout.Focus(); })); - Button openReleaseButton = new Button() - { - Margin = new Thickness(0, 0, 0, 0), - Content = $"Update to {latest.Name}", - ToolTip = $"Release notes:\n{release.Body}" - }; - ToolTipService.SetShowDuration(openReleaseButton, int.MaxValue); - openReleaseButton.Click += (s, e) => - { - openReleaseButton.IsEnabled = false; - MainWindow.Instance.EnqueueSnackbarMessage($"Updating to version... {latest.Name}, this may take a while.."); - new Thread(x => - { - new AppUpdater().Update(accManagerAsset); - }).Start(); - }; - ReleaseStackPanel.Children.Add(openReleaseButton); - HasAddedDownloadButton = true; - })); - } - } - } - - } - catch (Exception) - { - } -#pragma warning restore CS0162 // Unreachable code detected - } - - private void RemoveTempVersionFile() - { - try - { - string tempTargetFile = $"{FileUtil.RaceElementAppDataPath}AccManager.exe"; - FileInfo tempFile = new FileInfo(tempTargetFile); - - if (tempFile.Exists) - tempFile.Delete(); - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - } - } - - private long VersionToLong(Version VersionInfo) - { - string major = $"{VersionInfo.Major}".FillStart(4, '0'); - string minor = $"{VersionInfo.Minor}".FillStart(4, '0'); - string build = $"{VersionInfo.Build}".FillStart(4, '0'); - string revision = $"{VersionInfo.Revision}".FillStart(4, '0'); - string versionString = major + minor + build + revision; - - long.TryParse(versionString, out long version); - return version; - } - - private void FillReleaseNotes() - { - Dispatcher.BeginInvoke(new Action(() => - { - stackPanelReleaseNotes.Children.Clear(); - ReleaseNotes.Notes.ToList().ForEach(note => - { - TextBlock noteTitle = new TextBlock() - { - Text = note.Key, - Style = Resources["MaterialDesignBody1TextBlock"] as Style, - FontWeight = FontWeights.Bold, - FontStyle = FontStyles.Oblique - }; - TextBlock noteDescription = new TextBlock() - { - Text = note.Value, - TextWrapping = TextWrapping.WrapWithOverflow, - Style = Resources["MaterialDesignDataGridTextColumnStyle"] as Style - }; - - StackPanel changePanel = new StackPanel() { Margin = new Thickness(0, 10, 0, 0) }; - changePanel.Children.Add(noteTitle); - changePanel.Children.Add(noteDescription); - - stackPanelReleaseNotes.Children.Add(changePanel); - }); - })); - } - } -} diff --git a/Race_Element/Controls/About/License.xaml b/Race_Element/Controls/About/License.xaml deleted file mode 100644 index 4f5bcf722..000000000 --- a/Race_Element/Controls/About/License.xaml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/Race_Element/Controls/About/License.xaml.cs b/Race_Element/Controls/About/License.xaml.cs deleted file mode 100644 index fa3825e80..000000000 --- a/Race_Element/Controls/About/License.xaml.cs +++ /dev/null @@ -1,706 +0,0 @@ -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for License.xaml - /// - public partial class License : UserControl - { - public License() - { - InitializeComponent(); - - this.IsVisibleChanged += (s, e) => - { - if ((bool)e.NewValue) - TextBlockLicense.Text = LicenseText; - else - TextBlockLicense.Text = string.Empty; - }; - } - - private const string LicenseText = @" -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - -TERMS AND CONDITIONS - - 0. Definitions. - - ""This License"" refers to version 3 of the GNU General Public License. - - ""Copyright"" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - ""The Program"" refers to any copyrightable work licensed under this -License. Each licensee is addressed as ""you"". ""Licensees"" and -""recipients"" may be individuals or organizations. - - To ""modify"" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a ""modified version"" of the -earlier work or a work ""based on"" the earlier work. - - A ""covered work"" means either the unmodified Program or a work based -on the Program. - - To ""propagate"" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To ""convey"" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays ""Appropriate Legal Notices"" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The ""source code"" for a work means the preferred form of the work -for making modifications to it. ""Object code"" means any non-source -form of a work. - - A ""Standard Interface"" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The ""System Libraries"" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -""Major Component"", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The ""Corresponding Source"" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - ""keep intact all notices"". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -""aggregate"" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A ""User Product"" is either (1) a ""consumer product"", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, ""normally used"" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - ""Installation Information"" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - ""Additional permissions"" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered ""further -restrictions"" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An ""entity transaction"" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - -11. Patents. - - A ""contributor"" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's ""contributor version"". - - A contributor's ""essential patent claims"" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, ""control"" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a ""patent license"" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To ""grant"" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. ""Knowingly relying"" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is ""discriminatory"" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License ""or any later version"" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - -15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ""AS IS"" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the ""copyright"" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an ""about box"". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a ""copyright disclaimer"" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - -"; - - private void TextBlockLicense_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e) - { - - } - } -} diff --git a/Race_Element/Controls/About/ReleaseNotes.cs b/Race_Element/Controls/About/ReleaseNotes.cs deleted file mode 100644 index 48f89cd67..000000000 --- a/Race_Element/Controls/About/ReleaseNotes.cs +++ /dev/null @@ -1,278 +0,0 @@ -using System.Collections.Generic; - -namespace RaceElement.Controls -{ - public static class ReleaseNotes - { - internal readonly static Dictionary Notes = new Dictionary() - { - {"0.1.5.7", "- Improved rendering quality of pressures in tyre info hud." }, - {"0.1.5.6", "- Shift Indicator HUD: Revert original base color." }, - {"0.1.5.5", "- HUDs: When the Window toggle is enabled the HUD windows will now be always enabled and allow for better detection by Streaming and VR apps."+ - "\n- Reworked Tyre Info HUD, added guidelines when repositioning and always display psi."+ - "\n - Added option to show 2 decimals for tyre pressures."}, - {"0.1.5.4", "- Reworked Input and Oversteer trace."+ - "\n- Reworked background of shift indicator."+ - "\n- Reworked internal structure of the app."+ - "\n- Updated About Tab."+ - "\n- Open livery json now opens a new explorer window and selects the livery json file."}, - {"0.1.5.3", "- HUDs: Added Opacity Slider, this will allow you to set the overal transparency for each HUD separately."+ - "\n- Fix setup hider." }, - {"0.1.5.2", "- Liveries can now be dragged and dropped ontop of the app."+ - "\n- Liveries Viewer: Added competitor name to viewer if it's used in the livery."+ - "\n- Further design changes according to rebrand."}, - {"0.1.5.1", "- Reworked Titlebar, Icon and About Tab."+ - "\n- HUD: Added boost gauge, showing boost percentage."}, - {"0.1.5.0", "- ACC Manager is now known as Race Element."+ - "\n- Removed request for admin rights, if you have run as admin enabled, disable it."+ - "\n- You can copy all the entire contents of the ACC Manager folder to the Race Element folder. This to keep all your data and settings."}, - {"0.1.4.1", "- Added request for admin rights, the app uses this to detect whether ACC is running. Without these rights you may experience unexpected app crashes." }, - {"0.1.4.0", "- Reworked hud internals."+ - "\n- Reduced idle cpu usage to almost 0% when ACC is not running."}, - {"0.1.3.2", "- Fix bug when repositioning huds."}, - {"0.1.3.1", "- Internal optimizations."+ - "\n- Improved contrast of hud text panels."+ - "\n- HUDs now show when the engine is not running."}, - {"0.1.3.0", "- Design of Damage HUD, blends in better. Increased Font Size." }, - {"0.1.2.2", "- HUD: Added Damage HUD, displaying body damage in repair time and suspension damage in percentage."+ - "\n- Added track condition to basic lap telemetry recording."}, - {"0.1.2.1", "- Reworked design of several HUDs."+ - "\n - Input bars: Added option to switch around throttle and brake bars."+ - "\n - Inputs: Added gradual contrast."+ - "\n - Input and Oversteer Traces: Added gradual contrast."}, - {"0.1.2.0", "- Main folder changed from My Documents/ACC Manager to %AppData%/ACC Manager."+ - "\n - You can copy the old Data folder containing your race weekends to the new location."+ - "\n- HUD Configuration:" + - "\n - Redesign of HUD Configuration Controls: Grouped Controls."+ - "\n - This resets your HUD Configuration. Unfortunately ;)"+ - "\n - Right clicking inside of the configuration controls toggles activation of viewed HUD."+ - "\n - Scroll the sliders to change the value."+ - "\n- Added button to ACC Manager settings to open the ACC Manager folder."}, - {"0.1.1.2", "- HUD: Input bars overlay now has the option to set the bars to horizontal mode."+ - "\n- HUD: Added beta version of Race Info Overlay."}, - {"0.1.1.1", "- Changed dry tyres for Lamborghini Super Trofeo cars to GT4." }, - {"0.1.1.0", "- Auto Updater added: in the about tab when a new version is released there will be a 1 click button to update the app."+ - "\n- HUDs: Improvements to maintaining rendering frequency (Thank you FBalazs)."+ - "\n- ACC Manager: Fixed persistence of minimize app to system tray option."}, - {"0.1.0.5", "- Liveries Tab: Added button to refresh the livery trees."+ - "\n- ACC Manager: Added option to minimize the app to the system tray (default off)."+ - "\n- Decrease startup time."+ - "\n- Added startup counter (global)."}, - {"0.1.0.3", "- HUDs: Added Always On top option to each overlay, allowing you to hide the overlay in the game whilst streaming using the Window option."+ - "\n- HUD: Added Input Bars Overlay, displaying live throttle and brake inputs with vertical progress bars."+ - "\n- Liveries: Removed generating, import and export of dds_0 files."}, - {"0.1.0.1", "- OBS Websocket updated to version 5, using the setup hider now requires OBS version 28 or higher."+ - "\n- Updated design theme."+ - "\n- HUD tab: the title & description is now 1 big button to toggle hud activation."}, - {"0.0.9.0", "- Added Race Weekends tab to Telemetry tab."+ - "\n- ACC Manager now saves race weekend data(lap and sector times)."+ - "\n- Titlebar: Added icons for automatic steering lock and the stream setup hider."+ - "\n- Setup Importer drag and drop now works on any part of the app."+ - "\n- Changed order of main menu tabs." }, - {"0.0.8.2", "- HUD: Added Oversteer trace overlay. Displaying under and oversteer."+ - "\n- HUDs tab: Double click overlays on the list items to toggle overlays on and off."+ - "\n- Setups tab: Add strategy section to viewer and comparison."+ - "\n- Internal memory usage enhancements."}, - {"0.0.8.1", "- Setups tab: Right click to copy a setup to another track."+ - "\n- Setups Viewer: Reworked the table cell alignment."}, - {"0.0.8.0", "- HUD tab: New Design showing previews of overlays."+ - "\n- Setup Comparison: Highlights differences for each individual value with colors."+ - "\n- ECU Maps: Updated (By Mominon)."}, - {"0.0.7.9", "- TreeViews: Fixed open/close bug when clicking the leaves."+ - "\n- Livery Viewer: Increased snappiness and decreased memory usage."+ - "\n- ACC Settings: Added serverlist so you can manage unlisted servers and quickly enable or disable the serverList.json."+ - "\n- HUDs: Overlay options will only show when hovering else the description of the overlay will be displayed."+ - "\n- HUDs: Add a Window option to each overlay, allowing it to be captured by streaming applications."}, - {"0.0.7.8", "- Setups: Added Setup Importer, drag and drop your setup json file in the Setup Page/Tab."+ - "\n- HUDs: Added a preview mode."+ - "\n- HUD: Increased performance for Shift Indicator."}, - {"0.0.7.7", "- HUDs: Multiple monitors are now supported." + - "\n- HUDs: Increased performance for info tables/panels."}, - {"0.0.7.6", "- ACC Manager now remembers the last main tab you opened."+ - "\n- ACC Manager now remembers the last position of the GUI."+ - "\n- HUD: Added Debug Output overlay showing all kind of logging."+ - "\n- HUD: Increased performance for several overlays."+ - "\n- HUD: When hovering an overlay in the GUI, spacebar or enter key enabled/disables the overlay."+ - "\n- Lap tracker: Fixed an issue with finalizing lap data."}, - {"0.0.7.5", "- Setup Conversion: Fixed for McLaren 720s."+ - "\n- HUD: Shift indicator now draws vertical lines for every 1000 rpm available."}, - {"0.0.7.4", "- Hardware Settings: Added automatic steering hard lock based per car."+ - "\n- HUD: Made stint info configurable for Fuel Info overlay."+ - "\n- HUD: Input trace overlay can now be sized up to 800 datapoints (be aware of cpu usage)."}, - {"0.0.7.3", "- Stream settings: Fixed a crash (sigh..)." }, - {"0.0.7.2","- HUD: Current tyre set is now configurable for the Car Info Overlay."+ - "\n- Stream settings: Added Setup Hider for OBS and Streamlabs."}, - {"0.0.7.1", "- HUDs: Improve rendering performance."+ - "\n- HUDs: Prevent huds from rendering when pausing during hotlap mode."+ - "\n- HUD: Added Shift Indicator overlay, including an option to display when the pit limiter is activated."}, - {"0.0.7.0", "- HUD: Added configurable data collection/refresh rate for input trace."+ - "\n- HUD: Lap delta overlay's recorded laps are now reset in between practice/qualifying/race."}, - {"0.0.6.9", "- HUD: Added configurable potentional best lap time to lap delta overlay."+ - "\n- HUD: Fixed brake temps multiplication in tyre info overlay."}, - {"0.0.6.8", "- HUDs: Overlays now also render when reposition is enabled."+ - "\n- HUD: Fixed fuel progress bar for Fuel Info Overlay."}, - {"0.0.6.7", "- HUDs: Improved 'should render' status detection."+ - "\n- HUD: Fixed average brake temps in Tyre Info Overlay."+ - "\n- HUD: Added Inputs Overlay by Floriwan."+ - "\n- Livery exporter: Added option to exclude dds files." - }, - {"0.0.6.6", "- HUD: Added configurable data point amount for the Input Trace Overlay."+ - "\n- HUD: Lap Delta bar outlines positive or negative delta color."+ - "\n- HUD: Added subtle value background and row lines to info table and panel."+ - "\n- HUD: Added mouse cursor when repositioning overlays."}, - {"0.0.6.5", "- Liveries tab: Added tree item in tag tree showing all cars that aren't tagged yet."+ - "\n- HUD: Reposition hotkey has been changed to (Ctrl + Home), it was conflicting with other global hotkeys."+ - "\n- HUD: Changed font for values in the info panel and added drop shadow."+ - "\n- HUD: Lap Delta overlay now displays sector delta based on your fastest sectors."}, - {"0.0.6.4", "- HUD: Added hotkey (Ctrl + Shift + M) for enabling the reposition of overlays"+ - "\n- HUD: Overlays can now be scaled on with 1% steps, providing more precision."+ - "\n- HUD: Overlays can now be moved with the arrow keys as well for finetuning of position."+ - "\n- Added startup argument to start in minimized window state: ( /StartMinimized )."+ - "\n- Added Tyre Info overlay, this can be placed on top of the kunos tyre info." - }, - {"0.0.6.3", "- Lap Data Collector: Fix Average Fuel usage calculation after adding new fuel." }, - {"0.0.6.2", "- Integrate broadcast data, available for overlay developers."+ - "\n- HUD: Added Car Info Overlay."+ - "\n- HUD: Accelerometer Overlay is now scalable."+ - "\n- HUD: Fuel Info Overlay:"+ - "\n - Fuel bar turns red when fuel tank reaches 15% or lower."+ - "\n - Fuel Time is green if you have enough for stint/session and red if not."+ - "\n - Suggested fuel no longer shows negative values."+ - "\n - Fuel buffer laps now user selectable. Choice of 0-3 laps (Default: 0)"+ - "\n- HUD: Lap Delta Overlay:"+ - "\n - Added configurable Lap Type (in/out/regular)."+ - "\n - Added configurable Max Delta value."+ - "\n - Added tooltips."+ - "\n- HUD: Track Info Overlay:" + - "\n - Added configurable Time of Day information."+ - "\n - Added tooltips." - }, - {"0.0.6.1", "- Improve logging for overlays." }, - {"0.0.6.0", "- HUD Tab:"+ - "\n - Scroll the scale control to adjust the scale."+ - "\n - Click Scroll/middle mouse button overlay lines to enable reposition."+ - "\n - Left Click overlay line to toggle."+ - "\n- HUD: ECU Map Overlay can now be scaled and repositioned."+ - "\n- Trees in the GUI now expand on single click."}, - {"0.0.5.9", "- About Tab: Added information about HUDs."+ - "\n- Added Play ACC Button, launches Assetto Corsa Competizione using the steam link."+ - "\n- HUD: Added Fuel Info Overlay (By KrisV147)."+ - "\n- HUD: Added Lap Delta Overlay."+ - "\n- HUD Tab: Some overlays are now scalable."}, - {"0.0.5.8", "- HUD Tab: Added design."+ - "\n- HUD: Added option to input trace for disabling steering input."}, - {"0.0.5.7", "- HUD: Added Track Info overlay."+ - "\n- HUD: Added Accelerometer overlay."+ - "\n- HUD: Some overlays can be configured."}, - {"0.0.5.6", "- HUD: Certain overlays can now be repositioned, this position will be automatically saved."+ - "\n- HUD: Enabled overlays will be re-enabled during the next start of ACC Manager."}, - {"0.0.5.5", "- The Livery browser will re-expand previously expanded items after refreshing."+ - "\n- Added hotkey(Delete) to quickly open up the delete livery interface."}, - {"0.0.5.4", "- Decrease draw rate for tyre pressure trace by 90%."+ - "\n- Updated system.net.http reference due to possible vulnerability."}, - {"0.0.5.3", "- Added screen that pops-up after importing liveries, allowing you to tag them."+ - "\n- Setup conversions added by KrisV147:"+ - "\n - BMW M2 Cup 2020."+ - "\n - Lamborghini Huracán ST Evo2 2021."+ - "\n - Porsche 992 GT3 Cup 2021."+ - "\n - All existing in-game cars are now supported for the setup viewer/comparison."}, - {"0.0.5.2", "- Setup conversion added: Ferrari 488 Challenge Evo 2020(By KrisV147)."+ - "\n- Tyre pressure trace: now auto-detects gt3/gt4(gtc)/wet tyres."+ - "\n- Tyre pressure trace: draws specific parts in the trace by color, green = good, red is too high, blue is too low."}, - {"0.0.5.1", "- Setup conversions added:"+ - "\n - Audi R8 LMS Evo 2019."+ - "\n - Bentley Continental GT3 2015."+ - "\n - BMW M6 GT3 2017."+ - "\n - Lamborghini Gallardo G3 Reiter 2017."+ - "\n - Lamborghini Huracán ST 2015."+ - "\n - McLaren 650S GT3 2015."+ - "\n - Mercedes-AMG GT3 2015."+ - "\n - Porsche 911 II GT3 Cup 2017." }, - {"0.0.5.0", "- Added ECU map HUD (bottom-right), still very simple look."+ - "\n- Repositioned Input Trace HUD."+ - "\n- Added upper and lower bounds to Tires Traces (working for gt3 dry only atm)."}, - {"0.0.4.9", "- Setup conversions added by KrisV147:"+ - "\n - Audi R8 LMS GT4 2016."+ - "\n - BMW M4 GT4 2018."+ - "\n - Chevrolet Camaro GT4 R 2017."+ - "\n - Ginetta G55 GT4 2012."+ - "\n - Ktm Xbow GT4 2016."+ - "\n - Maserati Gran Turismo MC GT4 2016."+ - "\n - McLaren 570s GT4 2016."+ - "\n - Mercedes AMG GT4 2016."+ - "\n - Porsche 718 Cayman GT4 MR 2019."+ - "\n- Livery Browser: displays sub-item count in tree header." + - "\n- HUD: Tire pressure input trace changed."}, - {"0.0.4.8", "- HUD tab: Added overlays: Very very simple tire pressure trace overlay and a shared memory static data overlay." }, - {"0.0.4.7", "- Added HUD tab: Simple checkbox to enable the input trace overlay." }, - {"0.0.4.6", "- Setup conversion added: Aston Martin V12 Vantage GT3 2013(by KrisV147), Alpine A110 GT4(by KrisV147) and Aston Martin Vantage AMR GT4 2018(by KrisV147)." }, - {"0.0.4.5", "- Input Trace: Should be drawing less gpu cost." }, - {"0.0.4.4", "- Telemetry Debug: Add test overlay for input traces. Enabled with Draw On Game checkbox in Telemetry Debug (doesn't work with full-screen mode)." }, - {"0.0.4.3", "- Livery Displayer: Sponsors Image is now displayed ontop of Decals image."+ - "\n- Livery Displayer: Revamped layout to increase size of livery preview."+ - "\n- Livery Importer: Improved feedback for user when importing an unsupported archive."+ - "\n- Livery Tagger: When adding tags to cars, only the Tags tab in the Livery Browser will be updated."+ - "\n- Setup conversion added: Emil Frey Jaguar G3 2012."}, - {"0.0.4.2", "- Livery Tags: Cars under a tag are now alphabetically sorted."+ - "\n- ACCM: Allow window resizing."+ - "\n- Livery Displayer: preview images scale with window resizing."}, - {"0.0.4.1", "- Livery Tags: Cannot enter an empty tag name anymore."+ - "\n- Livery Browser: Now displays liveries without a team name set."}, - {"0.0.4.0", "- Livery Browser: Add livery tagging system." }, - {"0.0.3.9", "- Livery Deleter: shows the to be deleted skin in the livery displayer."+ - "\n- Add new app icon."+ - "\n- Fix issue with importer which caused acc manager to keep a file stream open."+ - "\n- Add more botched import scenarios for livery archives that only contain 1 livery."}, - {"0.0.3.8", "- Setup conversion added: Aston Martin V8 Vantage GT3 2019(by FBalazs)."+ - "\n- Livery Browser: added context menu option to delete liveries."}, - {"0.0.3.7", "- Setups tab: Car names have the year added."+ - "\n- Setups tab: Added button to right click menu to open car directory."+ - "\n- Setups tab: Added button to browser tab to refresh the setup list."+ - "\n- Setup conversion added: Lamborghini Huracán GT3 2015, Nissan GT-R Nismo GT3 2015, Ferrari 488 GT3 2018."+ - "\n- Livery Importer: Added 1 file filter for all supported types."+ - "\n- Livery Importer: Add strategy for botched archives (containing no separate folders)."}, - {"0.0.3.6", "- About tab: When a new release is available a new button allows you to visit the latest release and download the newest version." }, - {"0.0.3.5", "- About tab: Added buttons for Discord and GitHub."+ - "\n- Bulk DDS Generator: generate button is disabled when all DDS files have been generated."}, - {"0.0.3.4", "- Added Bulk DDS Generator: Got many skins without dds files? this will generate the dds files. Sit back and relax." }, - {"0.0.3.3", "- Livery browser: added two tabs for grouping style, Car model type and Teams."+ - "\n- Livery viewer: fix crash when generating dds files."}, - {"0.0.3.2", "- Fuel calcalator: added button to fetch data from game."+ - "\n- Livery browser: fix for fetching the liveries to display them in the list."}, - {"0.0.3.1", "- Telemetry: Display Array data" }, - {"0.0.3.0", "- Add Telemetry tab, very basic for now, might still have some data bugs, also not all data is shown as data yet."+ - "\n- Add car model name to livery viewer."}, - {"0.0.2.10","- Add features panel to about tab" }, - {"0.0.2.9", "- Setup conversion added: Bentley Continental GT3 2018, Lamborghini Huracán GT3 Evo, Lexus RC F GT3, Nissan GT-R Nismo GT3 2018." }, - {"0.0.2.8", "- Added exception handling so the manager will not crash for windows version lower than 11." }, - {"0.0.2.7", "- Livery exporter: Added skin pack exporter, right click teams or skins to add."+ - "\n- ACC Manager Folder: Added dedicated folder for the acc Manager, My Documents/ACC Manager."+ - "\n- Added logger which logs to the dedicated folder/Log."}, - {"0.0.2.6", "- Icon: Something not too fancy, but it shows what the tool does."+ - "\n- Setup conversion: fixed Porsche 911 II GT3."}, - {"0.0.2.5", "- Livery Displayer: Added button to generate dds files."+ - "\n- Livery Exporter: Now includes dds files if available."}, - {"0.0.2.4", "- Livery Displayer: Added buttons to open livery json and livery folder."+ - "\n- Livery Displayer: Added nationality, Paint materials for body and rims."}, - {"0.0.2.3", "- Add setup conversion for: Mercedes-AMG GT3 2020, BMW M4 GT3, Ferrari 488 GT3 Evo."+ - "\n- Fuel calculator: fixed fuel value parsing when windows language is set differently."}, - {"0.0.2.2", "- Livery exporter: exported zips are now according to acc folder structure."+ - "\n- Livery exporter: export team with all the skins inside in a single zip."+ - "\n- Livery importer: added support for archives with multiple liveries."}, - {"0.0.2.1", "- Livery Browser: Skins are grouped by team name." }, - {"0.0.2.0", "- Add Livery Browser, displays: team name, display name, car number, decals image and sponsors image."+ - "\n- Add Livery exporter: right click livery to save as zip."+ - "\n- Add Livery importer: supports (.7z, .rar, .zip), can import multiple archives at once, though multiple liveries per archive is not supported yet."}, - {"0.0.1.5", "- Right click track in setup browser to open folder in file explorer." }, - {"0.0.1.4", "- Add Simple Fuel Calculator." }, - {"0.0.1.3", "- Setup comparison now highlights setup when different."+ - "\n- Add setup conversion for: Audi R8 LMS, Honda NSX GT3, Porsche 911 GT3 R."}, - {"0.0.1.2", "- Added more icons."+ - "\n- Added custom Titlebar."}, - {"0.0.1.1", "- Setup Browser added."+ - "\n- Setup Comparison added: Right click setups in the setup browser to add them to the comparison."+ - "\n- Add setup conversion for: Audi R8 LMS evo II(by Jubka), Honda NSX GT3 Evo, Mclaren 720S GT3, Porsche II GT3 R."}, - {"0.0.1.0", "- Material Design added." }, - }; - } -} diff --git a/Race_Element/Controls/HUD/ConfigurationControls.cs b/Race_Element/Controls/HUD/ConfigurationControls.cs deleted file mode 100644 index ddadea0cf..000000000 --- a/Race_Element/Controls/HUD/ConfigurationControls.cs +++ /dev/null @@ -1,107 +0,0 @@ -using RaceElement.HUD.Overlay.Configuration; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows; -using RaceElement.Controls.Util.SetupImage; -using static RaceElement.HUD.Overlay.Configuration.OverlaySettings; -using static RaceElement.Controls.HUD.PreviewCache; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; -using System.Collections.Generic; - -namespace RaceElement.Controls.HUD -{ - internal class ConfigurationControls - { - internal static void SaveOverlayConfigFields(string overlayName, List configFields) - { - OverlaySettingsJson settings = OverlaySettings.LoadOverlaySettings(overlayName); - if (settings == null) - { - int screenMiddleX = (int)(SystemParameters.PrimaryScreenHeight / 2); - int screenMiddleY = (int)(SystemParameters.PrimaryScreenHeight / 2); - settings = new OverlaySettingsJson() { X = screenMiddleX, Y = screenMiddleY }; - } - - settings.Config = configFields; - - OverlaySettings.SaveOverlaySettings(overlayName, settings); - - // update preview image - if (HudOptions.Instance.listOverlays.SelectedIndex >= 0) - { - ListViewItem lvi = (ListViewItem)HudOptions.Instance.listOverlays.SelectedItem; - TextBlock tb = (TextBlock)lvi.Content; - string actualOverlayName = overlayName.Replace("Overlay", "").Trim(); - if (tb.Text.Equals(actualOverlayName)) - { - PreviewCache.GeneratePreview(actualOverlayName); - PreviewCache._cachedPreviews.TryGetValue(actualOverlayName, out PreviewCache.CachedPreview preview); - if (preview != null) - { - HudOptions.Instance.previewImage.Stretch = Stretch.UniformToFill; - HudOptions.Instance.previewImage.Width = preview.Width; - HudOptions.Instance.previewImage.Height = preview.Height; - HudOptions.Instance.previewImage.Source = ImageControlCreator.CreateImage(preview.Width, preview.Height, preview.CachedBitmap).Source; - } - else - { - HudOptions.Instance.previewImage.Source = null; - } - } - } - } - - - internal static void SaveOverlayConfigField(ConfigField configField) - { - string overlayName = HudOptions.Instance.GetCurrentlyViewedOverlayName(); - - OverlaySettingsJson settings = OverlaySettings.LoadOverlaySettings(overlayName); - if (settings == null) - { - int screenMiddleX = (int)(SystemParameters.PrimaryScreenHeight / 2); - int screenMiddleY = (int)(SystemParameters.PrimaryScreenHeight / 2); - settings = new OverlaySettingsJson() { X = screenMiddleX, Y = screenMiddleY, Config = OverlayConfiguration.GetConfigFields(HudOptions.Instance.overlayConfig) }; - } - - ConfigField field = null; - if (settings.Config == null) - settings.Config = OverlayConfiguration.GetConfigFields(HudOptions.Instance.overlayConfig); - - field = settings.Config.Find(x => x.Name == configField.Name); - if (field == null) - settings.Config.Add(configField); - else - { - settings.Config.Remove(field); - field = configField; - settings.Config.Add(configField); - } - - OverlaySettings.SaveOverlaySettings(overlayName, settings); - - // update preview image - if (HudOptions.Instance.listOverlays.SelectedIndex >= 0) - { - - - PreviewCache.GeneratePreview(overlayName); - PreviewCache._cachedPreviews.TryGetValue(overlayName, out CachedPreview preview); - if (preview != null) - { - HudOptions.Instance.previewImage.Stretch = Stretch.UniformToFill; - HudOptions.Instance.previewImage.Width = preview.Width; - HudOptions.Instance.previewImage.Height = preview.Height; - HudOptions.Instance.previewImage.Source = ImageControlCreator.CreateImage(preview.Width, preview.Height, preview.CachedBitmap).Source; - } - else - { - HudOptions.Instance.previewImage.Source = null; - } - - } - } - - - } -} diff --git a/Race_Element/Controls/HUD/Controls/ControlFactory.cs b/Race_Element/Controls/HUD/Controls/ControlFactory.cs deleted file mode 100644 index 77d087c6d..000000000 --- a/Race_Element/Controls/HUD/Controls/ControlFactory.cs +++ /dev/null @@ -1,137 +0,0 @@ -using RaceElement.Controls.HUD.Controls.ValueControls; -using RaceElement.HUD.Overlay.Configuration; -using Octokit; -using System; -using System.Linq; -using System.Reflection; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows.Threading; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; -using Label = System.Windows.Controls.Label; - -namespace RaceElement.Controls.HUD.Controls -{ - internal class ControlFactory - { - public static ControlFactory Instance { get; private set; } = new ControlFactory(); - - public ListViewItem GenerateOption(string group, string label, PropertyInfo pi, ConfigField configField) - { - Grid grid = new Grid() { Height = 26 }; - grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(120, GridUnitType.Pixel) }); - grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(240, GridUnitType.Pixel) }); - - ListViewItem item = new ListViewItem() - { - Content = grid, - Margin = new Thickness(0, 0, -1, 0), - Padding = new Thickness(0), - BorderThickness = new Thickness(1, 0, 0, 0), - //BorderBrush = System.Windows.Media.Brushes.OrangeRed, - Background = new SolidColorBrush(Color.FromArgb(120, 0, 0, 0)), - IsTabStop = false, - Focusable = false, - VerticalContentAlignment = VerticalAlignment.Center, - }; - - // add tooltip if exists. - foreach (Attribute cad in Attribute.GetCustomAttributes(pi)) - if (cad is ToolTipAttribute toolTip) - { - item.ToolTip = toolTip.ToolTip; - break; - } - - // add label - Label lblControl = GenerateLabel(label); - grid.Children.Add(lblControl); - Grid.SetColumn(lblControl, 0); - - // add generated control but only if the generated label is not null - IControl valueControl = GenerateValueControl(pi, configField); - valueControl.Control.HorizontalAlignment = HorizontalAlignment.Right; - if (valueControl != null) - { - Grid.SetColumn(valueControl.Control, 1); - grid.Children.Add(valueControl.Control); - } - - return item; - } - - private Label GenerateLabel(string label) - { - return new Label() - { - Content = string.Concat(label.Select(x => Char.IsUpper(x) ? " " + x : x.ToString())).TrimStart(' '), - Margin = new Thickness(0), - Padding = new Thickness(7, 0, 0, 0), - FontWeight = FontWeights.Normal, - FontSize = 13.5, - HorizontalAlignment = HorizontalAlignment.Left, - VerticalAlignment = VerticalAlignment.Center, - }; - } - - private IControl GenerateValueControl(PropertyInfo pi, ConfigField configField) - { - IControl contentControl = null; - - if (pi.PropertyType == typeof(bool)) - { - IValueControl boolValueControl = new BooleanValueControl(configField); - contentControl = boolValueControl; - } - if (pi.PropertyType == typeof(int)) - { - IntRangeAttribute intRange = null; - foreach (Attribute customAttribute in Attribute.GetCustomAttributes(pi)) - if (customAttribute is IntRangeAttribute intRangeAttribute) - intRange = intRangeAttribute; - - if (intRange != null) - { - IValueControl intValueControl = new IntegerValueControl(intRange, configField); - contentControl = intValueControl; - } - } - if (pi.PropertyType == typeof(byte)) - { - ByteRangeAttribute byteRange = null; - foreach (Attribute customattribute in Attribute.GetCustomAttributes(pi)) - if (customattribute is ByteRangeAttribute byteRangeAttribute) - byteRange = byteRangeAttribute; - - if (byteRange != null) - { - IValueControl intValueControl = new ByteValueControl(byteRange, configField); - contentControl = intValueControl; - } - } - if (pi.PropertyType == typeof(float)) - { - FloatRangeAttribute floatRange = null; - foreach (Attribute customAttribute in Attribute.GetCustomAttributes(pi)) - if (customAttribute is FloatRangeAttribute floatRangeAttribute) - floatRange = floatRangeAttribute; - - if (floatRange != null) - { - IValueControl floatValueControl = new FloatValueControl(floatRange, configField); - contentControl = floatValueControl; - } - } - - - if (contentControl == null) - return null; - - contentControl.Control.HorizontalAlignment = HorizontalAlignment.Center; - contentControl.Control.VerticalAlignment = VerticalAlignment.Center; - - return contentControl; - } - } -} diff --git a/Race_Element/Controls/HUD/Controls/ValueControls/BooleanValueControl.cs b/Race_Element/Controls/HUD/Controls/ValueControls/BooleanValueControl.cs deleted file mode 100644 index 92de47a18..000000000 --- a/Race_Element/Controls/HUD/Controls/ValueControls/BooleanValueControl.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System.Diagnostics; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using System.Windows.Input; -using System.Windows.Media; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; - -namespace RaceElement.Controls.HUD.Controls.ValueControls -{ - internal class BooleanValueControl : IValueControl, IControl - { - private readonly Grid _grid; - private readonly Label _label; - private readonly ToggleButton _toggleButton; - - public FrameworkElement Control => _grid; - public bool Value { get; set; } - private readonly ConfigField _field; - - public BooleanValueControl(ConfigField configField) - { - _field = configField; - _grid = new Grid() - { - Width = 220, - Margin = new Thickness(0, 0, 7, 0), - Background = new SolidColorBrush(Color.FromArgb(140, 2, 2, 2)), - Cursor = Cursors.Hand - }; - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(2, GridUnitType.Star) }); - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(8, GridUnitType.Star) }); - - // add label - _label = new Label() - { - HorizontalContentAlignment = HorizontalAlignment.Right, - FontWeight = FontWeights.Bold - }; - _grid.Children.Add(_label); - Grid.SetColumn(_label, 0); - - // add toggle button - _toggleButton = new ToggleButton() - { - IsChecked = bool.Parse(_field.Value.ToString()) - }; - _toggleButton.Checked += ToggleButtonValueChanged; - _toggleButton.Unchecked += ToggleButtonValueChanged; - UpdateLabel(); - _grid.Children.Add(_toggleButton); - Grid.SetColumn(_toggleButton, 1); - - // add entire grid as toggle button decheck - _grid.MouseLeftButtonUp += (s, e) => - { - _toggleButton.IsChecked = !_toggleButton.IsChecked; - }; - } - - private void ToggleButtonValueChanged(object sender, RoutedEventArgs e) - { - _field.Value = _toggleButton.IsChecked; - UpdateLabel(); - Save(); - } - - private void UpdateLabel() - { - _label.Content = bool.Parse(_field.Value.ToString()) ? "On" : "Off"; - } - - public void Save() - { - ConfigurationControls.SaveOverlayConfigField(_field); - } - } -} diff --git a/Race_Element/Controls/HUD/Controls/ValueControls/ByteValueControl.cs b/Race_Element/Controls/HUD/Controls/ValueControls/ByteValueControl.cs deleted file mode 100644 index 5716ecc2b..000000000 --- a/Race_Element/Controls/HUD/Controls/ValueControls/ByteValueControl.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Configuration; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; - -namespace RaceElement.Controls.HUD.Controls.ValueControls -{ - internal class ByteValueControl : IValueControl, IControl - { - private readonly Grid _grid; - private readonly Label _label; - private readonly Slider _slider; - - public FrameworkElement Control => _grid; - public byte Value { get; set; } - private readonly ConfigField _field; - - public ByteValueControl(ByteRangeAttribute byteRange, ConfigField configField) - { - _field = configField; - _grid = new Grid() - { - Width = 220, - Margin = new Thickness(0, 0, 7, 0), - Background = new SolidColorBrush(Color.FromArgb(140, 2, 2, 2)), - Cursor = Cursors.Hand - }; - _grid.PreviewMouseLeftButtonUp += (s, e) => Save(); - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(2, GridUnitType.Star) }); - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(8, GridUnitType.Star) }); - - _label = new Label() - { - Content = Value, - HorizontalContentAlignment = HorizontalAlignment.Right, - FontWeight = FontWeights.Bold - }; - _grid.Children.Add(_label); - Grid.SetColumn(_label, 0); - - _slider = new Slider() - { - Minimum = byteRange.Min, - Maximum = byteRange.Max, - TickFrequency = byteRange.Increment, - IsSnapToTickEnabled = true, - HorizontalAlignment = HorizontalAlignment.Right, - VerticalAlignment = VerticalAlignment.Center, - Width = 150 - }; - _slider.ValueChanged += (s, e) => - { - _field.Value = _slider.Value.ToString(); - _label.Content = _slider.Value; - }; - int value = int.Parse(configField.Value.ToString()); - value.Clip(byteRange.Min, byteRange.Max); - _slider.Value = value; - _grid.Children.Add(_slider); - Grid.SetColumn(_slider, 1); - _label.Content = _slider.Value; - - Control.MouseWheel += (sender, args) => - { - int delta = args.Delta; - _slider.Value += delta.Clip(-1, 1) * byteRange.Increment; - args.Handled = true; - Save(); - }; - } - - public void Save() - { - ConfigurationControls.SaveOverlayConfigField(_field); - } - } -} diff --git a/Race_Element/Controls/HUD/Controls/ValueControls/FloatValueControl.cs b/Race_Element/Controls/HUD/Controls/ValueControls/FloatValueControl.cs deleted file mode 100644 index 0ad99349c..000000000 --- a/Race_Element/Controls/HUD/Controls/ValueControls/FloatValueControl.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Windows.Controls; -using System.Windows; -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Configuration; -using System.Windows.Media; -using System.Windows.Input; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; - -namespace RaceElement.Controls.HUD.Controls.ValueControls -{ - internal class FloatValueControl : IValueControl, IControl - { - private readonly Grid _grid; - private readonly Label _label; - private readonly Slider _slider; - - public FrameworkElement Control => _grid; - public float Value { get; set; } - private readonly FloatRangeAttribute _floatRange; - private readonly ConfigField _field; - - public FloatValueControl(FloatRangeAttribute floatRange, ConfigField configField) - { - _field = configField; - _floatRange = floatRange; - - _grid = new Grid() - { - Width = 220, - Margin = new Thickness(0, 0, 7, 0), - Background = new SolidColorBrush(Color.FromArgb(140, 2, 2, 2)), - Cursor = Cursors.Hand - }; - _grid.PreviewMouseLeftButtonUp += (s, e) => Save(); - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(2, GridUnitType.Star) }); - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(8, GridUnitType.Star) }); - - _label = new Label() - { - HorizontalContentAlignment = HorizontalAlignment.Right, - FontWeight = FontWeights.Bold, - FontSize = 13, - }; - _grid.Children.Add(_label); - Grid.SetColumn(_label, 0); - - _slider = new Slider() - { - Minimum = _floatRange.Min, - Maximum = _floatRange.Max, - TickFrequency = _floatRange.Increment, - IsSnapToTickEnabled = true, - HorizontalAlignment = HorizontalAlignment.Right, - VerticalAlignment = VerticalAlignment.Center, - Width = 150 - }; - _slider.ValueChanged += (s, e) => - { - _field.Value = _slider.Value.ToString($"F{floatRange.Decimals}"); - UpdateLabel(floatRange.Decimals); - }; - - float value = float.Parse(configField.Value.ToString()); - value.Clip(floatRange.Min, floatRange.Max); - _slider.Value = value; - - _grid.Children.Add(_slider); - Grid.SetColumn(_slider, 1); - - Control.MouseWheel += (sender, args) => - { - int delta = args.Delta; - _slider.Value += delta.Clip(-1, 1) * _floatRange.Increment; - args.Handled = true; - Save(); - }; - - UpdateLabel(floatRange.Decimals); - } - - private void UpdateLabel(int decimals) - { - _label.Content = $"{_slider.Value.ToString($"F{decimals}")}"; - } - - public void Save() - { - ConfigurationControls.SaveOverlayConfigField(_field); - } - } -} diff --git a/Race_Element/Controls/HUD/Controls/ValueControls/IValueControl.cs b/Race_Element/Controls/HUD/Controls/ValueControls/IValueControl.cs deleted file mode 100644 index a547ee0e8..000000000 --- a/Race_Element/Controls/HUD/Controls/ValueControls/IValueControl.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; - -namespace RaceElement.Controls.HUD.Controls.ValueControls -{ - internal interface IControl - { - FrameworkElement Control { get; } - } - - internal interface IValueControl : IControl - { - T Value { get; set; } - - void Save(); - } -} diff --git a/Race_Element/Controls/HUD/Controls/ValueControls/IntegerValueControl.cs b/Race_Element/Controls/HUD/Controls/ValueControls/IntegerValueControl.cs deleted file mode 100644 index 8daf0ef19..000000000 --- a/Race_Element/Controls/HUD/Controls/ValueControls/IntegerValueControl.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; -using RaceElement.Util.SystemExtensions; -using RaceElement.HUD.Overlay.Configuration; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; - -namespace RaceElement.Controls.HUD.Controls.ValueControls -{ - internal class IntegerValueControl : IValueControl, IControl - { - private readonly Grid _grid; - private readonly Label _label; - private readonly Slider _slider; - - public FrameworkElement Control => _grid; - public int Value { get; set; } - private readonly ConfigField _field; - - public IntegerValueControl(IntRangeAttribute intRange, ConfigField configField) - { - _field = configField; - _grid = new Grid() - { - Width = 220, - Margin = new Thickness(0, 0, 7, 0), - Background = new SolidColorBrush(Color.FromArgb(140, 2, 2, 2)), - Cursor = Cursors.Hand - }; - _grid.PreviewMouseLeftButtonUp += (s, e) => Save(); - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(2, GridUnitType.Star) }); - _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(8, GridUnitType.Star) }); - - _label = new Label() - { - Content = _field.Value, - HorizontalContentAlignment = HorizontalAlignment.Right, - FontWeight = FontWeights.Bold, - FontSize = 13, - }; - _grid.Children.Add(_label); - Grid.SetColumn(_label, 0); - - _slider = new Slider() - { - Minimum = intRange.Min, - Maximum = intRange.Max, - TickFrequency = intRange.Increment, - IsSnapToTickEnabled = true, - HorizontalAlignment = HorizontalAlignment.Right, - VerticalAlignment = VerticalAlignment.Center, - Width = 150, - }; - _slider.ValueChanged += (s, e) => - { - _field.Value = _slider.Value.ToString(); - _label.Content = _field.Value; - }; - int value = int.Parse(_field.Value.ToString()); - value.Clip(intRange.Min, intRange.Max); - _slider.Value = value; - _grid.Children.Add(_slider); - Grid.SetColumn(_slider, 1); - - _label.Content = _field.Value; - Control.MouseWheel += (sender, args) => - { - int delta = args.Delta; - _slider.Value += delta.Clip(-1, 1) * intRange.Increment; - args.Handled = true; - Save(); - }; - } - - public void Save() - { - ConfigurationControls.SaveOverlayConfigField(_field); - } - } -} diff --git a/Race_Element/Controls/HUD/HudOptions.xaml b/Race_Element/Controls/HUD/HudOptions.xaml deleted file mode 100644 index a671fac37..000000000 --- a/Race_Element/Controls/HUD/HudOptions.xaml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/HUD/HudOptions.xaml.cs b/Race_Element/Controls/HUD/HudOptions.xaml.cs deleted file mode 100644 index db7e9a42f..000000000 --- a/Race_Element/Controls/HUD/HudOptions.xaml.cs +++ /dev/null @@ -1,718 +0,0 @@ -using RaceElement.Util.Settings; -using RaceElement.Util.SystemExtensions; -using RaceElement.Controls.HUD; -using RaceElement.Controls.HUD.Controls; -using RaceElement.Controls.Util.SetupImage; -using RaceElement.HUD.ACC; -using RaceElement.HUD.ACC.Overlays.OverlayMousePosition; -using RaceElement.HUD.Overlay.Configuration; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.Util; -using Gma.System.MouseKeyHook; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using System.Windows.Input; -using System.Windows.Media; -using static RaceElement.HUD.Overlay.Configuration.OverlayConfiguration; -using static RaceElement.HUD.Overlay.Configuration.OverlaySettings; - -// https://github.com/gmamaladze/globalmousekeyhook -namespace RaceElement.Controls -{ - /// - /// Interaction logic for HudOptions.xaml - /// - public partial class HudOptions : UserControl - { - private IKeyboardMouseEvents m_GlobalHook; - - public static HudOptions Instance { get; private set; } - - private HudSettings _hudSettings; - private HudSettingsJson _hudSettingsJson; - - private readonly object[] DefaultOverlayArgs = new object[] { new System.Drawing.Rectangle((int)SystemParameters.PrimaryScreenWidth / 2, (int)SystemParameters.PrimaryScreenHeight / 2, 300, 150) }; - - public HudOptions() - { - InitializeComponent(); - - Dispatcher.BeginInvoke(new Action(() => - { - _hudSettings = new HudSettings(); - _hudSettingsJson = _hudSettings.Get(); - - - listOverlays.SelectionChanged += ListOverlays_SelectionChanged; - listDebugOverlays.SelectionChanged += ListDebugOverlays_SelectionChanged; - tabControlListOverlays.SelectionChanged += (s, e) => - { - if (e.AddedItems.Count > 0) - { - if (s is ListViewItem) - { - e.Handled = true; - return; - } - } - - configStackPanel.Children.Clear(); - previewImage.Source = null; - listDebugOverlays.SelectedIndex = -1; - listOverlays.SelectedIndex = -1; - }; - - bool designTime = System.ComponentModel.DesignerProperties.GetIsInDesignMode(new DependencyObject()); - if (!designTime) - try - { - BuildOverlayPanel(); - - checkBoxReposition.Checked += (s, e) => - { - SetRepositionMode(true); - gridRepositionToggler.Background = new SolidColorBrush(Color.FromArgb(47, 69, 255, 00)); - }; - checkBoxReposition.Unchecked += (s, e) => - { - SetRepositionMode(false); - gridRepositionToggler.Background = new SolidColorBrush(Color.FromArgb(47, 255, 69, 00)); - }; - - // middle button to activate reposition mode - this.MouseUp += (s, e) => - { - if (e.ChangedButton == MouseButton.Middle) - { - this.checkBoxReposition.IsChecked = !this.checkBoxReposition.IsChecked; - e.Handled = true; - } - }; - - - checkBoxDemoMode.Checked += (s, e) => - { - _hudSettingsJson.DemoMode = true; - _hudSettings.Save(_hudSettingsJson); - gridDemoToggler.Background = new SolidColorBrush(Color.FromArgb(47, 69, 255, 00)); - }; - checkBoxDemoMode.Unchecked += (s, e) => - { - _hudSettingsJson.DemoMode = false; - _hudSettings.Save(_hudSettingsJson); - gridDemoToggler.Background = new SolidColorBrush(Color.FromArgb(47, 255, 69, 00)); - }; - gridDemoToggler.MouseUp += (s, e) => - { - this.checkBoxDemoMode.IsChecked = !this.checkBoxDemoMode.IsChecked; - }; - - // double click to activate overlays in the lists - listOverlays.MouseDoubleClick += (s, e) => { if (ToggleViewingOverlay()) e.Handled = true; }; - listOverlays.MouseLeftButtonDown += (s, e) => { if (ToggleViewingOverlay()) e.Handled = true; }; - listDebugOverlays.MouseDoubleClick += (s, e) => { if (ToggleViewingOverlay()) e.Handled = true; }; - - gridRepositionToggler.MouseUp += (s, e) => - { - this.checkBoxReposition.IsChecked = !this.checkBoxReposition.IsChecked; - e.Handled = true; - }; - - - m_GlobalHook = Hook.GlobalEvents(); - m_GlobalHook.OnCombination(new Dictionary { { Combination.FromString("Control+Home"), () => this.checkBoxReposition.IsChecked = !this.checkBoxReposition.IsChecked } }); - - this.PreviewKeyDown += HudOptions_PreviewKeyDown; - this.PreviewMouseDown += HudOptions_PreviewMouseDown; - - checkBoxDemoMode.IsChecked = _hudSettingsJson.DemoMode; - } - catch (Exception ex) - { - Debug.WriteLine(ex); - LogWriter.WriteToLog(ex); - } - })); - Instance = this; - } - - private void HudOptions_PreviewMouseDown(object sender, MouseButtonEventArgs e) - { - if (e.RightButton == MouseButtonState.Pressed) - { - if (ToggleViewingOverlay()) - e.Handled = true; - } - } - - private DateTime _lastOverlayStart = DateTime.MinValue; - private void HudOptions_PreviewKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Enter) - if (ToggleViewingOverlay()) - e.Handled = true; - } - - private bool ToggleViewingOverlay() - { - if (checkBoxReposition.IsChecked.Value) - return false; - - // kind of stupid but it works.. gotta travel the generated tree in #BuildOverlayConfigPanel(); - if (_lastOverlayStart.AddMilliseconds(200) < DateTime.Now) - foreach (UIElement element in configStackPanel.Children) - if (element is StackPanel panel) - foreach (UIElement child in panel.Children) - if (child is ToggleButton toggle) - { - toggle.IsChecked = !toggle.IsChecked; - _lastOverlayStart = DateTime.Now; - return true; - } - return false; - } - - public string GetCurrentlyViewedOverlayName() - { - foreach (UIElement element in configStackPanel.Children) - if (element is StackPanel panel) - foreach (UIElement child in panel.Children) - if (child is Label label) - return label.Content.ToString(); - - return string.Empty; - } - - private void ListOverlays_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (e.AddedItems.Count > 0) - { - ListViewItem listView = (ListViewItem)e.AddedItems[0]; - KeyValuePair kv = (KeyValuePair)listView.DataContext; - BuildOverlayConfigPanel(listView, kv.Value); - e.Handled = true; - } - else - configStackPanel.Children.Clear(); - } - - private void ListDebugOverlays_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (e.AddedItems.Count > 0) - { - ListViewItem listView = (ListViewItem)e.AddedItems[0]; - KeyValuePair kv = (KeyValuePair)listView.DataContext; - BuildOverlayConfigPanel(listView, kv.Value); - e.Handled = true; - } - else - configStackPanel.Children.Clear(); - } - - private bool _collectingGarbage = false; - private void CollectGarbage() - { - if (!_collectingGarbage) - ThreadPool.QueueUserWorkItem(x => - { - _collectingGarbage = true; - Debug.WriteLine("Collecting garbage"); - Thread.Sleep(10 * 1000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); - _collectingGarbage = false; - }); - } - - private void BuildOverlayConfigPanel(ListViewItem listViewItem, Type type) - { - - CollectGarbage(); - - configStackPanel.Children.Clear(); - OverlayAttribute overlayAttribute = GetOverlayAttribute(type); - OverlaySettingsJson tempOverlaySettings = OverlaySettings.LoadOverlaySettings(overlayAttribute.Name); - - PreviewCache.GeneratePreview(overlayAttribute.Name, true); - - StackPanel configStacker = GetConfigStacker(type); - - Label overlayNameLabel = new Label() - { - Content = overlayAttribute.Name, - FontFamily = FindResource("Conthrax") as FontFamily, - BorderBrush = Brushes.OrangeRed, - BorderThickness = new Thickness(0, 0, 0, 1.5), - Margin = new Thickness(0, -1, 0, 5), - HorizontalAlignment = HorizontalAlignment.Center, - FontSize = 30, - FontStyle = FontStyles.Italic, - Foreground = Brushes.White - }; - TextBlock overlayDescription = new TextBlock() - { - Text = overlayAttribute.Description, - HorizontalAlignment = HorizontalAlignment.Center, - TextWrapping = TextWrapping.Wrap, - TextAlignment = TextAlignment.Center, - FontSize = 13.5, - Margin = new Thickness(0, 0, 0, 3), - }; - StackPanel stackerOverlayInfo = new StackPanel() - { - Orientation = Orientation.Vertical, - Margin = new Thickness(7, 3, 7, 7), - Background = new SolidColorBrush(Color.FromArgb(140, 0, 0, 0)), - }; - - stackerOverlayInfo.Children.Add(overlayNameLabel); - stackerOverlayInfo.Children.Add(overlayDescription); - - StackPanel activationPanel = new StackPanel() - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Stretch, - VerticalAlignment = VerticalAlignment.Center, - Cursor = Cursors.Hand, - Name = "activationStacker", - Margin = new Thickness(0, 0, 0, 0), - }; - ToggleButton toggle = new ToggleButton() - { - Visibility = Visibility.Collapsed, - VerticalAlignment = VerticalAlignment.Center - }; - toggle.PreviewKeyDown += (s, e) => { if (e.Key == Key.Enter) e.Handled = true; }; - toggle.Checked += (s, e) => - { - toggle.Background = Brushes.Green; - - stackerOverlayInfo.Background = new SolidColorBrush(Color.FromArgb(140, 0, 0, 0)); - overlayNameLabel.Foreground = Brushes.LimeGreen; - - lock (OverlaysACC.ActiveOverlays) - { - AbstractOverlay overlay = OverlaysACC.ActiveOverlays.Find(f => f.GetType() == type); - - if (overlay == null) - { - - overlayNameLabel.BorderBrush = Brushes.Green; - listViewItem.Background = new SolidColorBrush(Color.FromArgb(50, 0, 0, 0)); - listViewItem.BorderBrush = new SolidColorBrush(Colors.LimeGreen); - overlay = (AbstractOverlay)Activator.CreateInstance(type, DefaultOverlayArgs); - - overlay.Start(); - - SaveOverlaySettings(overlay, true); - - configStacker.IsEnabled = false; - OverlaysACC.ActiveOverlays.Add(overlay); - } - } - }; - toggle.Unchecked += (s, e) => - { - toggle.Background = Brushes.Transparent; - - stackerOverlayInfo.Background = new SolidColorBrush(Color.FromArgb(140, 0, 0, 0)); - overlayNameLabel.BorderBrush = Brushes.OrangeRed; - overlayNameLabel.Foreground = Brushes.White; - - lock (OverlaysACC.ActiveOverlays) - { - listViewItem.Background = Brushes.Transparent; - listViewItem.BorderBrush = new SolidColorBrush(Colors.Transparent); - AbstractOverlay overlay = OverlaysACC.ActiveOverlays.Find(f => f.GetType() == type); - - SaveOverlaySettings(overlay, false); - - Task.Run(() => - { - overlay?.Stop(true); - }); - - OverlaysACC.ActiveOverlays.Remove(overlay); - configStacker.IsEnabled = true; - } - }; - activationPanel.MouseLeftButtonUp += (s, e) => toggle.IsChecked = !toggle.IsChecked; - - if (tempOverlaySettings.Enabled) - { - - toggle.IsChecked = true; - configStacker.IsEnabled = false; - overlayNameLabel.BorderBrush = Brushes.Green; - overlayNameLabel.Foreground = Brushes.LimeGreen; - } - - stackerOverlayInfo.MouseEnter += (s, e) => - { - stackerOverlayInfo.Background = stackerOverlayInfo.Background = new SolidColorBrush(Color.FromArgb(170, 0, 0, 0)); - - switch (toggle.IsChecked) - { - case true: - { - overlayNameLabel.BorderBrush = Brushes.OrangeRed; - stackerOverlayInfo.Background = stackerOverlayInfo.Background = new SolidColorBrush(Color.FromArgb(170, 0, 0, 0)); ; - break; - } - case false: - { - overlayNameLabel.BorderBrush = Brushes.LimeGreen; - stackerOverlayInfo.Background = stackerOverlayInfo.Background = new SolidColorBrush(Color.FromArgb(170, 0, 0, 0)); ; - break; - } - } - }; - stackerOverlayInfo.MouseLeave += (s, e) => - { - stackerOverlayInfo.Background = new SolidColorBrush(Color.FromArgb(127, 0, 0, 0)); - - switch (toggle.IsChecked) - { - case true: - { - overlayNameLabel.BorderBrush = Brushes.Green; - break; - } - case false: - { - overlayNameLabel.BorderBrush = Brushes.OrangeRed; - break; - } - } - }; - - activationPanel.Children.Add(toggle); - configStackPanel.Children.Add(activationPanel); - configStackPanel.Children.Add(stackerOverlayInfo); - - // click overlay title/description to toggle overlay - stackerOverlayInfo.Cursor = Cursors.Hand; - stackerOverlayInfo.PreviewMouseUp += (s, e) => - { - if (_lastOverlayStart.AddMilliseconds(200) < DateTime.Now) - { - toggle.IsChecked = !toggle.IsChecked; - _lastOverlayStart = DateTime.Now; - } - }; - - - // add config stacker - configStackPanel.Children.Add(configStacker); - - // add preview iamge - PreviewCache._cachedPreviews.TryGetValue(overlayAttribute.Name, out PreviewCache.CachedPreview preview); - if (preview == null) - previewImage.Source = null; - else - { - previewImage.Stretch = Stretch.UniformToFill; - previewImage.Width = preview.Width; - previewImage.Height = preview.Height; - previewImage.Source = ImageControlCreator.CreateImage(preview.Width, preview.Height, preview.CachedBitmap).Source; - } - } - - public void DisposeKeyboardHooks() - { - if (m_GlobalHook != null) - m_GlobalHook.Dispose(); - } - - private MousePositionOverlay mousePositionOverlay; - private void SetRepositionMode(bool enabled) - { - gridOverlays.IsEnabled = !enabled; - cardOverlayConfig.IsEnabled = !enabled; - - if (enabled) - { - if (mousePositionOverlay == null) - mousePositionOverlay = new MousePositionOverlay(new System.Drawing.Rectangle(0, 0, 150, 150), "Mouse Position"); - mousePositionOverlay.Start(false); - } - else - { - if (mousePositionOverlay != null) - mousePositionOverlay.Stop(); - } - - lock (OverlaysACC.ActiveOverlays) - foreach (AbstractOverlay overlay in OverlaysACC.ActiveOverlays) - { - if (overlay != null) - overlay.EnableReposition(enabled); - else - overlay.Start(); - } - - } - - private void BuildOverlayPanel() - { - OverlaysACC.GenerateDictionary(); - - //BuildOverlayStackPanel(stackPanelOverlaysRelease, OverlayType.Release); - //BuildOverlayStackPanel(stackPanelOverlaysDebug, OverlayType.Debug); - - BuildOverlayListView(listOverlays, OverlayType.Release); - BuildOverlayListView(listDebugOverlays, OverlayType.Debug); - } - - private void BuildOverlayListView(ListView listView, OverlayType overlayType) - { - listView.Items.Clear(); - - foreach (KeyValuePair x in OverlaysACC.AbstractOverlays) - { - - AbstractOverlay tempAbstractOverlay = (AbstractOverlay)Activator.CreateInstance(x.Value, DefaultOverlayArgs); - var overlayAttribute = GetOverlayAttribute(x.Value); - OverlaySettingsJson tempOverlaySettings = OverlaySettings.LoadOverlaySettings(overlayAttribute.Name); - tempAbstractOverlay.Dispose(); - - - if (overlayAttribute.OverlayType != overlayType) - continue; - - - Style listTextStyle = new Style(); - TextBlock listViewText = new TextBlock() - { - Text = x.Key, - Style = Resources["MaterialDesignButtonTextBlock"] as Style, - Margin = new Thickness(14, 0, 0, 0), - //FontFamily = new FontFamily(new Uri("pack://application:,,,./Fonts/#Conthrax Sb"), "Conthrax"), - FontSize = 13.8, - //FontWeight = FontWeights.UltraLight, - }; - - - double marginTopBottom = 6.5d; - - ListViewItem listViewItem = new ListViewItem() - { - Content = listViewText, - DataContext = x, - HorizontalContentAlignment = HorizontalAlignment.Left, - Padding = new Thickness(0, marginTopBottom, 0, marginTopBottom), - Margin = new Thickness(0, 0.5, 0, 0.5), - BorderBrush = new SolidColorBrush(Colors.Transparent), - BorderThickness = new Thickness(4, 0, 0, 0), - }; - if (tempOverlaySettings != null) - if (tempOverlaySettings.Enabled) - { - listViewItem.Background = new SolidColorBrush(Color.FromArgb(50, 0, 0, 0)); - listViewItem.BorderBrush = new SolidColorBrush(Colors.LimeGreen); - - // TODO - lock (OverlaysACC.ActiveOverlays) - { - AbstractOverlay overlay = (AbstractOverlay)Activator.CreateInstance(x.Value, DefaultOverlayArgs); - - overlay.Start(); - - SaveOverlaySettings(overlay, true); - - OverlaysACC.ActiveOverlays.Add(overlay); - } - } - - listView.Items.Add(listViewItem); - } - } - - internal OverlayConfiguration overlayConfig; - internal List configFields; - /// - /// NEEDS REFACTOR - /// decouple - /// generics - /// - /// - /// - /// - private StackPanel GetConfigStacker(Type overlayType) - { - StackPanel stacker = new StackPanel() - { - Margin = new Thickness(10, 0, 0, 0), - Orientation = Orientation.Vertical, - VerticalAlignment = VerticalAlignment.Center, - }; - - overlayConfig = GetOverlayConfig(overlayType); - if (overlayConfig == null) return stacker; - - string overlayName = GetOverlayName(overlayType); - - configFields = null; - OverlaySettingsJson overlaySettings = OverlaySettings.LoadOverlaySettings(overlayName); - if (overlaySettings == null) - configFields = OverlayConfiguration.GetConfigFields(overlayConfig); - else - configFields = overlaySettings.Config; - - if (configFields == null) - configFields = OverlayConfiguration.GetConfigFields(overlayConfig); - - - // discover classes (Config Groupings) in OverlaySettings class - PropertyInfo[] types = overlayConfig.GetType().GetProperties().Where(x => x.IsDefined(typeof(ConfigGroupingAttribute))).ToArray(); - foreach (PropertyInfo type in types) - { - ConfigGroupingAttribute cga = null; - foreach (Attribute cad in Attribute.GetCustomAttributes(type)) - if (cad is ConfigGroupingAttribute attribute) - cga = attribute; - - if (cga != null) - { - Debug.WriteLine($"{type.Name} - {type.ReflectedType.FullName} - {type.PropertyType.Name}"); - - ListView listView = new ListView() - { - Width = 360, - HorizontalAlignment = HorizontalAlignment.Left, - Margin = new Thickness(0, 0, 0, 5), - Background = new SolidColorBrush(Color.FromArgb(255, 0, 0, 0)), - }; - - listView.Items.Add(new ListViewItem() - { - Content = $" {cga.Title}", - Background = new SolidColorBrush(Color.FromArgb(255, 0, 0, 0)), - Foreground = new SolidColorBrush(Color.FromRgb(255, 255, 255)), - FontWeight = FontWeights.Bold, - FontStyle = FontStyles.Italic, - HorizontalContentAlignment = HorizontalAlignment.Left, - FontSize = 18, - ToolTip = $"{cga.Description}", - Focusable = false, - Margin = new Thickness(0), - Padding = new Thickness(2, 2, 0, 2), - BorderThickness = new Thickness(1, 1, 0, 0), - BorderBrush = Brushes.OrangeRed - }); - - foreach (PropertyInfo subType in type.PropertyType.GetProperties()) - { - ConfigField configField = configFields.Where(x => x.Name == $"{type.Name}.{subType.Name}").FirstOrDefault(); - if (configField == null) - { - var typeValue = type.GetValue(overlayConfig); - configField = new ConfigField() { Name = $"{type.Name}.{subType.Name}", Value = subType.GetValue(typeValue).ToString() }; - } - - if (configField != null) - { - Dispatcher.BeginInvoke(new Action(() => - { - listView.Items.Add(ControlFactory.Instance.GenerateOption($"{type.Name}", $"{subType.Name}", subType, configField)); - })); - } - } - - stacker.Children.Add(listView); - } - } - - return stacker; - } - - private void SaveOverlaySettings(AbstractOverlay overlay, bool isEnabled) - { - OverlaySettingsJson settings = OverlaySettings.LoadOverlaySettings(overlay.Name); - if (settings == null) - { - settings = new OverlaySettingsJson() { X = overlay.X, Y = overlay.Y }; - } - - settings.Enabled = isEnabled; - - OverlaySettings.SaveOverlaySettings(overlay.Name, settings); - } - - - private void SaveOverlayConfig(Type overlay, OverlayConfiguration overlayConfiguration) - { - object[] args = new object[] { new System.Drawing.Rectangle(0, 0, 300, 150) }; - AbstractOverlay tempOverlay = (AbstractOverlay)Activator.CreateInstance(overlay, args); - SaveOverlayConfig(tempOverlay, overlayConfiguration); - tempOverlay.Dispose(); - } - - private void SaveOverlayConfig(AbstractOverlay overlay, OverlayConfiguration overlayConfiguration) - { - OverlaySettingsJson settings = OverlaySettings.LoadOverlaySettings(overlay.Name); - if (settings == null) - { - settings = new OverlaySettingsJson() { X = overlay.X, Y = overlay.Y }; - } - - settings.Config = OverlayConfiguration.GetConfigFields(overlayConfiguration); - - OverlaySettings.SaveOverlaySettings(overlay.Name, settings); - } - - private string GetOverlayName(Type overlay) - { - var attribute = GetOverlayAttribute(overlay); - - if (attribute == null) - return String.Empty; - - return attribute.Name; - } - - private OverlayAttribute GetOverlayAttribute(Type overlay) - { - OverlayAttribute overlayAttribute = null; - try - { - overlayAttribute = overlay.GetCustomAttribute(); - } - catch (Exception) - { - } - return overlayAttribute; - } - - private OverlayConfiguration GetOverlayConfig(Type overlay) - { - object[] args = new object[] { new System.Drawing.Rectangle(0, 0, 300, 150) }; - AbstractOverlay tempOverlay = (AbstractOverlay)Activator.CreateInstance(overlay, args); - - OverlayConfiguration temp = null; - - //Debug.WriteLine($"Finding OverlayConfiguration in {tempOverlay.Name}"); - FieldInfo[] fields = tempOverlay.GetType().GetRuntimeFields().ToArray(); - foreach (var nested in fields) - { - if (nested.FieldType.BaseType == typeof(OverlayConfiguration)) - { - //Debug.WriteLine($"Found {nested.Name} - {nested.GetValue(overlay)}"); - temp = (OverlayConfiguration)Activator.CreateInstance(nested.FieldType, new object[] { }); - return temp; - } - } - - tempOverlay.Dispose(); - - return temp; - } - } -} diff --git a/Race_Element/Controls/HUD/HudTab.xaml b/Race_Element/Controls/HUD/HudTab.xaml deleted file mode 100644 index 4c6555c6c..000000000 --- a/Race_Element/Controls/HUD/HudTab.xaml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - diff --git a/Race_Element/Controls/HUD/HudTab.xaml.cs b/Race_Element/Controls/HUD/HudTab.xaml.cs deleted file mode 100644 index 4f1ff4c16..000000000 --- a/Race_Element/Controls/HUD/HudTab.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for HudTab.xaml - /// - public partial class HudTab : UserControl - { - public HudTab() - { - InitializeComponent(); - } - } -} diff --git a/Race_Element/Controls/HUD/PreviewCache.cs b/Race_Element/Controls/HUD/PreviewCache.cs deleted file mode 100644 index 632c58827..000000000 --- a/Race_Element/Controls/HUD/PreviewCache.cs +++ /dev/null @@ -1,142 +0,0 @@ -using RaceElement.Controls.Util.SetupImage; -using RaceElement.HUD.ACC; -using RaceElement.HUD.Overlay.Internal; -using RaceElement.HUD.Overlay.OverlayUtil; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; - -namespace RaceElement.Controls.HUD -{ - internal class PreviewCache - { - internal static readonly Dictionary _cachedPreviews = new Dictionary(); - private static readonly object[] DefaultOverlayArgs = new object[] { new System.Drawing.Rectangle((int)SystemParameters.PrimaryScreenWidth / 2, (int)SystemParameters.PrimaryScreenHeight / 2, 300, 150) }; - - public class CachedPreview - { - public int Width; - public int Height; - public CachedBitmap CachedBitmap; - } - - internal static void UpdatePreviewImage(ListView listOverlays, Image previewImage, string overlayName) - { - if (listOverlays.SelectedIndex >= 0) - { - ListViewItem lvi = (ListViewItem)listOverlays.SelectedItem; - TextBlock tb = (TextBlock)lvi.Content; - string actualOverlayName = overlayName.Replace("Overlay", "").Trim(); - if (tb.Text.Equals(actualOverlayName)) - { - PreviewCache.GeneratePreview(actualOverlayName); - PreviewCache._cachedPreviews.TryGetValue(actualOverlayName, out CachedPreview preview); - if (preview != null) - { - previewImage.Stretch = Stretch.UniformToFill; - previewImage.Width = preview.Width; - previewImage.Height = preview.Height; - previewImage.Source = ImageControlCreator.CreateImage(preview.Width, preview.Height, preview.CachedBitmap).Source; - } - else - { - previewImage.Source = null; - } - } - } - } - - /// - /// - /// - /// - /// Chooses to use a cached version if there is one - internal static void GeneratePreview(string overlayName, bool cached = false) - { - if (cached && _cachedPreviews.ContainsKey(overlayName)) - return; - - OverlaysACC.AbstractOverlays.TryGetValue(overlayName, out Type overlayType); - - if (overlayType == null) - return; - - AbstractOverlay overlay; - try - { - overlay = (AbstractOverlay)Activator.CreateInstance(overlayType, DefaultOverlayArgs); - } - catch (Exception) - { - return; - } - - overlay.pageGraphics = ACCSharedMemory.Instance.ReadGraphicsPageFile(false); - overlay.pageGraphics.NumberOfLaps = 30; - overlay.pageGraphics.FuelXLap = 3.012f; - overlay.pageGraphics.SessionType = ACCSharedMemory.AcSessionType.AC_RACE; - overlay.pageGraphics.MandatoryPitDone = false; - overlay.pageGraphics.NormalizedCarPosition = 0.0472972f; - - overlay.pagePhysics = ACCSharedMemory.Instance.ReadPhysicsPageFile(false); - overlay.pagePhysics.SpeedKmh = 272.32f; - overlay.pagePhysics.Fuel = 92.07f; - overlay.pagePhysics.Rpms = 8500; - overlay.pagePhysics.Gear = 3; - overlay.pagePhysics.WheelPressure = new float[] { 27.61f, 27.56f, 26.94f, 26.13f }; - overlay.pagePhysics.TyreCoreTemperature = new float[] { 92.6f, 88.5f, 65.9f, 67.2f }; - overlay.pagePhysics.PadLife = new float[] { 24f, 24f, 25f, 25f }; - overlay.pagePhysics.BrakeTemperature = new float[] { 300f, 250f, 450f, 460f }; - overlay.pagePhysics.Gas = 0.78f; - overlay.pagePhysics.Brake = 0.133f; - - overlay.pagePhysics.CarDamage[0] = 20; - overlay.pagePhysics.CarDamage[1] = 20; - overlay.pagePhysics.CarDamage[2] = 35; - overlay.pagePhysics.CarDamage[3] = 20; - - overlay.pagePhysics.SuspensionDamage[0] = 0.1f; - overlay.pagePhysics.SuspensionDamage[1] = 0.2f; - overlay.pagePhysics.SuspensionDamage[2] = 0.05f; - overlay.pagePhysics.SuspensionDamage[3] = 0.13f; - - overlay.pageStatic = ACCSharedMemory.Instance.ReadStaticPageFile(false); - overlay.pageStatic.MaxFuel = 120f; - overlay.pageStatic.MaxRpm = 9250; - overlay.pageStatic.CarModel = "porsche_991ii_gt3_r"; - overlay.pageStatic.Track = "Spa"; - - - try - { - overlay.BeforeStart(); - CachedPreview cachedPreview = new CachedPreview() - { - Width = overlay.Width, - Height = overlay.Height, - CachedBitmap = new CachedBitmap(overlay.Width, overlay.Height, g => overlay.Render(g)) - }; - - if (_cachedPreviews.ContainsKey(overlayName)) - _cachedPreviews[overlayName] = cachedPreview; - else - _cachedPreviews.Add(overlayName, cachedPreview); - - overlay.BeforeStop(); - } - catch (Exception) { } - finally - { - overlay.Dispose(); - overlay = null; - } - } - - - } -} diff --git a/Race_Element/Controls/Liveries/AfterImport.xaml b/Race_Element/Controls/Liveries/AfterImport.xaml deleted file mode 100644 index f5061db65..000000000 --- a/Race_Element/Controls/Liveries/AfterImport.xaml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Imported liveries - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/AfterImport.xaml.cs b/Race_Element/Controls/Liveries/AfterImport.xaml.cs deleted file mode 100644 index 450cf8c8e..000000000 --- a/Race_Element/Controls/Liveries/AfterImport.xaml.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for AfterImport.xaml - /// - public partial class AfterImport : UserControl - { - public static AfterImport Instance { get; private set; } - - private List ImportedLiveries; - - public AfterImport() - { - InitializeComponent(); - transitionAfterImport.Background = new SolidColorBrush(Color.FromArgb(140, 0, 0, 0)); - - - lvImportedLiveries.SelectionChanged += LvImportedLiveries_SelectionChanged; - buttonClose.Click += (o, e) => Close(); - buttonAddTags.Click += (o, e) => AddTags(); - - Instance = this; - } - - private void LvImportedLiveries_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - foreach (var item in lvImportedLiveries.Items) - { - var listBoxItem = (item as ListBoxItem); - listBoxItem.Background = Brushes.Transparent; - } - - foreach (var item in lvImportedLiveries.SelectedItems) - { - var listBoxItem = (item as ListBoxItem); - listBoxItem.Background = Brushes.OrangeRed; - } - } - - internal void Open(List importedLiveries) - { - this.ImportedLiveries = importedLiveries; - this.transitionAfterImport.Visibility = Visibility.Visible; - - - LiveryBrowser.Instance.Dispatcher.BeginInvoke(new Action(() => - { - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = false; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = false; - LiveryBrowser.Instance.liveriesTreeViewTags.IsEnabled = false; - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = false; - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = false; - })); - - UpdateList(); - } - - private void Close() - { - transitionAfterImport.Visibility = Visibility.Hidden; - LiveryBrowser.Instance.Dispatcher.BeginInvoke(new Action(() => - { - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = true; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = true; - LiveryBrowser.Instance.liveriesTreeViewTags.IsEnabled = true; - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = true; - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = true; - })); - } - - private void AddTags() - { - List selected = new List(); - - foreach (var item in lvImportedLiveries.SelectedItems) - { - selected.Add(((ListBoxItem)item).DataContext as LiveryTreeCar); - } - - LiveryTagger.Instance.Open(selected); - } - - private void UpdateList() - { - lvImportedLiveries.Items.Clear(); - - foreach (LiveryTreeCar car in ImportedLiveries) - { - ListBoxItem listBoxItem = new ListBoxItem() { Content = $"{car.CarsRoot.TeamName} / {car.CarsRoot.CustomSkinName}", DataContext = car }; - lvImportedLiveries.Items.Add(listBoxItem); - } - } - } -} diff --git a/Race_Element/Controls/Liveries/DDSgenerator.xaml b/Race_Element/Controls/Liveries/DDSgenerator.xaml deleted file mode 100644 index b064814af..000000000 --- a/Race_Element/Controls/Liveries/DDSgenerator.xaml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - DDS Generator - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/DDSgenerator.xaml.cs b/Race_Element/Controls/Liveries/DDSgenerator.xaml.cs deleted file mode 100644 index 5edeb2585..000000000 --- a/Race_Element/Controls/Liveries/DDSgenerator.xaml.cs +++ /dev/null @@ -1,195 +0,0 @@ -using RaceElement.Controls.Liveries; -using RaceElement.LiveryParser; -using RaceElement.Util; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for DDSgenerator.xaml - /// - public partial class DDSgenerator : UserControl - { - internal static DDSgenerator Instance; - - private List liveriesWithoutDDS = new List(); - private bool Generating = false; - - public DDSgenerator() - { - InitializeComponent(); - this.Visibility = Visibility.Hidden; - - this.IsVisibleChanged += DDSgenerator_IsVisibleChanged; - - buttonGenerate.Click += ButtonGenerate_Click; - buttonCancel.Click += ButtonCancel_Click; - - Instance = this; - } - - private void DDSgenerator_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) - { - if (this.Visibility == Visibility.Visible) - { - LoadLiveriesWithoutDDS(); - } - } - - private void ButtonCancel_Click(object sender, RoutedEventArgs e) - { - Cancel(); - } - - public void Cancel() - { - if (!this.Generating) - { - this.Visibility = Visibility.Hidden; - } - else - { - buttonCancel.IsEnabled = false; - buttonCancel.Content = "Cancelling..."; - Generating = false; - } - } - - private void ButtonGenerate_Click(object sender, RoutedEventArgs e) - { - new Thread(x => - { - Generating = true; - - Instance.Dispatcher.Invoke(() => - { - buttonGenerate.IsEnabled = false; - buttonGenerate.Content = "Generating dds files... this may take a while"; - buttonCancel.IsEnabled = true; - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = false; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = false; - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = false; - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = false; - LiveryDisplayer.Instance.buttonGenerateDDS.IsEnabled = false; - }); - - while (liveriesWithoutDDS.Count > 0 && Generating) - { - Instance.Dispatcher.Invoke(() => - { - todoList.SelectedIndex = 0; - (todoList.SelectedItem as ListBoxItem).Background = Brushes.Orange; - }); - - LiveryTreeCar livery = liveriesWithoutDDS.First(); - DDSutil.GenerateDDS(livery); - - Instance.Dispatcher.Invoke((Action)(() => - { - todoList.Items.RemoveAt(0); - liveriesWithoutDDS.RemoveAt(0); - })); - } - - - Instance.Dispatcher.Invoke(() => - { - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage($"Finished generating DDS Files."); - - buttonGenerate.IsEnabled = true; - buttonGenerate.Content = "Start generating"; - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = true; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = true; - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = true; - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = true; - LiveryDisplayer.Instance.buttonGenerateDDS.IsEnabled = true; - LiveryDisplayer.Instance.ReloadLivery(); - if (!Generating) - { - buttonCancel.IsEnabled = true; - buttonCancel.Content = "Cancel"; - } - - Generating = false; - LoadLiveriesWithoutDDS(); - }); - - - }).Start(); - } - - private void LoadLiveriesWithoutDDS() - { - todoList.Items.Clear(); - liveriesWithoutDDS.Clear(); - - DirectoryInfo customsCarsDirectory = new DirectoryInfo(FileUtil.CarsPath); - - List liveryTreeCars = new List(); - - foreach (var carsFile in customsCarsDirectory.GetFiles()) - { - if (carsFile.Extension != null && carsFile.Extension.Equals(".json")) - { - CarsJson.Root carsRoot = LiveryImporter.GetLivery(carsFile); - - if (carsRoot != null) - { - LiveryTreeCar treeCar = new LiveryTreeCar() { CarsFile = carsFile, CarsRoot = carsRoot }; - - if (treeCar.CarsRoot.CustomSkinName != null && treeCar.CarsRoot.TeamName != null) - if (!treeCar.CarsRoot.CustomSkinName.Equals(string.Empty) - && !treeCar.CarsRoot.TeamName.Equals(string.Empty) - ) - { - if (!DDSutil.HasDdsFiles(treeCar)) - liveryTreeCars.Add(treeCar); - - } - } - } - } - - if (liveryTreeCars.Count == 0) - { - buttonGenerate.Content = "All DDS files available"; - buttonGenerate.IsEnabled = false; - } - else - { - buttonGenerate.Content = "Start generating"; - buttonGenerate.IsEnabled = true; - } - - liveryTreeCars.Sort((a, b) => - { - return $"{a.CarsRoot.TeamName}{a.CarsRoot.CustomSkinName}".CompareTo($"{b.CarsRoot.TeamName}{b.CarsRoot.CustomSkinName}"); - }); - - liveryTreeCars.ForEach(x => - { - ListBoxItem listBoxItem = new ListBoxItem() - { - AllowDrop = true, - Content = $"{x.CarsRoot.TeamName} / {x.CarsRoot.CustomSkinName}", - DataContext = x, - }; - - todoList.Items.Add(listBoxItem); - }); - - liveriesWithoutDDS = liveryTreeCars; - } - - - } -} diff --git a/Race_Element/Controls/Liveries/DDSutil.cs b/Race_Element/Controls/Liveries/DDSutil.cs deleted file mode 100644 index 982621180..000000000 --- a/Race_Element/Controls/Liveries/DDSutil.cs +++ /dev/null @@ -1,121 +0,0 @@ -using RaceElement.Util; -using DdsFileTypePlus; -using PaintDotNet; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls.Liveries -{ - internal class DDSutil - { - private static readonly Dictionary pngsToDDS = new Dictionary() - { - //{"decals_0.dds","decals.png" }, - //{"sponsors_0.dds" ,"sponsors.png"}, - {"decals_1.dds","decals.png" }, - {"sponsors_1.dds","sponsors.png" } - }; - - public static void GenerateDDS(LiveryTreeCar livery) - { - try - { - for (int i = 0; i < pngsToDDS.Count; i++) - { - DirectoryInfo customSkinDir = new DirectoryInfo(FileUtil.LiveriesPath + livery.CarsRoot.CustomSkinName); - FileInfo[] liveryPngFiles = customSkinDir.GetFiles(pngsToDDS.ElementAt(i).Value); - if (liveryPngFiles != null && liveryPngFiles.Length > 0) - { - MainWindow.Instance.Dispatcher.Invoke(new Action(() => - { - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage($"Generating {pngsToDDS.ElementAt(i).Key} for {livery.CarsRoot.CustomSkinName}"); - })); - - FileInfo pngFile = liveryPngFiles[0]; - FileStream actualFileStream = pngFile.OpenRead(); - - Bitmap bitmap = new Bitmap(actualFileStream); - - if (pngsToDDS.ElementAt(i).Key.Contains("_1")) - { - bitmap = ResizeBitmap(bitmap, 2048, 2048); - } - - Surface surface = Surface.CopyFromBitmap(bitmap); - - FileInfo targetFile = new FileInfo($"{customSkinDir}\\{pngsToDDS.ElementAt(i).Key}"); - if (targetFile.Exists) - targetFile.Delete(); - - FileStream write = targetFile.OpenWrite(); - DdsFile.Save(write, DdsFileFormat.BC7, DdsErrorMetric.Perceptual, BC7CompressionMode.Slow, true, true, ResamplingAlgorithm.SuperSampling, surface, ProgressChanged); - write.Close(); - actualFileStream.Close(); - - GC.Collect(); - } - } - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - } - } - - public static bool HasDdsFiles(LiveryTreeCar livery) - { - try - { - for (int i = 0; i < pngsToDDS.Count; i++) - { - KeyValuePair kvp = pngsToDDS.ElementAt(i); - - DirectoryInfo customSkinDir = new DirectoryInfo(FileUtil.LiveriesPath + livery.CarsRoot.CustomSkinName); - if (customSkinDir != null && customSkinDir.Exists) - { - //check if png exists - FileInfo[] foundFiles = customSkinDir.GetFiles(kvp.Value); - - if (foundFiles != null && foundFiles.Length > 0) - { - foundFiles = customSkinDir.GetFiles(kvp.Key); - if (foundFiles == null || foundFiles.Length == 0) - { - return false; - } - } - } - } - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - return false; - } - - return true; - } - - private static Bitmap ResizeBitmap(Bitmap bmp, int width, int height) - { - Bitmap result = new Bitmap(width, height); - using (Graphics g = Graphics.FromImage(result)) - { - g.DrawImage(bmp, 0, 0, width, height); - } - return result; - } - - private static void ProgressChanged(object sender, ProgressEventArgs e) - { - //Debug.WriteLine(e.Percent.ToString()); - //progressBar1.Value = (int) Math.Round(e.Percent); - } - - } -} diff --git a/Race_Element/Controls/Liveries/LiveriesTab.xaml b/Race_Element/Controls/Liveries/LiveriesTab.xaml deleted file mode 100644 index 79bd5fb3b..000000000 --- a/Race_Element/Controls/Liveries/LiveriesTab.xaml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/LiveriesTab.xaml.cs b/Race_Element/Controls/Liveries/LiveriesTab.xaml.cs deleted file mode 100644 index 878847145..000000000 --- a/Race_Element/Controls/Liveries/LiveriesTab.xaml.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for LiveriesTab.xaml - /// - public partial class LiveriesTab : UserControl - { - - public static LiveriesTab Instance; - public LiveriesTab() - { - InitializeComponent(); - Instance = this; - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryBrowser.xaml b/Race_Element/Controls/Liveries/LiveryBrowser.xaml deleted file mode 100644 index e6608967b..000000000 --- a/Race_Element/Controls/Liveries/LiveryBrowser.xaml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/LiveryBrowser.xaml.cs b/Race_Element/Controls/Liveries/LiveryBrowser.xaml.cs deleted file mode 100644 index 64c1e7228..000000000 --- a/Race_Element/Controls/Liveries/LiveryBrowser.xaml.cs +++ /dev/null @@ -1,953 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data; -using RaceElement.LiveryParser; -using RaceElement.Util; -using SharpCompress.Archives; -using SharpCompress.Archives.Zip; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; -using static RaceElement.Controls.LiveryTagging; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for LiveryBrowser.xaml - /// - public partial class LiveryBrowser : UserControl - { - public static LiveryBrowser Instance; - - private List expandedCarHeaders = new List(); - private List expandedTeamHeaders = new List(); - private List expandedTagHeaders = new List(); - - public LiveryBrowser() - { - InitializeComponent(); - - Instance = this; - this.Loaded += (s, e) => ThreadPool.QueueUserWorkItem(x => FetchAllCars()); - - liveriesTreeViewTeams.SelectedItemChanged += LiveriesTreeView_SelectedItemChanged; - liveriesTreeViewCars.SelectedItemChanged += LiveriesTreeView_SelectedItemChanged; - liveriesTreeViewTags.SelectedItemChanged += LiveriesTreeView_SelectedItemChanged; - - liveriesTreeViewTeams.KeyUp += (s, e) => LiveryTreeViewKeyUp(liveriesTreeViewTeams, s, e); - liveriesTreeViewCars.KeyUp += (s, e) => LiveryTreeViewKeyUp(liveriesTreeViewCars, s, e); - liveriesTreeViewTags.KeyUp += (s, e) => LiveryTreeViewKeyUp(liveriesTreeViewTags, s, e); - - - buttonImportLiveries.Click += ButtonImportLiveries_Click; - - buttonRefreshLiveries.Click += (s, e) => ThreadPool.QueueUserWorkItem(x => FetchAllCars()); ; - - buttonGenerateAllDDS.Click += ButtonGenerateAllDDS_Click; - - - buttonNewTag.Click += (sender, args) => - { - LiveryTagCreator.Instance.Open(); - }; - - this.IsVisibleChanged += (s, e) => - { - if ((bool)e.NewValue) - LiveryDisplayer.Instance.ReloadLivery(); - else - LiveryDisplayer.Instance.Cache(); - - ThreadPool.QueueUserWorkItem(x => - { - Thread.Sleep(10 * 1000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); - }); - }; - } - - private void LiveryTreeViewKeyUp(TreeView treeView, object sender, KeyEventArgs e) - { - if (!treeView.IsVisible) - return; - - switch (e.Key) - { - case Key.Delete: - { - var selectedItem = treeView.SelectedItem; - - if (selectedItem == null) - return; - - TreeViewItem item = (TreeViewItem)selectedItem; - if (item.DataContext != null) - { - if (item.DataContext.GetType() == typeof(LiveryTreeCar)) - { - LiveryTreeCar treeCar = (LiveryTreeCar)item.DataContext; - LiveryDeleter.Instance.Open(treeCar); - - } - } - break; - } - default: break; - } - } - - private void ButtonGenerateAllDDS_Click(object sender, RoutedEventArgs e) - { - DDSgenerator.Instance.Visibility = Visibility.Visible; - } - - private void ButtonImportLiveries_Click(object sender, RoutedEventArgs e) - { - ThreadPool.QueueUserWorkItem(x => LiveryImporter.ImportLiveryZips()); - } - - private void LiveriesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) - { - if (e.NewValue != null) - { - if (e.NewValue.GetType() == typeof(TreeViewItem)) - { - TreeViewItem item = (TreeViewItem)e.NewValue; - if (item.DataContext != null) - { - if (item.DataContext.GetType() == typeof(LiveryTreeCar)) - { - LiveryTreeCar treeCar = (LiveryTreeCar)item.DataContext; - - - LiveryDisplayer.Instance.SetLivery(treeCar); - LiveryDisplayer.Instance.ReloadLivery(); - } - } - } - } - } - - internal class LiveryTreeCar - { - public FileInfo CarsFile { get; set; } - public CarsJson.Root CarsRoot { get; set; } - - public override bool Equals(object obj) - { - return obj is LiveryTreeCar car && - EqualityComparer.Default.Equals(CarsFile, car.CarsFile) && - EqualityComparer.Default.Equals(CarsRoot, car.CarsRoot); - } - } - - internal void FetchAllCars(bool tagsOnly = false) - { - Instance.Dispatcher.BeginInvoke(new Action(() => - { - try - { - if (!tagsOnly) - { - liveriesTreeViewTeams.Items.Clear(); - liveriesTreeViewCars.Items.Clear(); - } - liveriesTreeViewTags.Items.Clear(); - - DirectoryInfo customsCarsDirectory = new DirectoryInfo(FileUtil.CarsPath); - - List liveryTreeCars = new List(); - - foreach (var carsFile in customsCarsDirectory.GetFiles()) - { - if (carsFile.Extension != null && carsFile.Extension.Equals(".json")) - { - CarsJson.Root carsRoot = LiveryImporter.GetLivery(carsFile); - - if (carsRoot != null) - { - LiveryTreeCar treeCar = new LiveryTreeCar() { CarsFile = carsFile, CarsRoot = carsRoot }; - - if (treeCar.CarsRoot.CustomSkinName != null /*&& treeCar.carsRoot.teamName != null*/) - if (!treeCar.CarsRoot.CustomSkinName.Equals(string.Empty) - //&& !treeCar.carsRoot.teamName.Equals(string.Empty) - ) - liveryTreeCars.Add(treeCar); - } - } - } - - - var liveriesGroupedByCar = liveryTreeCars.GroupBy(g => ConversionFactory.GetCarName(g.CarsRoot.CarModelType)); - var liveriesGroupedByTeam = liveryTreeCars.GroupBy(g => g.CarsRoot.TeamName); - - if (!tagsOnly) - { - FillTreeViewTeams(liveriesGroupedByTeam); - FillTreeViewModels(liveriesGroupedByCar); - } - FillTreeViewTags(liveryTreeCars); - - } - catch (Exception ex) - { - Debug.WriteLine(ex); - LogWriter.WriteToLog(ex); - } - })); - } - - private void FillTreeViewModels(IEnumerable> liveriesGroupedByModel) - { - List carsTreeViews = new List(); - - foreach (IGrouping tItem in liveriesGroupedByModel) - { - string treeViewTitle = $"{tItem.Key}"; - int groupCount = tItem.Count(); - if (groupCount > 1) - { - treeViewTitle += $" ({groupCount})"; - } - TextBlock teamHeader = new TextBlock() - { - Text = treeViewTitle, - Style = Resources["MaterialDesignSubtitle1TextBlock"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5, - DataContext = tItem.Key - }; - TreeViewItem modelItem = new TreeViewItem() - { - Header = teamHeader, - Background = new SolidColorBrush(Color.FromArgb(38, 10, 0, 0)), - }; - modelItem.MouseLeftButtonUp += (s, e) => - { - modelItem.IsExpanded = !modelItem.IsExpanded; - e.Handled = true; - }; - if (expandedCarHeaders.Contains(tItem.Key)) modelItem.ExpandSubtree(); - modelItem.Expanded += (s, e) => - { - int targetItemInView = modelItem.Items.Count; - targetItemInView.ClipMax(18); - ((TreeViewItem)modelItem.Items.GetItemAt(targetItemInView - 1)).BringIntoView(); - expandedCarHeaders.Add(tItem.Key); - }; - modelItem.Collapsed += (s, e) => expandedCarHeaders.Remove(tItem.Key); - - var cars = tItem.ToList(); - cars.Sort((a, b) => - { - return $"{a.CarsRoot.CustomSkinName.ToLower()}".CompareTo($"{b.CarsRoot.CustomSkinName.ToLower()}"); - }); - foreach (LiveryTreeCar car in cars) - { - TextBlock skinHeader = new TextBlock() - { - Text = $"{car.CarsRoot.CustomSkinName}", - Style = Resources["MaterialDesignDataGridTextColumnStyle"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5 - }; - TreeViewItem skinItem = new TreeViewItem() { Header = skinHeader, DataContext = car }; - skinItem.ContextMenu = GetSkinContextMenu(car, null); - skinItem.MouseLeftButtonUp += (s, e) => e.Handled = true; - - modelItem.Items.Add(skinItem); - } - - modelItem.ContextMenu = GetTeamContextMenu(modelItem); - carsTreeViews.Add(modelItem); - } - - carsTreeViews.Sort((a, b) => - { - TextBlock aCar = a.Header as TextBlock; - TextBlock bCar = b.Header as TextBlock; - return $"{aCar.DataContext}".CompareTo($"{bCar.DataContext}"); - }); - - carsTreeViews.ForEach(x => liveriesTreeViewCars.Items.Add(x)); - } - - - private void FillTreeViewTeams(IEnumerable> liveriesGroupedByTeam) - { - List carsTreeViews = new List(); - - foreach (IGrouping tItem in liveriesGroupedByTeam) - { - string treeViewTitle = $"{tItem.Key}"; - int groupCount = tItem.Count(); - if (groupCount > 1) - { - treeViewTitle += $" ({groupCount})"; - } - TextBlock teamHeader = new TextBlock() - { - Text = treeViewTitle, - Style = Resources["MaterialDesignSubtitle1TextBlock"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5, - DataContext = tItem.Key - }; - TreeViewItem teamItem = new TreeViewItem() - { - Header = teamHeader, - Background = new SolidColorBrush(Color.FromArgb(38, 10, 0, 0)), - }; - teamItem.MouseLeftButtonUp += (s, e) => - { - teamItem.IsExpanded = !teamItem.IsExpanded; - e.Handled = true; - }; - if (expandedTeamHeaders.Contains(tItem.Key)) teamItem.ExpandSubtree(); - teamItem.Expanded += (s, e) => - { - int targetItemInView = teamItem.Items.Count; - targetItemInView.ClipMax(18); - ((TreeViewItem)teamItem.Items.GetItemAt(targetItemInView - 1)).BringIntoView(); - expandedTeamHeaders.Add(tItem.Key); - }; - teamItem.Collapsed += (s, e) => expandedTeamHeaders.Remove(tItem.Key); - - var cars = tItem.ToList(); - cars.Sort((a, b) => - { - return $"{a.CarsRoot.CustomSkinName.ToLower()}".CompareTo($"{b.CarsRoot.CustomSkinName.ToLower()}"); - }); - - foreach (LiveryTreeCar car in cars) - { - TextBlock skinHeader = new TextBlock() - { - Text = $"{car.CarsRoot.CustomSkinName}", - Style = Resources["MaterialDesignDataGridTextColumnStyle"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5 - }; - TreeViewItem skinItem = new TreeViewItem() { Header = skinHeader, DataContext = car }; - skinItem.ContextMenu = GetSkinContextMenu(car, null); - skinItem.MouseLeftButtonUp += (s, e) => e.Handled = true; - - teamItem.Items.Add(skinItem); - } - - teamItem.ContextMenu = GetTeamContextMenu(teamItem); - carsTreeViews.Add(teamItem); - } - - carsTreeViews.Sort((a, b) => - { - TextBlock aCar = a.Header as TextBlock; - TextBlock bCar = b.Header as TextBlock; - return $"{aCar.DataContext}".CompareTo($"{bCar.DataContext}"); - }); - - carsTreeViews.ForEach(x => liveriesTreeViewTeams.Items.Add(x)); - } - - private void FillTreeViewTags(List allLiveries) - { - List tagTreeItems = new List(); - - List liveriesWithTags = new List(); - - LiveryTagging.GetAllTags().ForEach(liveryTag => - { - List tagCars = new List(); - foreach (LiveryTreeCar car in allLiveries) - { - if (LiveryTagging.TagContainsCar(liveryTag, car)) - { - tagCars.Add(car); - } - } - - string treeViewTitle = $"{liveryTag.Name}"; - int groupCount = tagCars.Count(); - if (groupCount > 1) - { - treeViewTitle += $" ({groupCount})"; - } - - TextBlock tagHeader = new TextBlock() - { - Text = treeViewTitle, - Style = Resources["MaterialDesignSubtitle1TextBlock"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5, - DataContext = liveryTag.Name - }; - TreeViewItem tagItem = new TreeViewItem() - { - Header = tagHeader, - Background = new SolidColorBrush(Color.FromArgb(38, 10, 0, 0)), - }; - tagItem.MouseLeftButtonUp += (s, e) => - { - tagItem.IsExpanded = !tagItem.IsExpanded; - e.Handled = true; - }; - if (expandedTagHeaders.Contains(liveryTag.Name)) tagItem.ExpandSubtree(); - tagItem.Expanded += (s, e) => - { - int targetItemInView = tagItem.Items.Count; - targetItemInView.ClipMax(18); - if (tagItem.Items.Count > 0) - ((TreeViewItem)tagItem.Items.GetItemAt(targetItemInView - 1)).BringIntoView(); - expandedTagHeaders.Add(liveryTag.Name); - }; - tagItem.Collapsed += (s, e) => expandedTagHeaders.Remove(liveryTag.Name); - - tagItem.ContextMenu = GetTagContextMenu(tagItem, liveryTag); - tagCars.Sort((a, b) => - { - return $"{a.CarsRoot.CustomSkinName.ToLower()}".CompareTo($"{b.CarsRoot.CustomSkinName.ToLower()}"); - }); - - foreach (LiveryTreeCar car in tagCars) - { - TextBlock skinHeader = new TextBlock() - { - Text = $"{car.CarsRoot.CustomSkinName}", - Style = Resources["MaterialDesignDataGridTextColumnStyle"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5 - }; - TreeViewItem skinItem = new TreeViewItem() { Header = skinHeader, DataContext = car }; - skinItem.ContextMenu = GetSkinContextMenu(car, liveryTag); - skinItem.MouseLeftButtonUp += (s, e) => e.Handled = true; - if (!liveriesWithTags.Contains(car)) - liveriesWithTags.Add(car); - - tagItem.Items.Add(skinItem); - } - - tagTreeItems.Add(tagItem); - }); - - tagTreeItems.Sort((a, b) => - { - TextBlock textA = a.Header as TextBlock; - TextBlock textB = b.Header as TextBlock; - return $"{textA.DataContext}".CompareTo($"{textB.DataContext}"); - }); - - - if (liveriesWithTags.Count > 0) - { - List liveriesWithoutTags = allLiveries.Except(liveriesWithTags).ToList(); - - string treeViewTitle = $"No Tags ({liveriesWithoutTags.Count})"; - TextBlock tagHeader = new TextBlock() - { - Text = treeViewTitle, - Style = Resources["MaterialDesignSubtitle1TextBlock"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5, - Background = new SolidColorBrush(Colors.OrangeRed) - }; - if (liveriesWithoutTags.Count == 0) - tagHeader.Background = new SolidColorBrush(Colors.DarkOliveGreen); - - TreeViewItem tagItem = new TreeViewItem() - { - Header = tagHeader, - Background = new SolidColorBrush(Color.FromArgb(38, 10, 0, 0)), - }; - tagItem.PreviewMouseLeftButtonDown += (s, e) => { tagItem.IsExpanded = !tagItem.IsExpanded; }; - if (expandedTagHeaders.Contains("No Tags")) tagItem.ExpandSubtree(); - tagItem.Expanded += (s, e) => - { - int targetItemInView = tagItem.Items.Count; - targetItemInView.ClipMax(18); - if (tagItem.Items.Count > 0) - ((TreeViewItem)tagItem.Items.GetItemAt(targetItemInView - 1)).BringIntoView(); - expandedTagHeaders.Add("No Tags"); - }; - tagItem.Collapsed += (s, e) => expandedTagHeaders.Remove("No Tags"); - - liveriesWithoutTags.Sort((a, b) => - { - return $"{a.CarsRoot.TeamName} / {a.CarsRoot.CustomSkinName}".CompareTo($"{b.CarsRoot.TeamName} / {b.CarsRoot.CustomSkinName}"); - }); - - foreach (LiveryTreeCar car in liveriesWithoutTags) - { - TextBlock skinHeader = new TextBlock() - { - Text = $"{car.CarsRoot.TeamName} / {car.CarsRoot.CustomSkinName}", - Style = Resources["MaterialDesignDataGridTextColumnStyle"] as Style, - TextTrimming = TextTrimming.WordEllipsis, - Width = liveriesTreeViewTeams.Width - 5 - }; - TreeViewItem skinItem = new TreeViewItem() { Header = skinHeader, DataContext = car }; - skinItem.ContextMenu = GetSkinContextMenu(car, null); - - if (!liveriesWithTags.Contains(car)) - liveriesWithTags.Add(car); - - tagItem.Items.Add(skinItem); - } - - tagTreeItems.Insert(0, tagItem); - - } - - tagTreeItems.ForEach(x => liveriesTreeViewTags.Items.Add(x)); - - } - - - private ContextMenu GetSkinContextMenu(LiveryTreeCar liveryTreeCar, LiveryTag tag) - { - ContextMenu menu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)) - }; - - Button openLiveryDirectory = new Button() - { - Content = $"Open Livery Directory", - CommandParameter = liveryTreeCar, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - openLiveryDirectory.Click += OpenLiveryDirectory_Click; - menu.Items.Add(openLiveryDirectory); - - Button openLiveryJson = new Button() - { - Content = $"Open Livery Json in Explorer", - CommandParameter = liveryTreeCar, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - openLiveryJson.Click += OpenLiveryJson_Click; - menu.Items.Add(openLiveryJson); - - Button createZipButton = new Button() - { - Content = $"Save Skin as zip archive", - CommandParameter = liveryTreeCar, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - createZipButton.Click += CreateZipButton_Click; - menu.Items.Add(createZipButton); - - Button addSkinToSkinPack = new Button() - { - Content = $"Add to Skin Pack", - CommandParameter = liveryTreeCar, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - addSkinToSkinPack.Click += AddSkinToSkinPack_Click; - menu.Items.Add(addSkinToSkinPack); - - if (tag == null) - { - Button addSkinToTag = new Button() - { - Content = $"Add to Tag", - CommandParameter = liveryTreeCar, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - addSkinToTag.Click += AddSkinToTag_Click; - menu.Items.Add(addSkinToTag); - } - else - { - Button removeSkinFromTag = new Button() - { - Content = $"Remove from tag", - CommandParameter = liveryTreeCar, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - removeSkinFromTag.Click += (e, s) => - { - LiveryTagging.RemoveFromTag(tag, liveryTreeCar); - menu.IsOpen = false; - FetchAllCars(); - }; - menu.Items.Add(removeSkinFromTag); - } - - Button deleteLivery = new Button() - { - Content = $"Delete", - CommandParameter = liveryTreeCar, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - deleteLivery.Click += DeleteLivery_Click; - menu.Items.Add(deleteLivery); - - return menu; - } - - private void AddSkinToTag_Click(object sender, RoutedEventArgs e) - { - try - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - (button.Parent as ContextMenu).IsOpen = false; - - LiveryTreeCar liveryTreeCar = (LiveryTreeCar)button.CommandParameter; - - LiveryTagger.Instance.Open(liveryTreeCar); - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - } - - private void DeleteLivery_Click(object sender, RoutedEventArgs e) - { - try - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - (button.Parent as ContextMenu).IsOpen = false; - - LiveryTreeCar liveryTreeCar = (LiveryTreeCar)button.CommandParameter; - - LiveryDeleter.Instance.Open(liveryTreeCar); - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - } - - private void AddSkinToSkinPack_Click(object sender, RoutedEventArgs e) - { - try - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - LiveryTreeCar liveryTreeCar = (LiveryTreeCar)button.CommandParameter; - if (LiveryExporter.Instance.AddExportItem(liveryTreeCar)) - { - MainWindow.Instance.EnqueueSnackbarMessage($"Added {liveryTreeCar.CarsRoot.TeamName}/{liveryTreeCar.CarsRoot.CustomSkinName} to skin pack."); - } - - (button.Parent as ContextMenu).IsOpen = false; - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - } - - private void OpenLiveryJson_Click(object sender, RoutedEventArgs e) - { - try - { - if (sender.GetType() == typeof(Button)) - { - - Button button = (Button)sender; - - LiveryTreeCar liveryTreeCar = (LiveryTreeCar)button.CommandParameter; - - if (liveryTreeCar.CarsRoot.CustomSkinName == null || liveryTreeCar.CarsRoot.CustomSkinName.Length == 0) - { - goto closeMenu; - } - - FileInfo carsJsonFile = new FileInfo($"{liveryTreeCar.CarsFile}"); - Process.Start($"explorer", $"/select,{FileUtil.CarsPath}{carsJsonFile.Name}"); - - closeMenu: - (button.Parent as ContextMenu).IsOpen = false; - } - } - catch (Exception ex) { LogWriter.WriteToLog(ex); } - } - - private void OpenLiveryDirectory_Click(object sender, RoutedEventArgs e) - { - try - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - LiveryTreeCar liveryTreeCar = (LiveryTreeCar)button.CommandParameter; - - if (liveryTreeCar.CarsRoot.CustomSkinName == null || liveryTreeCar.CarsRoot.CustomSkinName.Length == 0) - { - goto closeMenu; - } - - DirectoryInfo directory = new DirectoryInfo($"{FileUtil.LiveriesPath}{liveryTreeCar.CarsRoot.CustomSkinName}"); - Process.Start(directory.FullName); - - closeMenu: - (button.Parent as ContextMenu).IsOpen = false; - } - } - catch (Exception ex) { LogWriter.WriteToLog(ex); } - } - - private ContextMenu GetTagContextMenu(TreeViewItem teamItem, LiveryTag tag) - { - ContextMenu menu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)) - }; - - Button addTeamToSkinPack = new Button() - { - Content = $"Add to Skin Pack", - CommandParameter = teamItem, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - addTeamToSkinPack.Click += AddTeamToSkinPack_Click; - menu.Items.Add(addTeamToSkinPack); - - Button deleteTagButton = new Button() - { - Content = $"Delete Tag", - CommandParameter = teamItem, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - ToolTip = "Warning! This permantely deletes this tag!", - VerticalAlignment = VerticalAlignment.Center, - }; - deleteTagButton.Click += (e, s) => - { - LiveryTagging.DeleteTag(tag); - menu.IsOpen = false; - }; - menu.Items.Add(deleteTagButton); - - return menu; - } - - private ContextMenu GetTeamContextMenu(TreeViewItem teamItem) - { - ContextMenu menu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)) - }; - - Button addTeamToSkinPack = new Button() - { - Content = $"Add to Skin Pack", - CommandParameter = teamItem, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - addTeamToSkinPack.Click += AddTeamToSkinPack_Click; - menu.Items.Add(addTeamToSkinPack); - - Button addTeamToTag = new Button() - { - Content = $"Add to Tag", - CommandParameter = teamItem, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - addTeamToTag.Click += AddTeamToTag_Click; - menu.Items.Add(addTeamToTag); - - return menu; - } - - private void AddTeamToTag_Click(object sender, RoutedEventArgs e) - { - try - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - TreeViewItem treeItem = (TreeViewItem)button.CommandParameter; - List treeCars = new List(); - - treeItem.Items.OfType().ToList().ForEach(x => - { - treeCars.Add((LiveryTreeCar)x.DataContext); - }); - - LiveryTagger.Instance.Open(treeCars); - - (button.Parent as ContextMenu).IsOpen = false; - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - } - - private void AddTeamToSkinPack_Click(object sender, RoutedEventArgs e) - { - try - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - TreeViewItem treeItem = (TreeViewItem)button.CommandParameter; - List treeCars = new List(); - - treeItem.Items.OfType().ToList().ForEach(x => - { - LiveryExporter.Instance.AddExportItem((LiveryTreeCar)x.DataContext); - }); - - (button.Parent as ContextMenu).IsOpen = false; - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - } - - private void CreateZipButton_Click(object sender, RoutedEventArgs e) - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - LiveryTreeCar liveryTreeCar = (LiveryTreeCar)button.CommandParameter; - - if (liveryTreeCar.CarsRoot.CustomSkinName == null || liveryTreeCar.CarsRoot.CustomSkinName.Length == 0) - { - goto closeMenu; - } - - Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); - - // Set filter for file extension and default file extension - dlg.DefaultExt = ".zip"; - dlg.AddExtension = true; - dlg.CheckPathExists = true; - dlg.FileName = $"{liveryTreeCar.CarsRoot.CustomSkinName}"; - dlg.DefaultExt = ".zip"; - dlg.Filter = "Livery zip|*.zip"; - Nullable result = dlg.ShowDialog(); - - - // Get the selected file name and display in a TextBox - if (result == true) - { - // Open document - string filename = dlg.FileName; - - if (filename == null) - goto closeMenu; - - using (ZipArchive zipArchive = ZipArchive.Create()) - { - string liveriesFolder = $"Liveries\\{liveryTreeCar.CarsRoot.CustomSkinName}\\"; - string carsFolder = "Cars\\"; - zipArchive.AddEntry($"{carsFolder}{liveryTreeCar.CarsFile.Name}", liveryTreeCar.CarsFile); - - DirectoryInfo customSkinDir = new DirectoryInfo(FileUtil.LiveriesPath + liveryTreeCar.CarsRoot.CustomSkinName); - if (customSkinDir.Exists) - { - - FileInfo decalsPng = new FileInfo(customSkinDir.FullName + "\\" + "decals.png"); - FileInfo decalsJson = new FileInfo(customSkinDir.FullName + "\\" + "decals.json"); - FileInfo sponsorsPng = new FileInfo(customSkinDir.FullName + "\\" + "sponsors.png"); - FileInfo sponsorsJson = new FileInfo(customSkinDir.FullName + "\\" + "sponsors.json"); - - if (decalsPng.Exists) - zipArchive.AddEntry($"{liveriesFolder}{decalsPng.Name}", decalsPng); - if (decalsJson.Exists) - zipArchive.AddEntry($"{liveriesFolder}{decalsJson.Name}", decalsJson); - if (sponsorsPng.Exists) - zipArchive.AddEntry($"{liveriesFolder}{sponsorsPng.Name}", sponsorsPng); - if (sponsorsJson.Exists) - zipArchive.AddEntry($"{liveriesFolder}{sponsorsJson.Name}", sponsorsJson); - - FileInfo decalsDds0 = new FileInfo(customSkinDir.FullName + "\\" + "decals_0.dds"); - //FileInfo decalsDds1 = new FileInfo(customSkinDir.FullName + "\\" + "decals_1.dds"); - FileInfo sponsorsDds0 = new FileInfo(customSkinDir.FullName + "\\" + "sponsors_0.dds"); - //FileInfo sponsorsDds1 = new FileInfo(customSkinDir.FullName + "\\" + "sponsors_1.dds"); - - if (decalsDds0.Exists) - zipArchive.AddEntry($"{liveriesFolder}{decalsDds0.Name}", decalsDds0); - //if (decalsDds1.Exists) - // zipArchive.AddEntry($"{liveriesFolder}{decalsDds1.Name}", decalsDds1); - if (sponsorsDds0.Exists) - zipArchive.AddEntry($"{liveriesFolder}{sponsorsDds0.Name}", sponsorsDds0); - //if (sponsorsDds1.Exists) - // zipArchive.AddEntry($"{liveriesFolder}{sponsorsDds1.Name}", sponsorsDds1); - - - using (FileStream outputStream = new FileStream(filename, FileMode.Create)) - { - zipArchive.SaveTo(outputStream); - MainWindow.Instance.snackbar.MessageQueue.Enqueue($"Livery \"{liveryTreeCar.CarsRoot.TeamName}\" saved as: {filename}"); - } - } - } - } - - closeMenu: - (button.Parent as ContextMenu).IsOpen = false; - } - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryDeleter.xaml b/Race_Element/Controls/Liveries/LiveryDeleter.xaml deleted file mode 100644 index c4586d2a7..000000000 --- a/Race_Element/Controls/Liveries/LiveryDeleter.xaml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Are you sure you want to delete this livery? - - - - - - - - diff --git a/Race_Element/Controls/Liveries/LiveryDeleter.xaml.cs b/Race_Element/Controls/Liveries/LiveryDeleter.xaml.cs deleted file mode 100644 index b40a0f983..000000000 --- a/Race_Element/Controls/Liveries/LiveryDeleter.xaml.cs +++ /dev/null @@ -1,87 +0,0 @@ -using RaceElement.Data; -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.IO; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for LiveryDeleter.xaml - /// - public partial class LiveryDeleter : UserControl - { - public static LiveryDeleter Instance { get; private set; } - private LiveryTreeCar ToBeDeleted; - - public LiveryDeleter() - { - InitializeComponent(); - - Instance = this; - - transitionDeleteDialog.Background = new SolidColorBrush(Color.FromArgb(140, 0, 0, 0)); - buttonDeleteSkinNo.Click += ButtonDeleteSkinNo_Click; - buttonDeleteSkinYes.Click += ButtonDeleteSkinYes_Click; - } - - private void ButtonDeleteSkinYes_Click(object sender, RoutedEventArgs e) - { - DeleteLivery(); - transitionDeleteDialog.Visibility = Visibility.Hidden; - - } - - private void DeleteLivery() - { - // delete json - // delete livery folder and contents - LiveryDisplayer.Instance.SetLivery(null); - GC.Collect(); - - try - { - DirectoryInfo customSkinDir = new DirectoryInfo(FileUtil.LiveriesPath + ToBeDeleted.CarsRoot.CustomSkinName); - if (customSkinDir.Exists) - customSkinDir.Delete(true); - - ToBeDeleted.CarsFile.Delete(); - - MainWindow.Instance.EnqueueSnackbarMessage($"Livery Deleted: {ToBeDeleted.CarsRoot.TeamName} / {ToBeDeleted.CarsRoot.CustomSkinName}"); - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - Debug.WriteLine(ex); - } - - LiveryBrowser.Instance.FetchAllCars(); - } - - private void ButtonDeleteSkinNo_Click(object sender, RoutedEventArgs e) - { - transitionDeleteDialog.Visibility = Visibility.Hidden; - } - - internal void Open(LiveryTreeCar liveryTreeCar) - { - LiveryExporter.Instance.Cancel(); - DDSgenerator.Instance.Cancel(); - LiveryDisplayer.Instance.SetLivery(liveryTreeCar); - - - ToBeDeleted = liveryTreeCar; - Instance.transitionDeleteDialog.Visibility = Visibility.Visible; - Instance.tbDeleteSkinText.Text = - $"Team: {ToBeDeleted.CarsRoot.TeamName}" + - $"\nSkin: {ToBeDeleted.CarsRoot.CustomSkinName}" + - $"\nCar: {ConversionFactory.GetCarName(ToBeDeleted.CarsRoot.CarModelType)}"; - - buttonDeleteSkinYes.Focus(); - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryDisplayer.xaml b/Race_Element/Controls/Liveries/LiveryDisplayer.xaml deleted file mode 100644 index 829a96e83..000000000 --- a/Race_Element/Controls/Liveries/LiveryDisplayer.xaml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/LiveryDisplayer.xaml.cs b/Race_Element/Controls/Liveries/LiveryDisplayer.xaml.cs deleted file mode 100644 index 9c0516fa4..000000000 --- a/Race_Element/Controls/Liveries/LiveryDisplayer.xaml.cs +++ /dev/null @@ -1,478 +0,0 @@ -using RaceElement.Controls.Liveries; -using RaceElement.Data; -using RaceElement.LiveryParser; -using RaceElement.Util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Threading; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for LiveryDisplayer.xaml - /// - public partial class LiveryDisplayer : UserControl - { - internal static LiveryDisplayer Instance; - - private LiveryTreeCar Livery { get; set; } - private bool _isLoading = false; - - public LiveryDisplayer() - { - InitializeComponent(); - - buttonGenerateDDS.Click += ButtonGenerateDDS_Click; - - Instance = this; - - this.IsVisibleChanged += (s, e) => - { - if (!(bool)e.NewValue) - { - Cache(); - } - }; - } - - private void ButtonGenerateDDS_Click(object sender, RoutedEventArgs e) - { - MainWindow.Instance.EnqueueSnackbarMessage($"Generating DDS files... this may take a while..."); - ThreadPool.QueueUserWorkItem((WaitCallback)(x => - { - Instance.Dispatcher.BeginInvoke(new Action(() => - { - buttonGenerateDDS.IsEnabled = false; - buttonGenerateDDS.Content = "Generating dds files... this may take a while"; - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = false; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = false; - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = false; - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = false; - })); - - DDSutil.GenerateDDS(Livery); - - Instance.Dispatcher.BeginInvoke(new Action(() => - { - buttonGenerateDDS.Visibility = Visibility.Hidden; - buttonGenerateDDS.IsEnabled = true; - buttonGenerateDDS.Content = "Generate DDS Files"; - - SetLivery(Livery); - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = true; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = true; - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = true; - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = true; - })); - MainWindow.Instance.EnqueueSnackbarMessage($"DDS generating completed."); - })); - } - - public void ReloadLivery() - { - if (!_isLoading) - { - SetLivery(this.Livery); - this.Visibility = Visibility.Visible; - } - } - - public void Cache() - { - foreach (var control in imageGrid.Children) - { - if (control is System.Windows.Controls.Image) - { - System.Windows.Controls.Image imageControl = (System.Windows.Controls.Image)control; - BitmapImage image = (BitmapImage)imageControl.Source; - if (image != null && image.StreamSource != null) - { - image.StreamSource.Close(); - image.StreamSource.Dispose(); - } - imageControl.Source = null; - imageControl = null; - } - } - imageGrid.Children.Clear(); - imageGrid.UpdateLayout(); - - stackPanelLiveryInfo.Children.Clear(); - stackPanelMainInfo.Children.Clear(); - skinMainInfo.Visibility = Visibility.Hidden; - buttonGenerateDDS.Visibility = Visibility.Hidden; - - this.Visibility = Visibility.Collapsed; - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, false, true); - } - - internal void SetLivery(LiveryTreeCar livery) - { - _isLoading = true; - - imageGrid.Children.Clear(); - stackPanelLiveryInfo.Children.Clear(); - stackPanelMainInfo.Children.Clear(); - skinMainInfo.Visibility = Visibility.Hidden; - buttonGenerateDDS.Visibility = Visibility.Hidden; - - if (livery == null) - return; - - Livery = livery; - Livery.CarsRoot = LiveryImporter.GetLivery(livery.CarsFile); - buttonGenerateDDS.Visibility = DDSutil.HasDdsFiles(Livery) ? Visibility.Hidden : Visibility.Visible; - - ThreadPool.QueueUserWorkItem(x => - { - Instance.Dispatcher.BeginInvoke(new Action(() => - { - CarsJson.Root carsRoot = Livery.CarsRoot; - string customSkinName = carsRoot.CustomSkinName; - - if (customSkinName != null && customSkinName.Length > 0) - { - skinMainInfo.Visibility = Visibility.Visible; - - if (carsRoot.TeamName != String.Empty) - stackPanelMainInfo.Children.Add(GetInfoLabel($"{carsRoot.TeamName}", HorizontalAlignment.Center, 25, "Team Name")); - stackPanelMainInfo.Children.Add(GetInfoLabel($"{carsRoot.CustomSkinName}", HorizontalAlignment.Center, 19, "Skin Name")); - stackPanelMainInfo.Children.Add(GetInfoLabel($"{ConversionFactory.GetCarName(carsRoot.CarModelType)}", HorizontalAlignment.Center, 16, "Car model type")); - if (carsRoot.CompetitorName != String.Empty) - stackPanelMainInfo.Children.Add(GetInfoLabel($"{carsRoot.CompetitorName}", HorizontalAlignment.Center, 16, "Competitor Name")); - - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Display Name: {carsRoot.DisplayName}")); - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Race Number: {carsRoot.RaceNumber}")); - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Nationality: {GetNationality(carsRoot.Nationality)}")); - - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"")); - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Body Base Layer: {GetBodyMaterialType(carsRoot.SkinMaterialType1)}")); - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Body Accent: {GetBodyMaterialType(carsRoot.SkinMaterialType2)}")); - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Body Trim: {GetBodyMaterialType(carsRoot.SkinMaterialType3)}")); - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Rim Base: {GetRimMaterialType(carsRoot.RimMaterialType1)}")); - stackPanelLiveryInfo.Children.Add(GetInfoLabel($"Rim Accent: {GetRimMaterialType(carsRoot.RimMaterialType2)}")); - - DirectoryInfo customSkinDir = new DirectoryInfo(FileUtil.LiveriesPath + customSkinName); - if (customSkinDir.Exists) - { - imageGrid.Children.Clear(); - - FileInfo[] decalFiles = customSkinDir.GetFiles("decals.png"); - if (decalFiles != null && decalFiles.Length > 0) - { - FileInfo decalsFile = decalFiles[0]; - System.Windows.Controls.Image imageControl = new System.Windows.Controls.Image() - { - Stretch = Stretch.Fill, - Height = 366, - Width = 366, - }; - imageGrid.Children.Add(imageControl); - LoadPhoto(imageControl, decalsFile.FullName); - - ThreadPool.QueueUserWorkItem(gc => - { - Thread.Sleep(1 * 1000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); - }); - } - - - // // WIll never display dds files as generating them takes way too fucking long - //FileInfo[] decalDDSFiles = customSkinDir.GetFiles("decals_0.dds"); - //if (decalDDSFiles != null && decalDDSFiles.Length > 0) - //{ - - // // https://stackoverflow.com/questions/23618171/load-dds-file-from-stream-and-display-in-wpf-application - - // // https://stackoverflow.com/questions/1118496/using-image-control-in-wpf-to-display-system-drawing-bitmap/1118557#1118557 - // // https://code.google.com/archive/p/kprojects/downloads - // // https://github.com/ptrsuder/ddsfiletype-plus-hack - - // FileInfo decalsFile = decalDDSFiles[0]; - - // Surface surface = DdsFile.Load(decalsFile.FullName); - - // System.Drawing.Bitmap bmp = surface.CreateAliasedBitmap(); - // MemoryStream ms = new MemoryStream(); - // bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); - // ms.Position = 0; - // BitmapImage bi = new BitmapImage(); - // bi.BeginInit(); - // bi.StreamSource = ms; - // bi.EndInit(); - // decalsImage.Source = bi; - //} - - - FileInfo[] sponsorFiles = customSkinDir.GetFiles("sponsors.png"); - if (sponsorFiles != null && sponsorFiles.Length > 0) - { - FileInfo sponsorsFile = sponsorFiles[0]; - System.Windows.Controls.Image imageControl = new System.Windows.Controls.Image() { Stretch = Stretch.UniformToFill, Height = 366, Width = 366 }; - imageGrid.Children.Add(imageControl); - LoadPhoto(imageControl, sponsorsFile.FullName); - ThreadPool.QueueUserWorkItem(gc => - { - Thread.Sleep(2 * 1000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, false, true); - }); - } - - - // // Displaying dds files takes way too fucking long.. - //FileInfo[] sponsorDddsFiles = customSkinDir.GetFiles("sponsors_0.dds"); - //if (sponsorDddsFiles != null && sponsorDddsFiles.Length > 0) - //{ - - // // https://stackoverflow.com/questions/23618171/load-dds-file-from-stream-and-display-in-wpf-application - - // // https://stackoverflow.com/questions/1118496/using-image-control-in-wpf-to-display-system-drawing-bitmap/1118557#1118557 - // // https://code.google.com/archive/p/kprojects/downloads - // // https://github.com/ptrsuder/ddsfiletype-plus-hack - - // FileInfo sponsorsFile = sponsorDddsFiles[0]; - - // Surface surface = DdsFile.Load(sponsorsFile.FullName); - - - // System.Drawing.Bitmap bmp = surface.CreateAliasedBitmap(); - // MemoryStream ms = new MemoryStream(); - // bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); - // ms.Position = 0; - // BitmapImage bi = new BitmapImage(); - // bi.BeginInit(); - // bi.StreamSource = ms; - // bi.EndInit(); - // sponsorsImage.Source = bi; - - - - // //ThreadPool.QueueUserWorkItem(y => - // //{ - // // FileInfo test = new FileInfo(sponsorsFile.FullName.Replace("_0", "_9779")); - // // if (test.Exists) - // // test.Delete(); - - - // // FileStream write = test.OpenWrite(); - // // DdsFile.Save(write, DdsFileFormat.BC7Srgb, DdsErrorMetric.Perceptual, BC7CompressionMode.Slow, true, true, ResamplingAlgorithm.Bilinear, surface, this.ProgressChanged); - // // //new BitmapImage(new Uri(sponsorsFile.FullName, UriKind.Absolute), new RequestCachePolicy(RequestCacheLevel.CacheIfAvailable)); - // // write.Close(); - - // // GC.Collect(); - // //}); - //} - - - - - UpdateImageSize(); - this.Visibility = Visibility.Visible; - _isLoading = false; - } - } - })); - }); - } - - private void LoadPhoto(System.Windows.Controls.Image imageControl, string path) - { - ThreadPool.QueueUserWorkItem(x => - { - BitmapImage bmi = new BitmapImage(); - using (var stream = new FileStream(path, FileMode.Open)) - { - bmi.BeginInit(); - bmi.CacheOption = BitmapCacheOption.OnLoad; - bmi.StreamSource = stream; - bmi.EndInit(); - - bmi.Freeze(); - stream.Close(); - stream.Dispose(); - } - - Dispatcher.BeginInvoke(new Action(() => - { - imageControl.Source = bmi; - })); - - }); - } - - private Label GetInfoLabel(string text, HorizontalAlignment allignmment = HorizontalAlignment.Left, int size = 13, string toolTip = "") - { - Label label = new Label() - { - Content = text, - Style = Resources["MaterialDesignLabel"] as Style, - FontSize = size, - HorizontalAlignment = allignmment - }; - if (toolTip != string.Empty) - { - label.ToolTip = toolTip; - } - return label; - } - - private static Dictionary Nationalities = new Dictionary() - { - {0,"Other" }, - {49,"Andorra" }, - {14,"Argentina" }, - {28,"Armenia" }, - {41,"Australia" }, - {9,"Austria" }, - {50,"Azerbaijan" }, - {79,"Bahrain" }, - {7,"Belgium" }, - {17,"Brazil" }, - {51,"Bulgaria" }, - {34,"Canada" }, - {82,"Chile" }, - {35,"China" }, - {81,"Chinese Taipei" }, - {47,"Colombia" }, - {33,"Croatia" }, - {52,"Cuba" }, - {53,"Czech Republic" }, - {32,"Denmark" }, - {86,"England" }, - {54,"Estonia" }, - {31,"Finland" }, - {3,"France" }, - {55,"Georgia" }, - {2,"Germany" }, - {5,"Great Britain" }, - {22,"Greece" }, - {46,"Hong Kong (S.A.R. of China)" }, - {6,"Hungary" }, - {56,"India" }, - {38,"Indonesia" }, - {78,"Iran" }, - {16,"Ireland" }, - {57,"Israel" }, - {1,"Italy" }, - {58,"Jamaica" }, - {48,"Japan" }, - {45,"Kuwait" }, - {59,"Latvia" }, - {27,"Lebanon" }, - {60,"Lithuania" }, - {44,"Luxembourg" }, - {61,"Macao (S.A.R. of China)" }, - {84,"Madagascar" }, - {62,"Malaysia" }, - {85,"Malta" }, - {29,"Mexico" }, - {15,"Monaco" }, - {63,"Nepal" }, - {12,"Netherlands" }, - {64,"New Caledonia" }, - {40,"New Zealand" }, - {65,"Nigeria" }, - {66,"Northern Ireland" }, - {24,"Norway" }, - {21,"Oman" }, - {67,"Papua New Guinea" }, - {68,"Phillipines" }, - {13,"Poland" }, - {36,"Portugal" }, - {19,"Puerto Rico" }, - {69,"Qatar" }, - {70,"Romania" }, - {10,"Russia" }, - {42,"San Marino" }, - {23,"Saudi Arabia" }, - {71,"Scotland" }, - {72,"Serbia" }, - {37,"Singapore" }, - {20,"Slovakia" }, - {73,"Slovenia" }, - {18,"South Africa" }, - {26,"South Korea" }, - {4,"Spain" }, - {30,"Sweden" }, - {8,"Switzerland" }, - {74,"Taiwan (China)" }, - {11,"Thailand" }, - {25,"Turkey" }, - {75,"Ukraine" }, - {43,"United Arab Emirates" }, - {83,"Uruguay" }, - {39,"USA" }, - {76,"Venezuela" }, - {77,"Wales" }, - {80,"Zimbabwe" }, - }; - private string GetNationality(int jsonValue) - { - - string nationality = "Other"; - try { nationality = Nationalities[jsonValue]; } catch (Exception) { } - return nationality; - } - - - private static Dictionary RimMaterialTypes = new Dictionary() - { - {1,"Glossy" }, - {2,"Matte" }, - {3,"Satin Metallic" }, - {4,"Metallic" }, - {5,"Chrome" } - }; - private string GetRimMaterialType(int jsonValue) - { - string MaterialType = "Other"; - try { MaterialType = RimMaterialTypes[jsonValue]; } catch (Exception e) { Debug.WriteLine(e); } - return MaterialType; - } - - private static Dictionary BodyMaterialTypes = new Dictionary() - { - {0,"Glossy" }, - {1,"Matte" }, - {2,"Satin" }, - {3,"Satin Metallic" }, - {4,"Metallic" }, - {5,"Chrome" } , - {6,"Clear Chrome" } - }; - private string GetBodyMaterialType(int jsonValue) - { - string MaterialType = "Other"; - try { MaterialType = BodyMaterialTypes[jsonValue]; } catch (Exception e) { Debug.WriteLine(e); } - return MaterialType; - } - - private void StackPanelDecals_SizeChanged(object sender, SizeChangedEventArgs e) - { - UpdateImageSize(); - } - - private void UpdateImageSize() - { - double lowestSize = imageGrid.ActualWidth; - if (imageGrid.ActualHeight < lowestSize) - { - lowestSize = imageGrid.ActualHeight; - } - - foreach (System.Windows.Controls.Image imageControl in imageGrid.Children) - { - imageControl.Width = lowestSize; - imageControl.Height = lowestSize; - } - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryExporter.xaml b/Race_Element/Controls/Liveries/LiveryExporter.xaml deleted file mode 100644 index 60d2dbb98..000000000 --- a/Race_Element/Controls/Liveries/LiveryExporter.xaml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Export Skin Pack - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/LiveryExporter.xaml.cs b/Race_Element/Controls/Liveries/LiveryExporter.xaml.cs deleted file mode 100644 index b8b96d36f..000000000 --- a/Race_Element/Controls/Liveries/LiveryExporter.xaml.cs +++ /dev/null @@ -1,237 +0,0 @@ -using RaceElement.Util; -using SharpCompress.Archives; -using SharpCompress.Archives.Zip; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Threading; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for LiveryExporter.xaml - /// - public partial class LiveryExporter : UserControl - { - public static LiveryExporter Instance { get; private set; } - - private List exportItems = new List(); - - public LiveryExporter() - { - InitializeComponent(); - Instance = this; - - this.Visibility = Visibility.Hidden; - - buttonExport.Click += ButtonExport_Click; - stackPanelToggleExportDDS.MouseUp += (s, e) => toggleExportDDS.IsChecked = !toggleExportDDS.IsChecked; - } - - private void ButtonExport_Click(object sender, RoutedEventArgs e) - { - try - { - bool shouldExportDDS = toggleExportDDS.IsChecked.Value; - - ThreadPool.QueueUserWorkItem((WaitCallback)(x => - { - Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); - - // Set filter for file extension and default file extension - dlg.DefaultExt = ".zip"; - dlg.AddExtension = true; - dlg.CheckPathExists = true; - dlg.FileName = $"Rename_Me.zip"; - dlg.DefaultExt = ".zip"; - dlg.Filter = "Livery zip|*.zip"; - bool? result = dlg.ShowDialog(); - - - // Get the selected file name and display in a TextBox - if (result == true) - { - // Open document - string filename = dlg.FileName; - - if (filename == null) - { - MainWindow.Instance.EnqueueSnackbarMessage("Please enter a file name"); - return; - } - else - { - Instance.Dispatcher.Invoke(new Action(() => - { - this.IsEnabled = false; - buttonExport.Content = "Exporting archive... please wait."; - MainWindow.Instance.EnqueueSnackbarMessage("Archiving selected skins..."); - })); - } - - using (ZipArchive zipArchive = ZipArchive.Create()) - { - foreach (LiveryTreeCar liveryTreeCar in exportItems) - { - string liveriesFolder = $"Liveries\\{liveryTreeCar.CarsRoot.CustomSkinName}\\"; - string carsFolder = "Cars\\"; - zipArchive.AddEntry($"{carsFolder}{liveryTreeCar.CarsFile.Name}", liveryTreeCar.CarsFile); - - DirectoryInfo customSkinDir = new DirectoryInfo(FileUtil.LiveriesPath + liveryTreeCar.CarsRoot.CustomSkinName); - if (customSkinDir.Exists) - { - - FileInfo decalsPng = new FileInfo(customSkinDir.FullName + "\\" + "decals.png"); - FileInfo decalsJson = new FileInfo(customSkinDir.FullName + "\\" + "decals.json"); - FileInfo sponsorsPng = new FileInfo(customSkinDir.FullName + "\\" + "sponsors.png"); - FileInfo sponsorsJson = new FileInfo(customSkinDir.FullName + "\\" + "sponsors.json"); ; - - if (decalsPng.Exists) - zipArchive.AddEntry($"{liveriesFolder}{decalsPng.Name}", decalsPng); - if (decalsJson.Exists) - zipArchive.AddEntry($"{liveriesFolder}{decalsJson.Name}", decalsJson); - if (sponsorsPng.Exists) - zipArchive.AddEntry($"{liveriesFolder}{sponsorsPng.Name}", sponsorsPng); - if (sponsorsJson.Exists) - zipArchive.AddEntry($"{liveriesFolder}{sponsorsJson.Name}", sponsorsJson); - - - if (shouldExportDDS) - { - //FileInfo decalsDds0 = new FileInfo(customSkinDir.FullName + "\\" + "decals_0.dds"); - FileInfo decalsDds1 = new FileInfo(customSkinDir.FullName + "\\" + "decals_1.dds"); - //FileInfo sponsorsDds0 = new FileInfo(customSkinDir.FullName + "\\" + "sponsors_0.dds"); - FileInfo sponsorsDds1 = new FileInfo(customSkinDir.FullName + "\\" + "sponsors_1.dds"); - - //if (decalsDds0.Exists) - // zipArchive.AddEntry($"{liveriesFolder}{decalsDds0.Name}", decalsDds0); - if (decalsDds1.Exists) - zipArchive.AddEntry($"{liveriesFolder}{decalsDds1.Name}", decalsDds1); - //if (sponsorsDds0.Exists) - // zipArchive.AddEntry($"{liveriesFolder}{sponsorsDds0.Name}", sponsorsDds0); - if (sponsorsDds1.Exists) - zipArchive.AddEntry($"{liveriesFolder}{sponsorsDds1.Name}", sponsorsDds1); - } - } - } - - using (FileStream outputStream = new FileStream(filename, FileMode.Create)) - { - zipArchive.SaveTo(outputStream); - outputStream.Close(); - } - - Instance.Dispatcher.Invoke(() => - { - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage($"Skin pack saved as: {filename}", "Open in explorer", () => - { - Process.Start($"explorer", $"/select,{filename}"); - }); - - exportItems.Clear(); - RebuildListView(); - this.IsEnabled = true; - buttonExport.Content = "Export as zip"; - }); - } - } - })); - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - finally - { - - } - } - - internal bool AddExportItem(LiveryTreeCar skin) - { - - if (!this.IsEnabled) - { - MainWindow.Instance.EnqueueSnackbarMessage($"Already exporting a skin pack, wait for it to complete archiving!"); - return false; - } - - if (exportItems.Contains(skin)) - { - MainWindow.Instance.EnqueueSnackbarMessage($"Skin pack already contains {skin.CarsRoot.TeamName}/{skin.CarsRoot.CustomSkinName}."); - return false; - } - - exportItems.Add(skin); - - RebuildListView(); - - return true; - } - - private void RebuildListView() - { - try - { - exportItems.Sort((a, b) => - { - return $"{a.CarsRoot.TeamName}{a.CarsRoot.CustomSkinName}".CompareTo($"{b.CarsRoot.TeamName}{b.CarsRoot.CustomSkinName}"); - }); - - exportList.Items.Clear(); - exportItems.ForEach(x => - { - ListBoxItem listBoxItem = new ListBoxItem() - { - AllowDrop = true, - Content = $"{x.CarsRoot.TeamName} / {x.CarsRoot.CustomSkinName}", - DataContext = x, - ToolTip = "Click to remove from skin pack" - }; - listBoxItem.MouseLeftButtonUp += ListBoxItem_MouseLeftButtonUp; - exportList.Items.Add(listBoxItem); - }); - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - } - - UpdateVisibility(); - } - - private void UpdateVisibility() - { - this.Visibility = exportItems.Count > 0 ? Visibility.Visible : Visibility.Hidden; - } - - public void Cancel() - { - exportItems.Clear(); - UpdateVisibility(); - } - - private void ListBoxItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) - { - - if (sender is ListBoxItem listBoxItem) - { - exportList.Items.Remove(listBoxItem); - - if (listBoxItem.DataContext is LiveryTreeCar car) - { - exportItems.Remove(car); - } - - UpdateVisibility(); - } - - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryImporter.cs b/Race_Element/Controls/Liveries/LiveryImporter.cs deleted file mode 100644 index 8e8362710..000000000 --- a/Race_Element/Controls/Liveries/LiveryImporter.cs +++ /dev/null @@ -1,355 +0,0 @@ -using RaceElement.LiveryParser; -using RaceElement.Util; -using Newtonsoft.Json; -using SharpCompress.Archives; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - internal static class LiveryImporter - { - - private static int liveryCount = 0; - private static List ImportedLiveries = new List(); - - public static void ImportLiveryZips(FileInfo file = null) - { - liveryCount = 0; - ImportedLiveries.Clear(); - - - try - { - LiveryBrowser.Instance.Dispatcher.BeginInvoke(new Action(() => - { - MainWindow.Instance.tabLiveries.Focus(); - - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = false; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = false; - LiveryBrowser.Instance.liveriesTreeViewTags.IsEnabled = false; - - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = false; - LiveryBrowser.Instance.buttonImportLiveries.Content = "Importing... please wait"; - - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = false; - LiveryDisplayer.Instance.IsEnabled = false; - })); - - Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); - if (file == null) - { - // Set filter for file extension and default file extension - dlg.AddExtension = true; - dlg.CheckPathExists = true; - dlg.Filter = "Livery archive|*.zip;*.rar;*.7z"; - dlg.Multiselect = true; - Nullable result = dlg.ShowDialog(); - - if (result == true) - { - string[] fileNames = dlg.FileNames; - if (fileNames != null && fileNames.Length > 0) - { - for (int i = 0; i < fileNames.Length; i++) - { - FileInfo fi = new FileInfo(fileNames[i]); - if (fi.Exists) - { - FileStream fs = fi.OpenRead(); - if (fs != null) - ImportArchive(fi); - - fs.Close(); - } - } - } - } - else - { - goto enableUI; - } - } - else - { - ImportArchive(file); - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - LogWriter.WriteToLog(ex); - } - - if (liveryCount > 0) - { - MainWindow.Instance.EnqueueSnackbarMessage($"Imported {liveryCount} liveries."); - LiveryBrowser.Instance.Dispatcher.BeginInvoke(new Action(() => - { - Debug.WriteLine("opening AfterImport."); - AfterImport.Instance.Open(ImportedLiveries); - })); - } - else - MainWindow.Instance.EnqueueSnackbarMessage($"The archive(s) you choose are not supported. Manually import them."); - - - enableUI: - LiveryBrowser.Instance.FetchAllCars(); - LiveryBrowser.Instance.Dispatcher.BeginInvoke(new Action(() => - { - LiveryBrowser.Instance.liveriesTreeViewTeams.IsEnabled = true; - LiveryBrowser.Instance.liveriesTreeViewCars.IsEnabled = true; - LiveryBrowser.Instance.liveriesTreeViewTags.IsEnabled = true; - - LiveryBrowser.Instance.buttonImportLiveries.IsEnabled = true; - LiveryBrowser.Instance.buttonImportLiveries.Content = "Import Liveries"; - - LiveryBrowser.Instance.buttonGenerateAllDDS.IsEnabled = true; - LiveryDisplayer.Instance.IsEnabled = true; - })); - } - - public static void ImportArchive(FileInfo fi) - { - - - IArchive archive = null; - - switch (fi.Extension) - { - case ".7z": - case ".zip": - case ".rar": archive = ArchiveFactory.Open(fi.FullName, new SharpCompress.Readers.ReaderOptions() { LeaveStreamOpen = false }); break; - default: - { - return; - } - } - - List archiveEntries = archive.Entries.ToList(); - List availableSkins = archiveEntries.FindAll((x) => - { - Stream entryStream = x.OpenEntryStream(); - CarsJson.Root carRoot = GetLivery(entryStream); - entryStream.Close(); - return carRoot != null && carRoot.CustomSkinName != null && !carRoot.CustomSkinName.Equals(string.Empty); - }); - - // check importing strategy - if (availableSkins.Count > 0) - { - List carsFolders = archiveEntries.FindAll((x) => - { - return x.Key.ToLower().EndsWith("cars/") || x.Key.ToLower().EndsWith("cars\\"); - }); - - if (availableSkins.Count == 1) - { - Debug.WriteLine("WTF???? noob export, going to try the botched import strategy."); - ImportStrategies.BotchedImportStrategy(archiveEntries); - } - else - { - Debug.WriteLine("Multiple liveries detected within 1 archive, using default import strategy."); - ImportStrategies.DefaultImportStrategy(archiveEntries); - } - } - - archive.Dispose(); - } - - private static class ImportStrategies - { - public static void BotchedImportStrategy(List archiveEntries) - { - archiveEntries.ForEach(x => - { - //Debug.WriteLine(x.Key); - if (!x.Key.StartsWith("__MACOSX")) - { - CarsJson.Root carRoot = GetLivery(x.OpenEntryStream()); - if (carRoot != null && carRoot.CustomSkinName != null && carRoot.CustomSkinName != string.Empty) - { - Debug.WriteLine($"Found livery {carRoot.TeamName} / {carRoot.CustomSkinName}"); - - string carsJsonFileName = $"{FileUtil.CarsPath}{FileUtil.GetFileName(x.Key)}"; - - string[] validSkinFiles = new string[] { "sponsors.json", "sponsors.png", "decals.json", "decals.png", ".dds" }; - - List skinFiles = archiveEntries.FindAll(s => - { - foreach (string validSkinFile in validSkinFiles) - { - if (s.Key.ToLower().EndsWith(validSkinFile) && !FileUtil.GetFileName(s.Key).StartsWith(".") && !s.Key.Contains("__MACOSX")) - { - return true; - } - } - - return false; - - }); - - if (skinFiles.Count == 0) - { - skinFiles = archiveEntries.FindAll(s => s.Key.Contains($"\\{carRoot.CustomSkinName}\\")); - } - if (skinFiles.Count == 0) - { - skinFiles = archiveEntries.FindAll(s => s.Key.Contains($"\\\\{carRoot.CustomSkinName}\\\\")); - } - - - if (skinFiles.Count > 0) - { - x.WriteToFile(carsJsonFileName); - - foreach (IArchiveEntry skinFile in skinFiles) - { - for (int s = 0; s < validSkinFiles.Length; s++) - { - if (skinFile.Key.ToLower().EndsWith(validSkinFiles[s])) - { - string liveryFolder = $"{FileUtil.LiveriesPath}{carRoot.CustomSkinName}\\"; - Directory.CreateDirectory(liveryFolder); - - string skinFileName = $"{liveryFolder}{FileUtil.GetFileName(skinFile.Key)}"; - skinFile.WriteToFile(skinFileName); - Debug.WriteLine($"Imported livery file: {skinFileName}"); - - - } - } - - } - LiveryTreeCar ltc = new LiveryTreeCar() { CarsFile = new FileInfo(carsJsonFileName), CarsRoot = carRoot }; - if (!ImportedLiveries.Contains(ltc)) - { - ImportedLiveries.Add(ltc); - liveryCount++; - } - //MainWindow.Instance.EnqueueSnackbarMessage($"Imported {carRoot.teamName} / {carRoot.customSkinName}"); - } - } - }; - }); - } - - public static void DefaultImportStrategy(List archiveEntries) - { - archiveEntries.ForEach(x => - { - //Debug.WriteLine(x.Key); - if (!x.Key.StartsWith("__MACOSX") && (x.Key.ToLower().Contains("cars/") || x.Key.ToLower().Contains("cars\\"))) - { - Stream entryStream = x.OpenEntryStream(); - CarsJson.Root carRoot = GetLivery(entryStream); - entryStream.Close(); - if (carRoot != null && carRoot.CustomSkinName != null && carRoot.CustomSkinName != string.Empty) - { - Debug.WriteLine($"Found livery {carRoot.TeamName} / {carRoot.CustomSkinName}"); - - string carsJsonFileName = $"{FileUtil.CarsPath}{FileUtil.GetFileName(x.Key)}"; - - - List skinFiles = archiveEntries.FindAll(s => - { - return s.Key.Contains($"/{carRoot.CustomSkinName}/") && !FileUtil.GetFileName(s.Key).StartsWith(".") && !s.Key.Contains("__MACOSX"); - }); - - if (skinFiles.Count == 0) - { - skinFiles = archiveEntries.FindAll(s => s.Key.Contains($"\\{carRoot.CustomSkinName}\\")); - } - if (skinFiles.Count == 0) - { - skinFiles = archiveEntries.FindAll(s => s.Key.Contains($"\\\\{carRoot.CustomSkinName}\\\\")); - } - - if (skinFiles.Count > 0) - { - x.WriteToFile(carsJsonFileName); - - string[] validSkinFiles = new string[] { "sponsors.json", "sponsors.png", "decals.json", "decals.png", ".dds" }; - foreach (IArchiveEntry skinFile in skinFiles) - { - for (int s = 0; s < validSkinFiles.Length; s++) - { - if (skinFile.Key.ToLower().EndsWith(validSkinFiles[s])) - { - string liveryFolder = $"{FileUtil.LiveriesPath}{carRoot.CustomSkinName}\\"; - Directory.CreateDirectory(liveryFolder); - - string skinFileName = $"{liveryFolder}{FileUtil.GetFileName(skinFile.Key)}"; - skinFile.WriteToFile(skinFileName); - Debug.WriteLine($"Imported livery file: {skinFileName}"); - - } - } - - } - LiveryTreeCar ltc = new LiveryTreeCar() { CarsFile = new FileInfo(carsJsonFileName), CarsRoot = carRoot }; - if (!ImportedLiveries.Contains(ltc)) - { - ImportedLiveries.Add(ltc); - liveryCount++; - } - //MainWindow.Instance.EnqueueSnackbarMessage($"Imported {carRoot.teamName} / {carRoot.customSkinName}"); - } - } - }; - }); - } - } - - - public static CarsJson.Root GetLivery(FileInfo file) - { - if (!file.Exists) - return null; - - try - { - using (FileStream fileStream = file.OpenRead()) - { - return GetLivery(fileStream); - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - //LogWriter.WriteToLog(ex); - } - return null; - } - - public static CarsJson.Root GetLivery(Stream stream) - { - string jsonString = string.Empty; - try - { - using (StreamReader reader = new StreamReader(stream)) - { - jsonString = reader.ReadToEnd(); - jsonString = jsonString.Replace("\0", ""); - reader.Close(); - stream.Close(); - } - - return JsonConvert.DeserializeObject(jsonString); - } - catch (Exception e) - { - //LogWriter.WriteToLog(e); - Debug.WriteLine(e); - } - - return null; - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryTagCreator.xaml b/Race_Element/Controls/Liveries/LiveryTagCreator.xaml deleted file mode 100644 index 34639a8b1..000000000 --- a/Race_Element/Controls/Liveries/LiveryTagCreator.xaml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Add new Tag - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/LiveryTagCreator.xaml.cs b/Race_Element/Controls/Liveries/LiveryTagCreator.xaml.cs deleted file mode 100644 index b46824a06..000000000 --- a/Race_Element/Controls/Liveries/LiveryTagCreator.xaml.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using static RaceElement.Controls.LiveryTagging; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for LiveryTagCreator.xaml - /// - public partial class LiveryTagCreator : UserControl - { - public static LiveryTagCreator Instance { get; private set; } - - public LiveryTagCreator() - { - InitializeComponent(); - - this.Visibility = Visibility.Hidden; - - buttonCreate.Click += ButtonCreate_Click; - buttonCancel.Click += ButtonCancel_Click; - textBoxNewTagName.PreviewTextInput += TextBoxNewTagName_PreviewTextInput; - - Instance = this; - } - - private void TextBoxNewTagName_PreviewTextInput(object sender, TextCompositionEventArgs e) - { - string originalText = ((TextBox)e.OriginalSource).Text; - - char[] illegalCharacters = System.IO.Path.GetInvalidFileNameChars(); - foreach (char illegalChar in illegalCharacters) - { - if (e.Text.Contains(illegalChar)) - { - textBoxNewTagName.Text = originalText; - e.Handled = true; - break; - } - } - } - - public void Open() - { - textBoxNewTagName.Text = String.Empty; - this.Visibility = Visibility.Visible; - textBoxNewTagName.Focus(); - } - - private void ButtonCreate_Click(object sender, RoutedEventArgs e) - { - string newTagName = textBoxNewTagName.Text.Trim(); - if (newTagName.Length == 0) - { - MainWindow.Instance.EnqueueSnackbarMessage("Please enter a name for your tag."); - return; - } - - if (newTagName.Equals("No Tags")) - { - MainWindow.Instance.EnqueueSnackbarMessage("This name is reserved."); - return; - } - - List allTags = LiveryTagging.GetAllTags(); - - foreach (LiveryTag tag in allTags) - { - if (tag.Name.Equals(newTagName)) - { - MainWindow.Instance.EnqueueSnackbarMessage("Tag already exists."); - return; - } - } - - LiveryTagging.CreateNewTag(newTagName); - this.Visibility = Visibility.Hidden; - - LiveryBrowser.Instance.FetchAllCars(); - - } - - private void ButtonCancel_Click(object sender, RoutedEventArgs e) - { - this.Visibility = Visibility.Hidden; - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryTagger.xaml b/Race_Element/Controls/Liveries/LiveryTagger.xaml deleted file mode 100644 index 5da3c342f..000000000 --- a/Race_Element/Controls/Liveries/LiveryTagger.xaml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Add tag - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Liveries/LiveryTagger.xaml.cs b/Race_Element/Controls/Liveries/LiveryTagger.xaml.cs deleted file mode 100644 index 1306f0c4e..000000000 --- a/Race_Element/Controls/Liveries/LiveryTagger.xaml.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System.Collections.Generic; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using static RaceElement.Controls.LiveryBrowser; -using static RaceElement.Controls.LiveryTagging; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for LiveryTagger.xaml - /// - public partial class LiveryTagger : UserControl - { - public static LiveryTagger Instance { get; private set; } - - internal List Cars = new List(); - - public LiveryTagger() - { - InitializeComponent(); - - buttonAdd.Click += ButtonAdd_Click; - buttonCancel.Click += ButtonCancel_Click; - - tagList.SelectionChanged += TagList_SelectionChanged; - - Visibility = Visibility.Hidden; - Instance = this; - } - - private void TagList_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - foreach (var item in tagList.Items) - { - var listBoxItem = (item as ListBoxItem); - listBoxItem.Background = Brushes.Transparent; - } - - foreach (var item in tagList.SelectedItems) - { - var listBoxItem = (item as ListBoxItem); - listBoxItem.Background = Brushes.OrangeRed; - } - } - - private void ButtonCancel_Click(object sender, RoutedEventArgs e) - { - this.Visibility = Visibility.Hidden; - AfterImport.Instance.IsEnabled = true; - } - - private void UpdateTagList() - { - tagList.Items.Clear(); - LiveryTagging.GetAllTags().ForEach(tag => - { - ListBoxItem item = new ListBoxItem() - { - DataContext = tag, - Content = tag.Name - }; - tagList.Items.Add(item); - }); - } - - internal void Open(LiveryTreeCar car) - { - Cars.Clear(); - Cars.Add(car); - - UpdateTagList(); - - this.Visibility = Visibility.Visible; - } - - internal void Open(List cars) - { - Cars.Clear(); - Cars = cars; - - UpdateTagList(); - - AfterImport.Instance.IsEnabled = false; - - this.Visibility = Visibility.Visible; - } - - private void ButtonAdd_Click(object sender, RoutedEventArgs e) - { - if (tagList.Items.Count == 0) - { - MainWindow.Instance.EnqueueSnackbarMessage("Please add a new tag first."); - goto close; - } - - if (tagList.SelectedItems.Count == 0) - { - MainWindow.Instance.EnqueueSnackbarMessage("Please select 1 or more tags."); - return; - } - - foreach (var listItem in tagList.SelectedItems) - { - var listBox = listItem as ListBoxItem; - LiveryTag tag = listBox.DataContext as LiveryTag; - foreach (var car in Cars) - { - LiveryTagging.AddToTag(tag, car); - } - } - close: - this.Visibility = Visibility.Hidden; - LiveryBrowser.Instance.FetchAllCars(true); - AfterImport.Instance.IsEnabled = true; - } - } -} diff --git a/Race_Element/Controls/Liveries/LiveryTagging.cs b/Race_Element/Controls/Liveries/LiveryTagging.cs deleted file mode 100644 index 4491440ef..000000000 --- a/Race_Element/Controls/Liveries/LiveryTagging.cs +++ /dev/null @@ -1,243 +0,0 @@ -using RaceElement.Util; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - internal class LiveryTagging - { - public class LiveryTag - { - public Guid Guid { get; set; } - public string Name { get; set; } - - /// - /// - /// - public List TaggedLiveries { get; set; } = new List(); - } - - public class TaggedLivery - { - public int CarModelType { get; set; } - public string TeamName { get; set; } - public string CustomSkinName { get; set; } - - public override bool Equals(object obj) - { - - if (obj == null) - { - return false; - } - if (!(obj is TaggedLivery)) - { - return false; - } - - TaggedLivery other = (TaggedLivery)obj; - return CarModelType == other.CarModelType && TeamName == other.TeamName && CustomSkinName == other.CustomSkinName; - } - } - - public static List GetAllTags() - { - DirectoryInfo tagDir = GetTagDirectory(); - - FileInfo[] jsonFiles = tagDir.GetFiles("*.json", SearchOption.TopDirectoryOnly); - - if (jsonFiles.Length == 0) - { - return new List(); - } - - List allTags = new List(); - - foreach (FileInfo file in jsonFiles) - { - LiveryTag tag = LoadTag(file); - allTags.Add(tag); - } - - - return allTags; - } - - public static bool AddToTag(LiveryTag tag, LiveryTreeCar livery) - { - TaggedLivery taggedLivery = new TaggedLivery() - { - CarModelType = livery.CarsRoot.CarModelType, - TeamName = livery.CarsRoot.TeamName, - CustomSkinName = livery.CarsRoot.CustomSkinName, - }; - - if (!tag.TaggedLiveries.Contains(taggedLivery)) - tag.TaggedLiveries.Add(taggedLivery); - else - MainWindow.Instance.EnqueueSnackbarMessage($"{livery.CarsRoot.CustomSkinName} has already been tagged with {tag.Name}"); - - SaveTag(tag); - - return false; - } - - - - internal static void RemoveFromTag(LiveryTag tag, LiveryTreeCar livery) - { - TaggedLivery taggedLivery = new TaggedLivery() - { - CarModelType = livery.CarsRoot.CarModelType, - TeamName = livery.CarsRoot.TeamName, - CustomSkinName = livery.CarsRoot.CustomSkinName, - }; - - tag.TaggedLiveries.Remove(taggedLivery); - SaveTag(tag); - } - - public static LiveryTag CreateNewTag(string tagName) - { - LiveryTag tag = new LiveryTag() - { - Guid = Guid.NewGuid(), - Name = tagName, - }; - SaveTag(tag); - return tag; - } - - public static bool TagContainsCar(LiveryTag tag, LiveryTreeCar car) - { - bool found = false; - - tag.TaggedLiveries.ForEach(x => - { - if (x.CarModelType == car.CarsRoot.CarModelType - && x.TeamName == car.CarsRoot.TeamName - && x.CustomSkinName == car.CarsRoot.CustomSkinName) - found = true; - }); - - return found; - } - - private static LiveryTag SaveTag(LiveryTag tag) - { - DirectoryInfo tagDir = GetTagDirectory(); - - FileInfo[] tagFiles = tagDir.GetFiles($"{tag.Name}.json"); - FileInfo liveryFile = null; - - if (tagFiles.Length == 0) - { - liveryFile = new FileInfo($"{FileUtil.RaceElementTagsPath}{tag.Name}.json"); - } - else - { - foreach (FileInfo file in tagFiles) - { - if (file.Name == $"{tag.Name}.json") - { - liveryFile = file; - break; - } - } - } - - string jsonString = JsonConvert.SerializeObject(tag, Formatting.Indented); - - File.WriteAllText(liveryFile.FullName, jsonString); - - return tag; - } - - private static LiveryTag LoadTag(FileInfo file) - { - if (!file.Exists) - return null; - - try - { - using (FileStream fileStream = file.OpenRead()) - { - return LoadTag(fileStream); - } - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } - return null; - } - - private static LiveryTag LoadTag(Stream stream) - { - string jsonString = string.Empty; - try - { - using (StreamReader reader = new StreamReader(stream)) - { - jsonString = reader.ReadToEnd(); - jsonString = jsonString.Replace("\0", ""); - reader.Close(); - stream.Close(); - } - - return JsonConvert.DeserializeObject(jsonString); - } - catch (Exception e) - { - Debug.WriteLine(e); - } - - return null; - } - - private static DirectoryInfo GetTagDirectory() - { - DirectoryInfo tagDir = new DirectoryInfo(FileUtil.RaceElementTagsPath); - - if (!tagDir.Exists) - { - tagDir.Create(); - } - - return tagDir; - } - - internal static void DeleteTag(LiveryTag tag) - { - DirectoryInfo tagDir = GetTagDirectory(); - - FileInfo[] tagFiles = tagDir.GetFiles($"{tag.Name}.json"); - - try - { - if (tagFiles.Length > 0) - { - foreach (FileInfo file in tagFiles) - { - if (file.Name.Equals($"{tag.Name}.json")) - { - file.Delete(); - - break; - } - } - } - - LiveryBrowser.Instance.FetchAllCars(true); - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - } - } - } -} diff --git a/Race_Element/Controls/Settings/AccManagerSettings/AccManagerSettingsTab.xaml b/Race_Element/Controls/Settings/AccManagerSettings/AccManagerSettingsTab.xaml deleted file mode 100644 index 5ae3640b7..000000000 --- a/Race_Element/Controls/Settings/AccManagerSettings/AccManagerSettingsTab.xaml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Settings/AccManagerSettings/AccManagerSettingsTab.xaml.cs b/Race_Element/Controls/Settings/AccManagerSettings/AccManagerSettingsTab.xaml.cs deleted file mode 100644 index 4414ad7f4..000000000 --- a/Race_Element/Controls/Settings/AccManagerSettings/AccManagerSettingsTab.xaml.cs +++ /dev/null @@ -1,59 +0,0 @@ -using RaceElement.Util.Settings; -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.IO; -using System.Threading; -using System.Windows.Controls; -using static RaceElement.Controls.LiveryBrowser; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for AccManagerSettingsTab.xaml - /// - public partial class AccManagerSettingsTab : UserControl - { - AccManagerSettings _settings; - - public AccManagerSettingsTab() - { - InitializeComponent(); - - _settings = new AccManagerSettings(); - Dispatcher.BeginInvoke(new Action(() => - { - toggleRecordLapTelemetry.IsChecked = _settings.Get().TelemetryRecordDetailed; - sliderTelemetryHerz.Value = _settings.Get().TelemetryDetailedHerz; - toggleMinimizeToSystemTray.IsChecked = _settings.Get().MinimizeToSystemTray; - - toggleRecordLapTelemetry.Checked += (s, e) => SaveSettings(); - toggleRecordLapTelemetry.Unchecked += (s, e) => SaveSettings(); - - toggleMinimizeToSystemTray.Checked += (s, e) => SaveSettings(); - toggleMinimizeToSystemTray.Unchecked += (s, e) => SaveSettings(); - - sliderTelemetryHerz.ValueChanged += (s, e) => SaveSettings(); - - buttonOpenAccManagerFolder.Click += ButtonOpenAccManagerFolder_Click; - })); - } - - private void ButtonOpenAccManagerFolder_Click(object sender, System.Windows.RoutedEventArgs e) - { - DirectoryInfo directory = new DirectoryInfo($"{FileUtil.RaceElementAppDataPath}"); - Process.Start(directory.FullName); - } - - private void SaveSettings() - { - var settings = _settings.Get(); - - settings.MinimizeToSystemTray = toggleMinimizeToSystemTray.IsChecked.Value; - - settings.TelemetryRecordDetailed = toggleRecordLapTelemetry.IsChecked.Value; - settings.TelemetryDetailedHerz = (int)sliderTelemetryHerz.Value; - _settings.Save(settings); - } - } -} diff --git a/Race_Element/Controls/Settings/AccSettings/AccServerListSettings.xaml b/Race_Element/Controls/Settings/AccSettings/AccServerListSettings.xaml deleted file mode 100644 index a49860a8e..000000000 --- a/Race_Element/Controls/Settings/AccSettings/AccServerListSettings.xaml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Settings/AccSettings/AccServerListSettings.xaml.cs b/Race_Element/Controls/Settings/AccSettings/AccServerListSettings.xaml.cs deleted file mode 100644 index e1b609a88..000000000 --- a/Race_Element/Controls/Settings/AccSettings/AccServerListSettings.xaml.cs +++ /dev/null @@ -1,265 +0,0 @@ -using RaceElement.Util; -using RaceElement.Util.Settings; -using System; -using System.Collections.Generic; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using System.Windows.Input; -using System.Windows.Media; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for AccServerListSettings.xaml - /// - public partial class AccServerListSettings : UserControl - { - private readonly AccSettings _accSettings; - private AccSettingsJson _accSettingsJson; - - private readonly AccServerListSettingsJson _accServerListSettingsJson = new AccServerListSettingsJson(); - private readonly UnlistedServersSettingsJson _unlistedServerSettingsJson = new UnlistedServersSettingsJson(); - - public AccServerListSettings() - { - InitializeComponent(); - _accSettings = new AccSettings(); - _accSettingsJson = _accSettings.Get(); - - this.Loaded += (s, e) => FillListView(); - this.listViewServers.SelectionChanged += ListViewServers_SelectionChanged; - buttonNew.Click += ButtonNew_Click; - } - - private void ButtonNew_Click(object sender, RoutedEventArgs e) - { - stackPanelServerDescription.Children.Clear(); - - StackPanel namePanel = new StackPanel() { Orientation = Orientation.Horizontal }; - Label nameLabel = new Label() { Content = "Name", Width = 80 }; - TextBox nameBox = new TextBox() { Width = 150 }; - namePanel.Children.Add(nameLabel); - namePanel.Children.Add(nameBox); - - StackPanel descriptionPanel = new StackPanel() { Orientation = Orientation.Horizontal }; - Label descriptionLabel = new Label() { Content = "Description", Width = 80 }; - TextBox descriptionBox = new TextBox() { Width = 150 }; - descriptionPanel.Children.Add(descriptionLabel); - descriptionPanel.Children.Add(descriptionBox); - - - StackPanel serverPanel = new StackPanel() { Orientation = Orientation.Horizontal }; - Label serverLabel = new Label() { Content = "Server", Width = 80 }; - TextBox serverBox = new TextBox() { Width = 150 }; - serverPanel.Children.Add(serverLabel); - serverPanel.Children.Add(serverBox); - - StackPanel buttonPanel = new StackPanel() { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 10, 0, 0) }; - Button saveButton = new Button() { Content = "Save" }; - saveButton.Click += (s, ev) => - { - UnlistedAccServer newServer = new UnlistedAccServer() - { - Name = nameBox.Text, - Description = descriptionBox.Text, - Server = serverBox.Text, - Guid = Guid.NewGuid() - }; - - if (newServer.Name != string.Empty && newServer.Description != string.Empty && newServer.Server != string.Empty) - { - var unlistedServerSettings = _unlistedServerSettingsJson.Get(); - unlistedServerSettings.UnlistedServers.Add(newServer); - _unlistedServerSettingsJson.Save(unlistedServerSettings); - MainWindow.Instance.EnqueueSnackbarMessage("Saved new unlisted server."); - stackPanelServerDescription.Children.Clear(); - FillListView(); - } - }; - buttonPanel.Children.Add(saveButton); - Button cancelButton = new Button() { Content = "Cancel", Margin = new Thickness(5, 0, 0, 0) }; - cancelButton.Click += (s, ev) => stackPanelServerDescription.Children.Clear(); - buttonPanel.Children.Add(cancelButton); - - stackPanelServerDescription.Children.Add(namePanel); - stackPanelServerDescription.Children.Add(descriptionPanel); - stackPanelServerDescription.Children.Add(serverPanel); - stackPanelServerDescription.Children.Add(buttonPanel); - } - - private void ListViewServers_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (listViewServers.SelectedItems.Count > 0) - { - stackPanelServerDescription.Children.Clear(); - - var unlistedServer = ((listViewServers.SelectedItem as ListViewItem).DataContext as UnlistedAccServer); - - StackPanel togglePanel = new StackPanel() { Orientation = Orientation.Horizontal, Cursor = Cursors.Hand }; - ToggleButton toggle = new ToggleButton(); - if (_accSettingsJson.UnlistedAccServer == unlistedServer.Guid) - toggle.IsChecked = true; - Label toggleLabel = new Label() { Content = toggle.IsChecked.Value ? " Deactivate" : " Activate" }; - - toggle.Checked += (s, ev) => - { - _accSettingsJson.UnlistedAccServer = unlistedServer.Guid; - _accSettings.Save(_accSettingsJson); - - AccServerListJson serverList = _accServerListSettingsJson.Get(); - serverList.leagueServerIp = unlistedServer.Server; - _accServerListSettingsJson.Save(serverList); - FillListView(); - toggleLabel.Content = toggle.IsChecked.Value ? " Deactivate" : " Activate"; - }; - toggle.Unchecked += (s, ev) => - { - _accSettingsJson.UnlistedAccServer = Guid.Empty; - _accSettings.Save(_accSettingsJson); - _accServerListSettingsJson.Delete(); - FillListView(); - toggleLabel.Content = toggle.IsChecked.Value ? " Deactivate" : " Activate"; - }; - - - togglePanel.MouseLeftButtonUp += (s, ev) => toggle.IsChecked = !toggle.IsChecked; ; - togglePanel.Children.Add(toggle); - togglePanel.Children.Add(toggleLabel); - stackPanelServerDescription.Children.Add(togglePanel); - - stackPanelServerDescription.Children.Add(new Label() - { - Content = $"Name: {unlistedServer.Name}" - }); - stackPanelServerDescription.Children.Add(new Label() - { - Content = $"Description: {unlistedServer.Description}" - }); - stackPanelServerDescription.Children.Add(new Label() - { - Content = $"Server address: {unlistedServer.Server}" - }); - } - } - - private void FillListView() - { - _accSettingsJson = _accSettings.Get(); - - UnlistedServersJson unlistedServersJson = _unlistedServerSettingsJson.Get(); - - listViewServers.Items.Clear(); - - if (unlistedServersJson.UnlistedServers != null) - foreach (var unlistedAccServer in unlistedServersJson.UnlistedServers) - { - TextBlock serverTextBlock = new TextBlock() - { - Text = $"{unlistedAccServer.Name}", - Style = Resources["MaterialDesignSubtitle1TextBlock"] as Style, - }; - - if (unlistedAccServer.Guid == _accSettingsJson.UnlistedAccServer) - serverTextBlock.Foreground = Brushes.Green; - - ListViewItem listItem = new ListViewItem - { - Content = serverTextBlock, - DataContext = unlistedAccServer, - ContextMenu = GetListContextMenu(unlistedAccServer), - }; - - listViewServers.Items.Add(listItem); - } - } - - private ContextMenu GetListContextMenu(UnlistedAccServer unlistedAccServer) - { - ContextMenu menu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)) - }; - - Button deleteTagButton = new Button() - { - Content = $"Delete", - CommandParameter = unlistedAccServer, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - ToolTip = "Warning! This permantely deletes this entry.", - VerticalAlignment = VerticalAlignment.Center, - }; - deleteTagButton.Click += (e, s) => - { - var serverList = _unlistedServerSettingsJson.Get(); - serverList.UnlistedServers.Remove(unlistedAccServer); - _unlistedServerSettingsJson.Save(serverList); - menu.IsOpen = false; - - if (_accSettingsJson.UnlistedAccServer == unlistedAccServer.Guid) - _accServerListSettingsJson.Delete(); - - stackPanelServerDescription.Children.Clear(); - FillListView(); - }; - - menu.Items.Add(deleteTagButton); - - return menu; - } - - public class AccServerListJson : IGenericSettingsJson - { -#pragma warning disable IDE1006 // Naming Styles - public string leagueServerIp { get; set; } -#pragma warning restore IDE1006 // Naming Styles - } - internal class AccServerListSettingsJson : AbstractSettingsJson - { - public override string Path => FileUtil.AccPath + "Config\\"; - public override string FileName => "serverList.json"; - - public override AccServerListJson Default() - { - return new AccServerListJson() { leagueServerIp = String.Empty }; - } - } - - public class UnlistedAccServer - { - public Guid Guid { get; set; } = Guid.Empty; - public string Name { get; set; } - public string Description { get; set; } - public string Server { get; set; } - - public override bool Equals(object obj) - { - if (obj is UnlistedAccServer) - { - return this.Guid == ((UnlistedAccServer)obj).Guid; - } - return false; - } - } - public class UnlistedServersJson : IGenericSettingsJson - { - public List UnlistedServers { get; set; } = new List(); - } - internal class UnlistedServersSettingsJson : AbstractSettingsJson - { - public override string Path => FileUtil.RaceElementSettingsPath; - public override string FileName => "ACC_UnlistedServers.json"; - - public override UnlistedServersJson Default() - { - return new UnlistedServersJson() { UnlistedServers = new List() }; - } - } - } -} diff --git a/Race_Element/Controls/Settings/AccSettings/AccSettingsTab.xaml b/Race_Element/Controls/Settings/AccSettings/AccSettingsTab.xaml deleted file mode 100644 index 756e91318..000000000 --- a/Race_Element/Controls/Settings/AccSettings/AccSettingsTab.xaml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - Serverlist - - - - - - - diff --git a/Race_Element/Controls/Settings/AccSettings/AccSettingsTab.xaml.cs b/Race_Element/Controls/Settings/AccSettings/AccSettingsTab.xaml.cs deleted file mode 100644 index cd4310625..000000000 --- a/Race_Element/Controls/Settings/AccSettings/AccSettingsTab.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for AccSettings.xaml - /// - public partial class AccSettingsTab : UserControl - { - public AccSettingsTab() - { - InitializeComponent(); - } - } -} diff --git a/Race_Element/Controls/Settings/AccSettings/ReplaySettings.xaml b/Race_Element/Controls/Settings/AccSettings/ReplaySettings.xaml deleted file mode 100644 index 9145b4c94..000000000 --- a/Race_Element/Controls/Settings/AccSettings/ReplaySettings.xaml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - diff --git a/Race_Element/Controls/Settings/AccSettings/ReplaySettings.xaml.cs b/Race_Element/Controls/Settings/AccSettings/ReplaySettings.xaml.cs deleted file mode 100644 index a2596ff45..000000000 --- a/Race_Element/Controls/Settings/AccSettings/ReplaySettings.xaml.cs +++ /dev/null @@ -1,52 +0,0 @@ -using RaceElement.Util.Settings; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for ReplaySettings.xaml - /// - public partial class ReplaySettings : UserControl - { - private AccSettingsJson _accSettings; - - public ReplaySettings() - { - InitializeComponent(); - - this.Loaded += (s, e) => LoadSettings(); - - this.toggleAutoSaveReplay.Checked += (s, e) => SaveSettings(); - this.toggleAutoSaveReplay.Unchecked += (s, e) => SaveSettings(); - } - - private void SaveSettings() - { - _accSettings.AutoRecordReplay = toggleAutoSaveReplay.IsChecked.Value; - TitleBar.Instance.SetIcons(TitleBar.ActivatedIcons.AutomaticSaveReplay, _accSettings.AutoRecordReplay); - - new AccSettings().Save(_accSettings); - } - - private void LoadSettings() - { - _accSettings = new AccSettings().Get(); - - toggleAutoSaveReplay.IsChecked = _accSettings.AutoRecordReplay; - TitleBar.Instance.SetIcons(TitleBar.ActivatedIcons.AutomaticSaveReplay, _accSettings.AutoRecordReplay); - } - } -} diff --git a/Race_Element/Controls/Settings/Hardware.xaml b/Race_Element/Controls/Settings/Hardware.xaml deleted file mode 100644 index 27d2055f7..000000000 --- a/Race_Element/Controls/Settings/Hardware.xaml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - In ACC, set the steering rotation in-game to 10. - Race Element will automatically set the correct rotation for every car. - - Supported wheelbases: - - MMOs. - - SimuCUBEs (1, 2S, 2P, 2U). - - Thrustmasters (T150, T300, T500, TGT, TMX, TSPC, TSXW, TX, F1). - - - - - - - - - diff --git a/Race_Element/Controls/Settings/Hardware.xaml.cs b/Race_Element/Controls/Settings/Hardware.xaml.cs deleted file mode 100644 index ca3875970..000000000 --- a/Race_Element/Controls/Settings/Hardware.xaml.cs +++ /dev/null @@ -1,92 +0,0 @@ -using RaceElement.Util.Settings; -using RaceElement.Hardware.ACC.SteeringLock; -using System; -using System.Diagnostics; -using System.Windows; -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for Hardware.xaml - /// - public partial class Hardware : UserControl - { - private readonly HardwareSettings _hardwareSettings; - public Hardware() - { - InitializeComponent(); - toggleSteeringHardwareLock.Checked += ToggleSteeringHardwareLock_Checked; - toggleSteeringHardwareLock.Unchecked += ToggleSteeringHardwareLock_Unchecked; - - buttonCheckSteeringLockSupport.Click += ButtonCheckSteeringLockSupport_Click; - - _hardwareSettings = new HardwareSettings(); - this.Loaded += (s, e) => LoadSettings(); - } - - private void ButtonCheckSteeringLockSupport_Click(object sender, RoutedEventArgs e) - { - string supportedDeviceName = SteeringLockTracker.GetSupportedDeviceName(); - string message; - - if (supportedDeviceName == string.Empty) - { - message = "Your device is not supported."; - toggleSteeringHardwareLock.IsChecked = false; - } - else - message = $"Detect supported device: {supportedDeviceName}"; - - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage(message); - } - - private void ToggleSteeringHardwareLock_Unchecked(object sender, RoutedEventArgs e) - { - SaveSettings(); - SteeringLockTracker.Instance.Dispose(); - TitleBar.Instance.SetIcons(TitleBar.ActivatedIcons.AutomaticSteeringHardLock, false); - //MainWindow.Instance.EnqueueSnackbarMessage("Disabled automatic hardware steering lock."); - - } - - private void ToggleSteeringHardwareLock_Checked(object sender, RoutedEventArgs e) - { - SaveSettings(); - SteeringLockTracker.Instance.StartTracking(); - TitleBar.Instance.SetIcons(TitleBar.ActivatedIcons.AutomaticSteeringHardLock, true); - //MainWindow.Instance.EnqueueSnackbarMessage("Enabled automatic hardware steering lock."); - } - - private void LoadSettings() - { - try - { - var hardwareSettings = _hardwareSettings.Get(); - - toggleSteeringHardwareLock.IsChecked = hardwareSettings.UseHardwareSteeringLock; - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - - private void SaveSettings() - { - try - { - var hardwareSettings = _hardwareSettings.Get(); - - hardwareSettings.UseHardwareSteeringLock = toggleSteeringHardwareLock.IsChecked.Value; - - _hardwareSettings.Save(hardwareSettings); - } - catch (Exception e) - { - Debug.WriteLine(e); - } - } - } -} diff --git a/Race_Element/Controls/Settings/SettingsTab.xaml b/Race_Element/Controls/Settings/SettingsTab.xaml deleted file mode 100644 index e89216f36..000000000 --- a/Race_Element/Controls/Settings/SettingsTab.xaml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - ACC - - - - - - - - - - - - - - - Hardware - - - - - - - - - - - - - - Streaming - - - - - - - - - - diff --git a/Race_Element/Controls/Settings/SettingsTab.xaml.cs b/Race_Element/Controls/Settings/SettingsTab.xaml.cs deleted file mode 100644 index 7a07314f8..000000000 --- a/Race_Element/Controls/Settings/SettingsTab.xaml.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for SettingsTab.xaml - /// - public partial class SettingsTab : UserControl - { - public static SettingsTab Instance { get; private set; } - - public SettingsTab() - { - InitializeComponent(); - Instance = this; - } - } -} diff --git a/Race_Element/Controls/Settings/Streaming.xaml b/Race_Element/Controls/Settings/Streaming.xaml deleted file mode 100644 index f35620aeb..000000000 --- a/Race_Element/Controls/Settings/Streaming.xaml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - Add any Source to your Active Scene called: SetupHider - OBS: Version 28 or higher is required. - Streamlabs: Use most recent version, only works locally. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Settings/Streaming.xaml.cs b/Race_Element/Controls/Settings/Streaming.xaml.cs deleted file mode 100644 index 31360f9d2..000000000 --- a/Race_Element/Controls/Settings/Streaming.xaml.cs +++ /dev/null @@ -1,244 +0,0 @@ -using RaceElement.Data.ACC.Tracker; -using RaceElement.Util.Settings; -using OBSWebsocketDotNet; -using SLOBSharp.Client; -using SLOBSharp.Client.Requests; -using System; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using WebSocketSharp; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for Streaming.xaml - /// - public partial class Streaming : UserControl - { - private StreamSettings _streamSettings; - - public Streaming() - { - InitializeComponent(); - - ThreadPool.QueueUserWorkItem(x => - { - Thread.Sleep(1000); - _streamSettings = new StreamSettings(); - Dispatcher.BeginInvoke(new Action(() => - { - TitleBar.Instance.SetIcons(TitleBar.ActivatedIcons.SetupHider, _streamSettings.Get().SetupHider); - })); - }); - - comboStreamSoftware.Items.Add("OBS"); - comboStreamSoftware.Items.Add("Streamlabs"); - comboStreamSoftware.SelectedIndex = 0; - comboStreamSoftware.SelectionChanged += (s, e) => - { - switch (comboStreamSoftware.SelectedItem) - { - case "OBS": - { - obsStack.Visibility = Visibility.Visible; - break; - } - case "Streamlabs": - { - obsStack.Visibility = Visibility.Hidden; - break; - } - } - }; - - buttonSave.Click += (s, e) => SaveSettings(); - buttonTestConnnection.Click += (s, e) => TestConnection(); - - toggleSetupHider.Click += (s, e) => ToggleSetupHider(); - - this.IsVisibleChanged += Streaming_IsVisibleChanged; - var pageGraphics = PageGraphicsTracker.Instance; - } - - private void Streaming_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) - { - if (this.IsVisible) - LoadSettings(); - } - - private void TestConnection() - { - var streamSettings = _streamSettings.Get(); - buttonTestConnnection.Content = "Testing Connection..."; - buttonTestConnnection.IsEnabled = false; - - switch (comboStreamSoftware.SelectedItem) - { - case "OBS": - { - TestOBSconnection(streamSettings); - break; - } - case "Streamlabs": - { - TestStreamlabsConnection(streamSettings); - break; - } - } - } - - private void TestOBSconnection(StreamingSettingsJson streamSettings) - { - Task.Run(() => - { - try - { - OBSWebsocket _obsWebSocket = new OBSWebsocket(); - _obsWebSocket.Connected += (s, e) => - { - Task.Run(() => - { - var list = _obsWebSocket.GetSceneItemList(_obsWebSocket.GetCurrentProgramScene()); - - bool foundSetupHider = list.Find(x => x.SourceName == "SetupHider") != null; - - string message = "SetupHider source was not found in your current Scene."; - if (foundSetupHider) - message = $"Connection to {streamSettings.StreamingSoftware} is working."; - - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage(message); - - _obsWebSocket.Disconnect(); - }); - }; - _obsWebSocket.Disconnected += (s, e) => - { - if (e.WebsocketDisconnectionInfo.Type == Websocket.Client.DisconnectionType.Error) - { - Debug.WriteLine("Disconnected test connection."); - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage($"Failed to make a connection to {streamSettings.StreamingSoftware}."); - } - - Dispatcher.Invoke(() => - { - buttonTestConnnection.Content = "Test Connection"; - buttonTestConnnection.IsEnabled = true; - }); - }; - _obsWebSocket.ConnectAsync($"ws://{streamSettings.StreamingWebSocketIP}:{streamSettings.StreamingWebSocketPort}", streamSettings.StreamingWebSocketPassword); - } - catch (Exception e) - { - Debug.WriteLine(e); - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage($"Failed to make a connection to OBS."); - Dispatcher.Invoke(() => - { - buttonTestConnnection.Content = "Test Connection"; - buttonTestConnnection.IsEnabled = true; - }); - } - }); - } - - private void TestStreamlabsConnection(StreamingSettingsJson streamSettings) - { - Task.Run(() => - { - try - { - SlobsPipeClient client = new SlobsPipeClient(); - var request = SlobsRequestBuilder.NewRequest().SetMethod("getScenes").SetResource("ScenesService").BuildRequest(); - - var response = client.ExecuteRequest(request); - if (response.Error != null) - throw new Exception($"{response.Error.Code}: {response.Error.Message} "); - else - { - bool foundSetupHider = false; - response.Result.First().Nodes.ForEach(x => { if (x.Name == "SetupHider") foundSetupHider = true; }); - if (!foundSetupHider) - throw new Exception("Did not find the 'SetupHider' Source in your active Scene."); - else - { - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage($"Connection to StreamLabs is working."); - } - } - } - catch (Exception e) - { - Debug.WriteLine(e); - - string message = $"Failed to make a connection to StreamLabs."; - - if (e.Message.Contains("SetupHider")) - message = e.Message; - - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage(message); - } - finally - { - Dispatcher.Invoke(() => - { - buttonTestConnnection.Content = "Test Connection"; - buttonTestConnnection.IsEnabled = true; - }); - } - }); - } - - - private void ToggleSetupHider() - { - var streamingSettings = _streamSettings.Get(); - streamingSettings.SetupHider = toggleSetupHider.IsChecked.Value; - _streamSettings.Save(streamingSettings); - - TitleBar.Instance.SetIcons(TitleBar.ActivatedIcons.SetupHider, streamingSettings.SetupHider); - } - - private void LoadSettings() - { - var streamingSettings = _streamSettings.Get(); - - streamPassword.Password = streamingSettings.StreamingWebSocketPassword; - streamServer.Text = streamingSettings.StreamingWebSocketIP; - streamPort.Text = $"{streamingSettings.StreamingWebSocketPort}"; - comboStreamSoftware.SelectedItem = streamingSettings.StreamingSoftware; - - toggleSetupHider.IsChecked = streamingSettings.SetupHider; - - if (streamingSettings.SetupHider) TitleBar.Instance.SetIcons(TitleBar.ActivatedIcons.SetupHider, true); - } - - private void SaveSettings() - { - var streamingSettings = _streamSettings.Get(); - - streamingSettings.StreamingSoftware = comboStreamSoftware.SelectedItem.ToString(); - streamingSettings.StreamingWebSocketIP = streamServer.Text; - streamingSettings.StreamingWebSocketPort = streamPort.Text; - - switch (streamingSettings.StreamingSoftware) - { - case "OBS": - { - streamingSettings.StreamingWebSocketPassword = streamPassword.Password; - break; - } - } - - _streamSettings.Save(streamingSettings); - MainWindow.Instance.ClearSnackbar(); - MainWindow.Instance.EnqueueSnackbarMessage("Saved Streaming settings."); - } - } -} diff --git a/Race_Element/Controls/Setup/FlowDocUtil/DocUtil.cs b/Race_Element/Controls/Setup/FlowDocUtil/DocUtil.cs deleted file mode 100644 index f519f1630..000000000 --- a/Race_Element/Controls/Setup/FlowDocUtil/DocUtil.cs +++ /dev/null @@ -1,558 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.Windows; -using System.Windows.Documents; -using System.Windows.Media; - -namespace RaceElement.Controls.Setup.FlowDocUtil -{ - public static class DocUtil - { - public static Table GetTable(int headerWidth, int valueWidth) - { - Table table = new Table(); - TableColumn columnTitle = new TableColumn(); - columnTitle.Width = new GridLength(headerWidth, GridUnitType.Star); - table.Columns.Add(columnTitle); - - TableColumn columnValues = new TableColumn(); - columnValues.Width = new GridLength(valueWidth, GridUnitType.Star); - table.Columns.Add(columnValues); - - table.Margin = new Thickness(0); - table.CellSpacing = 0; - table.LineStackingStrategy = LineStackingStrategy.MaxHeight; - return table; - } - - public static Table GetLeftAllignedTable(int headerWidth, int cells) - { - Table table = new Table(); - - int cellWidth = (100 - headerWidth) / cells; - - TableColumn columnHeader = new TableColumn(); - columnHeader.Width = new GridLength(headerWidth, GridUnitType.Star); - table.Columns.Add(columnHeader); - - for (int i = 0; i < cells; i++) - { - TableColumn column = new TableColumn(); - column.Width = new GridLength(cellWidth, GridUnitType.Star); - table.Columns.Add(column); - } - - table.Margin = new Thickness(0); - table.CellSpacing = 0; - return table; - } - - /// - /// Header is centered - /// - /// - /// - /// - public static Table GetCenteredTable(int headerWidth, int cells) - { - if (cells % 2 == 1) - throw new ArgumentException("Cells requires to be an even number"); - - Table table = new Table() { Padding = new Thickness(0) }; - - int cellWidth = (100 - headerWidth) / cells; - - for (int i = 0; i < cells / 2; i++) - { - TableColumn column = new TableColumn(); - column.Width = new GridLength(cellWidth, GridUnitType.Star); - table.Columns.Add(column); - } - - TableColumn columnHeader = new TableColumn(); - columnHeader.Width = new GridLength(headerWidth, GridUnitType.Star); - table.Columns.Add(columnHeader); - - for (int i = 0; i < cells / 2; i++) - { - TableColumn column = new TableColumn(); - column.Width = new GridLength(cellWidth, GridUnitType.Star); - table.Columns.Add(column); - } - - table.Margin = new Thickness(0); - table.LineStackingStrategy = LineStackingStrategy.MaxHeight; - table.CellSpacing = 0; - return table; - } - - public static Table GetTable(int valueWidth1, int headerWidth, int valueWidth2) - { - Table table = new Table(); - TableColumn columnValues1 = new TableColumn(); - columnValues1.Width = new GridLength(valueWidth1, GridUnitType.Star); - table.Columns.Add(columnValues1); - - TableColumn columnTitle = new TableColumn(); - columnTitle.Width = new GridLength(headerWidth, GridUnitType.Star); - table.Columns.Add(columnTitle); - - TableColumn columnValues2 = new TableColumn(); - columnValues2.Width = new GridLength(valueWidth2, GridUnitType.Star); - table.Columns.Add(columnValues2); - - table.Margin = new Thickness(0); - return table; - } - - public static TableRow GetTableRow(string title, string value) - { - TableRow row = new TableRow(); - row.Cells.Add(new TableCell(GetDefaultParagraph(title))); - row.Cells.Add(new TableCell(GetDefaultParagraph(value))); - return row; - } - - public static TableRow GetTableRow(string value1, string title, string value2) - { - TableRow row = new TableRow(); - TableCell cellA = new TableCell(GetDefaultParagraph(value1)) { TextAlignment = TextAlignment.Right }; - TableCell cellB = new TableCell(GetDefaultParagraph(title)) { TextAlignment = TextAlignment.Center }; - TableCell cellC = new TableCell(GetDefaultParagraph(value2)) { TextAlignment = TextAlignment.Left }; - row.Cells.Add(cellA); - row.Cells.Add(cellB); - row.Cells.Add(cellC); - return row; - } - - public static TableRow GetTableRow(Paragraph a, Paragraph b, Paragraph c) - { - return GetTableRow(a, b, c, 3); - } - - public static TableRow GetTableRow(Paragraph a, Paragraph b, Paragraph c, int cellCount) - { - int cellsToAdd = 0; - if (cellCount > 3) - cellsToAdd = (cellCount - 1) / 2; - - TableRow row = new TableRow(); - TableCell cellA = new TableCell(a) { TextAlignment = TextAlignment.Right }; - if (cellsToAdd > 0) - cellA.ColumnSpan = cellsToAdd; - TableCell cellB = new TableCell(b) { TextAlignment = TextAlignment.Center, Padding = new Thickness(0, 3, 0, 3) }; - TableCell cellC = new TableCell(c) { TextAlignment = TextAlignment.Left }; - if (cellsToAdd > 0) - cellC.ColumnSpan = cellsToAdd; - - row.Cells.Add(cellA); - row.Cells.Add(cellB); - row.Cells.Add(cellC); - - return row; - } - - - public static TableRow GetTableRowCompare(string value1, string title, string value2, int cellCount) - { - int cellsToAdd = 0; - if (cellCount > 3) - cellsToAdd = (cellCount - 1) / 2; - - - TableRow row = new TableRow(); - TableCell cellA = new TableCell(GetDefaultParagraph(value1, new Thickness(0, 0, 5, 0))) { TextAlignment = TextAlignment.Right }; - if (cellsToAdd > 0) - cellA.ColumnSpan = cellsToAdd; - TableCell cellB = new TableCell(GetDefaultParagraph(title)) - { - TextAlignment = TextAlignment.Center, - BorderThickness = new Thickness(2, 0, 2, 0), - BorderBrush = Brushes.DarkGray - }; - if (!value1.Equals(value2)) - { - cellB.Blocks.First().Foreground = Brushes.DarkOrange; - cellB.BorderBrush = Brushes.DarkOrange; - } - - TableCell cellC = new TableCell(GetDefaultParagraph(value2, new Thickness(5, 0, 0, 0))) { TextAlignment = TextAlignment.Left }; - if (cellsToAdd > 0) - cellC.ColumnSpan = cellsToAdd; - - - - row.Cells.Add(cellA); - row.Cells.Add(cellB); - row.Cells.Add(cellC); - - return row; - } - - public static TableRow GetTableRowLeft(string title, double value, int cellCount, int denominator = 0) - { - return GetTableRowLeft(title, new string[1], new double[] { value }, cellCount, denominator); - } - - public static TableRow GetTableRowLeft(string title, string[] labels, double[] values, int cellCount, int denominator = 0) - { - if (values.Length == 0) - throw new ArgumentException("Provide at least 1 value."); - if (labels.Length == 0) - labels = new string[values.Length]; - - List tableCells = new List(); - - for (int i = 0; i != values.Length; i++) - { - TableCell cell = new TableCell(GetDefaultParagraph($"{labels[i]}{values[i].ToString($"F{denominator}")}", new Thickness(3, 0, 3, 0))) - { - TextAlignment = TextAlignment.Left, - BorderThickness = new Thickness(0), - Padding = new Thickness(0), - }; - tableCells.Add(cell); - } - - TableRow row = new TableRow(); - - int spacingCells = 0; - if (cellCount > values.Count() + 1) - spacingCells = (cellCount - (values.Count() + 1)); - - TableCell header = new TableCell(GetDefaultParagraph(title, new Thickness(3, 0, 3, 0))) - { - TextAlignment = TextAlignment.Left, - BorderThickness = new Thickness(2, 0, 2, 0), - Padding = new Thickness(3, 0, 0, 0), - BorderBrush = Brushes.DarkGray - }; - - - row.Cells.Add(header); - - for (int i = 0; i < tableCells.Count; i++) - { - if (i == 0) - tableCells[i].Padding = new Thickness(3, 0, 0, 0); - row.Cells.Add(tableCells[i]); - } - - return row; - } - - public static TableRow GetTableRowLeftTitle(string title, int cellCount) - { - TableRow row = new TableRow(); - - // add header - Paragraph pHeader = GetDefaultHeader(18, title); - pHeader.TextAlignment = TextAlignment.Left; - pHeader.Margin = new Thickness(3, 5, 0, 3); - pHeader.FontStyle = FontStyles.Italic; - TableCell header = new TableCell(pHeader) - { - TextAlignment = TextAlignment.Left, - ColumnSpan = cellCount, - Padding = new Thickness(0), - }; - row.Cells.Add(header); - - return row; - } - - - public static TableRow GetTableRowLeft(string title, string value, int cellCount, bool fullValueColumnSpan = false) - { - if (!fullValueColumnSpan) - { - return GetTableRowLeft(title, new string[] { value }, cellCount); - } - else - { - TableRow row = new TableRow(); - - // set amount of spacing cells on the right - int spacingCells = 0; - if (cellCount > 2) - spacingCells = (cellCount - 1); - - // add header - TableCell header = new TableCell(GetDefaultParagraph(title)) - { - TextAlignment = TextAlignment.Left, - BorderThickness = new Thickness(2, 0, 2, 0), - Padding = new Thickness(0), - BorderBrush = Brushes.DarkGray - }; - row.Cells.Add(header); - - TableCell valueCell = new TableCell(GetDefaultParagraph(value, new Thickness(3, 0, 3, 0))) - { - TextAlignment = TextAlignment.Left, - Padding = new Thickness(3, 0, 0, 0), - }; - if (spacingCells > 0) - valueCell.ColumnSpan = spacingCells; - row.Cells.Add(valueCell); - - return row; - - } - } - - public static TableRow GetTableRowLeft(string title, string[] values, int cellCount) - { - if (values.Length == 0) - throw new ArgumentException("Provide at least 1 value."); - - TableRow row = new TableRow(); - - // set amount of spacing cells on the right - int spacingCells = 0; - if (cellCount > values.Count() + 1) - spacingCells = (cellCount - (values.Count() + 1)); - - // add header - TableCell header = new TableCell(GetDefaultParagraph(title)) - { - TextAlignment = TextAlignment.Left, - BorderThickness = new Thickness(2, 0, 2, 0), - Padding = new Thickness(0), - BorderBrush = Brushes.DarkGray - }; - row.Cells.Add(header); - - - // add values - for (int i = 0; i != values.Length; i++) - row.Cells.Add(new TableCell(GetDefaultParagraph(values[i], new Thickness(3, 0, 3, 0))) - { - TextAlignment = TextAlignment.Left, - Padding = new Thickness(0), - BorderThickness = new Thickness(0) - }); - - if (spacingCells > 0) - for (int i = 0; i < spacingCells; i++) - row.Cells.Add(new TableCell() { Padding = new Thickness(0), BorderThickness = new Thickness(0) }); - - return row; - } - - - public static TableRow GetTableRowCompare(string value1, string title, string value2) - { - return GetTableRowCompare(value1, title, value2, 3); - } - - public static TableRow GetTableRowCompare(double value1, string title, double value2, int cellCount, int denominator = 0) - { - return GetTableRowCompare(new double[] { value1 }, title, new double[] { value2 }, cellCount, denominator); - } - - public static TableRow GetTableRowCompare(double[] values1, string title, double[] values2, int cellCount, int denominator = 0) - { - return GetTableRowCompareWithLabels(new string[values1.Length], values1, title, values2, cellCount, denominator); - } - - public static TableRow GetTableRowCompareWithLabels(string[] labels, double[] values1, string title, double[] values2, int cellCount, int denominator = 0) - { - if (values1.Length != values2.Length) - throw new ArgumentException("Both of the values arrays have to be the same length."); - - List cells1 = new List(); - List cells2 = new List(); - - bool different = false; - - for (int i = 0; i < values1.Length; i++) - { - TableCell cell1 = new TableCell(GetDefaultParagraph($"{labels[i]}{values1[i].ToString($"F{denominator}")}", new Thickness(0, 0, 5, 0))) - { - TextAlignment = TextAlignment.Right, - Padding = new Thickness(0), - BorderThickness = new Thickness(0) - }; - TableCell cell2 = new TableCell(GetDefaultParagraph($"{labels[i]}{values2[i].ToString($"F{denominator}")}", new Thickness(5, 0, 0, 0))) - { - TextAlignment = TextAlignment.Left, - Padding = new Thickness(0), - BorderThickness = new Thickness(0) - }; - - if (values1[i] > values2[i]) - { - cell1.Blocks.First().Foreground = Brushes.LimeGreen; - cell2.Blocks.First().Foreground = Brushes.OrangeRed; - different = true; - } - - if (values1[i] < values2[i]) - { - cell2.Blocks.First().Foreground = Brushes.LimeGreen; - cell1.Blocks.First().Foreground = Brushes.OrangeRed; - different = true; - } - - cells1.Add(cell1); - cells2.Add(cell2); - } - - TableRow row = new TableRow(); - - int spacingCells = 0; - if (cellCount > values2.Count() * 2 + 1) - spacingCells = (cellCount - (values2.Count() * 2 + 1)) / 2; - - // add spacing cells on left side - if (spacingCells > 0) - for (int i = 0; i < spacingCells; i++) - row.Cells.Add(new TableCell(GetDefaultParagraph()) - { - Padding = new Thickness(0), - BorderThickness = new Thickness(0), - }); - - for (int i = 0; i < cells1.Count; i++) - row.Cells.Add(cells1[i]); - - TableCell header = new TableCell(GetDefaultParagraph(title)) - { - TextAlignment = TextAlignment.Center, - BorderThickness = new Thickness(2, 0, 2, 0), - BorderBrush = Brushes.DarkGray, - Padding = new Thickness(0) - }; - if (different) - { - header.BorderBrush = Brushes.DarkOrange; - header.Blocks.First().Foreground = Brushes.DarkOrange; - } - - row.Cells.Add(header); - - for (int i = 0; i < cells2.Count; i++) - row.Cells.Add(cells2[i]); - - // add spacing cells on right side - if (spacingCells > 0) - for (int i = 0; i < spacingCells; i++) - row.Cells.Add(new TableCell(GetDefaultParagraph()) - { - Padding = new Thickness(0), - BorderThickness = new Thickness(0), - LineHeight = 1, - LineStackingStrategy = LineStackingStrategy.MaxHeight - }); - - return row; - } - - public static Paragraph GetDefaultHeader() - { - Paragraph content = new Paragraph - { - FontSize = 17, - FontWeight = FontWeights.Medium, - Foreground = Brushes.White, - TextAlignment = TextAlignment.Center, - Margin = new Thickness(0, 0, 0, 0) - }; - return content; - } - - public static Paragraph GetDefaultHeader(double fontSize) - { - Paragraph content = GetDefaultHeader(); - content.FontSize = fontSize; - return content; - } - - public static Paragraph GetDefaultHeader(string inlineText) - { - Paragraph content = GetDefaultHeader(); - content.Inlines.Add(inlineText); - return content; - } - - public static Paragraph GetDefaultHeader(double fontSize, string inlineText) - { - Paragraph content = GetDefaultHeader(); - content.FontSize = fontSize; - content.Inlines.Add(inlineText); - return content; - } - - public static Paragraph GetDefaultParagraph() - { - Paragraph content = new Paragraph - { - FontSize = 12, - FontWeight = FontWeights.Medium, - Foreground = Brushes.White, - Margin = new Thickness(0, 0, 0, 0) - }; - return content; - } - - public static Paragraph GetDefaultParagraph(double fontSize) - { - Paragraph content = GetDefaultParagraph(); - content.FontSize = fontSize; - return content; - } - - public static Paragraph GetDefaultParagraph(string inlineText, Thickness margin) - { - Paragraph content = GetDefaultParagraph(inlineText); - content.Margin = margin; - return content; - } - - public static Paragraph GetDefaultParagraph(string inlineText) - { - Paragraph content = GetDefaultParagraph(); - content.Margin = new Thickness(5, 0, 0, 0); - content.Inlines.Add(inlineText); - return content; - } - - public static Paragraph GetDefaultParagraph(double fontSize, string inlineText) - { - Paragraph content = GetDefaultParagraph(fontSize); - content.Inlines.Add(inlineText); - return content; - } - - public static List GetDefaultList() - { - List list = new List - { - FontSize = 13, - Foreground = Brushes.White - }; - - return list; - } - - public static string GetTrackName(string fileName) - { - string[] dashSplit = fileName.Split('\\'); - string trackName = dashSplit[dashSplit.Length - 2]; - trackName = Regex.Replace(trackName, "^[a-z]", m => m.Value.ToUpper()); - trackName = trackName.Replace("_", " "); - return trackName; - } - - public static string GetParseName(string fileName) - { - string[] dashSplit = fileName.Split('\\'); - string parseName = dashSplit[dashSplit.Length - 3]; - return parseName; - } - - } -} diff --git a/Race_Element/Controls/Setup/FlowDocUtil/FlowDocCompareSetupRenderer.cs b/Race_Element/Controls/Setup/FlowDocUtil/FlowDocCompareSetupRenderer.cs deleted file mode 100644 index 29b075868..000000000 --- a/Race_Element/Controls/Setup/FlowDocUtil/FlowDocCompareSetupRenderer.cs +++ /dev/null @@ -1,350 +0,0 @@ -using RaceElement.Controls.Setup.FlowDocUtil; -using RaceElement.Data; -using System.IO; -using System.Linq; -using System.Windows; -using System.Windows.Documents; -using System.Windows.Media; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; - -namespace RaceElement.Controls.Setup -{ - public class FlowDocCompareSetupRenderer - { - public FlowDocCompareSetupRenderer() - { - - } - - public void LogComparison(ref FlowDocument flowDocument, FileInfo setupFile1, FileInfo setupFile2) - { - flowDocument.Blocks.Clear(); - - SetupJson.Root setup1 = GetSetupJsonRoot(setupFile1); - SetupJson.Root setup2 = GetSetupJsonRoot(setupFile2); - - if (setup1 == null || setup2 == null) - { - return; - } - - - //// Car 1 conversions - CarModels model1 = ConversionFactory.ParseCarName(DocUtil.GetParseName(setupFile1.FullName)); - if (model1 == CarModels.None) return; - ICarSetupConversion carSetup1 = ConversionFactory.GetConversion(model1); - if (carSetup1 == null) return; - TyreCompound compound1 = carSetup1.TyresSetup.Compound(setup1.BasicSetup.Tyres.TyreCompound); - - // Allignment / Tyre Setup car 1 - double frontLeftPressure1 = carSetup1.TyresSetup.TirePressure(carSetup1.DryTyreCompound, Wheel.FrontLeft, setup1.BasicSetup.Tyres.TyrePressure); - double frontRightPressure1 = carSetup1.TyresSetup.TirePressure(carSetup1.DryTyreCompound, Wheel.FrontRight, setup1.BasicSetup.Tyres.TyrePressure); - double rearLeftPressure1 = carSetup1.TyresSetup.TirePressure(carSetup1.DryTyreCompound, Wheel.RearLeft, setup1.BasicSetup.Tyres.TyrePressure); - double rearRightPressure1 = carSetup1.TyresSetup.TirePressure(carSetup1.DryTyreCompound, Wheel.RearRight, setup1.BasicSetup.Tyres.TyrePressure); - - double frontLeftCaster1 = carSetup1.TyresSetup.Caster(setup1.BasicSetup.Alignment.CasterLF); - double frontRightCaster1 = carSetup1.TyresSetup.Caster(setup1.BasicSetup.Alignment.CasterRF); - - double frontLeftToe1 = carSetup1.TyresSetup.Toe(Wheel.FrontLeft, setup1.BasicSetup.Alignment.Toe); - double frontRightToe1 = carSetup1.TyresSetup.Toe(Wheel.FrontRight, setup1.BasicSetup.Alignment.Toe); - double rearLeftToe1 = carSetup1.TyresSetup.Toe(Wheel.RearLeft, setup1.BasicSetup.Alignment.Toe); - double rearRightToe1 = carSetup1.TyresSetup.Toe(Wheel.RearRight, setup1.BasicSetup.Alignment.Toe); - - double camberFrontLeft1 = carSetup1.TyresSetup.Camber(Wheel.FrontLeft, setup1.BasicSetup.Alignment.Camber); - double camberFrontRight1 = carSetup1.TyresSetup.Camber(Wheel.FrontRight, setup1.BasicSetup.Alignment.Camber); - double camberRearLeft1 = carSetup1.TyresSetup.Camber(Wheel.RearLeft, setup1.BasicSetup.Alignment.Camber); - double camberRearRight1 = carSetup1.TyresSetup.Camber(Wheel.RearRight, setup1.BasicSetup.Alignment.Camber); - - - // Mechnical Setup car 1 - int wheelRateFrontLeft1 = carSetup1.MechanicalSetup.WheelRate(setup1.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.FrontLeft); - int wheelRateFrontRight1 = carSetup1.MechanicalSetup.WheelRate(setup1.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.FrontRight); - int wheelRateRearLeft1 = carSetup1.MechanicalSetup.WheelRate(setup1.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.RearLeft); - int wheelRateRearRight1 = carSetup1.MechanicalSetup.WheelRate(setup1.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.RearRight); - - - int bumpStopRateFrontLeft1 = carSetup1.MechanicalSetup.BumpstopRate(setup1.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.FrontLeft); - int bumpStopRateFrontRight1 = carSetup1.MechanicalSetup.BumpstopRate(setup1.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.FrontRight); - int bumpStopRateRearLeft1 = carSetup1.MechanicalSetup.BumpstopRate(setup1.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.RearLeft); - int bumpStopRateRearRight1 = carSetup1.MechanicalSetup.BumpstopRate(setup1.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.RearRight); - - int bumpStopRangeFrontLeft1 = carSetup1.MechanicalSetup.BumpstopRange(setup1.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.FrontLeft); - int bumpStopRangeFrontRight1 = carSetup1.MechanicalSetup.BumpstopRange(setup1.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.FrontRight); - int bumpStopRangeRearLeft1 = carSetup1.MechanicalSetup.BumpstopRange(setup1.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.RearLeft); - int bumpStopRangeRearRight1 = carSetup1.MechanicalSetup.BumpstopRange(setup1.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.RearRight); - - int differentialPreload1 = carSetup1.MechanicalSetup.PreloadDifferential(setup1.AdvancedSetup.Drivetrain.Preload); - - int brakePower1 = carSetup1.MechanicalSetup.BrakePower(setup1.AdvancedSetup.MechanicalBalance.BrakeTorque); - double brakeBias1 = carSetup1.MechanicalSetup.BrakeBias(setup1.AdvancedSetup.MechanicalBalance.BrakeBias); - int antiRollBarFront1 = carSetup1.MechanicalSetup.AntiRollBarFront(setup1.AdvancedSetup.MechanicalBalance.ARBFront); - int antiRollBarRear1 = carSetup1.MechanicalSetup.AntiRollBarFront(setup1.AdvancedSetup.MechanicalBalance.ARBRear); - double steeringRatio1 = carSetup1.MechanicalSetup.SteeringRatio(setup1.BasicSetup.Alignment.SteerRatio); - - - // Dampers car 1 - int bumpSlowFrontLeft1 = carSetup1.DamperSetup.BumpSlow(setup1.AdvancedSetup.Dampers.BumpSlow, Wheel.FrontLeft); - int bumpSlowFrontRight1 = carSetup1.DamperSetup.BumpSlow(setup1.AdvancedSetup.Dampers.BumpSlow, Wheel.FrontRight); - int bumpSlowRearLeft1 = carSetup1.DamperSetup.BumpSlow(setup1.AdvancedSetup.Dampers.BumpSlow, Wheel.RearLeft); - int bumpSlowRearRight1 = carSetup1.DamperSetup.BumpSlow(setup1.AdvancedSetup.Dampers.BumpSlow, Wheel.RearRight); - - int bumpFastFrontLeft1 = carSetup1.DamperSetup.BumpFast(setup1.AdvancedSetup.Dampers.BumpFast, Wheel.FrontLeft); - int bumpFastFrontRight1 = carSetup1.DamperSetup.BumpFast(setup1.AdvancedSetup.Dampers.BumpFast, Wheel.FrontRight); - int bumpFastRearLeft1 = carSetup1.DamperSetup.BumpFast(setup1.AdvancedSetup.Dampers.BumpFast, Wheel.RearLeft); - int bumpFastRearRight1 = carSetup1.DamperSetup.BumpFast(setup1.AdvancedSetup.Dampers.BumpFast, Wheel.RearRight); - - int reboundSlowFrontLeft1 = carSetup1.DamperSetup.ReboundSlow(setup1.AdvancedSetup.Dampers.ReboundSlow, Wheel.FrontLeft); - int reboundSlowFrontRight1 = carSetup1.DamperSetup.ReboundSlow(setup1.AdvancedSetup.Dampers.ReboundSlow, Wheel.FrontRight); - int reboundSlowRearLeft1 = carSetup1.DamperSetup.ReboundSlow(setup1.AdvancedSetup.Dampers.ReboundSlow, Wheel.RearLeft); - int reboundSlowRearRight1 = carSetup1.DamperSetup.ReboundSlow(setup1.AdvancedSetup.Dampers.ReboundSlow, Wheel.RearRight); - - int reboundFastFrontLeft1 = carSetup1.DamperSetup.ReboundFast(setup1.AdvancedSetup.Dampers.ReboundFast, Wheel.FrontLeft); - int reboundFastFrontRight1 = carSetup1.DamperSetup.ReboundFast(setup1.AdvancedSetup.Dampers.ReboundFast, Wheel.FrontRight); - int reboundFastRearLeft1 = carSetup1.DamperSetup.ReboundFast(setup1.AdvancedSetup.Dampers.ReboundFast, Wheel.RearLeft); - int reboundFastRearRight1 = carSetup1.DamperSetup.ReboundFast(setup1.AdvancedSetup.Dampers.ReboundFast, Wheel.RearRight); - - // Aero Balance car 1 - int rideHeightFront1 = carSetup1.AeroBalance.RideHeight(setup1.AdvancedSetup.AeroBalance.RideHeight, Position.Front); - int rideHeightRear1 = carSetup1.AeroBalance.RideHeight(setup1.AdvancedSetup.AeroBalance.RideHeight, Position.Rear); - int rearWing1 = carSetup1.AeroBalance.RearWing(setup1.AdvancedSetup.AeroBalance.RearWing); - int splitter1 = carSetup1.AeroBalance.Splitter(setup1.AdvancedSetup.AeroBalance.Splitter); - int brakeDuctsFront1 = setup1.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Front]; - int brakeDuctsRear1 = setup1.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Rear]; - - // Strategy car 1 - int brakeCompoundFront1 = setup1.BasicSetup.Strategy.FrontBrakePadCompound + 1; - int brakeCompoundRear1 = setup1.BasicSetup.Strategy.FrontBrakePadCompound + 1; - - - - ///// Car 2 conversions - - CarModels model2 = ConversionFactory.ParseCarName(DocUtil.GetParseName(setupFile2.FullName)); - if (model2 == CarModels.None) return; - ICarSetupConversion carSetup2 = ConversionFactory.GetConversion(model2); - - if (carSetup2 == null) return; - - TyreCompound compound2 = carSetup2.TyresSetup.Compound(setup2.BasicSetup.Tyres.TyreCompound); - - // Allignment / Tyre Setup car 2 - double frontLeftPressure2 = carSetup2.TyresSetup.TirePressure(carSetup2.DryTyreCompound, Wheel.FrontLeft, setup2.BasicSetup.Tyres.TyrePressure); - double frontRightPressure2 = carSetup2.TyresSetup.TirePressure(carSetup2.DryTyreCompound, Wheel.FrontRight, setup2.BasicSetup.Tyres.TyrePressure); - double rearLeftPressure2 = carSetup2.TyresSetup.TirePressure(carSetup2.DryTyreCompound, Wheel.RearLeft, setup2.BasicSetup.Tyres.TyrePressure); - double rearRightPressure2 = carSetup2.TyresSetup.TirePressure(carSetup2.DryTyreCompound, Wheel.RearRight, setup2.BasicSetup.Tyres.TyrePressure); - - double frontLeftCaster2 = carSetup2.TyresSetup.Caster(setup2.BasicSetup.Alignment.CasterLF); - double frontRightCaster2 = carSetup2.TyresSetup.Caster(setup2.BasicSetup.Alignment.CasterRF); - - double frontLeftToe2 = carSetup2.TyresSetup.Toe(Wheel.FrontLeft, setup2.BasicSetup.Alignment.Toe); - double frontRightToe2 = carSetup2.TyresSetup.Toe(Wheel.FrontRight, setup2.BasicSetup.Alignment.Toe); - double rearLeftToe2 = carSetup2.TyresSetup.Toe(Wheel.RearLeft, setup2.BasicSetup.Alignment.Toe); - double rearRightToe2 = carSetup2.TyresSetup.Toe(Wheel.RearRight, setup2.BasicSetup.Alignment.Toe); - - double camberFrontLeft2 = carSetup2.TyresSetup.Camber(Wheel.FrontLeft, setup2.BasicSetup.Alignment.Camber); - double camberFrontRight2 = carSetup2.TyresSetup.Camber(Wheel.FrontRight, setup2.BasicSetup.Alignment.Camber); - double camberRearLeft2 = carSetup2.TyresSetup.Camber(Wheel.RearLeft, setup2.BasicSetup.Alignment.Camber); - double camberRearRight2 = carSetup2.TyresSetup.Camber(Wheel.RearRight, setup2.BasicSetup.Alignment.Camber); - - - // Mechnical Setup car 2 - int wheelRateFrontLeft2 = carSetup2.MechanicalSetup.WheelRate(setup2.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.FrontLeft); - int wheelRateFrontRight2 = carSetup2.MechanicalSetup.WheelRate(setup2.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.FrontRight); - int wheelRateRearLeft2 = carSetup2.MechanicalSetup.WheelRate(setup2.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.RearLeft); - int wheelRateRearRight2 = carSetup2.MechanicalSetup.WheelRate(setup2.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.RearRight); - - - int bumpStopRateFrontLeft2 = carSetup2.MechanicalSetup.BumpstopRate(setup2.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.FrontLeft); - int bumpStopRateFrontRight2 = carSetup2.MechanicalSetup.BumpstopRate(setup2.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.FrontRight); - int bumpStopRateRearLeft2 = carSetup2.MechanicalSetup.BumpstopRate(setup2.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.RearLeft); - int bumpStopRateRearRight2 = carSetup2.MechanicalSetup.BumpstopRate(setup2.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.RearRight); - - int bumpStopRangeFrontLeft2 = carSetup2.MechanicalSetup.BumpstopRange(setup2.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.FrontLeft); - int bumpStopRangeFrontRight2 = carSetup2.MechanicalSetup.BumpstopRange(setup2.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.FrontRight); - int bumpStopRangeRearLeft2 = carSetup2.MechanicalSetup.BumpstopRange(setup2.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.RearLeft); - int bumpStopRangeRearRight2 = carSetup2.MechanicalSetup.BumpstopRange(setup2.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.RearRight); - - int differentialPreload2 = carSetup2.MechanicalSetup.PreloadDifferential(setup2.AdvancedSetup.Drivetrain.Preload); - - int brakePower2 = carSetup2.MechanicalSetup.BrakePower(setup2.AdvancedSetup.MechanicalBalance.BrakeTorque); - double brakeBias2 = carSetup2.MechanicalSetup.BrakeBias(setup2.AdvancedSetup.MechanicalBalance.BrakeBias); - int antiRollBarFront2 = carSetup2.MechanicalSetup.AntiRollBarFront(setup2.AdvancedSetup.MechanicalBalance.ARBFront); - int antiRollBarRear2 = carSetup2.MechanicalSetup.AntiRollBarFront(setup2.AdvancedSetup.MechanicalBalance.ARBRear); - double steeringRatio2 = carSetup2.MechanicalSetup.SteeringRatio(setup2.BasicSetup.Alignment.SteerRatio); - - - // Dampers car 2 - int bumpSlowFrontLeft2 = carSetup2.DamperSetup.BumpSlow(setup2.AdvancedSetup.Dampers.BumpSlow, Wheel.FrontLeft); - int bumpSlowFrontRight2 = carSetup2.DamperSetup.BumpSlow(setup2.AdvancedSetup.Dampers.BumpSlow, Wheel.FrontRight); - int bumpSlowRearLeft2 = carSetup2.DamperSetup.BumpSlow(setup2.AdvancedSetup.Dampers.BumpSlow, Wheel.RearLeft); - int bumpSlowRearRight2 = carSetup2.DamperSetup.BumpSlow(setup2.AdvancedSetup.Dampers.BumpSlow, Wheel.RearRight); - - int bumpFastFrontLeft2 = carSetup2.DamperSetup.BumpFast(setup2.AdvancedSetup.Dampers.BumpFast, Wheel.FrontLeft); - int bumpFastFrontRight2 = carSetup2.DamperSetup.BumpFast(setup2.AdvancedSetup.Dampers.BumpFast, Wheel.FrontRight); - int bumpFastRearLeft2 = carSetup2.DamperSetup.BumpFast(setup2.AdvancedSetup.Dampers.BumpFast, Wheel.RearLeft); - int bumpFastRearRight2 = carSetup2.DamperSetup.BumpFast(setup2.AdvancedSetup.Dampers.BumpFast, Wheel.RearRight); - - int reboundSlowFrontLeft2 = carSetup2.DamperSetup.ReboundSlow(setup2.AdvancedSetup.Dampers.ReboundSlow, Wheel.FrontLeft); - int reboundSlowFrontRight2 = carSetup2.DamperSetup.ReboundSlow(setup2.AdvancedSetup.Dampers.ReboundSlow, Wheel.FrontRight); - int reboundSlowRearLeft2 = carSetup2.DamperSetup.ReboundSlow(setup2.AdvancedSetup.Dampers.ReboundSlow, Wheel.RearLeft); - int reboundSlowRearRight2 = carSetup2.DamperSetup.ReboundSlow(setup2.AdvancedSetup.Dampers.ReboundSlow, Wheel.RearRight); - - int reboundFastFrontLeft2 = carSetup2.DamperSetup.ReboundFast(setup2.AdvancedSetup.Dampers.ReboundFast, Wheel.FrontLeft); - int reboundFastFrontRight2 = carSetup2.DamperSetup.ReboundFast(setup2.AdvancedSetup.Dampers.ReboundFast, Wheel.FrontRight); - int reboundFastRearLeft2 = carSetup2.DamperSetup.ReboundFast(setup2.AdvancedSetup.Dampers.ReboundFast, Wheel.RearLeft); - int reboundFastRearRight2 = carSetup2.DamperSetup.ReboundFast(setup2.AdvancedSetup.Dampers.ReboundFast, Wheel.RearRight); - - // Aero Balance car 2 - int rideHeightFront2 = carSetup2.AeroBalance.RideHeight(setup2.AdvancedSetup.AeroBalance.RideHeight, Position.Front); - int rideHeightRear2 = carSetup2.AeroBalance.RideHeight(setup2.AdvancedSetup.AeroBalance.RideHeight, Position.Rear); - int rearWing2 = carSetup2.AeroBalance.RearWing(setup2.AdvancedSetup.AeroBalance.RearWing); - int splitter2 = carSetup2.AeroBalance.Splitter(setup2.AdvancedSetup.AeroBalance.Splitter); - int brakeDuctsFront2 = setup2.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Front]; - int brakeDuctsRear2 = setup2.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Rear]; - - // Strategy car 2 - int brakeCompoundFront2 = setup2.BasicSetup.Strategy.FrontBrakePadCompound + 1; - int brakeCompoundRear2 = setup2.BasicSetup.Strategy.FrontBrakePadCompound + 1; - - - - const int cells = 13; - const int headerWidthPercent = 15; - string[] tyreLocationLabels = new string[] { "FL: ", "FR: ", "RL: ", "RR: " }; - string[] frontOrRearLabels = new string[] { "Front: ", "Rear: " }; - - - //// Setup Info Section - Section setupSection = new Section(); - TableRowGroup rgSetupInfo = new TableRowGroup(); - Paragraph header1 = DocUtil.GetDefaultHeader($"{setupFile1.Name.Replace(".json", "")}"); - header1.TextAlignment = TextAlignment.Right; - Paragraph header2 = DocUtil.GetDefaultHeader($"{setupFile2.Name.Replace(".json", "")}"); - header2.TextAlignment = TextAlignment.Left; - TableRow headerRow = DocUtil.GetTableRow(header1, DocUtil.GetDefaultParagraph(), header2, cells); - rgSetupInfo.Rows.Add(headerRow); - - rgSetupInfo.Rows.Add(DocUtil.GetTableRowCompare($"{DocUtil.GetTrackName(setupFile1.FullName)}", "Track", $"{DocUtil.GetTrackName(setupFile2.FullName)}", cells)); - rgSetupInfo.Rows.Add(DocUtil.GetTableRowCompare($"{ConversionFactory.CarModelToCarName[carSetup1.CarModel]}", "Car", $"{ConversionFactory.CarModelToCarName[carSetup2.CarModel]}", cells)); - rgSetupInfo.Rows.Add(DocUtil.GetTableRowCompare($"{carSetup1.CarClass}", "Class", $"{carSetup2.CarClass}", cells)); - Table setupInfoTable = DocUtil.GetCenteredTable(headerWidthPercent, cells - 1); - setupInfoTable.RowGroups.Add(rgSetupInfo); - setupSection.Blocks.Add(setupInfoTable); - setupSection.BorderBrush = Brushes.White; - setupSection.BorderThickness = new Thickness(0, 1, 0, 0); - setupSection.Margin = new Thickness(0, 0, 0, 0); - flowDocument.Blocks.Add(setupSection); - - - //// Tyres Section - Section tyresSection = new Section(); - TableRowGroup rgTyres = new TableRowGroup(); - Paragraph tyresHeader = DocUtil.GetDefaultHeader("Tyres Setup"); - tyresHeader.FontStyle = FontStyles.Italic; - rgTyres.Rows.Add(DocUtil.GetTableRow(DocUtil.GetDefaultParagraph(), tyresHeader, DocUtil.GetDefaultParagraph(), cells)); - rgTyres.Rows.Add(DocUtil.GetTableRowCompare($"{compound1}", "Compound", $"{compound2}", cells)); - rgTyres.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { frontLeftPressure1, frontRightPressure1, rearLeftPressure1, rearRightPressure1 }, "Pressures(psi)", new double[] { frontLeftPressure2, frontRightPressure2, rearLeftPressure2, rearRightPressure2 }, cells, 1)); - rgTyres.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { frontLeftToe1, frontRightToe1, rearLeftToe1, rearRightToe1 }, "Toe(°)", new double[] { frontLeftToe2, frontRightToe2, rearLeftToe2, rearRightToe2 }, cells, 2)); - rgTyres.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { camberFrontLeft1, camberFrontRight1, camberRearLeft1, camberRearRight1 }, "Camber(°)", new double[] { camberFrontLeft2, camberFrontRight2, camberRearLeft2, camberRearRight2 }, cells, 1)); - rgTyres.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels.Take(2).ToArray(), new double[] { frontLeftCaster1, frontRightCaster1 }, "Caster(°)", new double[] { frontLeftCaster2, frontRightCaster2 }, cells, 1)); - Table tyresSetupTable = DocUtil.GetCenteredTable(headerWidthPercent, cells - 1); - tyresSetupTable.RowGroups.Add(rgTyres); - tyresSection.Blocks.Add(tyresSetupTable); - tyresSection.BorderBrush = Brushes.White; - tyresSection.BorderThickness = new Thickness(0, 1, 0, 0); - flowDocument.Blocks.Add(tyresSection); - - //// Mechanical Grip Section - Section gripSection = new Section(); - TableRowGroup rgGrip = new TableRowGroup(); - Paragraph mechanicalHeader = DocUtil.GetDefaultHeader("Mechanical Grip"); - mechanicalHeader.FontStyle = FontStyles.Italic; - rgGrip.Rows.Add(DocUtil.GetTableRow(DocUtil.GetDefaultParagraph(), mechanicalHeader, DocUtil.GetDefaultParagraph(), cells)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { wheelRateFrontLeft1, wheelRateFrontRight1, wheelRateRearLeft1, wheelRateRearRight1 }, "Wheelrates(Nm)", new double[] { wheelRateFrontLeft2, wheelRateFrontRight2, wheelRateRearLeft2, wheelRateRearRight2 }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { bumpStopRateFrontLeft1, bumpStopRateFrontRight1, bumpStopRateRearLeft1, bumpStopRateRearRight1 }, "Bumpstop Rate(Nm)", new double[] { bumpStopRateFrontLeft2, bumpStopRateFrontRight2, bumpStopRateRearLeft2, bumpStopRateRearRight2 }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { bumpStopRangeFrontLeft1, bumpStopRangeFrontRight1, bumpStopRangeRearLeft1, bumpStopRangeRearRight1 }, "Bumpstop Range", new double[] { bumpStopRangeFrontLeft2, bumpStopRangeFrontRight2, bumpStopRangeRearLeft2, bumpStopRangeRearRight2 }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompareWithLabels(frontOrRearLabels, new double[] { antiRollBarFront1, antiRollBarRear1 }, "Anti roll bar", new double[] { antiRollBarFront2, antiRollBarRear2 }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompare(differentialPreload1, "Diff Preload(Nm)", differentialPreload2, cells)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompare(brakePower1, "Brake Power(%)", brakePower2, cells)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompare(brakeBias1, "Brake Bias(%)", brakeBias2, cells, 1)); - rgGrip.Rows.Add(DocUtil.GetTableRowCompare(steeringRatio1, "Steering Ratio", steeringRatio2, cells)); - Table gripTable = DocUtil.GetCenteredTable(headerWidthPercent, cells - 1); - gripTable.RowGroups.Add(rgGrip); - gripSection.Blocks.Add(gripTable); - gripSection.BorderBrush = Brushes.White; - gripSection.BorderThickness = new Thickness(0, 1, 0, 0); - flowDocument.Blocks.Add(gripSection); - - - - //// Dampers Section - Section dampersSection = new Section(); - TableRowGroup rgDampers = new TableRowGroup(); - Paragraph dampersHeader = DocUtil.GetDefaultHeader("Dampers"); - dampersHeader.FontStyle = FontStyles.Italic; - rgDampers.Rows.Add(DocUtil.GetTableRow(DocUtil.GetDefaultParagraph(), dampersHeader, DocUtil.GetDefaultParagraph(), cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { bumpSlowFrontLeft1, bumpSlowFrontRight1, bumpSlowRearLeft1, bumpSlowRearRight1 }, "Bump Slow", new double[] { bumpSlowFrontLeft2, bumpSlowFrontRight2, bumpSlowRearLeft2, bumpSlowRearRight2 }, cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { bumpFastFrontLeft1, bumpFastFrontRight1, bumpFastRearLeft1, bumpFastRearRight1 }, "Bump Fast", new double[] { bumpFastFrontLeft2, bumpFastFrontRight2, bumpFastRearLeft2, bumpFastRearRight2 }, cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { reboundSlowFrontLeft1, reboundSlowFrontRight1, reboundSlowRearLeft1, reboundSlowRearRight1 }, "Rebound Slow", new double[] { reboundSlowFrontLeft2, reboundSlowFrontRight2, reboundSlowRearLeft2, reboundSlowRearRight2 }, cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowCompareWithLabels(tyreLocationLabels, new double[] { reboundFastFrontLeft1, reboundFastFrontRight1, reboundFastRearLeft1, reboundFastRearRight1 }, "Rebound Fast", new double[] { reboundFastFrontLeft2, reboundFastFrontRight2, reboundFastRearLeft2, reboundFastRearRight2 }, cells)); - Table dampersTable = DocUtil.GetCenteredTable(headerWidthPercent, cells - 1); - dampersTable.RowGroups.Add(rgDampers); - dampersSection.Blocks.Add(dampersTable); - dampersSection.BorderBrush = Brushes.White; - dampersSection.BorderThickness = new Thickness(0, 1, 0, 0); - flowDocument.Blocks.Add(dampersSection); - - - //// Aero - Section aeroBalanceSection = new Section(); - TableRowGroup rgAero = new TableRowGroup(); - Paragraph aeroHeader = DocUtil.GetDefaultHeader("Aero Balance"); - aeroHeader.FontStyle = FontStyles.Italic; - rgAero.Rows.Add(DocUtil.GetTableRow(DocUtil.GetDefaultParagraph(), aeroHeader, DocUtil.GetDefaultParagraph(), cells)); - rgAero.Rows.Add(DocUtil.GetTableRowCompareWithLabels(frontOrRearLabels, new double[] { rideHeightFront1, rideHeightRear1 }, "Ride height(mm)", new double[] { rideHeightFront2, rideHeightRear2 }, cells)); - rgAero.Rows.Add(DocUtil.GetTableRowCompare(splitter1, "Splitter", splitter2, cells)); - rgAero.Rows.Add(DocUtil.GetTableRowCompare(rearWing1, "Rear Wing", rearWing2, cells)); - rgAero.Rows.Add(DocUtil.GetTableRowCompareWithLabels(frontOrRearLabels, new double[] { brakeDuctsFront1, brakeDuctsRear1 }, "Brake ducts", new double[] { brakeDuctsFront2, brakeDuctsRear2 }, cells)); - Table aeroTable = DocUtil.GetCenteredTable(headerWidthPercent, cells - 1); - aeroTable.RowGroups.Add(rgAero); - aeroBalanceSection.Blocks.Add(aeroTable); - aeroBalanceSection.BorderBrush = Brushes.White; - aeroBalanceSection.BorderThickness = new Thickness(0, 1, 0, 0); - flowDocument.Blocks.Add(aeroBalanceSection); - - //// Electronics - Section electronicsSection = new Section(); - TableRowGroup rgElectro = new TableRowGroup(); - Paragraph electroHeader = DocUtil.GetDefaultHeader("Electronics"); - electroHeader.FontStyle = FontStyles.Italic; - rgElectro.Rows.Add(DocUtil.GetTableRow(DocUtil.GetDefaultParagraph(), electroHeader, DocUtil.GetDefaultParagraph(), cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowCompare(setup1.BasicSetup.Electronics.TC1, "TC 1", setup2.BasicSetup.Electronics.TC1, cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowCompare(setup1.BasicSetup.Electronics.TC2, "TC 2", setup2.BasicSetup.Electronics.TC2, cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowCompare(setup1.BasicSetup.Electronics.Abs, "ABS", setup2.BasicSetup.Electronics.Abs, cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowCompare(setup1.BasicSetup.Electronics.ECUMap + 1, "Engine map", setup2.BasicSetup.Electronics.ECUMap + 1, cells)); - Table electroTable = DocUtil.GetCenteredTable(headerWidthPercent, cells - 1); - electroTable.RowGroups.Add(rgElectro); - electronicsSection.Blocks.Add(electroTable); - electronicsSection.BorderBrush = Brushes.White; - electronicsSection.BorderThickness = new Thickness(0, 1, 0, 0); - flowDocument.Blocks.Add(electronicsSection); - - - //// Strategy - Section strategySection = new Section(); - TableRowGroup rgStrategy = new TableRowGroup(); - Paragraph strategyHeader = DocUtil.GetDefaultHeader("Strategy"); - strategyHeader.FontStyle = FontStyles.Italic; - rgStrategy.Rows.Add(DocUtil.GetTableRow(DocUtil.GetDefaultParagraph(), strategyHeader, DocUtil.GetDefaultParagraph(), cells)); - rgStrategy.Rows.Add(DocUtil.GetTableRowCompareWithLabels(frontOrRearLabels, new double[] { brakeCompoundFront1, brakeCompoundRear1 }, "Brake Compound", new double[] { brakeCompoundFront2, brakeCompoundRear2 }, cells)); - Table strategyTable = DocUtil.GetCenteredTable(headerWidthPercent, cells - 1); - strategyTable.RowGroups.Add(rgStrategy); - strategySection.Blocks.Add(strategyTable); - strategySection.BorderBrush = Brushes.White; - strategySection.BorderThickness = new Thickness(0, 1, 0, 1); - flowDocument.Blocks.Add(strategySection); - } - - } -} diff --git a/Race_Element/Controls/Setup/FlowDocUtil/FlowDocSetupRenderer.cs b/Race_Element/Controls/Setup/FlowDocUtil/FlowDocSetupRenderer.cs deleted file mode 100644 index 86f44d539..000000000 --- a/Race_Element/Controls/Setup/FlowDocUtil/FlowDocSetupRenderer.cs +++ /dev/null @@ -1,230 +0,0 @@ -using RaceElement.Controls.Setup.FlowDocUtil; -using RaceElement.Data; -using System.IO; -using System.Linq; -using System.Windows; -using System.Windows.Documents; -using System.Windows.Media; -using static RaceElement.Data.ConversionFactory; -using static RaceElement.Data.SetupConverter; -using static RaceElement.Data.SetupJson; - -namespace RaceElement.Controls.Setup -{ - public class FlowDocSetupRenderer - { - public void LogSetup(ref FlowDocument flowDocument, string file, bool logTrack = true) - { - flowDocument.Blocks.Clear(); - - Root setup = GetSetupJsonRoot(file); - if (setup == null) return; - - CarModels model = ConversionFactory.ParseCarName(setup.CarName); - if (model == CarModels.None) return; - ICarSetupConversion carSetup = ConversionFactory.GetConversion(model); - - if (carSetup == null) - return; - - TyreCompound compound = carSetup.TyresSetup.Compound(setup.BasicSetup.Tyres.TyreCompound); - - // Allignment / Tyre Setup - double frontLeftPressure = carSetup.TyresSetup.TirePressure(carSetup.DryTyreCompound, Wheel.FrontLeft, setup.BasicSetup.Tyres.TyrePressure); - double frontRightPressure = carSetup.TyresSetup.TirePressure(carSetup.DryTyreCompound, Wheel.FrontRight, setup.BasicSetup.Tyres.TyrePressure); - double rearLeftPressure = carSetup.TyresSetup.TirePressure(carSetup.DryTyreCompound, Wheel.RearLeft, setup.BasicSetup.Tyres.TyrePressure); - double rearRightPressure = carSetup.TyresSetup.TirePressure(carSetup.DryTyreCompound, Wheel.RearRight, setup.BasicSetup.Tyres.TyrePressure); - - double frontLeftCaster = carSetup.TyresSetup.Caster(setup.BasicSetup.Alignment.CasterLF); - double frontRightCaster = carSetup.TyresSetup.Caster(setup.BasicSetup.Alignment.CasterRF); - - double frontLeftToe = carSetup.TyresSetup.Toe(Wheel.FrontLeft, setup.BasicSetup.Alignment.Toe); - double frontRightToe = carSetup.TyresSetup.Toe(Wheel.FrontRight, setup.BasicSetup.Alignment.Toe); - double rearLeftToe = carSetup.TyresSetup.Toe(Wheel.RearLeft, setup.BasicSetup.Alignment.Toe); - double rearRightToe = carSetup.TyresSetup.Toe(Wheel.RearRight, setup.BasicSetup.Alignment.Toe); - - double camberFrontLeft = carSetup.TyresSetup.Camber(Wheel.FrontLeft, setup.BasicSetup.Alignment.Camber); - double camberFrontRight = carSetup.TyresSetup.Camber(Wheel.FrontRight, setup.BasicSetup.Alignment.Camber); - double camberRearLeft = carSetup.TyresSetup.Camber(Wheel.RearLeft, setup.BasicSetup.Alignment.Camber); - double camberRearRight = carSetup.TyresSetup.Camber(Wheel.RearRight, setup.BasicSetup.Alignment.Camber); - - // Mechnical Setup - int wheelRateFrontLeft = carSetup.MechanicalSetup.WheelRate(setup.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.FrontLeft); - int wheelRateFrontRight = carSetup.MechanicalSetup.WheelRate(setup.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.FrontRight); - int wheelRateRearLeft = carSetup.MechanicalSetup.WheelRate(setup.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.RearLeft); - int wheelRateRearRight = carSetup.MechanicalSetup.WheelRate(setup.AdvancedSetup.MechanicalBalance.WheelRate, Wheel.RearRight); - - int bumpStopRateFrontLeft = carSetup.MechanicalSetup.BumpstopRate(setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.FrontLeft); - int bumpStopRateFrontRight = carSetup.MechanicalSetup.BumpstopRate(setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.FrontRight); - int bumpStopRateRearLeft = carSetup.MechanicalSetup.BumpstopRate(setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.RearLeft); - int bumpStopRateRearRight = carSetup.MechanicalSetup.BumpstopRate(setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp, Wheel.RearRight); - - int bumpStopRangeFrontLeft = carSetup.MechanicalSetup.BumpstopRange(setup.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.FrontLeft); - int bumpStopRangeFrontRight = carSetup.MechanicalSetup.BumpstopRange(setup.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.FrontRight); - int bumpStopRangeRearLeft = carSetup.MechanicalSetup.BumpstopRange(setup.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.RearLeft); - int bumpStopRangeRearRight = carSetup.MechanicalSetup.BumpstopRange(setup.AdvancedSetup.MechanicalBalance.BumpStopWindow, Wheel.RearRight); - - int differentialPreload = carSetup.MechanicalSetup.PreloadDifferential(setup.AdvancedSetup.Drivetrain.Preload); - - int brakePower = carSetup.MechanicalSetup.BrakePower(setup.AdvancedSetup.MechanicalBalance.BrakeTorque); - double brakeBias = carSetup.MechanicalSetup.BrakeBias(setup.AdvancedSetup.MechanicalBalance.BrakeBias); - int antiRollBarFront = carSetup.MechanicalSetup.AntiRollBarFront(setup.AdvancedSetup.MechanicalBalance.ARBFront); - int antiRollBarRear = carSetup.MechanicalSetup.AntiRollBarFront(setup.AdvancedSetup.MechanicalBalance.ARBRear); - double steeringRatio = carSetup.MechanicalSetup.SteeringRatio(setup.BasicSetup.Alignment.SteerRatio); - - // Dampers - int bumpSlowFrontLeft = carSetup.DamperSetup.BumpSlow(setup.AdvancedSetup.Dampers.BumpSlow, Wheel.FrontLeft); - int bumpSlowFrontRight = carSetup.DamperSetup.BumpSlow(setup.AdvancedSetup.Dampers.BumpSlow, Wheel.FrontRight); - int bumpSlowRearLeft = carSetup.DamperSetup.BumpSlow(setup.AdvancedSetup.Dampers.BumpSlow, Wheel.RearLeft); - int bumpSlowRearRight = carSetup.DamperSetup.BumpSlow(setup.AdvancedSetup.Dampers.BumpSlow, Wheel.RearRight); - - int bumpFastFrontLeft = carSetup.DamperSetup.BumpFast(setup.AdvancedSetup.Dampers.BumpFast, Wheel.FrontLeft); - int bumpFastFrontRight = carSetup.DamperSetup.BumpFast(setup.AdvancedSetup.Dampers.BumpFast, Wheel.FrontRight); - int bumpFastRearLeft = carSetup.DamperSetup.BumpFast(setup.AdvancedSetup.Dampers.BumpFast, Wheel.RearLeft); - int bumpFastRearRight = carSetup.DamperSetup.BumpFast(setup.AdvancedSetup.Dampers.BumpFast, Wheel.RearRight); - - int reboundSlowFrontLeft = carSetup.DamperSetup.ReboundSlow(setup.AdvancedSetup.Dampers.ReboundSlow, Wheel.FrontLeft); - int reboundSlowFrontRight = carSetup.DamperSetup.ReboundSlow(setup.AdvancedSetup.Dampers.ReboundSlow, Wheel.FrontRight); - int reboundSlowRearLeft = carSetup.DamperSetup.ReboundSlow(setup.AdvancedSetup.Dampers.ReboundSlow, Wheel.RearLeft); - int reboundSlowRearRight = carSetup.DamperSetup.ReboundSlow(setup.AdvancedSetup.Dampers.ReboundSlow, Wheel.RearRight); - - int reboundFastFrontLeft = carSetup.DamperSetup.ReboundFast(setup.AdvancedSetup.Dampers.ReboundFast, Wheel.FrontLeft); - int reboundFastFrontRight = carSetup.DamperSetup.ReboundFast(setup.AdvancedSetup.Dampers.ReboundFast, Wheel.FrontRight); - int reboundFastRearLeft = carSetup.DamperSetup.ReboundFast(setup.AdvancedSetup.Dampers.ReboundFast, Wheel.RearLeft); - int reboundFastRearRight = carSetup.DamperSetup.ReboundFast(setup.AdvancedSetup.Dampers.ReboundFast, Wheel.RearRight); - - // Aero Balance - int rideHeightFront = carSetup.AeroBalance.RideHeight(setup.AdvancedSetup.AeroBalance.RideHeight, Position.Front); - int rideHeightRear = carSetup.AeroBalance.RideHeight(setup.AdvancedSetup.AeroBalance.RideHeight, Position.Rear); - int rearWing = carSetup.AeroBalance.RearWing(setup.AdvancedSetup.AeroBalance.RearWing); - int splitter = carSetup.AeroBalance.Splitter(setup.AdvancedSetup.AeroBalance.Splitter); - int brakeDuctsFront = setup.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Front]; - int brakeDuctsRear = setup.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Rear]; - - // Strategy - int brakeCompoundFront = setup.BasicSetup.Strategy.FrontBrakePadCompound + 1; - int brakeCompoundRear = setup.BasicSetup.Strategy.FrontBrakePadCompound + 1; - - - const int cells = 8; - const int headerWidthPercent = 18; - string[] tyreLocationLabels = new string[] { "FL: ", "FR: ", "RL: ", "RR: " }; - string[] frontOrRearLabels = new string[] { "Front: ", "Rear: " }; - - - Section setupTitle = new Section(); - setupTitle.Blocks.Add(DocUtil.GetDefaultHeader(20, $"{new FileInfo(file).Name.Replace(".json", "")}")); - setupTitle.BorderBrush = Brushes.White; - setupTitle.BorderThickness = new Thickness(1); - setupTitle.Margin = new Thickness(0, 0, 0, 4); - setupTitle.Padding = new Thickness(0); - flowDocument.Blocks.Add(setupTitle); - - //// Setup Info Section - Table setupInfoTable = DocUtil.GetLeftAllignedTable(headerWidthPercent, cells); - TableRowGroup rowGroupSetupInfo = new TableRowGroup(); - if (logTrack) - rowGroupSetupInfo.Rows.Add(DocUtil.GetTableRowLeft("Track", $"{DocUtil.GetTrackName(file)}", cells, true)); - rowGroupSetupInfo.Rows.Add(DocUtil.GetTableRowLeft("Car", $"{CarModelToCarName[carSetup.CarModel]}", cells, true)); - rowGroupSetupInfo.Rows.Add(DocUtil.GetTableRowLeft("Class", $"{carSetup.CarClass}", cells, true)); - setupInfoTable.RowGroups.Add(rowGroupSetupInfo); - Section setupSection = new Section(); - setupInfoTable.BorderBrush = Brushes.DarkGray; - setupInfoTable.BorderThickness = new Thickness(0, 0, 0, 1); - setupSection.Blocks.Add(setupInfoTable); - flowDocument.Blocks.Add(setupSection); - - //// Tyres Section - Section tyresSection = new Section(); - TableRowGroup rgTyres = new TableRowGroup(); - rgTyres.Rows.Add(DocUtil.GetTableRowLeftTitle("Tyres Setup", cells)); - rgTyres.Rows.Add(DocUtil.GetTableRowLeft("Compound", $"{compound}", cells, true)); - rgTyres.Rows.Add(DocUtil.GetTableRowLeft("Pressures(psi)", tyreLocationLabels, new double[] { frontLeftPressure, frontRightPressure, rearLeftPressure, rearRightPressure }, cells, 1)); - rgTyres.Rows.Add(DocUtil.GetTableRowLeft("Toe(°)", tyreLocationLabels, new double[] { frontLeftToe, frontRightToe, rearLeftToe, rearRightToe }, cells, 2)); - rgTyres.Rows.Add(DocUtil.GetTableRowLeft("Camber(°)", tyreLocationLabels, new double[] { camberFrontLeft, camberFrontRight, camberRearLeft, camberRearRight }, cells, 1)); - rgTyres.Rows.Add(DocUtil.GetTableRowLeft("Caster(°)", tyreLocationLabels.Take(2).ToArray(), new double[] { frontLeftCaster, frontRightCaster }, cells, 1)); - Table tyresSetupTable = DocUtil.GetLeftAllignedTable(headerWidthPercent, cells); - tyresSetupTable.RowGroups.Add(rgTyres); - tyresSection.Blocks.Add(tyresSetupTable); - tyresSection.BorderBrush = Brushes.DarkGray; - tyresSection.BorderThickness = new Thickness(0, 0, 0, 1); - flowDocument.Blocks.Add(tyresSection); - - //// Mechanical Grip Section - Section gripSection = new Section(); - TableRowGroup rgGrip = new TableRowGroup(); - rgGrip.Rows.Add(DocUtil.GetTableRowLeftTitle("Mechanical Grip", cells)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Wheelrates(Nm)", tyreLocationLabels, new double[] { wheelRateFrontLeft, wheelRateFrontRight, wheelRateRearLeft, wheelRateRearRight }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Bumpstop Rate(Nm)", tyreLocationLabels, new double[] { bumpStopRateFrontLeft, bumpStopRateFrontRight, bumpStopRateRearLeft, bumpStopRateRearRight }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Bumpstop Range", tyreLocationLabels, new double[] { bumpStopRangeFrontLeft, bumpStopRangeFrontRight, bumpStopRangeRearLeft, bumpStopRangeRearRight }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Anti roll bar", frontOrRearLabels, new double[] { antiRollBarFront, antiRollBarRear }, cells, 0)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Diff Preload(Nm)", differentialPreload, cells)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Brake Power(%)", brakePower, cells)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Brake Bias(%)", brakeBias, cells, 1)); - rgGrip.Rows.Add(DocUtil.GetTableRowLeft("Steering Ratio", steeringRatio, cells)); - Table gripTable = DocUtil.GetLeftAllignedTable(headerWidthPercent, cells); ; - gripTable.RowGroups.Add(rgGrip); - gripSection.Blocks.Add(gripTable); - gripSection.BorderBrush = Brushes.DarkGray; - gripSection.BorderThickness = new Thickness(0, 0, 0, 1); - flowDocument.Blocks.Add(gripSection); - - //// Dampers Section - Section dampersSection = new Section(); - TableRowGroup rgDampers = new TableRowGroup(); - rgDampers.Rows.Add(DocUtil.GetTableRowLeftTitle("Dampers", cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowLeft("Bump Slow", tyreLocationLabels, new double[] { bumpSlowFrontLeft, bumpSlowFrontRight, bumpSlowRearLeft, bumpSlowRearRight }, cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowLeft("Bump Fast", tyreLocationLabels, new double[] { bumpFastFrontLeft, bumpFastFrontRight, bumpFastRearLeft, bumpFastRearRight }, cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowLeft("Rebound Slow", tyreLocationLabels, new double[] { reboundSlowFrontLeft, reboundSlowFrontRight, reboundSlowRearLeft, reboundSlowRearRight }, cells)); - rgDampers.Rows.Add(DocUtil.GetTableRowLeft("Rebound Fast", tyreLocationLabels, new double[] { reboundFastFrontLeft, reboundFastFrontRight, reboundFastRearLeft, reboundFastRearRight }, cells)); - Table dampersTable = DocUtil.GetLeftAllignedTable(headerWidthPercent, cells); - dampersTable.RowGroups.Add(rgDampers); - dampersSection.Blocks.Add(dampersTable); - dampersSection.BorderBrush = Brushes.DarkGray; - dampersSection.BorderThickness = new Thickness(0, 0, 0, 1); - flowDocument.Blocks.Add(dampersSection); - - //// Aero - Section aeroBalanceSection = new Section(); - TableRowGroup rgAero = new TableRowGroup(); - rgAero.Rows.Add(DocUtil.GetTableRowLeftTitle("Aero Balance", cells)); - rgAero.Rows.Add(DocUtil.GetTableRowLeft("Ride height(mm)", frontOrRearLabels, new double[] { rideHeightFront, rideHeightRear }, cells)); - rgAero.Rows.Add(DocUtil.GetTableRowLeft("Splitter", splitter, cells)); - rgAero.Rows.Add(DocUtil.GetTableRowLeft("Rear Wing", rearWing, cells)); - rgAero.Rows.Add(DocUtil.GetTableRowLeft("Brake ducts", frontOrRearLabels, new double[] { brakeDuctsFront, brakeDuctsRear }, cells)); - Table aeroTable = DocUtil.GetLeftAllignedTable(headerWidthPercent, cells); - aeroTable.RowGroups.Add(rgAero); - aeroBalanceSection.Blocks.Add(aeroTable); - aeroBalanceSection.BorderBrush = Brushes.DarkGray; - aeroBalanceSection.BorderThickness = new Thickness(0, 0, 0, 1); - flowDocument.Blocks.Add(aeroBalanceSection); - - //// Electronics - Section electronicsSection = new Section(); - TableRowGroup rgElectro = new TableRowGroup(); - rgElectro.Rows.Add(DocUtil.GetTableRowLeftTitle("Electronics", cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowLeft("TC 1", setup.BasicSetup.Electronics.TC1, cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowLeft("TC 2", setup.BasicSetup.Electronics.TC2, cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowLeft("ABS", setup.BasicSetup.Electronics.Abs, cells)); - rgElectro.Rows.Add(DocUtil.GetTableRowLeft("Engine map", setup.BasicSetup.Electronics.ECUMap + 1, cells)); - Table electroTable = DocUtil.GetLeftAllignedTable(headerWidthPercent, cells); - electroTable.RowGroups.Add(rgElectro); - electronicsSection.Blocks.Add(electroTable); - electronicsSection.BorderBrush = Brushes.DarkGray; - electronicsSection.BorderThickness = new Thickness(0, 0, 0, 1); - flowDocument.Blocks.Add(electronicsSection); - - //// Strategy - Section strategySection = new Section(); - TableRowGroup rgStrategy = new TableRowGroup(); - rgStrategy.Rows.Add(DocUtil.GetTableRowLeftTitle("Strategy", cells)); - rgStrategy.Rows.Add(DocUtil.GetTableRowLeft("Brake Compound", frontOrRearLabels, new double[] { brakeCompoundFront, brakeCompoundRear }, cells)); - Table strategyTable = DocUtil.GetLeftAllignedTable(headerWidthPercent, cells); - strategyTable.RowGroups.Add(rgStrategy); - strategySection.Blocks.Add(strategyTable); - strategySection.BorderBrush = Brushes.DarkGray; - strategySection.BorderThickness = new Thickness(0, 0, 0, 1); - flowDocument.Blocks.Add(strategySection); - } - } -} diff --git a/Race_Element/Controls/Setup/SetupBrowser.xaml b/Race_Element/Controls/Setup/SetupBrowser.xaml deleted file mode 100644 index 33d2596d0..000000000 --- a/Race_Element/Controls/Setup/SetupBrowser.xaml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Setup/SetupBrowser.xaml.cs b/Race_Element/Controls/Setup/SetupBrowser.xaml.cs deleted file mode 100644 index d32a002ce..000000000 --- a/Race_Element/Controls/Setup/SetupBrowser.xaml.cs +++ /dev/null @@ -1,405 +0,0 @@ -using RaceElement.Controls.Setup; -using RaceElement.Util; -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using static RaceElement.Data.SetupJson; -using static RaceElement.Data.ConversionFactory; -using RaceElement.Util.SystemExtensions; -using System.Collections.Generic; -using System.Threading; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for SetupBrowser.xaml - /// - public partial class SetupBrowser : UserControl - { - public static SetupBrowser Instance { get; set; } - - private readonly string SetupsPath = FileUtil.AccPath + "Setups\\"; - - private readonly FlowDocSetupRenderer _setupRenderer; - private string _selectedSetup; - - private Dictionary> _expandedHeaders = new Dictionary>(); - - public SetupBrowser() - { - InitializeComponent(); - - _setupRenderer = new FlowDocSetupRenderer(); - ThreadPool.QueueUserWorkItem(x => - { - FetchAllSetups(); - }); - setupsTreeView.SelectedItemChanged += SetupsTreeView_SelectedItemChanged; - - buttonEditSetup.Click += (o, e) => - { - if (_selectedSetup != null) - SetupEditor.Instance.Open(_selectedSetup); - }; - - Instance = this; - } - - - private void SetupsTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) - { - if (e.NewValue != null) - { - if (e.NewValue.GetType() == typeof(TreeViewItem)) - { - TreeViewItem item = (TreeViewItem)e.NewValue; - if (item.DataContext != null) - { - if (item.DataContext.GetType() == typeof(FileInfo)) - { - FileInfo file = (FileInfo)item.DataContext; - _selectedSetup = file.FullName; - - Root root = GetSetupJsonRoot(file); - if (root == null) - return; - -#if DEBUG - // make edit button visible depending on whether there is a setup changer avaiable for the car - if (GetChanger(ParseCarName(root.CarName)) == null) - { - buttonEditSetup.Visibility = Visibility.Hidden; - } - else - { - - buttonEditSetup.Visibility = Visibility.Visible; - } -#endif - - _setupRenderer.LogSetup(ref flowDocument, file.FullName); - e.Handled = true; - } - } - } - } - } - - internal void FetchAllSetups() - { - try - { - DirectoryInfo setupsDirectory = new DirectoryInfo(SetupsPath); - - if (!setupsDirectory.Exists) - return; - - Dispatcher.BeginInvoke(new Action(() => - { - setupsTreeView.Items.Clear(); - - // Find car directories - foreach (var carDir in setupsDirectory.GetDirectories()) - { - if (carDir.GetDirectories().Any() && !carDir.Name.Contains(".git")) - { - bool carHasSetups = false; - - // Make Car Tree View Item - TextBlock carHeader = new TextBlock() - { - Text = CarModelToCarName[ParseCarName(carDir.Name)], - Style = Resources["MaterialDesignSubtitle1TextBlock"] as Style, - }; - TreeViewItem carTreeViewItem = new TreeViewItem() - { - Header = carHeader, - Background = new SolidColorBrush(Color.FromArgb(38, 10, 0, 0)), - }; - carTreeViewItem.MouseLeftButtonUp += (s, e) => - { - carTreeViewItem.IsExpanded = !carTreeViewItem.IsExpanded; - if (s == carTreeViewItem) - e.Handled = true; - }; - carTreeViewItem.ContextMenu = GetCarContextMenu(carDir); - carTreeViewItem.Expanded += (s, e) => - { - if (!_expandedHeaders.ContainsKey(carHeader.Text)) - _expandedHeaders.Add(carHeader.Text, new List()); - }; - carTreeViewItem.Collapsed += (s, e) => - { - if (s == carTreeViewItem) - if (_expandedHeaders.ContainsKey(carHeader.Text)) - _expandedHeaders.Remove(carHeader.Text); - }; - - if (_expandedHeaders.ContainsKey(carHeader.Text)) carTreeViewItem.IsExpanded = true; - - // find track directories in car dir - foreach (var trackDir in carDir.GetDirectories()) - { - bool trackHasSetups = false; - - string trackName = trackDir.Name; - trackName = Regex.Replace(trackName, "^[a-z]", m => m.Value.ToUpper()); - trackName = trackName.Replace("_", " "); - TextBlock trackHeader = new TextBlock() - { - Text = trackName, - Style = Resources["MaterialDesignSubtitle2TextBlock"] as Style, - }; - TreeViewItem trackTreeViewItem = new TreeViewItem() - { - Header = trackHeader, - DataContext = trackDir, - Background = new SolidColorBrush(Color.FromArgb(19, 0, 0, 0)), - }; - trackTreeViewItem.MouseLeftButtonUp += (s, e) => - { - trackTreeViewItem.IsExpanded = !trackTreeViewItem.IsExpanded; - if (s == trackTreeViewItem) - e.Handled = true; - }; - trackTreeViewItem.Expanded += (s, e) => - { - if (_expandedHeaders.ContainsKey(carHeader.Text) && !_expandedHeaders[carHeader.Text].Contains(trackName)) - _expandedHeaders[carHeader.Text].Add(trackName); - - int targetItemInView = trackTreeViewItem.Items.Count; - targetItemInView.ClipMax(18); - if (targetItemInView > 0) - ((TreeViewItem)trackTreeViewItem.Items.GetItemAt(targetItemInView - 1)).BringIntoView(); - }; - trackTreeViewItem.Collapsed += (s, e) => - { - if (_expandedHeaders.ContainsKey(carHeader.Text)) - _expandedHeaders[carHeader.Text].Remove(trackName); - e.Handled = true; - }; - trackTreeViewItem.ContextMenu = GetTrackContextMenu(trackDir); - - if (_expandedHeaders.ContainsKey(carHeader.Text) && _expandedHeaders[carHeader.Text].Contains(trackName)) - trackTreeViewItem.IsExpanded = true; - - // find setups in track dir - foreach (var trackFile in trackDir.GetFiles()) - { - if (trackFile.Extension.Equals(".json")) - { - TextBlock setupHeader = new TextBlock() - { - Text = trackFile.Name.Replace(".json", ""), - Style = Resources["MaterialDesignDataGridTextColumnStyle"] as Style - }; - TreeViewItem setupTreeViewItem = new TreeViewItem() - { - Header = setupHeader, - DataContext = trackFile, - }; - setupTreeViewItem.MouseLeftButtonUp += (s, e) => e.Handled = true; - - setupTreeViewItem.ContextMenu = GetCompareContextMenu(trackFile); - - trackTreeViewItem.Items.Add(setupTreeViewItem); - } - } - - // check for any setups so the tree view doesn't get cluttered with cars that have no setups - if (trackTreeViewItem.Items.Count > 0) - { - carHasSetups = true; - trackHasSetups = true; - } - - if (trackHasSetups) - carTreeViewItem.Items.Add(trackTreeViewItem); - } - - if (carHasSetups) - setupsTreeView.Items.Add(carTreeViewItem); - } - } - })); - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - Debug.WriteLine(ex); - } - } - - private ContextMenu GetCarContextMenu(DirectoryInfo directory) - { - ContextMenu menu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)) - }; - - - Button openFolder = new Button() - { - Content = "Open in explorer", - CommandParameter = directory, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - openFolder.Click += OpenFolder_Click; - - menu.Items.Add(openFolder); - - return menu; - } - - private ContextMenu GetTrackContextMenu(DirectoryInfo directory) - { - ContextMenu menu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)) - }; - - - Button openFolder = new Button() - { - Content = "Open in explorer", - CommandParameter = directory, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - openFolder.Click += OpenFolder_Click; - - menu.Items.Add(openFolder); - - return menu; - } - - private void OpenFolder_Click(object sender, RoutedEventArgs e) - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - DirectoryInfo directory = (DirectoryInfo)button.CommandParameter; - Process.Start(directory.FullName); - - (button.Parent as ContextMenu).IsOpen = false; - } - } - - private ContextMenu GetCompareContextMenu(FileInfo file) - { - ContextMenu contextMenu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)), - }; - - Button addToCompare1 = new Button() - { - Content = "Add to compare 1", - CommandParameter = file, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - addToCompare1.Click += AddToCompare1_Click; - - Button addToCompare2 = new Button() - { - Content = "Add to compare 2", - CommandParameter = file, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - addToCompare2.Click += AddToCompare2_Click; - - contextMenu.Items.Add(addToCompare1); - contextMenu.Items.Add(addToCompare2); - - Button copyToOtherTrack = new Button() - { - Content = "Copy to other track", - CommandParameter = file, - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - copyToOtherTrack.Click += CopyToOtherTrack_Click; - contextMenu.Items.Add(copyToOtherTrack); - - contextMenu.HorizontalOffset = 0; - contextMenu.VerticalOffset = 0; - - return contextMenu; - } - - private void CopyToOtherTrack_Click(object sender, RoutedEventArgs e) - { - if (sender is Button button) - { - FileInfo file = (FileInfo)button.DataContext; - - SetupImporter.Instance.Open(file.FullName, true); - - (button.Parent as ContextMenu).IsOpen = false; - } - } - - private void AddToCompare2_Click(object sender, RoutedEventArgs e) - { - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - SetupComparer.Instance.SetSetup2((FileInfo)button.CommandParameter); - - MainWindow.Instance.snackbar.MessageQueue.Clear(); - MainWindow.Instance.snackbar.MessageQueue.Enqueue("Added setup to compare 2"); - - (button.Parent as ContextMenu).IsOpen = false; - } - } - - private void AddToCompare1_Click(object sender, RoutedEventArgs e) - { - - if (sender.GetType() == typeof(Button)) - { - Button button = (Button)sender; - - SetupComparer.Instance.SetSetup1((FileInfo)button.CommandParameter); - - MainWindow.Instance.snackbar.MessageQueue.Clear(); - MainWindow.Instance.snackbar.MessageQueue.Enqueue("Added setup to compare 1"); - - (button.Parent as ContextMenu).IsOpen = false; - } - } - - } -} diff --git a/Race_Element/Controls/Setup/SetupComparer.xaml b/Race_Element/Controls/Setup/SetupComparer.xaml deleted file mode 100644 index befecaeb1..000000000 --- a/Race_Element/Controls/Setup/SetupComparer.xaml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Setup/SetupComparer.xaml.cs b/Race_Element/Controls/Setup/SetupComparer.xaml.cs deleted file mode 100644 index 5b8549321..000000000 --- a/Race_Element/Controls/Setup/SetupComparer.xaml.cs +++ /dev/null @@ -1,48 +0,0 @@ -using RaceElement.Controls.Setup; -using System.IO; -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for SetupComparer.xaml - /// - public partial class SetupComparer : UserControl - { - private readonly FlowDocCompareSetupRenderer setupRenderer = new FlowDocCompareSetupRenderer(); - private FileInfo Setup1 { get; set; } - private FileInfo Setup2 { get; set; } - - - public SetupComparer() - { - InitializeComponent(); - Instance = this; - } - - public void SetSetup1(FileInfo file) - { - this.Setup1 = file; - - UpdateComparison(); - //setupRenderer.LogSetup(ref flowDoc1, file.FullName); - } - - public void SetSetup2(FileInfo file) - { - this.Setup2 = file; - UpdateComparison(); - //setupRenderer.LogSetup(ref flowDoc2, file.FullName); - } - - private void UpdateComparison() - { - if (this.Setup1 != null && this.Setup2 != null) - { - this.setupRenderer.LogComparison(ref flowDocCompare, Setup1, Setup2); - } - } - - public static SetupComparer Instance { get; private set; } - } -} diff --git a/Race_Element/Controls/Setup/SetupEditor.xaml b/Race_Element/Controls/Setup/SetupEditor.xaml deleted file mode 100644 index 41024e703..000000000 --- a/Race_Element/Controls/Setup/SetupEditor.xaml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Setup/SetupEditor.xaml.cs b/Race_Element/Controls/Setup/SetupEditor.xaml.cs deleted file mode 100644 index 49610e6f5..000000000 --- a/Race_Element/Controls/Setup/SetupEditor.xaml.cs +++ /dev/null @@ -1,1192 +0,0 @@ -using System; -using System.Windows; -using System.Windows.Controls; -using System.IO; -using System.Diagnostics; -using Newtonsoft.Json; -using static RaceElement.Data.SetupConverter; -using RaceElement.Data; -using static RaceElement.Data.SetupJson; -using RaceElement.Data.SetupRanges; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for SetupEditor.xaml - /// - public partial class SetupEditor : UserControl - { - public static SetupEditor Instance { get; private set; } - - private ISetupChanger SetupChanger { get; set; } - private Root Setup { get; set; } - - public SetupEditor() - { - InitializeComponent(); - - buttonSave.Click += (o, e) => Save(); - buttonCancel.Click += (o, e) => Close(); - - Instance = this; - } - - public void Open(string file) - { - this.Setup = GetSetup(new FileInfo(file)); - - Instance.transitionEditPanel.Visibility = Visibility.Visible; - - ISetupChanger changer = ConversionFactory.GetChanger(ConversionFactory.ParseCarName(Setup.CarName)); - if (changer == null) - Close(); - - - EnableBrowser(false); - SetupChanger = changer; - CreateFields(); - } - - public void Save() - { - // Do save stuff here - - - Close(); - } - - private void EnableBrowser(bool enable) - { - SetupBrowser.Instance.setupsTreeView.IsEnabled = enable; - } - - public void Close() - { - EnableBrowser(true); - Instance.transitionEditPanel.Visibility = Visibility.Hidden; - } - - private void CreateFields() - { - FieldStackPanel.Children.Clear(); - - // Tyre Setup - int tyreLabelWidth = 110; - FieldStackPanel.Children.Add(GetTitle("Tyres Setup")); - FieldStackPanel.Children.Add(GetTyrePressureStacker(tyreLabelWidth)); - FieldStackPanel.Children.Add(GetToeStacker(tyreLabelWidth)); - FieldStackPanel.Children.Add(GetCamberStacker(tyreLabelWidth)); - FieldStackPanel.Children.Add(GetCasterStacker(tyreLabelWidth)); - - - // Electronics Setup - int ecuLabelWidth = tyreLabelWidth; - FieldStackPanel.Children.Add(GetTitle("Electronics Setup")); - FieldStackPanel.Children.Add(GetTractionControlStacker(ecuLabelWidth)); - FieldStackPanel.Children.Add(GetABSStacker(ecuLabelWidth)); - FieldStackPanel.Children.Add(GetEngineMapStacker(ecuLabelWidth)); - - - - // Mechanical Setup - int mechLabelWidth = tyreLabelWidth; - FieldStackPanel.Children.Add(GetTitle("Mechanical Setup")); - FieldStackPanel.Children.Add(GetWheelRatesStacker(mechLabelWidth)); - FieldStackPanel.Children.Add(GetBumpstopRateStacker(mechLabelWidth)); - FieldStackPanel.Children.Add(GetBumpstopRangeStacker(mechLabelWidth)); - FieldStackPanel.Children.Add(GetAntiRollBarStacker(mechLabelWidth)); - FieldStackPanel.Children.Add(GetDiffPreloadStacker(mechLabelWidth)); - FieldStackPanel.Children.Add(GetBrakePowerStacker(mechLabelWidth)); - FieldStackPanel.Children.Add(GetBrakeBiasStacker(mechLabelWidth)); - FieldStackPanel.Children.Add(GetSteeringRatioStacker(mechLabelWidth)); - - // Damper Setup - int damperLabelWidth = tyreLabelWidth; - FieldStackPanel.Children.Add(GetTitle("Damper Setup")); - FieldStackPanel.Children.Add(GetBumpSlowStacker(damperLabelWidth)); - FieldStackPanel.Children.Add(GetBumpFastStacker(damperLabelWidth)); - FieldStackPanel.Children.Add(GetReboundSlowStacker(damperLabelWidth)); - FieldStackPanel.Children.Add(GetReboundFastStacker(damperLabelWidth)); - - // Aero Setup - int aeroLabelWidth = tyreLabelWidth; - FieldStackPanel.Children.Add(GetTitle("Aero Setup")); - FieldStackPanel.Children.Add(GetRideHeightStacker(aeroLabelWidth)); - FieldStackPanel.Children.Add(GetAeroSurfaceStacker(aeroLabelWidth)); - FieldStackPanel.Children.Add(GetBrakeDuctStacker(aeroLabelWidth)); - - - } - - #region AeroSetupChanger - - private Grid GetAeroSurfaceStacker(int labelWidth) - { - Grid grid = GetMainGrid("Aero", labelWidth); - - - int blockWidth = 50; - Grid settings = GetGrid(2, blockWidth + 45); - Grid.SetColumn(settings, 2); - - - // Front - StackPanel stackerFront = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFront.Children.Add(new Label() { Content = "Splitter" }); - ComboBox comboSplitter = new ComboBox() { Width = blockWidth - 11, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboSplitter.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.AeroSetupChanger.Splitter); - comboSplitter.SelectedIndex = Setup.AdvancedSetup.AeroBalance.Splitter; - comboSplitter.SelectionChanged += (s, e) => { Setup.AdvancedSetup.AeroBalance.Splitter = comboSplitter.SelectedIndex; }; - stackerFront.Children.Add(comboSplitter); - Grid.SetColumn(stackerFront, 0); - - // Rear - StackPanel stackerRear = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRear.Children.Add(new Label() { Content = "Wing" }); - ComboBox comboRear = new ComboBox() { Width = blockWidth + 1, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboRear.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.AeroSetupChanger.RearWing); - comboRear.SelectedIndex = Setup.AdvancedSetup.AeroBalance.RearWing; - comboRear.SelectionChanged += (s, e) => { Setup.AdvancedSetup.AeroBalance.RearWing = comboRear.SelectedIndex; }; - stackerRear.Children.Add(comboRear); - Grid.SetColumn(stackerRear, 1); - - - settings.Children.Add(stackerFront); - settings.Children.Add(stackerRear); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetBrakeDuctStacker(int labelWidth) - { - Grid grid = GetMainGrid("Brake Ducts", labelWidth); - - int blockWidth = 50; - - Grid settings = GetGrid(2, blockWidth + 45); - Grid.SetColumn(settings, 1); - - - // Front - StackPanel stackerFront = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFront.Children.Add(new Label() { Content = "Front" }); - ComboBox comboFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.AeroSetupChanger.BrakeDucts); - comboFL.SelectedIndex = Setup.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Front]; - comboFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Front] = comboFL.SelectedIndex; }; - stackerFront.Children.Add(comboFL); - Grid.SetColumn(stackerFront, 0); - - // Rear - StackPanel stackerRear = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRear.Children.Add(new Label() { Content = "Rear" }); - ComboBox comboFR = new ComboBox() { Width = blockWidth + 4, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.AeroSetupChanger.BrakeDucts); - comboFR.SelectedIndex = Setup.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Rear]; - comboFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.AeroBalance.BrakeDuct[(int)Position.Rear] = comboFR.SelectedIndex; }; - stackerRear.Children.Add(comboFR); - Grid.SetColumn(stackerRear, 1); - - - settings.Children.Add(stackerFront); - settings.Children.Add(stackerRear); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetRideHeightStacker(int labelWidth) - { - Grid grid = GetMainGrid("Ride Height", labelWidth); - - int blockWidth = 50; - - Grid settings = GetGrid(2, blockWidth + 45); - Grid.SetColumn(settings, 1); - - - // Front - StackPanel stackerFront = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFront.Children.Add(new Label() { Content = "Front" }); - ComboBox comboFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.AeroSetupChanger.RideHeightFront); - comboFL.SelectedIndex = Setup.AdvancedSetup.AeroBalance.RideHeight[0]; - comboFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.AeroBalance.RideHeight[0] = comboFL.SelectedIndex; }; - stackerFront.Children.Add(comboFL); - Grid.SetColumn(stackerFront, 0); - - // Rear - StackPanel stackerRear = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRear.Children.Add(new Label() { Content = "Rear" }); - ComboBox comboFR = new ComboBox() { Width = blockWidth + 4, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.AeroSetupChanger.RideHeightRear); - comboFR.SelectedIndex = Setup.AdvancedSetup.AeroBalance.RideHeight[2]; - comboFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.AeroBalance.RideHeight[2] = comboFR.SelectedIndex; }; - stackerRear.Children.Add(comboFR); - Grid.SetColumn(stackerRear, 1); - - - settings.Children.Add(stackerFront); - settings.Children.Add(stackerRear); - - grid.Children.Add(settings); - - return grid; - } - - #endregion - - #region DamperSetupChanger - - private Grid GetReboundFastStacker(int labelWidth) - { - Grid grid = GetMainGrid("Rebound Fast", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboPressureFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundFast); - comboPressureFL.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.FrontLeft]; - comboPressureFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.FrontLeft] = comboPressureFL.SelectedIndex; }; - stackerFL.Children.Add(comboPressureFL); - Grid.SetColumn(stackerFL, 0); - - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboPressureFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundFast); - comboPressureFR.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.FrontRight]; - comboPressureFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.FrontRight] = comboPressureFR.SelectedIndex; }; - stackerFR.Children.Add(comboPressureFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboPressureRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundFast); - comboPressureRL.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.RearLeft]; - comboPressureRL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.RearLeft] = comboPressureRL.SelectedIndex; }; - stackerRL.Children.Add(comboPressureRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboPressureRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundFast); - comboPressureRR.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.RearRight]; - comboPressureRR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundFast[(int)Wheel.RearRight] = comboPressureRR.SelectedIndex; }; - stackerRR.Children.Add(comboPressureRR); - Grid.SetColumn(stackerRR, 3); - - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetReboundSlowStacker(int labelWidth) - { - Grid grid = GetMainGrid("Rebound Slow", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboPressureFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundSlow); - comboPressureFL.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.FrontLeft]; - comboPressureFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.FrontLeft] = comboPressureFL.SelectedIndex; }; - stackerFL.Children.Add(comboPressureFL); - Grid.SetColumn(stackerFL, 0); - - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboPressureFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundSlow); - comboPressureFR.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.FrontRight]; - comboPressureFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.FrontRight] = comboPressureFR.SelectedIndex; }; - stackerFR.Children.Add(comboPressureFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboPressureRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundSlow); - comboPressureRL.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.RearLeft]; - comboPressureRL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.RearLeft] = comboPressureRL.SelectedIndex; }; - stackerRL.Children.Add(comboPressureRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboPressureRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.ReboundSlow); - comboPressureRR.SelectedIndex = Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.RearRight]; - comboPressureRR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.ReboundSlow[(int)Wheel.RearRight] = comboPressureRR.SelectedIndex; }; - stackerRR.Children.Add(comboPressureRR); - Grid.SetColumn(stackerRR, 3); - - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetBumpSlowStacker(int labelWidth) - { - Grid grid = GetMainGrid("Bump Slow", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboPressureFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpSlow); - comboPressureFL.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.FrontLeft]; - comboPressureFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.FrontLeft] = comboPressureFL.SelectedIndex; }; - stackerFL.Children.Add(comboPressureFL); - Grid.SetColumn(stackerFL, 0); - - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboPressureFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpSlow); - comboPressureFR.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.FrontRight]; - comboPressureFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.FrontRight] = comboPressureFR.SelectedIndex; }; - stackerFR.Children.Add(comboPressureFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboPressureRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpSlow); - comboPressureRL.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.RearLeft]; - comboPressureRL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.RearLeft] = comboPressureRL.SelectedIndex; }; - stackerRL.Children.Add(comboPressureRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboPressureRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpSlow); - comboPressureRR.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.RearRight]; - comboPressureRR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpSlow[(int)Wheel.RearRight] = comboPressureRR.SelectedIndex; }; - stackerRR.Children.Add(comboPressureRR); - Grid.SetColumn(stackerRR, 3); - - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetBumpFastStacker(int labelWidth) - { - Grid grid = GetMainGrid("Bump Fast", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboPressureFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpFast); - comboPressureFL.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.FrontLeft]; - comboPressureFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.FrontLeft] = comboPressureFL.SelectedIndex; }; - stackerFL.Children.Add(comboPressureFL); - Grid.SetColumn(stackerFL, 0); - - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboPressureFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpFast); - comboPressureFR.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.FrontRight]; - comboPressureFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.FrontRight] = comboPressureFR.SelectedIndex; }; - stackerFR.Children.Add(comboPressureFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboPressureRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpFast); - comboPressureRL.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.RearLeft]; - comboPressureRL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.RearLeft] = comboPressureRL.SelectedIndex; }; - stackerRL.Children.Add(comboPressureRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboPressureRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.DamperSetupChanger.BumpFast); - comboPressureRR.SelectedIndex = Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.RearRight]; - comboPressureRR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Dampers.BumpFast[(int)Wheel.RearRight] = comboPressureRR.SelectedIndex; }; - stackerRR.Children.Add(comboPressureRR); - Grid.SetColumn(stackerRR, 3); - - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - - #endregion - - #region ElectronicsSetupChanger - - - private Grid GetEngineMapStacker(int labelWidth) - { - Grid grid = GetMainGrid("Engine Map", labelWidth); - - Grid settings = GetGrid(1, 95); - Grid.SetColumn(settings, 1); - - - StackPanel stackerEcuMap = new StackPanel { Orientation = Orientation.Horizontal }; - ComboBox comboEcuMap = new ComboBox() { Width = 88, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboEcuMap.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.ElectronicsSetupChanger.EcuMap); - comboEcuMap.SelectedIndex = Setup.BasicSetup.Electronics.ECUMap; - comboEcuMap.SelectionChanged += (s, e) => { Setup.BasicSetup.Electronics.ECUMap = comboEcuMap.SelectedIndex; }; - stackerEcuMap.Children.Add(comboEcuMap); - Grid.SetColumn(stackerEcuMap, 0); - - - settings.Children.Add(stackerEcuMap); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetABSStacker(int labelWidth) - { - Grid grid = GetMainGrid("ABS", labelWidth); - - Grid settings = GetGrid(1, 95); - Grid.SetColumn(settings, 1); - - - StackPanel stackerABS = new StackPanel { Orientation = Orientation.Horizontal }; - ComboBox comboABS = new ComboBox() { Width = 88, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboABS.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.ElectronicsSetupChanger.ABS); - comboABS.SelectedIndex = Setup.BasicSetup.Electronics.Abs; - comboABS.SelectionChanged += (s, e) => { Setup.BasicSetup.Electronics.Abs = comboABS.SelectedIndex; }; - stackerABS.Children.Add(comboABS); - Grid.SetColumn(stackerABS, 0); - - - settings.Children.Add(stackerABS); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetTractionControlStacker(int labelWidth) - { - Grid grid = GetMainGrid("Traction Control", labelWidth); - - Grid settings = GetGrid(2, 95); - Grid.SetColumn(settings, 2); - - - StackPanel stackerTC = new StackPanel { Orientation = Orientation.Horizontal }; - stackerTC.Children.Add(new Label() { Content = "TC1", ToolTip = "Traction Control" }); - ComboBox comboTC = new ComboBox() { Width = 56, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboTC.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.ElectronicsSetupChanger.TractionControl); - comboTC.SelectedIndex = Setup.BasicSetup.Electronics.TC1; - comboTC.SelectionChanged += (s, e) => { Setup.BasicSetup.Electronics.TC1 = comboTC.SelectedIndex; }; - stackerTC.Children.Add(comboTC); - Grid.SetColumn(stackerTC, 0); - - StackPanel stackerTC2 = new StackPanel { Orientation = Orientation.Horizontal }; - stackerTC2.Children.Add(new Label() { Content = "TC2", ToolTip = "Traction Control Cut" }); - ComboBox comboTC2 = new ComboBox() { Width = 57, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboTC2.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.ElectronicsSetupChanger.TractionControlCut); - comboTC2.SelectedIndex = Setup.BasicSetup.Electronics.TC2; - comboTC2.SelectionChanged += (s, e) => { Setup.BasicSetup.Electronics.TC2 = comboTC2.SelectedIndex; }; - stackerTC2.Children.Add(comboTC2); - Grid.SetColumn(stackerTC2, 1); - - - settings.Children.Add(stackerTC); - settings.Children.Add(stackerTC2); - - grid.Children.Add(settings); - - return grid; - } - - #endregion - - #region MechanicalSetupChanger - private Grid GetSteeringRatioStacker(int labelWidth) - { - Grid grid = GetMainGrid("Steering Ratio", labelWidth); - - Grid settings = GetGrid(1, 90); - Grid.SetColumn(settings, 1); - - - StackPanel stackerBrakeBias = new StackPanel { Orientation = Orientation.Horizontal }; - ComboBox comboBrakeBias = new ComboBox() { Width = 88, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboBrakeBias.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.SteeringRatio); - comboBrakeBias.SelectedIndex = Setup.BasicSetup.Alignment.SteerRatio; - comboBrakeBias.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.SteerRatio = comboBrakeBias.SelectedIndex; }; - stackerBrakeBias.Children.Add(comboBrakeBias); - Grid.SetColumn(stackerBrakeBias, 0); - - - settings.Children.Add(stackerBrakeBias); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetBrakeBiasStacker(int labelWidth) - { - Grid grid = GetMainGrid("Brake Bias", labelWidth); - - Grid settings = GetGrid(1, 90); - Grid.SetColumn(settings, 1); - - - StackPanel stackerBrakeBias = new StackPanel { Orientation = Orientation.Horizontal }; - ComboBox comboBrakeBias = new ComboBox() { Width = 88, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboBrakeBias.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BrakeBias); - comboBrakeBias.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BrakeBias; - comboBrakeBias.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BrakeBias = comboBrakeBias.SelectedIndex; }; - stackerBrakeBias.Children.Add(comboBrakeBias); - Grid.SetColumn(stackerBrakeBias, 0); - - - settings.Children.Add(stackerBrakeBias); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetBrakePowerStacker(int labelWidth) - { - Grid grid = GetMainGrid("Brake Power", labelWidth); - - Grid settings = GetGrid(1, 90); - Grid.SetColumn(settings, 1); - - - StackPanel stackerBrakePower = new StackPanel { Orientation = Orientation.Horizontal }; - ComboBox comboBrakePower = new ComboBox() { Width = 88, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboBrakePower.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BrakePower); - comboBrakePower.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BrakeTorque; - comboBrakePower.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BrakeTorque = comboBrakePower.SelectedIndex; }; - stackerBrakePower.Children.Add(comboBrakePower); - Grid.SetColumn(stackerBrakePower, 0); - - - settings.Children.Add(stackerBrakePower); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetDiffPreloadStacker(int labelWidth) - { - Grid grid = GetMainGrid("Diff Preload", labelWidth); - - Grid settings = GetGrid(1, 90); - Grid.SetColumn(settings, 1); - - - StackPanel stackerPreload = new StackPanel { Orientation = Orientation.Horizontal }; - ComboBox comboPreload = new ComboBox() { Width = 88, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPreload.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.PreloadDifferential); - comboPreload.SelectedIndex = Setup.AdvancedSetup.Drivetrain.Preload; - comboPreload.SelectionChanged += (s, e) => { Setup.AdvancedSetup.Drivetrain.Preload = comboPreload.SelectedIndex; }; - stackerPreload.Children.Add(comboPreload); - Grid.SetColumn(stackerPreload, 0); - - - settings.Children.Add(stackerPreload); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetAntiRollBarStacker(int labelWidth) - { - Grid grid = GetMainGrid("Anti roll bar", labelWidth); - - int blockWidth = 50; - - Grid settings = GetGrid(2, blockWidth + 45); - Grid.SetColumn(settings, 1); - - - // FL - StackPanel stackerFront = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFront.Children.Add(new Label() { Content = "Front" }); - ComboBox comboFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.AntiRollBarFront); - comboFL.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.ARBFront; - comboFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.ARBFront = comboFL.SelectedIndex; }; - stackerFront.Children.Add(comboFL); - Grid.SetColumn(stackerFront, 0); - - // FR - StackPanel stackerRear = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRear.Children.Add(new Label() { Content = "Rear" }); - ComboBox comboFR = new ComboBox() { Width = blockWidth + 4, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.AntiRollBarRear); - comboFR.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.ARBRear; - comboFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.ARBRear = comboFR.SelectedIndex; }; - stackerRear.Children.Add(comboFR); - Grid.SetColumn(stackerRear, 1); - - - settings.Children.Add(stackerFront); - settings.Children.Add(stackerRear); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetBumpstopRangeStacker(int labelWidth) - { - Grid grid = GetMainGrid("Bumpstop range", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - Grid.SetColumn(settings, 1); - - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRangeFronts); - comboFL.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.FrontLeft]; - comboFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.FrontLeft] = comboFL.SelectedIndex; }; - stackerFL.Children.Add(comboFL); - Grid.SetColumn(stackerFL, 0); - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRangeFronts); - comboFR.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.FrontRight]; - comboFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.FrontRight] = comboFR.SelectedIndex; }; - stackerFR.Children.Add(comboFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboRL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRangeRears); - comboRL.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.RearLeft]; - comboRL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.RearLeft] = comboRL.SelectedIndex; }; - stackerRL.Children.Add(comboRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboRR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRangeRears); - comboRR.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.RearRight]; - comboRR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopWindow[(int)Wheel.RearRight] = comboRR.SelectedIndex; }; - stackerRR.Children.Add(comboRR); - Grid.SetColumn(stackerRR, 3); - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetBumpstopRateStacker(int labelWidth) - { - Grid grid = GetMainGrid("Bumpstop rate", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - Grid.SetColumn(settings, 1); - - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRate); - comboFL.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.FrontLeft]; - comboFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.FrontLeft] = comboFL.SelectedIndex; }; - stackerFL.Children.Add(comboFL); - Grid.SetColumn(stackerFL, 0); - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRate); - comboFR.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.FrontRight]; - comboFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.FrontRight] = comboFR.SelectedIndex; }; - stackerFR.Children.Add(comboFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboRL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRate); - comboRL.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.RearLeft]; - comboRL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.RearLeft] = comboRL.SelectedIndex; }; - stackerRL.Children.Add(comboRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboRR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.BumpstopRate); - comboRR.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.RearRight]; - comboRR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.BumpStopRateUp[(int)Wheel.RearRight] = comboRR.SelectedIndex; }; - stackerRR.Children.Add(comboRR); - Grid.SetColumn(stackerRR, 3); - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetWheelRatesStacker(int labelWidth) - { - Grid grid = GetMainGrid("Wheelrate", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.WheelRateFronts); - comboFL.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.FrontLeft]; - comboFL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.FrontLeft] = comboFL.SelectedIndex; }; - stackerFL.Children.Add(comboFL); - Grid.SetColumn(stackerFL, 0); - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboFR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.WheelRateFronts); - comboFR.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.FrontRight]; - comboFR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.FrontRight] = comboFR.SelectedIndex; }; - stackerFR.Children.Add(comboFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboRL.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.WheelRateRears); - comboRL.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.RearLeft]; - comboRL.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.RearLeft] = comboRL.SelectedIndex; }; - stackerRL.Children.Add(comboRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboRR.ItemsSource = SetupIntRange.GetOptionsCollection(SetupChanger.MechanicalSetupChanger.WheelRateRears); - comboRR.SelectedIndex = Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.RearRight]; - comboRR.SelectionChanged += (s, e) => { Setup.AdvancedSetup.MechanicalBalance.WheelRate[(int)Wheel.RearRight] = comboRR.SelectedIndex; }; - stackerRR.Children.Add(comboRR); - Grid.SetColumn(stackerRR, 3); - - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - #endregion - - #region TyreSetupChanger - private Grid GetTyrePressureStacker(int labelWidth) - { - Grid grid = GetMainGrid("PSI", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboPressureFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFL.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.TyrePressures); - comboPressureFL.SelectedIndex = Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.FrontLeft]; - comboPressureFL.SelectionChanged += (s, e) => { Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.FrontLeft] = comboPressureFL.SelectedIndex; }; - stackerFL.Children.Add(comboPressureFL); - Grid.SetColumn(stackerFL, 0); - - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboPressureFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureFR.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.TyrePressures); - comboPressureFR.SelectedIndex = Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.FrontRight]; - comboPressureFR.SelectionChanged += (s, e) => { Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.FrontRight] = comboPressureFR.SelectedIndex; }; - stackerFR.Children.Add(comboPressureFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboPressureRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRL.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.TyrePressures); - comboPressureRL.SelectedIndex = Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.RearLeft]; - comboPressureRL.SelectionChanged += (s, e) => { Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.RearLeft] = comboPressureRL.SelectedIndex; }; - stackerRL.Children.Add(comboPressureRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboPressureRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboPressureRR.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.TyrePressures); - comboPressureRR.SelectedIndex = Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.RearRight]; - comboPressureRR.SelectionChanged += (s, e) => { Setup.BasicSetup.Tyres.TyrePressure[(int)Wheel.RearRight] = comboPressureRR.SelectedIndex; }; - stackerRR.Children.Add(comboPressureRR); - Grid.SetColumn(stackerRR, 3); - - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetCamberStacker(int labelWidth) - { - Grid grid = GetMainGrid("Camber", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboToeFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboToeFL.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.CamberFront); - comboToeFL.SelectedIndex = Setup.BasicSetup.Alignment.Camber[(int)Wheel.FrontLeft]; - comboToeFL.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.FrontLeft] = comboToeFL.SelectedIndex; }; - stackerFL.Children.Add(comboToeFL); - Grid.SetColumn(stackerFL, 0); - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboToeFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboToeFR.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.CamberFront); - comboToeFR.SelectedIndex = Setup.BasicSetup.Alignment.Camber[(int)Wheel.FrontRight]; - comboToeFR.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.FrontRight] = comboToeFR.SelectedIndex; }; - stackerFR.Children.Add(comboToeFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboToeRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboToeRL.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.CamberRear); - comboToeRL.SelectedIndex = Setup.BasicSetup.Alignment.Camber[(int)Wheel.RearLeft]; - comboToeRL.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.RearLeft] = comboToeRL.SelectedIndex; }; - stackerRL.Children.Add(comboToeRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboToeRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboToeRR.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.CamberRear); - comboToeRR.SelectedIndex = Setup.BasicSetup.Alignment.Camber[(int)Wheel.RearRight]; - comboToeRR.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.RearRight] = comboToeRR.SelectedIndex; }; - stackerRR.Children.Add(comboToeRR); - Grid.SetColumn(stackerRR, 3); - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetCasterStacker(int labelWidth) - { - // Caster inputs - Grid grid = GetMainGrid("Caster", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(2, blockWidth + 30); - Grid.SetColumn(settings, 1); - - // LF - StackPanel stackerCasterLF = new StackPanel() { Orientation = Orientation.Horizontal }; - stackerCasterLF.Children.Add(new Label() { Content = "FL" }); - ComboBox comboCasterLF = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboCasterLF.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.Caster); - comboCasterLF.SelectedIndex = Setup.BasicSetup.Alignment.CasterLF; - comboCasterLF.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.CasterLF = comboCasterLF.SelectedIndex; }; - stackerCasterLF.Children.Add(comboCasterLF); - Grid.SetColumn(stackerCasterLF, 0); - - // RF - StackPanel stackerCasterRF = new StackPanel() { Orientation = Orientation.Horizontal }; - stackerCasterRF.Children.Add(new Label() { Content = "FR" }); - ComboBox comboCasterRF = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboCasterRF.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.Caster); - comboCasterRF.SelectedIndex = Setup.BasicSetup.Alignment.CasterRF; - comboCasterRF.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.CasterRF = comboCasterRF.SelectedIndex; }; - stackerCasterRF.Children.Add(comboCasterRF); - Grid.SetColumn(stackerCasterRF, 1); - - settings.Children.Add(stackerCasterLF); - settings.Children.Add(stackerCasterRF); - - grid.Children.Add(settings); - - return grid; - } - - private Grid GetToeStacker(int labelWidth) - { - Grid grid = GetMainGrid("Toe", labelWidth); - - int blockWidth = 65; - - Grid settings = GetGrid(4, blockWidth + 30); - Grid.SetColumn(settings, 1); - - // FL - StackPanel stackerFL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFL.Children.Add(new Label() { Content = "FL" }); - ComboBox comboCasterFL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboCasterFL.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.ToeFront); - comboCasterFL.SelectedIndex = Setup.BasicSetup.Alignment.Toe[(int)Wheel.FrontLeft]; - comboCasterFL.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.FrontLeft] = comboCasterFL.SelectedIndex; }; - stackerFL.Children.Add(comboCasterFL); - Grid.SetColumn(stackerFL, 0); - - // FR - StackPanel stackerFR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerFR.Children.Add(new Label() { Content = "FR" }); - ComboBox comboCasterFR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboCasterFR.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.ToeFront); - comboCasterFR.SelectedIndex = Setup.BasicSetup.Alignment.Toe[(int)Wheel.FrontRight]; - comboCasterFR.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.FrontRight] = comboCasterFR.SelectedIndex; }; - stackerFR.Children.Add(comboCasterFR); - Grid.SetColumn(stackerFR, 1); - - // RL - StackPanel stackerRL = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRL.Children.Add(new Label() { Content = "RL" }); - ComboBox comboCasterRL = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; ; - comboCasterRL.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.ToeRear); - comboCasterRL.SelectedIndex = Setup.BasicSetup.Alignment.Toe[(int)Wheel.RearLeft]; - comboCasterRL.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.RearLeft] = comboCasterRL.SelectedIndex; }; - stackerRL.Children.Add(comboCasterRL); - Grid.SetColumn(stackerRL, 2); - - // RR - StackPanel stackerRR = new StackPanel { Orientation = Orientation.Horizontal }; - stackerRR.Children.Add(new Label() { Content = "RR" }); - ComboBox comboCasterRR = new ComboBox() { Width = blockWidth, HorizontalContentAlignment = HorizontalAlignment.Right }; - comboCasterRR.ItemsSource = SetupDoubleRange.GetOptionsCollection(SetupChanger.TyreSetupChanger.ToeRear); - comboCasterRR.SelectedIndex = Setup.BasicSetup.Alignment.Toe[(int)Wheel.RearRight]; - comboCasterRR.SelectionChanged += (s, e) => { Setup.BasicSetup.Alignment.Camber[(int)Wheel.RearRight] = comboCasterRR.SelectedIndex; }; - stackerRR.Children.Add(comboCasterRR); - Grid.SetColumn(stackerRR, 3); - - - settings.Children.Add(stackerFL); - settings.Children.Add(stackerFR); - settings.Children.Add(stackerRL); - settings.Children.Add(stackerRR); - - grid.Children.Add(settings); - - return grid; - } - #endregion - - private Grid GetMainGrid(string label, int labelWidth) - { - Grid grid = new Grid() - { - HorizontalAlignment = HorizontalAlignment.Stretch, - ColumnDefinitions = { - new ColumnDefinition() { Width = new GridLength(labelWidth) }, - new ColumnDefinition() - } - }; - grid.Children.Add(new Label() { Content = label }); - - return grid; - } - - private Grid GetGrid(int columnCount, int columnWidth) - { - Grid customGrid = new Grid() - { - HorizontalAlignment = HorizontalAlignment.Stretch, - }; - - for (int i = 0; i < columnCount; i++) - { - customGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(columnWidth) }); - } - - return customGrid; - } - - private TextBlock GetTitle(string label) - { - return new TextBlock() - { - Text = label, - HorizontalAlignment = HorizontalAlignment.Center, - Style = Resources["MaterialDesignHeadline6TextBlock"] as Style, - TextDecorations = { TextDecorations.Underline }, - Margin = new Thickness(0, 2, 0, 0), - FontSize = 16 - }; - } - - public Root GetSetup(FileInfo file) - { - if (!file.Exists) - return null; - - string jsonString = string.Empty; - try - { - using (FileStream fileStream = file.OpenRead()) - { - using (StreamReader reader = new StreamReader(fileStream)) - { - jsonString = reader.ReadToEnd(); - reader.Close(); - fileStream.Close(); - } - } - } - catch (Exception e) - { - Debug.WriteLine(e); - } - - Root setup = JsonConvert.DeserializeObject(jsonString); - return setup; - } - } -} diff --git a/Race_Element/Controls/Setup/SetupImporter.xaml b/Race_Element/Controls/Setup/SetupImporter.xaml deleted file mode 100644 index f7b7490c5..000000000 --- a/Race_Element/Controls/Setup/SetupImporter.xaml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - Setup Importer - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Setup/SetupImporter.xaml.cs b/Race_Element/Controls/Setup/SetupImporter.xaml.cs deleted file mode 100644 index 60ba3b234..000000000 --- a/Race_Element/Controls/Setup/SetupImporter.xaml.cs +++ /dev/null @@ -1,121 +0,0 @@ -using RaceElement.Controls.Setup; -using RaceElement.Data; -using RaceElement.Data.ACC.Tracks; -using RaceElement.Util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Windows; -using System.Windows.Controls; -using static RaceElement.Data.ACC.Tracks.TrackData; -using static RaceElement.Data.ConversionFactory; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for SetupImporter.xaml - /// - public partial class SetupImporter : UserControl - { - internal static SetupImporter Instance { get; private set; } - - private string _originalSetupFile; - private string _setupName; - private SetupJson.Root _currentSetup; - private FlowDocSetupRenderer _renderer; - - public SetupImporter() - { - InitializeComponent(); - this.Visibility = Visibility.Hidden; - - buttonCancel.Click += (s, e) => Close(); - - _renderer = new FlowDocSetupRenderer(); - - Instance = this; - } - - private void BuildTrackList() - { - this.listViewTracks.Items.Clear(); - foreach (KeyValuePair kv in Data.ACC.Tracks.TrackData.Tracks) - { - ListViewItem trackItem = new ListViewItem() - { - FontWeight = FontWeights.Bold, - Content = kv.Value.FullName, - DataContext = kv.Key - }; - - trackItem.MouseLeftButtonUp += (s, e) => - { - CarModels model = ConversionFactory.ParseCarName(_currentSetup.CarName); - string modelName = ConversionFactory.GetNameFromCarModel(model); - - FileInfo targetFile = new FileInfo(FileUtil.AccPath + "Setups\\" + _currentSetup.CarName + "\\" + kv.Key + "\\" + _setupName + ".json"); - - if (targetFile.Exists) - { - MainWindow.Instance.EnqueueSnackbarMessage($"Setup already exists: {targetFile.FullName}"); - Close(); - return; - } - - if (!targetFile.Directory.Exists) - targetFile.Directory.Create(); - - FileInfo originalFile = new FileInfo(_originalSetupFile); - if (originalFile.Exists) - originalFile.CopyTo(targetFile.FullName); - - MainWindow.Instance.EnqueueSnackbarMessage($"Imported {_setupName} for {modelName} at {kv.Value.FullName}"); - - SetupBrowser.Instance.FetchAllSetups(); - Close(); - }; - this.listViewTracks.Items.Add(trackItem); - } - } - - public bool Open(string setupFile, bool showTrack = false) - { - FileInfo file = new FileInfo(setupFile); - if (!file.Exists) - return false; - - SetupJson.Root setupRoot = ConversionFactory.GetSetupJsonRoot(file); - if (setupRoot == null) - return false; - - Debug.WriteLine($"Importing {file.FullName}"); - CarModels model = ConversionFactory.ParseCarName(setupRoot.CarName); - string modelName = ConversionFactory.GetNameFromCarModel(model); - Debug.WriteLine($"Trying to import a setup for {modelName}"); - _currentSetup = setupRoot; - _setupName = file.Name.Replace(".json", ""); - _originalSetupFile = setupFile; - - BuildTrackList(); - this.textBlockSetupName.Text = $"{modelName} - {file.Name}"; - - _renderer.LogSetup(ref this.flowDocument, setupFile, showTrack); - - this.Visibility = Visibility.Visible; - SetupsTab.Instance.tabControl.IsEnabled = false; - - return true; - } - - public void Close() - { - _setupName = String.Empty; - _currentSetup = null; - this.Visibility = Visibility.Hidden; - this.listViewTracks.Items.Clear(); - this.flowDocument.Blocks.Clear(); - SetupsTab.Instance.tabControl.IsEnabled = true; - } - } -} diff --git a/Race_Element/Controls/Setup/SetupRenderer.xaml b/Race_Element/Controls/Setup/SetupRenderer.xaml deleted file mode 100644 index 833698402..000000000 --- a/Race_Element/Controls/Setup/SetupRenderer.xaml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Setup/SetupRenderer.xaml.cs b/Race_Element/Controls/Setup/SetupRenderer.xaml.cs deleted file mode 100644 index e8f3d253c..000000000 --- a/Race_Element/Controls/Setup/SetupRenderer.xaml.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Windows; -using System.Windows.Controls; -using RaceElement.Controls.Setup; -using RaceElement.Util; -using System.Diagnostics; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for SetupRenderer.xaml - /// - /// - public partial class SetupRenderer : UserControl - { - public SetupRenderer() - { - InitializeComponent(); - - openFile.Click += OpenFile_Click; - } - - private void OpenFile_Click(object sender, RoutedEventArgs e) - { - try - { - Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); - - // Set filter for file extension and default file extension - dlg.DefaultExt = ".json"; - dlg.Filter = "ACC Setup files|*.json"; - Nullable result = dlg.ShowDialog(); - - - // Get the selected file name and display in a TextBox - if (result == true) - { - flowDocument.Blocks.Clear(); - - // Open document - string filename = dlg.FileName; - new FlowDocSetupRenderer().LogSetup(ref flowDocument, filename); - } - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - Debug.WriteLine(ex); - } - } - - - } -} diff --git a/Race_Element/Controls/Setup/SetupsTab.xaml b/Race_Element/Controls/Setup/SetupsTab.xaml deleted file mode 100644 index 37ab14185..000000000 --- a/Race_Element/Controls/Setup/SetupsTab.xaml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -  Browse - - - - - - - - - - - - - - - -  Compare - - - - - - - - - - - diff --git a/Race_Element/Controls/Setup/SetupsTab.xaml.cs b/Race_Element/Controls/Setup/SetupsTab.xaml.cs deleted file mode 100644 index 719a1b197..000000000 --- a/Race_Element/Controls/Setup/SetupsTab.xaml.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for SetupsTab.xaml - /// - public partial class SetupsTab : UserControl - { - public static SetupsTab Instance { get; private set; } - - public SetupsTab() - { - InitializeComponent(); - - tabSetupTree.ContextMenu = GetBrowseTabContextMenu(); - Instance = this; - } - - private ContextMenu GetBrowseTabContextMenu() - { - ContextMenu contextMenu = new ContextMenu() - { - Style = Resources["MaterialDesignContextMenu"] as Style, - Margin = new Thickness(0), - Padding = new Thickness(0), - GroupStyleSelector = null, - UsesItemContainerTemplate = true, - Background = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)) - }; - - Button refreshSetupTree = new Button() - { - Content = $"Refresh", - Style = Resources["MaterialDesignRaisedButton"] as Style, - Margin = new Thickness(0), - Height = 30, - VerticalAlignment = VerticalAlignment.Center, - }; - refreshSetupTree.Click += (s, e) => { SetupBrowser.Instance.FetchAllSetups(); ((s as Button).Parent as ContextMenu).IsOpen = false; }; - contextMenu.Items.Add(refreshSetupTree); - - return contextMenu; - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/DivideBy1000ToFloatConverter.cs b/Race_Element/Controls/Telemetry/RaceSessions/DivideBy1000ToFloatConverter.cs deleted file mode 100644 index 5f4a7145d..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/DivideBy1000ToFloatConverter.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace RaceElement.Controls.Telemetry.RaceSessions -{ - internal class DivideBy1000ToFloatConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is int) - { - float result = (int)value / 1000f; - return $"{result:F3}"; - } - return string.Empty; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/FormattedFloatConverter.cs b/Race_Element/Controls/Telemetry/RaceSessions/FormattedFloatConverter.cs deleted file mode 100644 index 1e11a5d75..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/FormattedFloatConverter.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace RaceElement.Controls.Telemetry.RaceSessions -{ - internal class FormattedFloatConverter : IValueConverter - { - private int _decimals; - public FormattedFloatConverter(int decimals = 3) - { - this._decimals = decimals; - } - - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is float) - return ((float)value).ToString($"F{_decimals}"); - - return string.Empty; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/LapTypeConverter.cs b/Race_Element/Controls/Telemetry/RaceSessions/LapTypeConverter.cs deleted file mode 100644 index 2720c84ba..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/LapTypeConverter.cs +++ /dev/null @@ -1,33 +0,0 @@ -using RaceElement.Broadcast; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace RaceElement.Controls.Telemetry.RaceSessions -{ - internal class LapTypeConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null && value is LapType) - { - switch (value) - { - case LapType.Inlap: return "In"; - case LapType.Outlap: return "Out"; - default: return string.Empty; - } - } - return string.Empty; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/MillisecondsToFormattedTimeSpanString.cs b/Race_Element/Controls/Telemetry/RaceSessions/MillisecondsToFormattedTimeSpanString.cs deleted file mode 100644 index a6a42750c..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/MillisecondsToFormattedTimeSpanString.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; - -namespace RaceElement.Controls.Telemetry.RaceSessions -{ - internal class MillisecondsToFormattedTimeSpanString : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is int) - { - return $"{new TimeSpan(0, 0, 0, 0, (int)value):mm\\:ss\\:fff}"; - } - return string.Empty; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/Plots/BrakeTempsPlot.cs b/Race_Element/Controls/Telemetry/RaceSessions/Plots/BrakeTempsPlot.cs deleted file mode 100644 index c159c34a4..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/Plots/BrakeTempsPlot.cs +++ /dev/null @@ -1,112 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data; -using RaceElement.Data.ACC.Database.Telemetry; -using ScottPlot; -using ScottPlot.Plottable; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Controls; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace RaceElement.Controls.Telemetry.RaceSessions.Plots -{ - internal class BrakeTempsPlot - { - private readonly TextBlock _textBlockMetrics; - private readonly AbstractTrackData _trackData; - - public BrakeTempsPlot(AbstractTrackData trackData, ref TextBlock textBlockMetrics) - { - _trackData = trackData; - _textBlockMetrics = textBlockMetrics; - } - - internal WpfPlot Create(Grid outerGrid, Dictionary dict) - { - WpfPlot wpfPlot = new WpfPlot(); - - PlotUtil.SetDefaultWpfPlotConfiguration(ref wpfPlot); - - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - outerGrid.SizeChanged += (se, ev) => - { - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - }; - - - Plot plot = wpfPlot.Plot; - plot.Palette = PlotUtil.WheelPositionPallete; - plot.Benchmark(false); - - double[][] brakeTemps = new double[4][]; - double minTemp = int.MaxValue; - double maxTemp = int.MinValue; - - double[] splines = dict.Select(x => (double)x.Value.SplinePosition * _trackData.TrackLength).ToArray(); - if (splines.Length == 0) - return wpfPlot; - - SignalPlotXY[] brakePlots = new SignalPlotXY[4]; - string fourSpaces = "".FillEnd(4, ' '); - for (int i = 0; i < 4; i++) - { - var temps = dict.Select(x => (double)x.Value.BrakeData.BrakeTemperature[i]); - _textBlockMetrics.Text += $"Av. {Enum.GetNames(typeof(SetupConverter.Wheel))[i]}: {temps.Average():F1}{fourSpaces}"; - brakeTemps[i] = temps.ToArray(); - - minTemp.ClipMax(brakeTemps[i].Min()); - maxTemp.ClipMin(brakeTemps[i].Max()); - - brakePlots[i] = plot.AddSignalXY(splines, brakeTemps[i], label: Enum.GetNames(typeof(SetupConverter.Wheel))[i]); - } - - double padding = 10; - plot.SetAxisLimitsX(xMin: 0, xMax: _trackData.TrackLength); - plot.SetAxisLimitsY(minTemp - padding, maxTemp + padding); - plot.SetOuterViewLimits(0, _trackData.TrackLength, minTemp - padding, maxTemp + padding); - plot.XLabel("Meters"); - plot.YLabel("Celsius"); - - #region add markers - - MarkerPlot[] tyreMarkers = new MarkerPlot[4]; - for (int i = 0; i != tyreMarkers.Length; i++) - { - tyreMarkers[i] = wpfPlot.Plot.AddPoint(0, 0, color: brakePlots[i].Color); - PlotUtil.SetDefaultMarkerStyle(ref tyreMarkers[i]); - } - - outerGrid.MouseMove += (s, e) => - { - (double mouseCoordsX, _) = wpfPlot.GetMouseCoordinates(); - - for (int i = 0; i != tyreMarkers.Length; i++) - { - (double x, double y, int index) = brakePlots[i].GetPointNearestX(mouseCoordsX); - PlotUtil.MarkerIndex = index; - tyreMarkers[i].SetPoint(x, y); - tyreMarkers[i].IsVisible = true; - brakePlots[i].Label = $"{Enum.GetNames(typeof(SetupConverter.Wheel))[i]}: {brakeTemps[i][index]:F2}"; - } - - wpfPlot.RenderRequest(); - }; - - #endregion - - wpfPlot.AxesChanged += PlotUtil.WpfPlot_AxesChanged; - if (PlotUtil.AxisLimitsCustom) - plot.SetAxisLimits(xAxisIndex: 0, xMin: PlotUtil.AxisLimits.XMin, xMax: PlotUtil.AxisLimits.XMax); - - PlotUtil.SetDefaultPlotStyles(ref plot); - wpfPlot.RenderRequest(); - - return wpfPlot; - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/Plots/InputsPlot.cs b/Race_Element/Controls/Telemetry/RaceSessions/Plots/InputsPlot.cs deleted file mode 100644 index d47acfa64..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/Plots/InputsPlot.cs +++ /dev/null @@ -1,145 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Database.Telemetry; -using ScottPlot; -using ScottPlot.Plottable; -using ScottPlot.Renderable; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Controls; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace RaceElement.Controls.Telemetry.RaceSessions.Plots -{ - internal class InputsPlot - { - private readonly TextBlock _textBlockMetrics; - private readonly AbstractTrackData _trackData; - private readonly int _fullSteeringLock; - - public InputsPlot(AbstractTrackData trackData, ref TextBlock textBlockMetrics, int fullSteeringLock) - { - _trackData = trackData; - _textBlockMetrics = textBlockMetrics; - _fullSteeringLock = fullSteeringLock; - } - - internal WpfPlot Create(Grid outerGrid, Dictionary dict) - { - WpfPlot wpfPlot = new WpfPlot(); - - PlotUtil.SetDefaultWpfPlotConfiguration(ref wpfPlot); - - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - outerGrid.SizeChanged += (se, ev) => - { - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - }; - - - double[] splines = dict.Select(x => (double)x.Value.SplinePosition * _trackData.TrackLength).ToArray(); - if (splines.Length == 0) - return wpfPlot; - - var gasses = dict.Select(x => (double)x.Value.InputsData.Gas * 100); - double[] gasDatas = gasses.ToArray(); - double averageGas = gasses.Average(); - - var brakes = dict.Select(x => (double)x.Value.InputsData.Brake * 100); - double[] brakeDatas = brakes.ToArray(); - double averageBrakes = brakes.Average(); - - double[] steeringDatas = dict.Select(x => (double)x.Value.InputsData.SteerAngle * _fullSteeringLock / 2).ToArray(); - string fourSpaces = "".FillEnd(4, ' '); - _textBlockMetrics.Text += $"Av. Throttle: {averageGas:F2}%{fourSpaces}"; - _textBlockMetrics.Text += $"Av. Brake: {averageBrakes:F2}%{fourSpaces}"; - - if (splines.Length == 0) - return wpfPlot; - - Plot plot = wpfPlot.Plot; - plot.SetAxisLimitsY(-5, 105); - - var axis2 = plot.AddAxis(Edge.Left, axisIndex: 2, title: "Inputs"); - plot.SetOuterViewLimits(0, _trackData.TrackLength, -3, 103, yAxisIndex: 2); - - var gasPlot = plot.AddSignalXY(splines, gasDatas, color: System.Drawing.Color.Green, label: "Throttle"); - gasPlot.FillBelow(upperColor: System.Drawing.Color.FromArgb(95, 0, 255, 0), lowerColor: System.Drawing.Color.Transparent); - gasPlot.YAxisIndex = 2; - - var brakePlot = plot.AddSignalXY(splines, brakeDatas, color: System.Drawing.Color.Red, label: "Brake"); - brakePlot.FillBelow(upperColor: System.Drawing.Color.FromArgb(140, 255, 0, 0), lowerColor: System.Drawing.Color.Transparent); - brakePlot.YAxisIndex = 2; - - var steeringPlot = plot.AddSignalXY(splines, steeringDatas, color: System.Drawing.Color.WhiteSmoke, label: "Steering"); - steeringPlot.YAxisIndex = 0; - - plot.SetAxisLimits(xMin: 0, xMax: _trackData.TrackLength, yMin: -1.05 * _fullSteeringLock / 2, yMax: 1.05 * _fullSteeringLock / 2, yAxisIndex: 0); - plot.SetOuterViewLimits(0, _trackData.TrackLength, -1.05 * _fullSteeringLock / 2, 1.05 * _fullSteeringLock / 2, yAxisIndex: 0); - - plot.XLabel("Meters"); - plot.YLabel("Steering (Degrees)"); - - plot.Palette = new ScottPlot.Palettes.PolarNight(); - - PlotUtil.SetDefaultPlotStyles(ref plot); - - - #region add markers - - MarkerPlot gasMarker = wpfPlot.Plot.AddPoint(0, 0, color: System.Drawing.Color.Green); - PlotUtil.SetDefaultMarkerStyle(ref gasMarker); - - MarkerPlot brakeMarker = wpfPlot.Plot.AddPoint(0, 0, color: System.Drawing.Color.Red); - PlotUtil.SetDefaultMarkerStyle(ref brakeMarker); - - MarkerPlot steeringMarker = wpfPlot.Plot.AddPoint(0, 0, color: System.Drawing.Color.WhiteSmoke); - PlotUtil.SetDefaultMarkerStyle(ref steeringMarker); - - outerGrid.MouseMove += (s, e) => - { - (double mouseCoordsX, _) = wpfPlot.GetMouseCoordinates(); - - (double gasX, double gasY, int gasIndex) = gasPlot.GetPointNearestX(mouseCoordsX); - gasMarker.YAxisIndex = 2; - gasMarker.SetPoint(gasX, gasY); - gasMarker.IsVisible = true; - gasPlot.Label = $"Throttle: {gasDatas[gasIndex]:F3}"; - - - (double brakeX, double brakeY, int brakeIndex) = brakePlot.GetPointNearestX(mouseCoordsX); - brakeMarker.YAxisIndex = 2; - brakeMarker.SetPoint(brakeX, brakeY); - brakeMarker.IsVisible = true; - brakePlot.Label = $"Brake: {brakeDatas[brakeIndex]:F3}"; - - - (double steerX, double steerY, int steerIndex) = steeringPlot.GetPointNearestX(mouseCoordsX); - steeringMarker.YAxisIndex = 0; - steeringMarker.SetPoint(steerX, steerY); - steeringMarker.IsVisible = true; - steeringPlot.Label = $"Steering: {(steeringDatas[steerIndex]):F3}"; - - PlotUtil.MarkerIndex = steerIndex; - - wpfPlot.RenderRequest(); - }; - - #endregion - - wpfPlot.AxesChanged += PlotUtil.WpfPlot_AxesChanged; - if (PlotUtil.AxisLimitsCustom) - plot.SetAxisLimits(xAxisIndex: 0, xMin: PlotUtil.AxisLimits.XMin, xMax: PlotUtil.AxisLimits.XMax); - - - wpfPlot.RenderRequest(); - - return wpfPlot; - } - - - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/Plots/PlotUtil.cs b/Race_Element/Controls/Telemetry/RaceSessions/Plots/PlotUtil.cs deleted file mode 100644 index aa522273c..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/Plots/PlotUtil.cs +++ /dev/null @@ -1,89 +0,0 @@ -using RaceElement.Data.ACC.Tracks; -using ScottPlot; -using ScottPlot.Plottable; -using ScottPlot.Styles; -using System; - -namespace RaceElement.Controls.Telemetry.RaceSessions.Plots -{ - internal static class PlotUtil - { - private static readonly IStyle DefaultPlotStyle = Style.Black; - public static readonly IPalette WheelPositionPallete = Palette.OneHalfDark; - - - - public static void SetDefaultPlotStyles(ref Plot plot) - { - plot.YAxis.TickLabelStyle(color: System.Drawing.Color.White); - plot.XAxis.TickLabelStyle(color: System.Drawing.Color.White); - plot.YAxis2.TickLabelStyle(color: System.Drawing.Color.White); - - ScottPlot.Renderable.Legend legend = plot.Legend(true, Alignment.UpperLeft); - legend.FillColor = System.Drawing.Color.FromArgb(160, 0, 0, 0); - legend.FontColor = System.Drawing.Color.White; - legend.OutlineColor = System.Drawing.Color.FromArgb(30, 255, 255, 255); - legend.ShadowColor = System.Drawing.Color.FromArgb(30, 255, 0, 0); - legend.FontSize = 13; - legend.FontBold = true; - legend.IsDetached = true; - - plot.Style(DefaultPlotStyle); - plot.YAxis.RulerMode(true); - plot.YAxis2.RulerMode(true); - } - - public static void SetDefaultWpfPlotConfiguration(ref WpfPlot plot) - { - plot.Configuration.DoubleClickBenchmark = false; - plot.Configuration.LockVerticalAxis = true; - plot.Configuration.Quality = ScottPlot.Control.QualityMode.LowWhileDragging; - plot.Configuration.MiddleClickDragZoom = false; - plot.Configuration.MiddleClickAutoAxis = true; - plot.Configuration.RightClickDragZoom = false; - } - - public static void SetPoint(this MarkerPlot marker, double x, double y) - { - marker.X = x; - marker.Y = y; - } - - public static void SetDefaultMarkerStyle(ref MarkerPlot marker) - { - marker.MarkerSize = 10; - marker.MarkerLineWidth = 2; - marker.MarkerShape = ScottPlot.MarkerShape.openCircle; - marker.IsVisible = false; - } - - public static AxisLimits AxisLimits; - public static bool AxisLimitsCustom { get; internal set; } = false; - public static event EventHandler AxisLimitsChanged; - - public static void WpfPlot_AxesChanged(object sender, EventArgs e) - { - WpfPlot wpfPlot = (WpfPlot)sender; - AxisLimits = wpfPlot.Plot.GetAxisLimits(xAxisIndex: 0); - AxisLimitsCustom = true; - AxisLimitsChanged?.Invoke(null, AxisLimits); - //Debug.WriteLine($"XMin: {AxisLimits.XMin}, XMax: {AxisLimits.XMax}, XCenter: {AxisLimits.XCenter}"); - } - - internal static TrackData.AbstractTrackData trackData; - - internal static event EventHandler MarkerIndexChanged; - private static int _markerIndex = -1; - internal static int MarkerIndex - { - get { return _markerIndex; } - set - { - _markerIndex = value; - MarkerIndexChanged?.Invoke(null, value); - } - } - - - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/Plots/SpeedGearPlot.cs b/Race_Element/Controls/Telemetry/RaceSessions/Plots/SpeedGearPlot.cs deleted file mode 100644 index 56838484d..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/Plots/SpeedGearPlot.cs +++ /dev/null @@ -1,134 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Database.Telemetry; -using ScottPlot; -using ScottPlot.Plottable; -using ScottPlot.Renderable; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Controls; -using static RaceElement.Data.ACC.Tracks.TrackData; - -namespace RaceElement.Controls.Telemetry.RaceSessions.Plots -{ - internal class SpeedGearPlot - { - private readonly TextBlock _textBlockMetrics; - private readonly AbstractTrackData _trackData; - - public SpeedGearPlot(AbstractTrackData trackData, ref TextBlock textBlockMetrics) - { - _trackData = trackData; - _textBlockMetrics = textBlockMetrics; - } - - internal WpfPlot Create(Grid outerGrid, Dictionary dict) - { - WpfPlot wpfPlot = new WpfPlot(); - - PlotUtil.SetDefaultWpfPlotConfiguration(ref wpfPlot); - - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - outerGrid.SizeChanged += (se, ev) => - { - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - }; - - double[] splines = dict.Select(x => (double)x.Value.SplinePosition * _trackData.TrackLength).ToArray(); - if (splines.Length == 0) - return wpfPlot; - - if (dict.First().Value.PhysicsData == null) - return wpfPlot; - - - var gears = dict.Select(x => (double)x.Value.InputsData.Gear - 1); - double[] gearDatas = gears.ToArray(); - double maxGear = gears.Max(); - double averageGear = gears.Average(); - - var speeds = dict.Select(x => (double)x.Value.PhysicsData.Speed); - double[] speedData = speeds.ToArray(); - double minSpeed = speedData.Min(); - double maxSpeed = speedData.Max(); - double averageSpeed = speedData.Average(); - - string fourSpaces = "".FillEnd(4, ' '); - _textBlockMetrics.Text += $"{fourSpaces}Av. Speed: {averageSpeed:F3} km/h"; - _textBlockMetrics.Text += $"{fourSpaces}Min Speed: {minSpeed:F3} km/h"; - _textBlockMetrics.Text += $"{fourSpaces}Max Speed: {maxSpeed:F3} km/h"; - - if (splines.Length == 0) - return wpfPlot; - - Plot plot = wpfPlot.Plot; - plot.SetAxisLimitsY(-5, 105); - - // gearing axis - var gearingPlot = plot.AddScatterStep(splines, gearDatas, color: System.Drawing.Color.OrangeRed, label: "Gear"); - gearingPlot.YAxisIndex = 0; - plot.SetAxisLimits(xMin: 0, xMax: _trackData.TrackLength, yMin: 0, yMax: 1.05 * maxGear, yAxisIndex: 0); - plot.SetOuterViewLimits(0, _trackData.TrackLength, 0, 1.05 * maxGear, yAxisIndex: 0); - - // speed axis - plot.AddAxis(Edge.Left, axisIndex: 2, title: "Speed (km/h)"); - var speedPlot = plot.AddSignalXY(splines, speedData, color: System.Drawing.Color.White, label: "Speed"); - speedPlot.FillBelow(upperColor: System.Drawing.Color.FromArgb(95, 0, 255, 0), lowerColor: System.Drawing.Color.Transparent); - speedPlot.YAxisIndex = 2; - - plot.SetOuterViewLimits(0, _trackData.TrackLength, -3, maxSpeed + 3, yAxisIndex: 2); - plot.SetAxisLimits(0, _trackData.TrackLength, -3, maxSpeed + 3, yAxisIndex: 2); - - plot.XLabel("Meters"); - plot.YLabel("Gear"); - - plot.Palette = new ScottPlot.Palettes.PolarNight(); - - PlotUtil.SetDefaultPlotStyles(ref plot); - - - #region add markers - - MarkerPlot speedMarker = wpfPlot.Plot.AddPoint(0, 0, color: System.Drawing.Color.White); - PlotUtil.SetDefaultMarkerStyle(ref speedMarker); - - MarkerPlot gearMarker = wpfPlot.Plot.AddPoint(0, 0, color: System.Drawing.Color.OrangeRed); - PlotUtil.SetDefaultMarkerStyle(ref gearMarker); - - outerGrid.MouseMove += (s, e) => - { - (double mouseCoordsX, _) = wpfPlot.GetMouseCoordinates(); - - (double speedX, double speedY, int gasIndex) = speedPlot.GetPointNearestX(mouseCoordsX); - speedMarker.YAxisIndex = 2; - speedMarker.SetPoint(speedX, speedY); - speedMarker.IsVisible = true; - speedPlot.Label = $"Speed: {speedData[gasIndex]:F3}"; - - (double gearX, double gearY, int gearIndex) = gearingPlot.GetPointNearestX(mouseCoordsX); - gearMarker.YAxisIndex = 0; - gearMarker.SetPoint(gearX, gearY); - gearMarker.IsVisible = true; - gearingPlot.Label = $"Gear: {gearDatas[gearIndex]:F0}"; - - PlotUtil.MarkerIndex = gearIndex; - - wpfPlot.RenderRequest(); - }; - - #endregion - - wpfPlot.AxesChanged += PlotUtil.WpfPlot_AxesChanged; - if (PlotUtil.AxisLimitsCustom) - plot.SetAxisLimits(xAxisIndex: 0, xMin: PlotUtil.AxisLimits.XMin, xMax: PlotUtil.AxisLimits.XMax); - - wpfPlot.RenderRequest(); - - return wpfPlot; - } - - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/Plots/TyrePressurePlot.cs b/Race_Element/Controls/Telemetry/RaceSessions/Plots/TyrePressurePlot.cs deleted file mode 100644 index b6689abd7..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/Plots/TyrePressurePlot.cs +++ /dev/null @@ -1,122 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Database.Telemetry; -using RaceElement.Data; -using ScottPlot; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Controls; -using static RaceElement.Data.ACC.Tracks.TrackData; -using ScottPlot.Plottable; - -namespace RaceElement.Controls.Telemetry.RaceSessions.Plots -{ - internal class TyrePressurePlot - { - private readonly TextBlock _textBlockMetrics; - private readonly AbstractTrackData _trackData; - - public TyrePressurePlot(AbstractTrackData trackData, ref TextBlock textBlockMetrics) - { - _trackData = trackData; - _textBlockMetrics = textBlockMetrics; - } - - internal WpfPlot Create(Grid outerGrid, Dictionary dict) - { - WpfPlot wpfPlot = new WpfPlot(); - - PlotUtil.SetDefaultWpfPlotConfiguration(ref wpfPlot); - - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - outerGrid.SizeChanged += (se, ev) => - { - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - }; - - - Plot plot = wpfPlot.Plot; - plot.Palette = PlotUtil.WheelPositionPallete; - plot.Benchmark(false); - - double[][] tyrePressures = new double[4][]; - double minPressure = int.MaxValue; - double maxPressure = int.MinValue; - - double[] splines = dict.Select(x => (double)x.Value.SplinePosition * _trackData.TrackLength).ToArray(); - if (splines.Length == 0) - return wpfPlot; - - SignalPlotXY[] tyrePlots = new SignalPlotXY[4]; - string fourSpaces = "".FillEnd(4, ' '); - for (int i = 0; i < 4; i++) - { - var pressures = dict.Select(x => (double)x.Value.TyreData.TyrePressure[i]); - _textBlockMetrics.Text += $"Av. {Enum.GetNames(typeof(SetupConverter.Wheel))[i]}: {pressures.Average():F2}{fourSpaces}"; - tyrePressures[i] = pressures.ToArray(); - - minPressure.ClipMax(tyrePressures[i].Min()); - maxPressure.ClipMin(tyrePressures[i].Max()); - - tyrePlots[i] = plot.AddSignalXY(splines, tyrePressures[i], label: Enum.GetNames(typeof(SetupConverter.Wheel))[i]); - } - - double padding = 0.1; - double defaultMinPressure = 27, defaultMaxPressure = 28; - if (minPressure > defaultMinPressure && maxPressure < defaultMaxPressure) - { - minPressure.ClipMax(defaultMinPressure); - maxPressure.ClipMin(defaultMaxPressure); - } - - plot.SetAxisLimitsX(xMin: 0, xMax: _trackData.TrackLength); - plot.SetAxisLimitsY(minPressure - padding, maxPressure + padding); - plot.SetOuterViewLimits(0, _trackData.TrackLength, minPressure - padding, maxPressure + padding); - plot.XLabel("Meters"); - plot.YLabel("PSI"); - - - #region add markers - - MarkerPlot[] tyreMarkers = new MarkerPlot[4]; - for (int i = 0; i != tyreMarkers.Length; i++) - { - tyreMarkers[i] = wpfPlot.Plot.AddPoint(0, 0, color: tyrePlots[i].Color); - PlotUtil.SetDefaultMarkerStyle(ref tyreMarkers[i]); - } - - outerGrid.MouseMove += (s, e) => - { - (double mouseCoordsX, _) = wpfPlot.GetMouseCoordinates(); - - for (int i = 0; i != tyreMarkers.Length; i++) - { - (double x, double y, int index) = tyrePlots[i].GetPointNearestX(mouseCoordsX); - tyreMarkers[i].SetPoint(x, y); - tyreMarkers[i].IsVisible = true; - tyrePlots[i].Label = $"{Enum.GetNames(typeof(SetupConverter.Wheel))[i]}: {tyrePressures[i][index]:F3}"; - - PlotUtil.MarkerIndex = index; - } - - wpfPlot.RenderRequest(); - }; - - #endregion - - wpfPlot.AxesChanged += PlotUtil.WpfPlot_AxesChanged; - if (PlotUtil.AxisLimitsCustom) - plot.SetAxisLimits(xAxisIndex: 0, xMin: PlotUtil.AxisLimits.XMin, xMax: PlotUtil.AxisLimits.XMax); - - PlotUtil.SetDefaultPlotStyles(ref plot); - - wpfPlot.RenderRequest(); - - return wpfPlot; - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/Plots/TyreTempsPlot.cs b/Race_Element/Controls/Telemetry/RaceSessions/Plots/TyreTempsPlot.cs deleted file mode 100644 index d53c551ef..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/Plots/TyreTempsPlot.cs +++ /dev/null @@ -1,115 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Database.Telemetry; -using RaceElement.Data; -using ScottPlot; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Controls; -using static RaceElement.Data.ACC.Tracks.TrackData; -using ScottPlot.Plottable; - -namespace RaceElement.Controls.Telemetry.RaceSessions.Plots -{ - internal class TyreTempsPlot - { - private readonly TextBlock _textBlockMetrics; - private readonly AbstractTrackData _trackData; - - public TyreTempsPlot(AbstractTrackData trackData, ref TextBlock textBlockMetrics) - { - _trackData = trackData; - _textBlockMetrics = textBlockMetrics; - } - - internal WpfPlot Create(Grid outerGrid, Dictionary dict) - { - WpfPlot wpfPlot = new WpfPlot(); - - PlotUtil.SetDefaultWpfPlotConfiguration(ref wpfPlot); - - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - outerGrid.SizeChanged += (se, ev) => - { - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - }; - - Plot plot = wpfPlot.Plot; - plot.Palette = PlotUtil.WheelPositionPallete; - plot.Benchmark(false); - - double[][] tyreTemps = new double[4][]; - double minTemp = int.MaxValue; - double maxTemp = int.MinValue; - double[] splines = dict.Select(x => (double)x.Value.SplinePosition * _trackData.TrackLength).ToArray(); - - if (splines.Length == 0) - return wpfPlot; - - SignalPlotXY[] tyrePlots = new SignalPlotXY[4]; - string fourSpaces = "".FillEnd(4, ' '); - for (int i = 0; i < 4; i++) - { - var temps = dict.Select(x => (double)x.Value.TyreData.TyreCoreTemperature[i]); - - _textBlockMetrics.Text += $"Av. {Enum.GetNames(typeof(SetupConverter.Wheel))[i]}: {temps.Average():F2}{fourSpaces}"; - tyreTemps[i] = temps.ToArray(); - - minTemp.ClipMax(tyreTemps[i].Min()); - maxTemp.ClipMin(tyreTemps[i].Max()); - - tyrePlots[i] = plot.AddSignalXY(splines, tyreTemps[i], label: Enum.GetNames(typeof(SetupConverter.Wheel))[i]); - } - - double padding = 2; - plot.SetAxisLimitsX(xMin: 0, xMax: _trackData.TrackLength); - plot.SetAxisLimitsY(minTemp - padding, maxTemp + padding); - plot.SetOuterViewLimits(0, _trackData.TrackLength, minTemp - padding, maxTemp + padding); - plot.XLabel("Meters"); - plot.YLabel("Celsius"); - - - #region add markers - - MarkerPlot[] tyreMarkers = new MarkerPlot[4]; - for (int i = 0; i != tyreMarkers.Length; i++) - { - tyreMarkers[i] = wpfPlot.Plot.AddPoint(0, 0, color: tyrePlots[i].Color); - PlotUtil.SetDefaultMarkerStyle(ref tyreMarkers[i]); - } - - outerGrid.MouseMove += (s, e) => - { - (double mouseCoordsX, _) = wpfPlot.GetMouseCoordinates(); - - for (int i = 0; i != tyreMarkers.Length; i++) - { - (double x, double y, int index) = tyrePlots[i].GetPointNearestX(mouseCoordsX); - tyreMarkers[i].SetPoint(x, y); - tyreMarkers[i].IsVisible = true; - tyrePlots[i].Label = $"{Enum.GetNames(typeof(SetupConverter.Wheel))[i]}: {tyreTemps[i][index]:F3}"; - - PlotUtil.MarkerIndex = index; - } - - wpfPlot.RenderRequest(); - }; - - #endregion - - wpfPlot.AxesChanged += PlotUtil.WpfPlot_AxesChanged; - if (PlotUtil.AxisLimitsCustom) - plot.SetAxisLimits(xAxisIndex: 0, xMin: PlotUtil.AxisLimits.XMin, xMax: PlotUtil.AxisLimits.XMax); - - PlotUtil.SetDefaultPlotStyles(ref plot); - - wpfPlot.RenderRequest(); - - return wpfPlot; - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/Plots/WheelSlipPlot.cs b/Race_Element/Controls/Telemetry/RaceSessions/Plots/WheelSlipPlot.cs deleted file mode 100644 index 8a21655e3..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/Plots/WheelSlipPlot.cs +++ /dev/null @@ -1,147 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Data.ACC.Database.Telemetry; -using ScottPlot; -using System.Collections.Generic; -using System.Linq; -using static RaceElement.Data.SetupConverter; -using System.Windows.Controls; -using static RaceElement.Data.ACC.Tracks.TrackData; -using ScottPlot.Plottable; - -namespace RaceElement.Controls.Telemetry.RaceSessions.Plots -{ - internal class WheelSlipPlot - { - private readonly TextBlock _textBlockMetrics; - private readonly AbstractTrackData _trackData; - - public WheelSlipPlot(AbstractTrackData trackData, ref TextBlock textBlockMetrics) - { - _trackData = trackData; - _textBlockMetrics = textBlockMetrics; - } - - internal WpfPlot Create(Grid outerGrid, Dictionary dict) - { - WpfPlot wpfPlot = new WpfPlot(); - - PlotUtil.SetDefaultWpfPlotConfiguration(ref wpfPlot); - - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - outerGrid.SizeChanged += (se, ev) => - { - wpfPlot.Height = outerGrid.ActualHeight; - wpfPlot.MaxHeight = outerGrid.MaxHeight; - wpfPlot.MinHeight = outerGrid.MinHeight; - }; - - Plot plot = wpfPlot.Plot; - plot.Palette = PlotUtil.WheelPositionPallete; - plot.Benchmark(false); - - double[][] wheelSlips = new double[4][]; - - double[] splines = dict.Select(x => (double)x.Value.SplinePosition * _trackData.TrackLength).ToArray(); - - if (splines.Length == 0) - return wpfPlot; - - if (dict.First().Value.PhysicsData == null || dict.First().Value.PhysicsData.WheelSlip == null) - return wpfPlot; - - - double[] understeers = new double[splines.Length]; - double[] oversteers = new double[splines.Length]; - - for (int i = 0; i != dict.Count; i++) - { - float[] wheelSlip = dict.ElementAt(i).Value.PhysicsData.WheelSlip; - - float slipRatioFront = (wheelSlip[(int)Wheel.FrontLeft] + wheelSlip[(int)Wheel.FrontRight]) / 2; - float slipRatioRear = (wheelSlip[(int)Wheel.RearLeft] + wheelSlip[(int)Wheel.RearRight]) / 2; - - // understeer - if (slipRatioFront > slipRatioRear) - { - understeers[i] = slipRatioFront - slipRatioRear; - oversteers[i] = 0; - } - else if (slipRatioRear > slipRatioFront) - { // oversteer - oversteers[i] = (slipRatioRear - slipRatioFront); - understeers[i] = 0; - } - else - { - oversteers[i] = 0; - understeers[i] = 0; - } - } - - var understeerPlot = plot.AddSignalXY(splines, understeers, label: "Understeer", color: System.Drawing.Color.Blue); - understeerPlot.FillBelow(System.Drawing.Color.Blue, System.Drawing.Color.Transparent); - - var oversteerPlot = plot.AddSignalXY(splines, oversteers, label: "Oversteer", color: System.Drawing.Color.OrangeRed); - oversteerPlot.FillBelow(System.Drawing.Color.OrangeRed, System.Drawing.Color.Transparent); - - string fourSpaces = "".FillEnd(4, ' '); - double averageUndersteer = understeers.Average(); - double averageOversteer = oversteers.Average(); - _textBlockMetrics.Text += $"Av. Understeer {averageUndersteer:F3}"; - _textBlockMetrics.Text += $"{fourSpaces}Av. Oversteer {averageOversteer:F3}"; - - double minValue = 0; - double maxValue = int.MinValue; - - maxValue.ClipMin(understeers.Max()); - maxValue.ClipMin(oversteers.Max()); - - double padding = 0.5; - plot.SetAxisLimitsX(xMin: 0, xMax: _trackData.TrackLength); - plot.SetAxisLimitsY(minValue - padding / 2, maxValue + padding); - plot.SetOuterViewLimits(0, _trackData.TrackLength, minValue - 0.05, maxValue + padding); - plot.XLabel("Meters"); - plot.YLabel("Slip Angle"); - - #region add markers - - MarkerPlot osMarker = wpfPlot.Plot.AddPoint(0, 0, color: System.Drawing.Color.Blue); - MarkerPlot usMarker = wpfPlot.Plot.AddPoint(0, 0, color: System.Drawing.Color.OrangeRed); - PlotUtil.SetDefaultMarkerStyle(ref osMarker); - PlotUtil.SetDefaultMarkerStyle(ref usMarker); - - outerGrid.MouseMove += (s, e) => - { - (double mouseCoordsX, _) = wpfPlot.GetMouseCoordinates(); - - (double usX, double usY, int usIndex) = oversteerPlot.GetPointNearestX(mouseCoordsX); - usMarker.SetPoint(usX, usY); - usMarker.IsVisible = true; - oversteerPlot.Label = $"Oversteer: {oversteers[usIndex]:F3}"; - - (double osX, double osY, int osIndex) = understeerPlot.GetPointNearestX(mouseCoordsX); - osMarker.SetPoint(osX, osY); - osMarker.IsVisible = true; - understeerPlot.Label = $"Understeer: {understeers[osIndex]:F3}"; - - PlotUtil.MarkerIndex = osIndex; - - wpfPlot.RenderRequest(); - }; - - #endregion - - wpfPlot.AxesChanged += PlotUtil.WpfPlot_AxesChanged; - if (PlotUtil.AxisLimitsCustom) - plot.SetAxisLimits(xAxisIndex: 0, xMin: PlotUtil.AxisLimits.XMin, xMax: PlotUtil.AxisLimits.XMax); - - PlotUtil.SetDefaultPlotStyles(ref plot); - - wpfPlot.RenderRequest(); - - return wpfPlot; - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/RaceSessionBrowser.xaml b/Race_Element/Controls/Telemetry/RaceSessions/RaceSessionBrowser.xaml deleted file mode 100644 index 4ea074d76..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/RaceSessionBrowser.xaml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -  Local - - - - - - - - - - - - - -  Current - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Telemetry/RaceSessions/RaceSessionBrowser.xaml.cs b/Race_Element/Controls/Telemetry/RaceSessions/RaceSessionBrowser.xaml.cs deleted file mode 100644 index 45ed2f472..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/RaceSessionBrowser.xaml.cs +++ /dev/null @@ -1,619 +0,0 @@ -using RaceElement.Broadcast; -using RaceElement.Controls.Telemetry.RaceSessions; -using RaceElement.Controls.Telemetry.RaceSessions.Plots; -using RaceElement.Data; -using RaceElement.Data.ACC.Cars; -using RaceElement.Data.ACC.Database; -using RaceElement.Data.ACC.Database.GameData; -using RaceElement.Data.ACC.Database.LapDataDB; -using RaceElement.Data.ACC.Database.SessionData; -using RaceElement.Data.ACC.Database.Telemetry; -using RaceElement.Data.ACC.Session; -using RaceElement.Data.ACC.Tracks; -using RaceElement.Util; -using LiteDB; -using MaterialDesignThemes.Wpf; -using ScottPlot; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Input; -using System.Windows.Media; -using DataGridTextColumn = MaterialDesignThemes.Wpf.DataGridTextColumn; -using AbstractTrackData = RaceElement.Data.ACC.Tracks.TrackData.AbstractTrackData; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for RaceSessionBrowser.xaml - /// - TODO: refactor into OOP - /// - public partial class RaceSessionBrowser : UserControl - { - public static RaceSessionBrowser Instance { get; private set; } - private LiteDatabase CurrentDatabase; - - private int previousTelemetryComboSelection = -1; - - public RaceSessionBrowser() - { - InitializeComponent(); - - this.Loaded += (s, e) => ThreadPool.QueueUserWorkItem(x => - { - FindRaceWeekends(); - }); - - comboTracks.SelectionChanged += (s, e) => FillCarComboBox(); - comboCars.SelectionChanged += (s, e) => LoadSessionList(); - listViewRaceSessions.SelectionChanged += (s, e) => LoadSession(); - - gridTabHeaderLocalSession.MouseRightButtonUp += (s, e) => FindRaceWeekends(); - - RaceSessionTracker.Instance.OnRaceWeekendEnded += (s, e) => FindRaceWeekends(); - - Instance = this; - } - - private void CloseTelemetry() - { - comboBoxMetrics.Items.Clear(); - gridMetrics.Children.Clear(); - textBlockMetricInfo.Text = String.Empty; - transitionContentPlots.Visibility = Visibility.Collapsed; - trackMap.Visibility = Visibility.Collapsed; - - Grid.SetRowSpan(gridSessionViewer, 2); - Grid.SetRowSpan(tabControlWeekends, 2); - - ThreadPool.QueueUserWorkItem(x => - { - Thread.Sleep(2000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); - }); - } - - private void FindRaceWeekends() - { - Dispatcher.Invoke(() => - { - localRaceWeekends.Items.Clear(); - - DirectoryInfo dataDir = new DirectoryInfo(FileUtil.RaceElementDataPath); - if (!dataDir.Exists) - return; - - var raceWeekendFiles = dataDir.EnumerateFiles() - .Where(x => !x.Name.Contains("log") && x.Extension == ".rwdb") - .OrderByDescending(x => x.LastWriteTimeUtc); - - foreach (FileInfo file in raceWeekendFiles) - { - TextBlock textBlock = new TextBlock() { Text = file.Name.Replace(file.Extension, ""), FontSize = 12 }; - ListViewItem lvi = new ListViewItem() { Content = textBlock, DataContext = file.FullName, Cursor = Cursors.Hand }; - lvi.MouseLeftButtonUp += (s, e) => - { - ListViewItem item = (ListViewItem)s; - OpenRaceWeekendDatabase((string)item.DataContext); - }; - localRaceWeekends.Items.Add(lvi); - } - }); - } - - public void OpenRaceWeekendDatabase(string filename, bool focusCurrentWeekendTab = true) - { - if (CurrentDatabase != null) - CurrentDatabase.Dispose(); ; - - CurrentDatabase = RaceWeekendDatabase.OpenDatabase(filename); - if (CurrentDatabase != null) - { - FillTrackComboBox(); - if (focusCurrentWeekendTab) - tabCurrentWeekend.Focus(); - } - } - - private void LoadSession() - { - DbRaceSession session = GetSelectedRaceSession(); - if (session == null) return; - - Dictionary laps = LapDataCollection.GetForSession(CurrentDatabase, session.Id); - stackerSessionViewer.Children.Clear(); - gridSessionLaps.Children.Clear(); - - if (session == null) return; - - string sessionInfo = $"{(session.IsOnline ? "On" : "Off")}line {ACCSharedMemory.SessionTypeToString(session.SessionType)}"; - - if (session.UtcEnd > session.UtcStart) - { - TimeSpan duration = session.UtcEnd.Subtract(session.UtcStart); - sessionInfo += $" - Duration: {duration:hh\\:mm\\:ss}"; - } - - int potentialBestLapTime = laps.GetPotentialFastestLapTime(); - if (potentialBestLapTime != -1) - sessionInfo += $" - Potential best: {new TimeSpan(0, 0, 0, 0, potentialBestLapTime):mm\\:ss\\:fff}"; - - stackerSessionViewer.Children.Add(new TextBlock() - { - Text = sessionInfo, - FontSize = 14 - }); - - gridSessionLaps.Children.Add(GetLapDataGrid(laps)); - - Grid.SetRowSpan(gridSessionViewer, 2); - Grid.SetRowSpan(tabControlWeekends, 2); - - transitionContentPlots.Visibility = Visibility.Collapsed; - trackMap.Visibility = Visibility.Collapsed; - - PlotUtil.AxisLimitsCustom = false; - - } - - private Guid GetSelectedTrack() - { - if (comboTracks.SelectedIndex == -1) return Guid.Empty; - return (Guid)(comboTracks.SelectedItem as ComboBoxItem).DataContext; - } - - private Guid GetSelectedCar() - { - if (comboCars.SelectedIndex == -1) return Guid.Empty; - return (Guid)(comboCars.SelectedItem as ComboBoxItem).DataContext; - } - - private DbRaceSession GetSelectedRaceSession() - { - if (listViewRaceSessions.SelectedIndex == -1) return null; - return (DbRaceSession)(listViewRaceSessions.SelectedItem as ListViewItem).DataContext; - } - - public void FillCarComboBox() - { - if (GetSelectedTrack() == Guid.Empty) - return; - - List carGuidsForTrack = RaceSessionCollection.GetAllCarsForTrack(CurrentDatabase, GetSelectedTrack()); - List allCars = CarDataCollection.GetAll(CurrentDatabase); - - comboCars.Items.Clear(); - foreach (DbCarData carData in allCars.Where(x => carGuidsForTrack.Contains(x.Id))) - { - var carModel = ConversionFactory.ParseCarName(carData.ParseName); - string carName = ConversionFactory.GetNameFromCarModel(carModel); - ComboBoxItem item = new ComboBoxItem() { DataContext = carData.Id, Content = carName }; - comboCars.Items.Add(item); - } - comboCars.SelectedIndex = 0; - } - - public void FillTrackComboBox() - { - comboTracks.Items.Clear(); - List allTracks = TrackDataCollection.GetAll(CurrentDatabase); - if (allTracks.Any()) - { - foreach (DbTrackData track in allTracks) - { - string trackName; - TrackData.Tracks.TryGetValue(track.ParseName, out AbstractTrackData trackData); - if (trackData == null) trackName = track.ParseName; - else trackName = trackData.FullName; - - ComboBoxItem item = new ComboBoxItem() { DataContext = track.Id, Content = trackName }; - comboTracks.Items.Add(item); - } - - comboTracks.SelectedIndex = 0; - } - } - - public void LoadSessionList() - { - List allsessions = RaceSessionCollection.GetAll(CurrentDatabase); - - listViewRaceSessions.Items.Clear(); - var sessionsWithCorrectTrackAndCar = allsessions - .Where(x => x.TrackId == GetSelectedTrack() && x.CarId == GetSelectedCar()) - .OrderByDescending(x => x.UtcStart); - if (sessionsWithCorrectTrackAndCar.Any()) - { - foreach (DbRaceSession session in sessionsWithCorrectTrackAndCar) - { - DbCarData carData = CarDataCollection.GetCarData(CurrentDatabase, session.CarId); - DbTrackData dbTrackData = TrackDataCollection.GetTrackData(CurrentDatabase, session.TrackId); - - var carModel = ConversionFactory.ParseCarName(carData.ParseName); - string carName = ConversionFactory.GetNameFromCarModel(carModel); - string trackName = dbTrackData.ParseName; - TrackData.Tracks.TryGetValue(dbTrackData.ParseName, out AbstractTrackData trackData); - if (dbTrackData != null) trackName = trackData.FullName; - - session.UtcStart = DateTime.SpecifyKind(session.UtcStart, DateTimeKind.Utc); - ListViewItem listItem = new ListViewItem() - { - Content = $"{ACCSharedMemory.SessionTypeToString(session.SessionType)} - {session.UtcStart.ToLocalTime():U}", - DataContext = session - }; - listViewRaceSessions.Items.Add(listItem); - } - - listViewRaceSessions.SelectedIndex = 0; - } - } - - public DataGrid GetLapDataGrid(Dictionary laps) - { - var data = laps.OrderByDescending(x => x.Key).Select(x => x.Value); - DataGrid grid = new DataGrid() - { - ItemsSource = data, - AutoGenerateColumns = false, - CanUserDeleteRows = false, - CanUserAddRows = false, - IsReadOnly = true, - EnableRowVirtualization = false, - SelectionMode = DataGridSelectionMode.Single, - SelectionUnit = DataGridSelectionUnit.FullRow, - GridLinesVisibility = DataGridGridLinesVisibility.Vertical, - FontWeight = FontWeights.ExtraBold, - AlternatingRowBackground = new SolidColorBrush(Color.FromArgb(25, 0, 0, 0)), - RowBackground = Brushes.Transparent, - VerticalScrollBarVisibility = ScrollBarVisibility.Auto, - HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, - }; - - int fastestLapIndex = laps.GetFastestLapIndex(); - grid.LoadingRow += (s, e) => - { - DataGridRowEventArgs ev = e; - DbLapData lapData = (DbLapData)ev.Row.DataContext; - - ev.Row.Margin = new Thickness(0); - ev.Row.Padding = new Thickness(0); - - if (!lapData.IsValid) - ev.Row.Foreground = Brushes.OrangeRed; - - if (lapData.Index == fastestLapIndex) - ev.Row.Foreground = Brushes.LimeGreen; - - switch (lapData.LapType) - { - case LapType.Outlap: - { - ev.Row.FontStyle = FontStyles.Italic; - break; - } - case LapType.Inlap: - { - ev.Row.FontStyle = FontStyles.Italic; - break; - } - } - - ev.Row.PreviewMouseLeftButtonDown += (se, eve) => - { - if (ev.Row.IsSelected) - { - CloseTelemetry(); - ev.Row.IsSelected = false; - eve.Handled = true; - } - }; - }; - - grid.Columns.Add(new DataGridTextColumn() - { - Header = new TextBlock() { Text = "#", ToolTip = "Lap", Margin = new Thickness(0) }, - Binding = new Binding("Index"), - SortDirection = System.ComponentModel.ListSortDirection.Descending, - FontWeight = FontWeights.DemiBold, - }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = "Time", - Binding = new Binding("Time") { Converter = new MillisecondsToFormattedTimeSpanString() } - }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = "S 1", - Binding = new Binding("Sector1") { Converter = new DivideBy1000ToFloatConverter() } - }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = "S 2", - Binding = new Binding("Sector2") { Converter = new DivideBy1000ToFloatConverter() } - }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = "S 3", - Binding = new Binding("Sector3") { Converter = new DivideBy1000ToFloatConverter() } - }); - - // fuel used - StackPanel fuelUsagePanel = new StackPanel() - { - Orientation = System.Windows.Controls.Orientation.Horizontal, - ToolTip = "Fuel used", - }; - fuelUsagePanel.Children.Add(new PackIcon() { Kind = PackIconKind.Fuel }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = fuelUsagePanel, - Binding = new Binding("FuelUsage") { Converter = new DivideBy1000ToFloatConverter() }, - }); - - // fuel left - StackPanel fuelLeftPanel = new StackPanel() - { - Orientation = System.Windows.Controls.Orientation.Horizontal, - ToolTip = "Fuel left" - }; - fuelLeftPanel.Children.Add(new PackIcon() { Kind = PackIconKind.Fuel }); - fuelLeftPanel.Children.Add(new TextBlock() { Text = " Left" }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = fuelLeftPanel, - Binding = new Binding("FuelInTank") { Converter = new FormattedFloatConverter() } - }); - - grid.Columns.Add(new DataGridTextColumn() - { - Header = "Box", - Binding = new Binding("LapType") { Converter = new LapTypeConverter() } - }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = "Track", - Binding = new Binding("GripStatus") { } - }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = "°C Air", - Binding = new Binding("TempAmbient") { Converter = new FormattedFloatConverter(2) } - }); - grid.Columns.Add(new DataGridTextColumn() - { - Header = "°C Track", - Binding = new Binding("TempTrack") { Converter = new FormattedFloatConverter(2) } - }); - - - - //grid.SelectedCellsChanged += (s, e) => - //{ - // if (grid.SelectedIndex != -1) - // { - // DbLapData lapdata = (DbLapData)grid.SelectedItem; - - // CreateCharts(lapdata.Id); - // } - //}; - - return grid; - } - - - private delegate WpfPlot Plotter(Grid g, Dictionary dictio); - - private SelectionChangedEventHandler _selectionChangedHandler; - private Dictionary _currentData; - - private void LogTelemetrySplinesInfo(Dictionary dictio) - { - Debug.WriteLine($"Spline[Start: {dictio.First().Value.SplinePosition:F6}, End: {dictio.Last().Value.SplinePosition:F6}, Count: {dictio.Count}]"); - - float previousSpline = -1; - int index = 0; - foreach (var node in dictio) - { - if (node.Value.SplinePosition < previousSpline) - { - Debug.WriteLine($"Decreasing spline at index {index + 1}: {previousSpline}->{node.Value.SplinePosition:F12}"); - - int tenPercentCount = dictio.Count / 10; - - break; - } - previousSpline = node.Value.SplinePosition; - index++; - } - - - } - - private void FilterTelemetrySplines(Dictionary dictio) - { - Debug.WriteLine("-- Before Filtering --"); - LogTelemetrySplinesInfo(_currentData); - - - float highestSplinePosition = -1; - - long minKeyToTranslate = -1; - bool needsToTranslate = false; - - bool lastCloseToZero = false; - if (dictio.Last().Value.SplinePosition < 0.1) - lastCloseToZero = true; - - Debug.WriteLine($" --- Min Key: {minKeyToTranslate}"); - float lastSplinePosition = -1; - foreach (var data in dictio) - { - if (!needsToTranslate) - { - if (data.Value.SplinePosition < lastSplinePosition && minKeyToTranslate == -1) - { - needsToTranslate = true; - minKeyToTranslate = data.Key; - Debug.WriteLine($" --- Min Key: {minKeyToTranslate} - {data.Value.SplinePosition:F12}"); - } - if (!needsToTranslate) - lastSplinePosition = data.Value.SplinePosition; - } - - if (needsToTranslate) - if (data.Value.SplinePosition > highestSplinePosition) - highestSplinePosition = data.Value.SplinePosition; - } - - if (needsToTranslate) - { - Debug.WriteLine("-- Requires Filtering --"); - float translation = 1 - dictio.First().Value.SplinePosition; - if (lastCloseToZero) - translation = dictio.First().Value.SplinePosition * -1; - - _currentData.Clear(); - - Debug.WriteLine($"Translation {translation}"); - - bool startTranslation = false; - foreach (var data in dictio) - { - if (!startTranslation) - { - if (data.Key == minKeyToTranslate) - startTranslation = true; - else - { - var oldPoint = data.Value; - oldPoint.SplinePosition = (oldPoint.SplinePosition + translation); - - if (oldPoint.SplinePosition > 1) - oldPoint.SplinePosition -= 1; - - _currentData.Add(data.Key, oldPoint); - } - } - - if (startTranslation) - { - var oldPoint = data.Value; - oldPoint.SplinePosition = (1 + oldPoint.SplinePosition) + translation; - - if (oldPoint.SplinePosition > 2) - oldPoint.SplinePosition -= 1; - - _currentData.Add(data.Key, oldPoint); - } - } - - - } - - Debug.WriteLine("-- After Filtering --"); - LogTelemetrySplinesInfo(_currentData); - } - - private void CreateCharts(Guid lapId) - { - //gridSessionViewer - comboBoxMetrics.Items.Clear(); - gridMetrics.Children.Clear(); - textBlockMetricInfo.Text = String.Empty; - - DbLapTelemetry telemetry = LapTelemetryCollection.GetForLap(CurrentDatabase.GetCollection(), lapId); - - if (telemetry == null) - { - Grid.SetRowSpan(gridSessionViewer, 2); - Grid.SetRowSpan(tabControlWeekends, 2); - transitionContentPlots.Visibility = Visibility.Collapsed; - trackMap.Visibility = Visibility.Collapsed; - } - else - { - Grid.SetRowSpan(gridSessionViewer, 1); - Grid.SetRowSpan(tabControlWeekends, 1); - transitionContentPlots.Visibility = Visibility.Visible; - - - if (_currentData != null) - _currentData.Clear(); - - _currentData = telemetry.DeserializeLapData(); - telemetry = null; - - FilterTelemetrySplines(_currentData.ToDictionary(x => x.Key, x => x.Value)); - - - AbstractTrackData trackData = TrackData.Tracks.Values.First(x => x.Guid == GetSelectedTrack()); - PlotUtil.trackData = trackData; - int fullSteeringLock = SteeringLock.Get(CarDataCollection.GetCarData(CurrentDatabase, GetSelectedCar()).ParseName); - - trackMap.SetData(ref _currentData); - trackMap.Visibility = Visibility.Visible; - - - Dictionary plots = new Dictionary(); - plots.Add("Speed/Gear", (g, d) => new SpeedGearPlot(trackData, ref textBlockMetricInfo).Create(g, d)); - plots.Add("Inputs", (g, d) => new InputsPlot(trackData, ref textBlockMetricInfo, fullSteeringLock).Create(g, d)); - plots.Add("Wheel Slip", (g, d) => new WheelSlipPlot(trackData, ref textBlockMetricInfo).Create(g, d)); - plots.Add("Tyre Temperatures", (g, d) => new TyreTempsPlot(trackData, ref textBlockMetricInfo).Create(g, d)); - plots.Add("Tyre Pressures", (g, d) => new TyrePressurePlot(trackData, ref textBlockMetricInfo).Create(g, d)); - plots.Add("Brake Temperatures", (g, d) => new BrakeTempsPlot(trackData, ref textBlockMetricInfo).Create(g, d)); - - if (_selectionChangedHandler != null) - { - comboBoxMetrics.SelectionChanged -= _selectionChangedHandler; - _selectionChangedHandler = null; - } - - comboBoxMetrics.SelectionChanged += _selectionChangedHandler = new SelectionChangedEventHandler((s, e) => - { - if (comboBoxMetrics.SelectedItem == null) - return; - - previousTelemetryComboSelection = comboBoxMetrics.SelectedIndex; - - gridMetrics.Children.Clear(); - textBlockMetricInfo.Text = String.Empty; - - Grid grid = new Grid(); - gridMetrics.Children.Add(grid); - - Plotter plotter = (Plotter)(comboBoxMetrics.SelectedItem as ComboBoxItem).DataContext; - grid.Children.Add(plotter.Invoke(grid, _currentData)); - - ThreadPool.QueueUserWorkItem(x => - { - Thread.Sleep(2000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); - }); - }); - - foreach (var plot in plots) - { - ComboBoxItem boxItem = new ComboBoxItem() - { - Content = plot.Key, - DataContext = plot.Value - }; - comboBoxMetrics.Items.Add(boxItem); - } - - if (comboBoxMetrics.Items.Count > 0) - { - int toSelect = previousTelemetryComboSelection; - if (toSelect == -1) toSelect = 0; - comboBoxMetrics.SelectedIndex = toSelect; - } - } - } - } -} diff --git a/Race_Element/Controls/Telemetry/RaceSessions/TrackMap/TrackMap.xaml b/Race_Element/Controls/Telemetry/RaceSessions/TrackMap/TrackMap.xaml deleted file mode 100644 index 62389171e..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/TrackMap/TrackMap.xaml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/Race_Element/Controls/Telemetry/RaceSessions/TrackMap/TrackMap.xaml.cs b/Race_Element/Controls/Telemetry/RaceSessions/TrackMap/TrackMap.xaml.cs deleted file mode 100644 index 807d2cbc9..000000000 --- a/Race_Element/Controls/Telemetry/RaceSessions/TrackMap/TrackMap.xaml.cs +++ /dev/null @@ -1,276 +0,0 @@ -using RaceElement.Util.SystemExtensions; -using RaceElement.Controls.Telemetry.RaceSessions.Plots; -using RaceElement.Controls.Util.SetupImage; -using RaceElement.Data.ACC.Database.Telemetry; -using RaceElement.HUD.Overlay.OverlayUtil; -using ScottPlot; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Linq; -using System.Threading; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using Brushes = System.Drawing.Brushes; -using Color = System.Drawing.Color; -using Pen = System.Drawing.Pen; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for TrackMap.xaml - /// - public partial class TrackMap : UserControl - { - private Dictionary _dict; - PointF[] points = new PointF[0]; - - private CachedBitmap _cbDrivenCoordinates; - - private Thread markerThread; - private int _markerIndex = -1; - private int _nextMarkerIndex = -1; - private int _lastX = -1, _lastY = -1; - - private float _maxSize = 0; - private float _xTranslate = 0; - private float _yTranslate = 0; - - - public TrackMap() - { - InitializeComponent(); - this.IsVisibleChanged += TrackMap_IsVisibleChanged; - - this.SizeChanged += (s, e) => DrawDrivenCoordinates(ref _dict, true); - - PlotUtil.MarkerIndexChanged += PlotUtil_MarkerIndexChanged; - PlotUtil.AxisLimitsChanged += PlotUtil_AxisLimitsChanged; - } - - private void PlotUtil_AxisLimitsChanged(object sender, AxisLimits axisLimits) - { - new Thread(() => - { - lock (_dict) - points = _dict.Where(x => - { - double trackPosition = PlotUtil.trackData.TrackLength * x.Value.SplinePosition; - int buffer = 50; - return trackPosition < axisLimits.XMax + buffer && trackPosition > (axisLimits.XMin - buffer); - }).Select(x => new PointF(x.Value.PhysicsData.X, x.Value.PhysicsData.Y)).ToArray(); - - DrawDrivenCoordinates(ref _dict, true); - }).Start(); - } - - private void PlotUtil_MarkerIndexChanged(object sender, int index) - { - if (_markerIndex == index) - return; - - _markerIndex = index; - - if (_cbDrivenCoordinates != null && index != -1) - { - if (markerThread == null || !markerThread.IsAlive) - { - markerThread = new Thread(x => - { - TelemetryPoint tmPoint = _dict.ElementAt(index).Value; - - bool somethingWrong = false; - if (tmPoint.PhysicsData.X < 1 && tmPoint.PhysicsData.X >= 0) - somethingWrong = true; - if (tmPoint.PhysicsData.Y < 1 && tmPoint.PhysicsData.Y >= 0) - somethingWrong = true; - if (tmPoint.PhysicsData.X > -1 && tmPoint.PhysicsData.X <= 0) - somethingWrong = true; - if (tmPoint.PhysicsData.Y > -1 && tmPoint.PhysicsData.Y <= 0) - somethingWrong = true; - - if (somethingWrong) - return; - - float xPoint = (tmPoint.PhysicsData.X + _xTranslate) / _maxSize; - float yPoint = (tmPoint.PhysicsData.Y + _yTranslate) / _maxSize; - - var drawPoint = new PointF(xPoint * _cbDrivenCoordinates.Width, yPoint * _cbDrivenCoordinates.Height); - - int newX = (int)drawPoint.X; - int newY = (int)drawPoint.Y; - - if (newX == _lastX && newY == _lastY) - return; - - _lastX = newX; - _lastY = newY; - - CachedBitmap mapWithMarker = new CachedBitmap(_cbDrivenCoordinates.Width, _cbDrivenCoordinates.Height, g => - { - _cbDrivenCoordinates?.Draw(g); - - GraphicsPath path = new GraphicsPath(); - - // add current location marker - int ellipseSize = 12; - path.AddEllipse(drawPoint.X - ellipseSize / 2, drawPoint.Y - ellipseSize / 2, ellipseSize, ellipseSize); - - // draw t - g.DrawPath(new Pen(Color.White, 1f), path); - }); - - this.Dispatcher.Invoke(() => - { - image.Stretch = Stretch.UniformToFill; - image.Width = _cbDrivenCoordinates.Width; - image.Height = _cbDrivenCoordinates.Height; - image.Source = ImageControlCreator.CreateImage(mapWithMarker.Width, mapWithMarker.Height, mapWithMarker).Source; - }, System.Windows.Threading.DispatcherPriority.DataBind); - - Thread.Sleep(38); - - if (_nextMarkerIndex != -1) - { - new Thread(() => - { - PlotUtil_MarkerIndexChanged(null, _nextMarkerIndex); - _nextMarkerIndex = -1; - }).Start(); - } - - }); - markerThread.Start(); - } - else - { - _nextMarkerIndex = index; - } - } - } - - private void TrackMap_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) - { - if (this.Visibility == Visibility.Visible) - DrawMap(); - else - { - image.Source = null; - ThreadPool.QueueUserWorkItem(x => - { - Thread.Sleep(1000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, false, true); - }); - } - } - - public void SetData(ref Dictionary dict) - { - this._dict = dict; - DrawMap(); - } - - public void DrawMap() - { - if (_dict == null) - return; - - DrawDrivenCoordinates(ref _dict); - } - - private void DrawDrivenCoordinates(ref Dictionary dict, bool updateImageControl = false) - { - if (points == null) - points = dict.Select(x => new PointF(x.Value.PhysicsData.X, x.Value.PhysicsData.Y)).ToArray(); - - Grid parent = (Grid)this.Parent; - int width = (int)(parent.ColumnDefinitions.First().ActualWidth); - int height = (int)(parent.RowDefinitions.ElementAt(1).ActualHeight); - - width.ClipMax(height); - height.ClipMax(width); - - _cbDrivenCoordinates = new CachedBitmap(width, height, g => - { - float minX = float.MaxValue, maxX = float.MinValue; - float minY = float.MaxValue, maxY = float.MinValue; - foreach (PointF point in points) - { - maxX.ClipMin(point.X); - minX.ClipMax(point.X); - maxY.ClipMin(point.Y); - minY.ClipMax(point.Y); - } - - _xTranslate = 0; - _yTranslate = 0; - - if (minX >= 0) - _xTranslate = minX * -1; - else - _xTranslate = minX * -1; - - if (minY >= 0) - _yTranslate = minY * -1; - else - _yTranslate = minY * -1; - - _xTranslate += 50; - _yTranslate += 50; - - points = points.Select(x => new PointF(x.X + _xTranslate, x.Y + _yTranslate)).ToArray(); - minX = float.MaxValue; maxX = float.MinValue; - minY = float.MaxValue; maxY = float.MinValue; - foreach (PointF point in points) - { - maxX.ClipMin(point.X); - minX.ClipMax(point.X); - maxY.ClipMin(point.Y); - minY.ClipMax(point.Y); - } - - if (points.Length > 0) - { - _maxSize = 0; - if (minX * -1 > _maxSize) - _maxSize = minX * -1; - if (maxX > _maxSize) - _maxSize = maxX; - if (minY * -1 > _maxSize) - _maxSize = minY * -1; - if (maxY > _maxSize) - _maxSize = maxY; - - _maxSize *= 1.1f; - - points = points.Select(x => - { - float xPoint = x.X / _maxSize; - float yPoint = x.Y / _maxSize; - return new PointF(xPoint * width, yPoint * height); - }).ToArray(); - GraphicsPath path = new GraphicsPath(FillMode.Winding); - path.AddLines(points); - - Pen pen = new Pen(Color.White, 2f); - g.SmoothingMode = SmoothingMode.HighQuality; - g.DrawPath(pen, path); - } - }); - - if (updateImageControl) - { - this.Dispatcher.Invoke(() => - { - image.Stretch = Stretch.Uniform; - image.Width = width; - image.Height = height; - image.Source = ImageControlCreator.CreateImage(_cbDrivenCoordinates.Width, _cbDrivenCoordinates.Height, _cbDrivenCoordinates).Source; - }, System.Windows.Threading.DispatcherPriority.DataBind); - } - } - } -} diff --git a/Race_Element/Controls/Telemetry/TelemetryDebug.xaml b/Race_Element/Controls/Telemetry/TelemetryDebug.xaml deleted file mode 100644 index 6fed9858f..000000000 --- a/Race_Element/Controls/Telemetry/TelemetryDebug.xaml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - Static Data - - - - - - - - - - - - - - - - Physics Data - - - - - - - - - - - - - - - - Graphics Data - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/TitleBar.xaml.cs b/Race_Element/Controls/TitleBar.xaml.cs deleted file mode 100644 index 38adbee59..000000000 --- a/Race_Element/Controls/TitleBar.xaml.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Diagnostics; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for TitleBar.xaml - /// - public partial class TitleBar : UserControl - { - internal static TitleBar Instance { get; private set; } - - private const string _AppName = "Race Element"; - - public TitleBar() - { - InitializeComponent(); - SetAppTitle(); - buttonExit.Click += ButtonExit_Click; - - buttonMinimize.Click += (e, s) => { App.Current.MainWindow.WindowState = WindowState.Minimized; }; - buttonMaximize.Click += (e, s) => - { - if (App.Current.MainWindow.WindowState == WindowState.Maximized) - App.Current.MainWindow.WindowState = WindowState.Normal; - else - App.Current.MainWindow.WindowState = WindowState.Maximized; - }; - - this.iconSteeringLock.MouseRightButtonDown += (s, e) => - { - MainWindow.Instance.tabSettings.Focus(); - SettingsTab.Instance.tabHardware.Focus(); - e.Handled = true; - }; - - this.iconSetupHider.MouseRightButtonDown += (s, e) => - { - MainWindow.Instance.tabSettings.Focus(); - SettingsTab.Instance.tabStreaming.Focus(); - e.Handled = true; - }; - - this.iconAutoSaveReplay.MouseRightButtonDown += (s, e) => - { - - MainWindow.Instance.tabSettings.Focus(); - SettingsTab.Instance.tabAccSettings.Focus(); - }; - - -#if DEBUG - copySpline.Click += (s, e) => - { - try - { - float spline = ACCSharedMemory.Instance.ReadGraphicsPageFile().NormalizedCarPosition; - MainWindow.Instance.EnqueueSnackbarMessage($"Copied spline position {spline}f"); - - Clipboard.SetText($"{spline}f"); - } - catch (Exception) - {// - } - }; -#else - copySpline.Visibility = Visibility.Collapsed; -#endif - this.MouseDoubleClick += TitleBar_MouseDoubleClick; - Instance = this; - } - - internal void SetAppTitle(string launchType = "") - { - Dispatcher.BeginInvoke(new Action(() => - { - this.Title.Text = $"{_AppName} {GetAssemblyFileVersion()}"; - if (launchType != String.Empty) - this.Title.Text += $" - {launchType}"; - })); - } - - private void TitleBar_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - WindowState targetState = WindowState.Normal; - switch (App.Current.MainWindow.WindowState) - { - case WindowState.Normal: - { - targetState = WindowState.Maximized; - break; - } - case WindowState.Maximized: - { - targetState = WindowState.Normal; - break; - } - } - - App.Current.MainWindow.WindowState = targetState; - } - - public void SetIcons(ActivatedIcons icon, bool enabled) - { - switch (icon) - { - case ActivatedIcons.AutomaticSteeringHardLock: - { - iconSteeringLock.Visibility = enabled ? Visibility.Visible : Visibility.Collapsed; - break; - } - case ActivatedIcons.SetupHider: - { - iconSetupHider.Visibility = enabled ? Visibility.Visible : Visibility.Collapsed; - break; - } - case ActivatedIcons.AutomaticSaveReplay: - { - iconAutoSaveReplay.Visibility = enabled ? Visibility.Visible : Visibility.Collapsed; - break; - } - } - } - - public enum ActivatedIcons - { - AutomaticSteeringHardLock, - SetupHider, - AutomaticSaveReplay - } - - private void ButtonExit_Click(object sender, RoutedEventArgs e) - { - MainWindow.Instance.SaveLocation(); - Environment.Exit(0); - } - - public static string GetAssemblyFileVersion() - { - try - { - System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); - FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); - return fileVersion.FileVersion; - } - catch (Exception) - { - return String.Empty; - } - } - } -} diff --git a/Race_Element/Controls/Tools/FuelCalculator.xaml b/Race_Element/Controls/Tools/FuelCalculator.xaml deleted file mode 100644 index cf08ee83b..000000000 --- a/Race_Element/Controls/Tools/FuelCalculator.xaml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Controls/Tools/FuelCalculator.xaml.cs b/Race_Element/Controls/Tools/FuelCalculator.xaml.cs deleted file mode 100644 index 73cdd1810..000000000 --- a/Race_Element/Controls/Tools/FuelCalculator.xaml.cs +++ /dev/null @@ -1,275 +0,0 @@ -using RaceElement.Util; -using System; -using System.Globalization; -using System.Text.RegularExpressions; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for FuelCalculator.xaml - /// - public partial class FuelCalculator : UserControl - { - Regex regexRealNumbersOnly = new Regex("[0-9]+$"); - Regex regexDoublesOnly = new Regex("^[.][0-9]+$|^[0-9]*[.]{0,1}[0-9]*$"); - - private int raceHours = 0; - private int raceMinutes = 0; - - private double fuelPerLap = 0; - - private int lapTimeMinutes = 0; - private int lapTimeSeconds = 0; - private int lapTimeMilliseconds = 0; - - - public FuelCalculator() - { - InitializeComponent(); - - sliderHours.ValueChanged += SliderHours_ValueChanged; - sliderMinutes.ValueChanged += SliderMinutes_ValueChanged; - - // validate input - textBoxFuelPerLap.PreviewTextInput += TextBoxFuelPerLap_PreviewTextInput; - textBoxLapTimeMinute.PreviewTextInput += PreviewTextInput_NumbersOnly; - textBoxLapTimeSecond.PreviewTextInput += PreviewTextInput_NumbersOnly; - textBoxLapTimeMillis.PreviewTextInput += PreviewTextInput_NumbersOnly; - - textBoxFuelPerLap.TextChanged += TextBoxFuelPerLap_TextChanged; - textBoxLapTimeMinute.TextChanged += TextBoxLapTimeMinute_TextChanged; - textBoxLapTimeSecond.TextChanged += TextBoxLapTimeSecond_TextChanged; - textBoxLapTimeMillis.TextChanged += TextBoxLapTimeMillis_TextChanged; - - UpdateRaceDuration(); - UpdateLapTime(); - - buttonFillDataFromMemory.Click += ButtonFillDataFromMemory_Click; - } - - private void ButtonFillDataFromMemory_Click(object sender, RoutedEventArgs e) - { - try - { - var memoryMap = ACCSharedMemory.Instance.ReadGraphicsPageFile(false); - - if (memoryMap.Status == ACCSharedMemory.AcStatus.AC_OFF) - { - return; - } - - float memFuelPerLap = memoryMap.FuelXLap; - textBoxFuelPerLap.Text = Math.Round(memFuelPerLap, 6).ToString(); - - string[] splittedTime = memoryMap.BestTime.Split(':'); - if (int.Parse(splittedTime[0]) > 4) // no lap-time set - return; - - textBoxLapTimeMinute.Text = splittedTime[0]; - textBoxLapTimeSecond.Text = splittedTime[1]; - textBoxLapTimeMillis.Text = splittedTime[2]; - } - catch (Exception ex) - { - LogWriter.WriteToLog(ex); - } - } - - private void CalculateFuel() - { - long totalRaceMilliseconds = raceHours * 60 * 60 * 1000 + raceMinutes * 60 * 1000; - long totalLapTimeMilliseconds = lapTimeMinutes * 60 * 1000 + lapTimeSeconds * 1000 + lapTimeMilliseconds; - - if (totalRaceMilliseconds == 0 || totalLapTimeMilliseconds == 0 || fuelPerLap == 0) - { - lapCountLabel.Content = string.Empty; - fuelRequiredLabel.Content = string.Empty; - return; - } - - double laps = (double)totalRaceMilliseconds / (double)totalLapTimeMilliseconds; - double fuelRequired = Math.Ceiling(laps) * fuelPerLap; - - lapCountLabel.Content = $"Laps: {Math.Ceiling(laps)} ({Math.Round(laps, 3)})"; - fuelRequiredLabel.Content = $"Fuel Required: {Math.Ceiling(fuelRequired)} Liters ({Math.Round(fuelRequired, 3)})"; - } - - private void TextBoxFuelPerLap_TextChanged(object sender, TextChangedEventArgs e) - { - string text = textBoxFuelPerLap.Text; - if (!regexDoublesOnly.IsMatch(text)) - { - if (text.Equals(string.Empty)) - { - textBoxFuelPerLap.Text = string.Empty; - fuelPerLap = 0.0; - } - else - { - textBoxFuelPerLap.Text = fuelPerLap.ToString(); - } - } - - if (text.Length > 0) - { - try - { - var separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; - fuelPerLap = double.Parse(text.Replace(".", separator)); - - CalculateFuel(); - } - catch (Exception) - { - fuelPerLap = 0.0; - } - } - else - { - fuelPerLap = 0.0; - } - } - - - private void TextBoxLapTimeMillis_TextChanged(object sender, TextChangedEventArgs e) - { - string text = textBoxLapTimeMillis.Text; - if (!regexRealNumbersOnly.IsMatch(text)) - { - if (text.Equals(string.Empty)) - { - textBoxLapTimeMillis.Text = string.Empty; - lapTimeMilliseconds = 0; - } - else - { - textBoxLapTimeMillis.Text = lapTimeMilliseconds.ToString(); - } - } - else - { - if (text.Length > 0) - lapTimeMilliseconds = Convert.ToInt32(text); - else - lapTimeMilliseconds = 0; - } - - UpdateLapTime(); - } - - private void TextBoxLapTimeSecond_TextChanged(object sender, TextChangedEventArgs e) - { - string text = textBoxLapTimeSecond.Text; - if (!regexRealNumbersOnly.IsMatch(text)) - { - if (text.Equals(string.Empty)) - { - textBoxLapTimeSecond.Text = string.Empty; - lapTimeSeconds = 0; - } - else - { - textBoxLapTimeSecond.Text = lapTimeSeconds.ToString(); - } - } - else - { - - if (text.Length > 0) - lapTimeSeconds = Convert.ToInt32(text); - else - lapTimeSeconds = 0; - } - - UpdateLapTime(); - } - - private void TextBoxLapTimeMinute_TextChanged(object sender, TextChangedEventArgs e) - { - string text = textBoxLapTimeMinute.Text; - if (!regexRealNumbersOnly.IsMatch(text)) - { - if (text.Equals(string.Empty)) - { - textBoxLapTimeMinute.Text = string.Empty; - lapTimeMinutes = 0; - } - else - { - textBoxLapTimeMinute.Text = lapTimeMinutes.ToString(); - } - } - { - if (text.Length > 0) - lapTimeMinutes = Convert.ToInt32(text); - else - lapTimeMinutes = 0; - } - - UpdateLapTime(); - } - - private void UpdateLapTime() - { - lapTimeLabel.Content = $"Laptime: {lapTimeMinutes}:{lapTimeSeconds}.{lapTimeMilliseconds}"; - CalculateFuel(); - } - - private void PreviewTextInput_NumbersOnly(object sender, TextCompositionEventArgs e) - { - e.Handled = !regexRealNumbersOnly.IsMatch(e.Text); - } - - private void TextBoxFuelPerLap_PreviewTextInput(object sender, TextCompositionEventArgs e) - { - - e.Handled = !regexDoublesOnly.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text)); - } - - private void SliderMinutes_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) - { - UpdateRaceDuration(); - } - - private void SliderHours_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) - { - UpdateRaceDuration(); - } - - private void UpdateRaceDuration() - { - raceHours = (int)sliderHours.Value; - raceMinutes = (int)sliderMinutes.Value; - - bool includeMinutes = raceMinutes > 0; - - string duration = string.Empty; - if (raceHours > 0) - { - string hourOrHours = "hour"; - if (raceHours > 1) - hourOrHours += 's'; - - duration += $"{raceHours} {hourOrHours}"; - - if (includeMinutes) - { - duration += " and "; - } - } - - if (includeMinutes) - { - duration += $"{raceMinutes} minutes"; - } - - raceDurationLabel.Content = $"Race Duration: {duration}"; - CalculateFuel(); - } - - - } -} diff --git a/Race_Element/Controls/Tools/ToolsTabs.xaml b/Race_Element/Controls/Tools/ToolsTabs.xaml deleted file mode 100644 index 9bab5b12c..000000000 --- a/Race_Element/Controls/Tools/ToolsTabs.xaml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - -  Fuel Calculator - - - - - - - - - - - - diff --git a/Race_Element/Controls/Tools/ToolsTabs.xaml.cs b/Race_Element/Controls/Tools/ToolsTabs.xaml.cs deleted file mode 100644 index 979f82216..000000000 --- a/Race_Element/Controls/Tools/ToolsTabs.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace RaceElement.Controls -{ - /// - /// Interaction logic for ToolsTabs.xaml - /// - public partial class ToolsTabs : UserControl - { - public ToolsTabs() - { - InitializeComponent(); - } - } -} diff --git a/Race_Element/Controls/Util/ImageControlCreator.cs b/Race_Element/Controls/Util/ImageControlCreator.cs deleted file mode 100644 index 9a6028d87..000000000 --- a/Race_Element/Controls/Util/ImageControlCreator.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Windows.Media.Imaging; - -namespace RaceElement.Controls.Util.SetupImage -{ - internal class ImageControlCreator - { - public static System.Windows.Controls.Image CreateImage(int width, int height, RaceElement.HUD.Overlay.OverlayUtil.CachedBitmap cachedBitmap) - { - Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppPArgb); - - using (Graphics g = Graphics.FromImage(bitmap)) - { - cachedBitmap?.Draw(g, 0, 0, width, height); - } - - MemoryStream memStream = new MemoryStream(); - bitmap.Save(memStream, ImageFormat.Png); - - BitmapImage bmi = new BitmapImage - { - DecodePixelWidth = bitmap.Width, - DecodePixelHeight = bitmap.Height, - }; - - bmi.BeginInit(); - bmi.CacheOption = BitmapCacheOption.OnLoad; - bmi.StreamSource = memStream; - bmi.EndInit(); - bmi.Freeze(); - - System.Windows.Controls.Image image = new System.Windows.Controls.Image - { - Width = bitmap.Width, - Height = bitmap.Height, - Stretch = System.Windows.Media.Stretch.Uniform, - Source = bmi, - }; - - memStream.Close(); - memStream.Dispose(); - - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, false); - - return image; - } - } -} diff --git a/Race_Element/Controls/Util/Updater/Updater.cs b/Race_Element/Controls/Util/Updater/Updater.cs deleted file mode 100644 index c087d5ce4..000000000 --- a/Race_Element/Controls/Util/Updater/Updater.cs +++ /dev/null @@ -1,144 +0,0 @@ -using RaceElement.Util; -using Octokit; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Net; -using System.Text; -using System.Threading.Tasks; - -namespace RaceElement.Controls.Util.Updater -{ - internal class AppUpdater - { - internal void Update(ReleaseAsset asset) - { - if (!Verify(asset)) - { - LogWriter.WriteToLog("AutoUpdater: Unable to verify release asset."); - return; - } - - string assemblyStart = System.Reflection.Assembly.GetExecutingAssembly().Location; - - FileInfo currentAssemblyFile = new FileInfo(assemblyStart); - - MoveCurrentExecutableToDocumentsPath(currentAssemblyFile.FullName); - - if (!DownloadNewVersion(asset.BrowserDownloadUrl, currentAssemblyFile.FullName)) - { - RevertVersion(assemblyStart); - return; - } - - if (!RunNewVersion(currentAssemblyFile.FullName)) - { - LogWriter.WriteToLog("AutoUpdater: Something went wrong trying to run the newest version."); - RevertVersion(assemblyStart); - return; - } - } - - private bool MoveCurrentExecutableToDocumentsPath(string currentExecutableFullName) - { - Debug.WriteLine($"AutoUpdater: Moving current Executable to {FileUtil.RaceElementAppDataPath}"); - - FileInfo toBeMoved = new FileInfo(currentExecutableFullName); - - string tempTargetFile = $"{FileUtil.RaceElementAppDataPath}RaceElement.exe"; - - FileInfo targetFile = new FileInfo(tempTargetFile); - if (targetFile.Exists) - targetFile.Delete(); - - toBeMoved.MoveTo(tempTargetFile); - - Debug.WriteLine($"Current location of currentExecutable {toBeMoved.FullName} "); - return true; - } - - private bool RevertVersion(string currentExecutableFullName) - { - try - { - Debug.WriteLine($"AutoUpdater: Reverting Executable from {FileUtil.RaceElementAppDataPath} to {currentExecutableFullName}"); - - FileInfo toBeMoved = new FileInfo($"{FileUtil.RaceElementAppDataPath}RaceElement.exe"); - - FileInfo targetFile = new FileInfo(currentExecutableFullName); - if (targetFile.Exists) - targetFile.Delete(); - - toBeMoved.MoveTo(currentExecutableFullName); - - Debug.WriteLine($"Current location of currentExecutable {toBeMoved.FullName} "); - } - catch (Exception e) - { - LogWriter.WriteToLog("AutoUpdater: Something went wrong trying to revert the previous version."); - LogWriter.WriteToLog(e); - } - return true; - } - - private bool DownloadNewVersion(string downloadUrl, string targetFile) - { - try - { - var client = new WebClient(); - client.DownloadFile(downloadUrl, targetFile); - - LogWriter.WriteToLog($"AutoUpdater: Downloaded latest version from {downloadUrl} to file:\n{targetFile}"); - - FileInfo newVersion = new FileInfo(targetFile); - return newVersion.Exists; - } - catch (Exception e) - { - LogWriter.WriteToLog("AutoUpdater: Something went wrong trying to download the newest version."); - LogWriter.WriteToLog(e); - return false; - } - } - - private bool RunNewVersion(string targetFile) - { - LogWriter.WriteToLog("Shutting down, starting newest version"); - - FileInfo newVersion = new FileInfo(targetFile); - - if (!newVersion.Exists) - return false; - - string fullName = newVersion.FullName.Replace('\\', '/'); - ProcessStartInfo startInfo = new ProcessStartInfo() - { - FileName = "cmd", - Arguments = $"/c start \"RaceElement.exe\" \"{fullName}\"", - WindowStyle = ProcessWindowStyle.Hidden, - }; - LogWriter.WriteToLog(startInfo.Arguments); - - - Process.Start(startInfo); - - Environment.Exit(0); - - return false; - } - - private bool Verify(ReleaseAsset asset) - { - if (asset.ContentType != "application/x-msdownload") - return false; - if (asset.State != "uploaded") - return false; - if (asset.Uploader.Login != "RiddleTime") - return false; - - return true; - } - } -} diff --git a/Race_Element/FodyWeavers.xml b/Race_Element/FodyWeavers.xml deleted file mode 100644 index 92e3f5bfb..000000000 --- a/Race_Element/FodyWeavers.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Race_Element/LiveryParser/CarsJson.cs b/Race_Element/LiveryParser/CarsJson.cs deleted file mode 100644 index 1b304a3a2..000000000 --- a/Race_Element/LiveryParser/CarsJson.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace RaceElement.LiveryParser -{ - public class CarsJson - { - public class Root - { - public int CarGuid { get; set; } - public int TeamGuid { get; set; } - public int RaceNumber { get; set; } - public int RaceNumberPadding { get; set; } - public int AuxLightKey { get; set; } - public int AuxLightColor { get; set; } - public int SkinTemplateKey { get; set; } - public int SkinColor1Id { get; set; } - public int SkinColor2Id { get; set; } - public int SkinColor3Id { get; set; } - public int SponsorId { get; set; } - public int SkinMaterialType1 { get; set; } - public int SkinMaterialType2 { get; set; } - public int SkinMaterialType3 { get; set; } - public int RimColor1Id { get; set; } - public int RimColor2Id { get; set; } - public int RimMaterialType1 { get; set; } - public int RimMaterialType2 { get; set; } - public string TeamName { get; set; } - public int Nationality { get; set; } - public string DisplayName { get; set; } - public string CompetitorName { get; set; } - public int CompetitorNationality { get; set; } - public int TeamTemplateKey { get; set; } - public int CarModelType { get; set; } - public int CupCategory { get; set; } - public int LicenseType { get; set; } - public int UseEnduranceKit { get; set; } - public string CustomSkinName { get; set; } - public int BannerTemplateKey { get; set; } - } - } -} diff --git a/Race_Element/LiveryParser/PaintDetailsJson.cs b/Race_Element/LiveryParser/PaintDetailsJson.cs deleted file mode 100644 index b587860c5..000000000 --- a/Race_Element/LiveryParser/PaintDetailsJson.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace RaceElement.LiveryParser -{ - // (Sponsors.json + Decals.json) - public class PaintDetailsJson - { - public class Root - { - public int BaseRoughness { get; set; } - public int ClearCoat { get; set; } - public int ClearCoatRoughness { get; set; } - public int Metallic { get; set; } - } - } -} diff --git a/Race_Element/MainWindow.xaml b/Race_Element/MainWindow.xaml deleted file mode 100644 index f66809ede..000000000 --- a/Race_Element/MainWindow.xaml +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - About - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HUD - - - - - - - - - - - - - - - - - - - - - - - - - - - Data - - - - - - - - - - - - - - - - - - - - - - - - - - Setups - - - - - - - - - - - - - - - - - - - - - - - - - - - - Liveries - - - - - - - - - - - - - - - - - - - - - - - - - Tools - - - - - - - - - - - - - - - - - - - - - - - - - - Settings - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/MainWindow.xaml.cs b/Race_Element/MainWindow.xaml.cs deleted file mode 100644 index b84af9858..000000000 --- a/Race_Element/MainWindow.xaml.cs +++ /dev/null @@ -1,425 +0,0 @@ -using RaceElement.Broadcast; -using RaceElement.Util.Settings; -using RaceElement.Util.SystemExtensions; -using RaceElement.Controls; -using RaceElement.Data.ACC.Tracker; -using RaceElement.Hardware.ACC.SteeringLock; -using RaceElement.HUD.ACC; -using RaceElement.HUD.ACC.Data.Tracker; -using RaceElement.HUD.ACC.Overlays.OverlayDebugInfo.OverlayDebugOutput; -using RaceElement.Util; -using System; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Net; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Threading; -using System.Windows; -using System.Windows.Input; -using System.Windows.Interop; -using System.Windows.Threading; -using System.IO; - -namespace RaceElement -{ - /// - /// Interaction logic for MainWindow.xaml - /// - public partial class MainWindow : Window - { - internal static MainWindow Instance { get; private set; } - public const double MaxOpacity = 0.9892; - - private readonly UiSettings _uiSettings; - private readonly AccManagerSettings _accManagerSettings; - - public MainWindow() - { - this.Opacity = MaxOpacity; - DateTime startTime = DateTime.Now; - - InitializeComponent(); - Instance = this; - - Debug.WriteLine($"Startup time(ms): {DateTime.Now.Subtract(startTime).TotalMilliseconds}"); - - try - { - IntPtr hWnd = new WindowInteropHelper(GetWindow(this)).EnsureHandle(); - var attribute = DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE; - var preference = DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUND; - DwmSetWindowAttribute(hWnd, attribute, ref preference, sizeof(uint)); - } - catch (Exception) - { - // LogWriter.WriteToLog("Rounded corners are not supported for this machine, using square corners for the main window."); - } - - _uiSettings = new UiSettings(); - _accManagerSettings = new AccManagerSettings(); - - - this.Title = $"Race Element {GetAssemblyFileVersion()}"; - - this.titleBar.MouseLeftButtonDown += TitleBar_MouseLeftButtonDown; - this.titleBar.MouseLeftButtonUp += TitleBar_MouseLeftButtonUp; - this.titleBar.MouseLeave += (s, e) => { _stopDecreaseOpacty = true; e.Handled = true; this.Opacity = MaxOpacity; }; - this.titleBar.DragLeave += (s, e) => { _stopDecreaseOpacty = true; e.Handled = true; this.Opacity = MaxOpacity; }; - this.titleBar.MouseDoubleClick += (s, e) => { _stopDecreaseOpacty = true; e.Handled = true; this.Opacity = MaxOpacity; }; - - this.buttonPlayACC.Click += (sender, e) => Process.Start(new ProcessStartInfo() - { - FileName = "cmd", - Arguments = $"/c start steam://rungameid/805550", - WindowStyle = ProcessWindowStyle.Hidden, - }); - - this.StateChanged += MainWindow_StateChanged; - - - AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; - this.Closing += MainWindow_Closing; - - _ = TraceOutputListener.Instance; - - this.Loaded += MainWindow_Loaded; - - tabControl.SelectionChanged += (s, se) => - { - UiSettingsJson tempSettings = _uiSettings.Get(); - tempSettings.SelectedTabIndex = tabControl.SelectedIndex; - _uiSettings.Save(tempSettings); - }; - - tabControl.SelectedIndex = _uiSettings.Get().SelectedTabIndex.Clip(0, tabControl.Items.Count - 1); - - UiSettingsJson uiSettings = _uiSettings.Get(); - this.Left = uiSettings.X.Clip(0, (int)SystemParameters.PrimaryScreenWidth); - this.Top = uiSettings.Y.Clip(0, (int)SystemParameters.PrimaryScreenHeight); - - _uiSettings.Save(uiSettings); - - this.PreviewDrop += (s, e) => - { - Debug.WriteLine(e); - }; - this.Drop += MainWindow_Drop; - - InitializeSystemTrayIcon(); - - - // --- TODO refactor - ACCTrackerStarter.StartACCTrackers(); - - // warm up the broad cast config json.. make sure it's set up before we join any session - _ = BroadcastConfig.GetConfiguration(); - // --- - } - - private void MainWindow_Drop(object sender, DragEventArgs e) - { - /// https://stackoverflow.com/questions/3794462/enable-dragdrop-from-explorer-to-run-as-administrator-application - /// - // run new service with less elevated rights... this one will be able to accept drag and drop. - - - - if (e.Data is DataObject) - { - DataObject data = (DataObject)e.Data; - - StringCollection droppedItems = data.GetFileDropList(); - if (droppedItems.Count == 1) - { - string droppedItem = droppedItems[0]; - - if (droppedItem.EndsWith(".json")) - { - if (SetupImporter.Instance.Open(droppedItem)) - { - tabSetups.Focus(); - e.Handled = true; - return; - } - } - - if (droppedItem.EndsWith(".rwdb")) - { - RaceSessionBrowser.Instance.OpenRaceWeekendDatabase(droppedItem); - tabTelemetry.Focus(); - e.Handled = true; - return; - } - - if (droppedItem.EndsWith(".7z") || droppedItem.EndsWith(".zip") || droppedItem.EndsWith(".rar")) - { - Dispatcher.BeginInvoke(new Action(() => - { - LiveryImporter.ImportLiveryZips(new FileInfo(droppedItem)); - })); - } - - } - } - - } - - public void SaveLocation() - { - UiSettingsJson uiSettings = _uiSettings.Get(); - uiSettings.X = (int)this.Left; - uiSettings.Y = (int)this.Top; - _uiSettings.Save(uiSettings); - } - - private void MainWindow_Loaded(object sender, RoutedEventArgs e) - { - ThreadPool.QueueUserWorkItem(x => - { - Thread.Sleep(2000); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true); - string loadString = $"Loaded Race Element {GetAssemblyFileVersion()}"; - string fileHash = FileUtil.GetBase64Hash(FileUtil.AppFullName); - -#if DEBUG - loadString += " - Debug"; -#endif - Trace.WriteLine(loadString); - Trace.WriteLine($"Application Hash: {fileHash}"); - LogWriter.WriteToLog($"Application Hash: {fileHash}"); - LogWriter.WriteToLog(loadString); - - UpdateUsage(); - }); - - if (!App.Instance.StartMinimized) - this.WindowState = WindowState.Normal; - } - - private void UpdateUsage() - { -#if DEBUG - return; -#endif - try - { - string hitCounter = "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FRiddleTime%2FRace-Element"; - HttpWebRequest request = (HttpWebRequest)WebRequest.Create(hitCounter); - HttpWebResponse response = (HttpWebResponse)request.GetResponse(); - response.Close(); - } - catch (Exception) { } - } - - private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) - { - SaveLocation(); - - OverlaysACC.CloseAll(); - HudTrackers.StopAll(); - ACCTrackerDispose.Dispose(); - HudOptions.Instance.DisposeKeyboardHooks(); - SteeringLockTracker.Instance.Dispose(); - - Environment.Exit(0); - } - - private void CurrentDomain_ProcessExit(object sender, EventArgs e) - { - OverlaysACC.CloseAll(); - HudTrackers.StopAll(); - ACCTrackerDispose.Dispose(); - HudOptions.Instance.DisposeKeyboardHooks(); - SteeringLockTracker.Instance.Dispose(); - - Environment.Exit(0); - } - - - private System.Windows.Forms.NotifyIcon _notifyIcon; - private void InitializeSystemTrayIcon() - { - try - { - _notifyIcon = new System.Windows.Forms.NotifyIcon() - { - Icon = System.Drawing.Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location), - Visible = false, - ContextMenuStrip = CreateContextMenu(), - Text = "Race Element" - }; - - _notifyIcon.DoubleClick += (s, e) => Instance.WindowState = WindowState.Normal; - } - catch (Exception e) - { - LogWriter.WriteToLog(e); - Debug.WriteLine(e); - } - } - private System.Windows.Forms.ContextMenuStrip CreateContextMenu() - { - var openItem = new System.Windows.Forms.ToolStripMenuItem("Open"); - openItem.Click += (s, e) => Instance.WindowState = WindowState.Normal; - var exitItem = new System.Windows.Forms.ToolStripMenuItem("Exit"); - exitItem.Click += (s, e) => Environment.Exit(0); - var contextMenu = new System.Windows.Forms.ContextMenuStrip { Items = { openItem, exitItem } }; - return contextMenu; - } - - - private void MainWindow_StateChanged(object sender, EventArgs e) - { - switch (this.WindowState) - { - case WindowState.Minimized: - { - if (_accManagerSettings.Get().MinimizeToSystemTray) - { - _notifyIcon.Visible = true; - ShowInTaskbar = false; - } - - break; - } - case WindowState.Normal: - { - this.Activate(); - mainGrid.Margin = new Thickness(0); - //rowTitleBar.Height = new GridLength(30); - _stopDecreaseOpacty = true; - ShowInTaskbar = true; - - _notifyIcon.Visible = false; - break; - } - case WindowState.Maximized: - { - mainGrid.Margin = new Thickness(8); - //rowTitleBar.Height = new GridLength(35); - _stopDecreaseOpacty = true; - ShowInTaskbar = true; - - _notifyIcon.Visible = false; - break; - } - } - } - - internal void EnqueueSnackbarMessage(string message) - { - Instance.snackbar.Dispatcher.Invoke(DispatcherPriority.Normal, new Action( - delegate () - { - if (Instance.WindowState != WindowState.Minimized) - Instance.snackbar.MessageQueue.Enqueue(message); - })); - } - - internal void ClearSnackbar() - { - Instance.snackbar.Dispatcher.Invoke(DispatcherPriority.Normal, new Action( - delegate () - { - if (Instance.WindowState != WindowState.Minimized) - Instance.snackbar.MessageQueue.Clear(); - })); - } - - internal void EnqueueSnackbarMessage(string message, string action, Action actionDelegate) - { - Instance.snackbar.Dispatcher.Invoke(DispatcherPriority.Normal, new Action( - delegate () - { - if (Instance.WindowState != WindowState.Minimized) - Instance.snackbar.MessageQueue.Enqueue(message, action, actionDelegate); - })); - } - - - private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - DecreaseOpacity(0.850, 0.025); - DragMove(); - e.Handled = true; - } - - private void TitleBar_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) - { - _stopDecreaseOpacty = true; - this.Opacity = MaxOpacity; - e.Handled = true; - } - - private bool _stopDecreaseOpacty; - private void DecreaseOpacity(double target, double steps) - { - _stopDecreaseOpacty = false; - - new Thread(() => - { - bool finalValueReached = false; - - while (!finalValueReached) - { - if (_stopDecreaseOpacty) - { - Dispatcher.Invoke(new Action(() => - { - this.Opacity = MaxOpacity; - })); - break; - } - - Thread.Sleep(3); - Dispatcher.Invoke(new Action(() => - { - this.Opacity -= steps; - - if (this.Opacity < target) - finalValueReached = true; - })); - - } - }).Start(); - } - - public static string GetAssemblyFileVersion() - { - try - { - System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); - FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); - return fileVersion.FileVersion; - } - catch (Exception) - { - return String.Empty; - } - } - - public enum DWMWINDOWATTRIBUTE - { - DWMWA_WINDOW_CORNER_PREFERENCE = 33 - } - - // The DWM_WINDOW_CORNER_PREFERENCE enum for DwmSetWindowAttribute's third parameter, which tells the function - // what value of the enum to set. - // Copied from dwmapi.h - public enum DWM_WINDOW_CORNER_PREFERENCE - { - DWMWCP_DEFAULT = 0, - DWMWCP_DONOTROUND = 1, - DWMWCP_ROUND = 2, - DWMWCP_ROUNDSMALL = 3 - } - - // Import dwmapi.dll and define DwmSetWindowAttribute in C# corresponding to the native function. - [DllImport("dwmapi.dll", CharSet = CharSet.Unicode, PreserveSig = false)] - internal static extern void DwmSetWindowAttribute(IntPtr hwnd, - DWMWINDOWATTRIBUTE attribute, - ref DWM_WINDOW_CORNER_PREFERENCE pvAttribute, - uint cbAttribute); - } -} diff --git a/Race_Element/Properties/AssemblyInfo.cs b/Race_Element/Properties/AssemblyInfo.cs deleted file mode 100644 index e9af23061..000000000 --- a/Race_Element/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Resources; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Windows; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Race Element")] -[assembly: AssemblyDescription("Universal Tools for Sim Racing.")] -[assembly: AssemblyConfiguration( -#if DEBUG - "Dev" -#else - "Release" -#endif -)] -[assembly: AssemblyCompany("Element Future")] -[assembly: AssemblyProduct("Race Element")] -[assembly: AssemblyCopyright("Copyright 2022 © Reinier Klarenberg")] -[assembly: AssemblyTrademark("Element Future")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -//In order to begin building localizable applications, set -//CultureYouAreCodingWith in your .csproj file -//inside a . For example, if you are using US english -//in your source files, set the to en-US. Then uncomment -//the NeutralResourceLanguage attribute below. Update the "en-US" in -//the line below to match the UICulture setting in the project file. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -[assembly: AssemblyVersion("0.1.5.7")] -[assembly: AssemblyFileVersion("0.1.5.7")] -[assembly: NeutralResourcesLanguage("")] diff --git a/Race_Element/Properties/Resources.Designer.cs b/Race_Element/Properties/Resources.Designer.cs deleted file mode 100644 index cb495dca5..000000000 --- a/Race_Element/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace RaceElement.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RaceElement.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/Race_Element/Properties/Resources.resx b/Race_Element/Properties/Resources.resx deleted file mode 100644 index af7dbebba..000000000 --- a/Race_Element/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Race_Element/Properties/Settings.Designer.cs b/Race_Element/Properties/Settings.Designer.cs deleted file mode 100644 index dc6c3a199..000000000 --- a/Race_Element/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace RaceElement.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/Race_Element/Properties/Settings.settings b/Race_Element/Properties/Settings.settings deleted file mode 100644 index 033d7a5e9..000000000 --- a/Race_Element/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/Race_Element/Properties/app.manifest b/Race_Element/Properties/app.manifest deleted file mode 100644 index af7b2323e..000000000 --- a/Race_Element/Properties/app.manifest +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/Race Element.csproj b/Race_Element/Race Element.csproj deleted file mode 100644 index 5e345a32f..000000000 --- a/Race_Element/Race Element.csproj +++ /dev/null @@ -1,821 +0,0 @@ - - - - - - Debug - AnyCPU - {DEA7B2CA-611A-4CB8-BEDA-988F3EA11AF9} - WinExe - RaceElement - RaceElement - v4.8 - 512 - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 4 - true - true - - - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - Race Element - Reinier Klarenberg - Race Element - 6 - 0.0.2.6 - false - true - true - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - true - true - MinimumRecommendedRules.ruleset - false - - - RaceElement.App - - - race-element-icon-2.ico - - - false - - - false - - - false - - - key.snk - - - 9FBE825EC0ACCC58542DA8C54DA8899183BDE274 - - - ACCSetupApp_TemporaryKey.pfx - - - false - - - Custom - - - - - Properties\app.manifest - - - true - bin\Debug Minimized\ - DEBUG;TRACE - true - full - x86 - 7.3 - prompt - true - - - - ..\packages\AutoMapper.8.1.0\lib\net461\AutoMapper.dll - True - - - ..\packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll - - - ..\packages\DdsFileTypePlusHack.1.0.4\lib\net45\DdsFileTypePlus.dll - False - True - - - ..\packages\MouseKeyHook.5.6.0\lib\net40\Gma.System.MouseKeyHook.dll - - - ..\packages\LiteDB.5.0.15\lib\net45\LiteDB.dll - - - ..\packages\MaterialDesignColors.2.0.9\lib\net462\MaterialDesignColors.dll - - - ..\packages\MaterialDesignThemes.4.6.1\lib\net462\MaterialDesignThemes.Wpf.dll - - - ..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll - - - ..\packages\Microsoft.Extensions.Configuration.7.0.0\lib\net462\Microsoft.Extensions.Configuration.dll - - - ..\packages\Microsoft.Extensions.Configuration.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Configuration.Binder.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Binder.dll - - - ..\packages\Microsoft.Extensions.Configuration.CommandLine.7.0.0\lib\net462\Microsoft.Extensions.Configuration.CommandLine.dll - - - ..\packages\Microsoft.Extensions.Configuration.EnvironmentVariables.7.0.0\lib\net462\Microsoft.Extensions.Configuration.EnvironmentVariables.dll - - - ..\packages\Microsoft.Extensions.Configuration.FileExtensions.7.0.0\lib\net462\Microsoft.Extensions.Configuration.FileExtensions.dll - - - ..\packages\Microsoft.Extensions.Configuration.Json.7.0.0\lib\net462\Microsoft.Extensions.Configuration.Json.dll - - - ..\packages\Microsoft.Extensions.Configuration.UserSecrets.7.0.0\lib\net462\Microsoft.Extensions.Configuration.UserSecrets.dll - - - ..\packages\Microsoft.Extensions.DependencyInjection.7.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.dll - - - ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll - - - ..\packages\Microsoft.Extensions.FileProviders.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.FileProviders.Abstractions.dll - - - ..\packages\Microsoft.Extensions.FileProviders.Physical.7.0.0\lib\net462\Microsoft.Extensions.FileProviders.Physical.dll - - - ..\packages\Microsoft.Extensions.FileSystemGlobbing.7.0.0\lib\net462\Microsoft.Extensions.FileSystemGlobbing.dll - - - ..\packages\Microsoft.Extensions.Hosting.7.0.0\lib\net462\Microsoft.Extensions.Hosting.dll - - - ..\packages\Microsoft.Extensions.Hosting.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Hosting.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Logging.7.0.0\lib\net462\Microsoft.Extensions.Logging.dll - - - ..\packages\Microsoft.Extensions.Logging.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Logging.Configuration.7.0.0\lib\net462\Microsoft.Extensions.Logging.Configuration.dll - - - ..\packages\Microsoft.Extensions.Logging.Console.7.0.0\lib\net462\Microsoft.Extensions.Logging.Console.dll - - - ..\packages\Microsoft.Extensions.Logging.Debug.7.0.0\lib\net462\Microsoft.Extensions.Logging.Debug.dll - - - ..\packages\Microsoft.Extensions.Logging.EventLog.7.0.0\lib\net462\Microsoft.Extensions.Logging.EventLog.dll - - - ..\packages\Microsoft.Extensions.Logging.EventSource.7.0.0\lib\net462\Microsoft.Extensions.Logging.EventSource.dll - - - ..\packages\Microsoft.Extensions.Options.7.0.0\lib\net462\Microsoft.Extensions.Options.dll - - - ..\packages\Microsoft.Extensions.Options.ConfigurationExtensions.7.0.0\lib\net462\Microsoft.Extensions.Options.ConfigurationExtensions.dll - - - ..\packages\Microsoft.Extensions.Primitives.7.0.0\lib\net462\Microsoft.Extensions.Primitives.dll - - - ..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll - True - True - - - ..\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\packages\obs-websocket-dotnet.5.0.0.3\lib\netstandard2.0\obs-websocket-dotnet.dll - - - ..\packages\Octokit.4.0.3\lib\netstandard2.0\Octokit.dll - - - ..\packages\DdsFileTypePlusHack.1.0.4\lib\net45\PaintDotNet.Base.dll - - - ..\packages\Quartz.3.5.0\lib\net472\Quartz.dll - - - ..\packages\Quartz.Extensions.DependencyInjection.3.5.0\lib\netstandard2.0\Quartz.Extensions.DependencyInjection.dll - - - ..\packages\Quartz.Extensions.Hosting.3.5.0\lib\netstandard2.0\Quartz.Extensions.Hosting.dll - - - ..\packages\ScottPlot.4.1.59\lib\net462\ScottPlot.dll - - - ..\packages\ScottPlot.WPF.4.1.59\lib\net48\ScottPlot.WPF.dll - - - ..\packages\SharpCompress.0.32.2\lib\net461\SharpCompress.dll - - - ..\packages\SLOBSharp.1.1.4\lib\netstandard2.0\SLOBSharp.dll - True - - - - ..\packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll - True - True - - - ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - ..\packages\System.Collections.Immutable.7.0.0\lib\net462\System.Collections.Immutable.dll - - - - - ..\packages\System.Console.4.3.1\lib\net46\System.Console.dll - True - True - - - ..\packages\System.Diagnostics.DiagnosticSource.7.0.0\lib\net462\System.Diagnostics.DiagnosticSource.dll - - - ..\packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll - True - True - - - - ..\packages\System.Drawing.Common.7.0.0\lib\net462\System.Drawing.Common.dll - - - ..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll - True - True - - - ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll - True - True - - - ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - True - True - - - ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll - True - True - - - ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll - True - True - - - ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll - True - True - - - ..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll - True - True - - - ..\packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll - True - True - - - ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll - - - ..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll - True - True - - - ..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll - True - True - - - ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\packages\System.Reactive.5.0.0\lib\net472\System.Reactive.dll - - - ..\packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll - True - True - - - ..\packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll - True - True - - - ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - - ..\packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll - True - True - - - ..\packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll - True - True - - - ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll - True - True - - - - ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll - True - True - - - ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - True - True - - - ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - True - True - - - ..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll - True - True - - - ..\packages\System.Text.Encoding.CodePages.7.0.0\lib\net462\System.Text.Encoding.CodePages.dll - - - ..\packages\System.Text.Encodings.Web.7.0.0\lib\net462\System.Text.Encodings.Web.dll - - - ..\packages\System.Text.Json.7.0.0\lib\net462\System.Text.Json.dll - - - ..\packages\System.Text.RegularExpressions.4.3.1\lib\net463\System.Text.RegularExpressions.dll - True - True - - - ..\packages\System.Threading.Channels.7.0.0\lib\net462\System.Threading.Channels.dll - - - ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - - - ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll - - - - - - - 4.0 - - - ..\packages\System.Xml.ReaderWriter.4.3.1\lib\net46\System.Xml.ReaderWriter.dll - True - True - - - ..\packages\WebSocketSharp-netstandard.1.0.1\lib\net45\websocket-sharp.dll - - - ..\packages\Websocket.Client.4.4.43\lib\netstandard2.0\Websocket.Client.dll - - - - - - - - MSBuild:Compile - Designer - - - About.xaml - - - License.xaml - - - - - - - - - - - HudOptions.xaml - - - HudTab.xaml - - - - AfterImport.xaml - - - DDSgenerator.xaml - - - - LiveriesTab.xaml - - - LiveryBrowser.xaml - - - LiveryDeleter.xaml - - - LiveryDisplayer.xaml - - - LiveryExporter.xaml - - - - LiveryTagCreator.xaml - - - LiveryTagger.xaml - - - - AccManagerSettingsTab.xaml - - - AccSettingsTab.xaml - - - AccServerListSettings.xaml - - - ReplaySettings.xaml - - - Hardware.xaml - - - SettingsTab.xaml - - - Streaming.xaml - - - - - SetupBrowser.xaml - - - - SetupComparer.xaml - - - SetupEditor.xaml - - - - - - - - - - - - - - RaceSessionBrowser.xaml - - - TrackMap.xaml - - - - SetupImporter.xaml - - - SetupsTab.xaml - - - TelemetryDebug.xaml - - - TelemetryTab.xaml - - - TitleBar.xaml - - - FuelCalculator.xaml - - - ToolsTabs.xaml - - - - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - MSBuild:Compile - Designer - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - MSBuild:Compile - Designer - - - App.xaml - Code - - - SetupRenderer.xaml - - - MainWindow.xaml - Code - - - - - Code - - - True - True - Resources.resx - - - True - Settings.settings - True - - - ResXFileCodeGenerator - Resources.Designer.cs - - - .editorconfig - - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - - - - - - - False - Microsoft .NET Framework 4.8 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - - {840220BD-8469-4A04-A6EC-1ED2BC743EFB} - Race Element.Broadcast - - - {BB693CEB-CD96-4EB6-9F13-110D3CCECFFE} - Race Element.Data.ACC - - - {8A7A4857-2F0A-4E85-98C5-3EA1228A8CE2} - Race Element.Hardware - - - {F1699F70-54A1-49F2-896D-B70B1EDABF74} - Race Element.HUD.ACC - - - {3717A55E-4629-40ED-9C93-24058D9EF18C} - Race Element.HUD - - - {9F9BE520-14C4-4AB6-8119-5E14BCCA9A0F} - Race Element.SharedMemory - - - {AAB23116-299B-415B-8305-96CB86148CE7} - Race Element.Util - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Race_Element/Resources/race element icon 2.ico b/Race_Element/Resources/race element icon 2.ico deleted file mode 100644 index 2223c4130..000000000 Binary files a/Race_Element/Resources/race element icon 2.ico and /dev/null differ diff --git a/Race_Element/app.manifest b/Race_Element/app.manifest deleted file mode 100644 index d72e75011..000000000 --- a/Race_Element/app.manifest +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Race_Element/costura32/DdsFileTypePlusIO_x86.dll b/Race_Element/costura32/DdsFileTypePlusIO_x86.dll deleted file mode 100644 index bf8ce412d..000000000 Binary files a/Race_Element/costura32/DdsFileTypePlusIO_x86.dll and /dev/null differ diff --git a/Race_Element/costura64/DdsFileTypePlusIO_x64.dll b/Race_Element/costura64/DdsFileTypePlusIO_x64.dll deleted file mode 100644 index 8bc319431..000000000 Binary files a/Race_Element/costura64/DdsFileTypePlusIO_x64.dll and /dev/null differ diff --git a/Race_Element/key.snk b/Race_Element/key.snk deleted file mode 100644 index dcec24238..000000000 Binary files a/Race_Element/key.snk and /dev/null differ diff --git a/Race_Element/packages.config b/Race_Element/packages.config deleted file mode 100644 index 27a366b9c..000000000 --- a/Race_Element/packages.config +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_config.yml b/_config.yml deleted file mode 100644 index eff7c1418..000000000 --- a/_config.yml +++ /dev/null @@ -1,43 +0,0 @@ -title: Race Element -url: https://race.elementfuture.com -author: RiddleTime - -description: > # this means to ignore newlines until "show_exerpts:" - Provides tooling for Sim Racing
- -show_excerpts: false # set to true to show excerpts on the homepage - -paginate: 5 -paginate_path: "/blog/page:num/" - -tag_permalink_style: pretty -tag_page_layout: tag_page -tag_page_dir: tag - -# jekyll-dash date format -# refer to http://shopify.github.io/liquid/filters/date/ if you want to customize this -dash: - date_format: "%b %-d, %Y" - - # generate social links in footer - # supported colors: green, red, orange, blue, cyan, pink, teal, yellow, indigo, purple - social_links: - - url: https://discord.gg/26AAEW5mUq - icon: discord - color: purple - - url: https://paypal.me/CompetizioneManager - icon: heart - color: red - - url: https://github.com/RiddleTime/Race-Element/releases/latest - icon: arrow-alt-circle-down - color: orange - - avatar_source: local - avatar_path: /other resources/race element icon 2.png - -# Build settings -theme: jekyll-dash - -plugins: - - liquid-md5 - - jekyll/tagging diff --git a/_posts/2023-01-12-get-started.md b/_posts/2023-01-12-get-started.md deleted file mode 100644 index bc854702d..000000000 --- a/_posts/2023-01-12-get-started.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -layout: post -title: How to get started -description: Downloading the app and running it for the first time. -tags: guide ---- - -## How to get started -First of all, **[Download](https://github.com/RiddleTime/Race-Element/releases/latest "Download")** the app. The link will lead you to the latest version at GitHub. - -Place **RaceElement.exe** on your boot drive, best practice is to make a folder for it in My Documents. If the app is not located on your boot drive you will encounter issues with the auto-updater. - -Then simply run the app. Do **not** run it as admin, since this will prevent some features from working. - -## Guides inside the app\'s About Tab -The app includes an about tab which contains a guide section, read this carefully since it includes instructions on how to use for example the HUDs. - -There are multiple guides posted on this web page which you can find [here](https://race.elementfuture.com/tag/guide/ "here"). - -### Help! my browser, windows and my anti-virus tell me this is a dangerous file. -The app is open source, you can always check out the source code to ensure the app is not doing anything that it should not be doing. The reason why this is happening is because the app does not have an [EV Certificate](https://en.wikipedia.org/wiki/Extended_Validation_Certificate "EV Certificate"), these are fairly expensive($200-$300 a year) and I\'d rather spend resources on actually improving the app. diff --git a/_posts/2023-01-12-webpage.md b/_posts/2023-01-12-webpage.md deleted file mode 100644 index c41f518cf..000000000 --- a/_posts/2023-01-12-webpage.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: post -title: New Webpage! -description: New webpage design using the Jekyll dash theme by bitbrain. -tags: website ---- - -## Welcome to the new webpage for Race Element. -With the rebrand from ACC manager to Race Element I decided it was time for a new design for the website. -Thanks for BitBrain, a peer from uni, this was quite an easy job. -The website will be used for guides and news. - -[Download Latest Release](https://github.com/RiddleTime/Race-Element/releases/latest) diff --git a/angular.json b/angular.json new file mode 100644 index 000000000..95d68d12d --- /dev/null +++ b/angular.json @@ -0,0 +1,57 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "blog": { + "projectType": "application", + "root": ".", + "sourceRoot": "src", + "prefix": "blog", + "architect": { + "build": { + "builder": "@analogjs/platform:vite", + "options": { + "configFile": "vite.config.ts", + "main": "src/main.ts", + "outputPath": "dist/client", + "tsConfig": "tsconfig.app.json" + }, + "defaultConfiguration": "production", + "configurations": { + "development": { + "mode": "development" + }, + "production": { + "sourcemap": false, + "mode": "production" + } + } + }, + "serve": { + "builder": "@analogjs/platform:vite-dev-server", + "defaultConfiguration": "development", + "options": { + "buildTarget": "blog:build", + "port": 5173 + }, + "configurations": { + "development": { + "buildTarget": "blog:build:development", + "hmr": true + }, + "production": { + "buildTarget": "blog:build:production" + } + } + }, + "test": { + "builder": "@analogjs/platform:vitest" + } + } + } + }, + "cli": { + "analytics": false + } +} diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..22d4a4c63 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,5 @@ +version: 0.1.{build}.{branch} +branches: + only: + - dev + - release diff --git a/atom.xml b/atom.xml deleted file mode 100644 index 85fe6f324..000000000 --- a/atom.xml +++ /dev/null @@ -1,27 +0,0 @@ ---- -layout: page ---- - - - - - {{ site.title }} - - - {{ site.time | date_to_xmlschema }} - {{ site.url }} - - {{ site.author.name }} - - - {% for post in site.posts %} - - {{ post.title }} - - {{ post.date | date_to_xmlschema }} - {{ site.url }}{{ post.id }} - {{ post.content | xml_escape }} - - {% endfor %} - - diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 6960ecca2..000000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -race.elementfuture.com \ No newline at end of file diff --git a/index.html b/index.html index e4d427d21..13e52e3bb 100644 --- a/index.html +++ b/index.html @@ -1,3 +1,42 @@ ---- -layout: home ---- + + + + + + + + + Race Element + + + + + + + + + + + + + + + + + + + + + + + diff --git a/other resources/Race Element - Name.png b/other resources/Race Element - Name.png deleted file mode 100644 index 916f5a795..000000000 Binary files a/other resources/Race Element - Name.png and /dev/null differ diff --git a/other resources/acc manager - name - background 1.png b/other resources/acc manager - name - background 1.png deleted file mode 100644 index 2852fbc62..000000000 Binary files a/other resources/acc manager - name - background 1.png and /dev/null differ diff --git a/other resources/acc manager - name.png b/other resources/acc manager - name.png deleted file mode 100644 index 9bab49d4c..000000000 Binary files a/other resources/acc manager - name.png and /dev/null differ diff --git a/other resources/acc manager - name.psd b/other resources/acc manager - name.psd deleted file mode 100644 index 36110a642..000000000 Binary files a/other resources/acc manager - name.psd and /dev/null differ diff --git a/other resources/diagrams/track states.uxf b/other resources/diagrams/track states.uxf deleted file mode 100644 index ba3149caf..000000000 --- a/other resources/diagrams/track states.uxf +++ /dev/null @@ -1,31 +0,0 @@ -10UMLState4102509040On TrackUMLState1602509040Pit EntryUMLState1601209040PitUMLState4101209040Pit ExitRelation24012019040lt=-> -Leaving Pits10;20;170;20Relation200150100120lt=-> -Entered Pits10;100;10;10Relation230150200130lt=-> -Tow180;110;10;10Relation440150100120lt=-> -Joining track10;10;10;100Relation24025019040lt=-> -Entering Pits170;20;10;20Relation20028027060lt=-> -Unsucessful Pit Entry10;10;10;40;250;40;250;10UMLState12070430290Lap Index --- -valign=top - -UMLState4106209040On TrackUMLState1606209040Pit EntryUMLState1604909040PitUMLState4104909040Pit ExitRelation24049019040lt=-> -Leaving Pits10;20;170;20Relation200520100120lt=-> -Entered Pits10;100;10;10Relation230520200130lt=-> -Tow180;110;10;10Relation440520100120lt=-> -Joining track10;10;10;100Relation24062019040lt=-> -Entering Pits170;20;10;20Relation20065027060lt=-> -Unsucessful Pit Entry10;10;10;40;250;40;250;10UMLState120440430290Lap Index --- -valign=top - -Relation70130110400lt=-> - - - - - - - - -Lap finished90;10;10;10;10;380;90;380Relation490260190400lt=-> -Lap finished10;10;100;10;100;380;10;380 \ No newline at end of file diff --git a/other resources/new_icon.ico b/other resources/new_icon.ico deleted file mode 100644 index dee80c61c..000000000 Binary files a/other resources/new_icon.ico and /dev/null differ diff --git a/other resources/new_icon.psd b/other resources/new_icon.psd deleted file mode 100644 index 10730cbb3..000000000 Binary files a/other resources/new_icon.psd and /dev/null differ diff --git a/other resources/race element icon 2.ico b/other resources/race element icon 2.ico deleted file mode 100644 index 2223c4130..000000000 Binary files a/other resources/race element icon 2.ico and /dev/null differ diff --git a/other resources/race element icon 2.png b/other resources/race element icon 2.png deleted file mode 100644 index 8b81686fa..000000000 Binary files a/other resources/race element icon 2.png and /dev/null differ diff --git a/other resources/race element icon 2.psd b/other resources/race element icon 2.psd deleted file mode 100644 index c1bfd85f4..000000000 Binary files a/other resources/race element icon 2.psd and /dev/null differ diff --git a/other resources/race element icon.png b/other resources/race element icon.png deleted file mode 100644 index 16e6ee791..000000000 Binary files a/other resources/race element icon.png and /dev/null differ diff --git a/other resources/race element icon.psd b/other resources/race element icon.psd deleted file mode 100644 index cbfd97e66..000000000 Binary files a/other resources/race element icon.psd and /dev/null differ diff --git a/other resources/race-element-icon-2.ico b/other resources/race-element-icon-2.ico deleted file mode 100644 index 5266bd6b7..000000000 Binary files a/other resources/race-element-icon-2.ico and /dev/null differ diff --git a/other resources/race-element-icon.ico b/other resources/race-element-icon.ico deleted file mode 100644 index 27f76a51c..000000000 Binary files a/other resources/race-element-icon.ico and /dev/null differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..8675fe855 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,31902 @@ +{ + "name": "analog-project", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "analog-project", + "version": "0.0.0", + "dependencies": { + "@analogjs/content": "^1.9.0", + "@analogjs/router": "^1.9.0", + "@angular/animations": "^18.0.0", + "@angular/common": "^18.0.0", + "@angular/compiler": "^18.0.0", + "@angular/core": "^18.0.0", + "@angular/forms": "^18.2.8", + "@angular/platform-browser": "^18.0.0", + "@angular/platform-browser-dynamic": "^18.2.8", + "@angular/platform-server": "^18.2.8", + "@angular/router": "^18.2.8", + "front-matter": "^4.0.2", + "marked": "^5.1.2", + "marked-gfm-heading-id": "^3.2.0", + "marked-highlight": "^2.2.0", + "marked-mangle": "^1.1.9", + "mermaid": "^10.9.2", + "prismjs": "^1.29.0", + "rxjs": "~7.5.6", + "tslib": "^2.8.0", + "zone.js": "^0.14.10" + }, + "devDependencies": { + "@analogjs/platform": "^1.9.0", + "@analogjs/vite-plugin-angular": "^1.9.0", + "@angular-devkit/build-angular": "^18.2.9", + "@angular/cli": "^18.2.9", + "@angular/compiler-cli": "^18.2.8", + "autoprefixer": "^10.4.14", + "jsdom": "^22.1.0", + "postcss": "^8.4.47", + "tailwindcss": "^3.4.14", + "typescript": "~5.4.2", + "vite": "^5.4.9", + "vitest": "^1.6.0" + }, + "engines": { + "node": ">=18.13.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@analogjs/content": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@analogjs/content/-/content-1.9.0.tgz", + "integrity": "sha512-O+TII8kpFAkRWiwLP4NPJYgoBKkEI5slbx/0c/CDdTBOS9ZwkU97K+0tDAJ66HVpWJEf0Zf/813kP8ZSSeih7w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/brandonroberts" + }, + "peerDependencies": { + "@angular/common": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "@angular/platform-browser": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "@angular/router": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "@nx/devkit": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "front-matter": "^4.0.2", + "prismjs": "^1.29.0", + "rxjs": "^6.5.0 || ^7.5.0", + "satori": "^0.10.14", + "satori-html": "^0.3.2", + "sharp": "^0.33.5" + }, + "peerDependenciesMeta": { + "satori": { + "optional": true + }, + "satori-html": { + "optional": true + }, + "sharp": { + "optional": true + } + } + }, + "node_modules/@analogjs/platform": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@analogjs/platform/-/platform-1.14.1.tgz", + "integrity": "sha512-5Rx4plMfZ/gY+8rfbLw6tyK//Sujt7YuR90Sk65IPmUhKYblQKmlF8aCMc6A6D8351yTMgh2/foj1x6RbXY1QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@analogjs/vite-plugin-angular": "^1.14.1", + "@analogjs/vite-plugin-nitro": "^1.14.1", + "nitropack": "^2.10.0", + "vitefu": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/brandonroberts" + }, + "peerDependencies": { + "@nx/angular": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@nx/devkit": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@nx/vite": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "marked": ">=5.0.2", + "marked-gfm-heading-id": "^3.0.4", + "marked-highlight": "^2.0.1", + "marked-mangle": "^1.1.7", + "marked-shiki": "^1.1.0", + "shiki": "^1.6.1" + }, + "peerDependenciesMeta": { + "marked-highlight": { + "optional": true + }, + "marked-shiki": { + "optional": true + }, + "prismjs": { + "optional": true + }, + "shiki": { + "optional": true + } + } + }, + "node_modules/@analogjs/router": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@analogjs/router/-/router-1.9.0.tgz", + "integrity": "sha512-ZmpYxniQeBoJGBwGjXk7z1pcNsACGNerlRH/OIVYyUcbA/yDyI1IPzJCBb4Q7DLvHy6C0cKQcDEkZQs3IAarjQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/brandonroberts" + }, + "peerDependencies": { + "@analogjs/content": "^1.9.0", + "@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "@angular/router": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@analogjs/vite-plugin-angular": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@analogjs/vite-plugin-angular/-/vite-plugin-angular-1.14.1.tgz", + "integrity": "sha512-nCoRQpLu5t8DtBoN+lNbWAJ3p6X4TnKJZQqOh0ZmcADeHf07vEOq6HiGcEi461SedKawQVAu9SZmRTsNeDfz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-morph": "^21.0.0", + "vfile": "^6.0.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/brandonroberts" + }, + "peerDependencies": { + "@angular-devkit/build-angular": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "@angular/build": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@angular-devkit/build-angular": { + "optional": true + }, + "@angular/build": { + "optional": true + } + } + }, + "node_modules/@analogjs/vite-plugin-nitro": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@analogjs/vite-plugin-nitro/-/vite-plugin-nitro-1.14.1.tgz", + "integrity": "sha512-gioeemQMW/dUghUoSH1QFADJ6sIspp7dYlybMp0P4FQ3JnJNfmKKDHl6Dva0X/gM8OIgMjqpEGrh/D5bXlUd/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "esbuild": "^0.25.0", + "nitropack": "^2.10.0", + "radix3": "^1.1.1", + "xmlbuilder2": "^3.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/brandonroberts" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1802.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.9.tgz", + "integrity": "sha512-fubJf4WC/t3ITy+tyjI4/CKKwUP4XJTmV+Y0nyPcrkcthVyUcIpZB74NlUOvg6WECiPQuIc+CtoAaA9X5+RQ5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "18.2.9", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.9.tgz", + "integrity": "sha512-d4W6t9vBozFUmOP2VvihMcSg/zgr3AvJY6/b7OPuATlK+W3P6tmsqxGIQ6eKc1TxXeu3lWhi14mV2pPykfrwfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1802.9", + "@angular-devkit/build-webpack": "0.1802.9", + "@angular-devkit/core": "18.2.9", + "@angular/build": "18.2.9", + "@babel/core": "7.25.2", + "@babel/generator": "7.25.0", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.25.0", + "@babel/plugin-transform-async-to-generator": "7.24.7", + "@babel/plugin-transform-runtime": "7.24.7", + "@babel/preset-env": "7.25.3", + "@babel/runtime": "7.25.0", + "@discoveryjs/json-ext": "0.6.1", + "@ngtools/webpack": "18.2.9", + "@vitejs/plugin-basic-ssl": "1.1.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.20", + "babel-loader": "9.1.3", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "12.0.2", + "critters": "0.0.24", + "css-loader": "7.1.2", + "esbuild-wasm": "0.23.0", + "fast-glob": "3.3.2", + "http-proxy-middleware": "3.0.0", + "https-proxy-agent": "7.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "karma-source-map-support": "1.4.0", + "less": "4.2.0", + "less-loader": "12.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.3.1", + "magic-string": "0.30.11", + "mini-css-extract-plugin": "2.9.0", + "mrmime": "2.0.0", + "open": "10.1.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.6.1", + "postcss": "8.4.41", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.77.6", + "sass-loader": "16.0.0", + "semver": "7.6.3", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.31.6", + "tree-kill": "1.2.2", + "tslib": "2.6.3", + "vite": "5.4.6", + "watchpack": "2.4.1", + "webpack": "5.94.0", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.0.4", + "webpack-merge": "6.0.1", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.23.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "@web/test-runner": "^0.18.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^18.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.4 <5.6" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1802.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.9.tgz", + "integrity": "sha512-p7xNGo5ZTV/Z0Rk+q2/E68QQLw9VT33kauDh6s010jIeBLrOwMo74JpzXMSFttQo5O4bLKP8IORzIM+0q7Uzjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1802.9", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.9.tgz", + "integrity": "sha512-bsVt//5E0ua7FZfO0dCF/qGGY6KQD34/bNGyRu5B6HedimpdU2/0PGDptksU5v3yKEc9gNw0xC6mT0UsY/R9pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.9.tgz", + "integrity": "sha512-aIY5/IomDOINGCtFYi77uo0acDpdQNNCighfBBUGEBNMQ1eE3oGNGpLAH/qWeuxJndgmxrdKsvws9DdT46kLig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "18.2.9", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.11", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular/animations": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.8.tgz", + "integrity": "sha512-dMSn2hg70siv3lhP+vqhMbgc923xw6XBUvnpCPEzhZqFHvPXfh/LubmsD5RtqHmjWebXtgVcgS+zg3Gq3jB2lg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.2.8" + } + }, + "node_modules/@angular/build": { + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.9.tgz", + "integrity": "sha512-o1hOEM2e6ARy+ck2Pohl0d/RFgbbXTw6/hTLAj3CBKjtqAGStRaVF2UlJjhi+xOxlfsOPuJJc9IpzLBteku+Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1802.9", + "@babel/core": "7.25.2", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.24.7", + "@inquirer/confirm": "3.1.22", + "@vitejs/plugin-basic-ssl": "1.1.0", + "browserslist": "^4.23.0", + "critters": "0.0.24", + "esbuild": "0.23.0", + "fast-glob": "3.3.2", + "https-proxy-agent": "7.0.5", + "listr2": "8.2.4", + "lmdb": "3.0.13", + "magic-string": "0.30.11", + "mrmime": "2.0.0", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.6.1", + "rollup": "4.22.4", + "sass": "1.77.6", + "semver": "7.6.3", + "vite": "5.4.6", + "watchpack": "2.4.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "less": "^4.2.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.4 <5.6" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/win32-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/esbuild": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" + } + }, + "node_modules/@angular/build/node_modules/vite": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/@angular/cli": { + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.9.tgz", + "integrity": "sha512-ejTIqwvPABwK7MtVmI2qWbEaMhhbHNsq0NPzl1hwLtkrLbjdDrEVv0Wy+gN0xqrT9NyCPl4AmNLz/xuYTzgU5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1802.9", + "@angular-devkit/core": "18.2.9", + "@angular-devkit/schematics": "18.2.9", + "@inquirer/prompts": "5.3.8", + "@listr2/prompt-adapter-inquirer": "2.0.15", + "@schematics/angular": "18.2.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.4", + "npm-package-arg": "11.0.3", + "npm-pick-manifest": "9.1.0", + "pacote": "18.0.6", + "resolve": "1.22.8", + "semver": "7.6.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.8.tgz", + "integrity": "sha512-TYsKtE5nVaIScWSLGSO34Skc+s3hB/BujSddnfQHoNFvPT/WR0dfmdlpVCTeLj+f50htFoMhW11tW99PbK+whQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.2.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.8.tgz", + "integrity": "sha512-JRedHNfK1CCPVyeGQB5w3WBYqMA6X8Q240CkvjlGfn0pVXihf9DWk3nkSQJVgYxpvpHfxdgjaYZ5IpMzlkmkhw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.2.8" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.8.tgz", + "integrity": "sha512-OksDE4LWQUCcIvMjtZF7eiDCdIMrcMMpC1+Q0PIYi7KmnqXFGs4/Y0NdJvtn/LrQznzz5WaKM3ZDVNZTRX4wmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.25.2", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/compiler": "18.2.8", + "typescript": ">=5.4 <5.6" + } + }, + "node_modules/@angular/compiler-cli/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/compiler-cli/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/core": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.8.tgz", + "integrity": "sha512-NwIuX/Iby1jT6Iv1/s6S3wOFf8xfuQR3MPGvKhGgNtjXLbHG+TXceK9+QPZC0s9/Z8JR/hz+li34B79GrIKgUg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.10" + } + }, + "node_modules/@angular/forms": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.8.tgz", + "integrity": "sha512-JCLki7KC6D5vF6dE6yGlBmW33khIgpHs8N9SzuiJtkQqNDTIQA8cPsGV6qpLpxflxASynQOX5lDkWYdQyfm77Q==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.2.8", + "@angular/core": "18.2.8", + "@angular/platform-browser": "18.2.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.8.tgz", + "integrity": "sha512-EPai4ZPqSq3ilLJUC85kPi9wo5j5suQovwtgRyjM/75D9Qy4TV19g8hkVM5Co/zrltO8a2G6vDscCNI5BeGw2A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/animations": "18.2.8", + "@angular/common": "18.2.8", + "@angular/core": "18.2.8" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.8.tgz", + "integrity": "sha512-poZoapDqyN/rxGKQ3C6esdPiPLMkSpP2v12hoEa12KHgfPk7T1e+a+NMyJjV8HeOY3WyvL7tGRhW0NPTajTkhw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.2.8", + "@angular/compiler": "18.2.8", + "@angular/core": "18.2.8", + "@angular/platform-browser": "18.2.8" + } + }, + "node_modules/@angular/platform-server": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-18.2.8.tgz", + "integrity": "sha512-gt+UKnDhnsDgpiXTQmkMsTzBMh0+FVkihGHHvjoL/HQ1lBz5od9QIj6EB6+aco5XkPoXaSqkfJ5hi/bnnEJDcg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/animations": "18.2.8", + "@angular/common": "18.2.8", + "@angular/compiler": "18.2.8", + "@angular/core": "18.2.8", + "@angular/platform-browser": "18.2.8" + } + }, + "node_modules/@angular/router": { + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.8.tgz", + "integrity": "sha512-L+olYgxIiBq+tbfayVI0cv1yOuymsw33msnGC2l/vpc9sSVfqGzESFnB4yMVU3vHtE9v6v2Y6O+iV44/b79W/g==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.2.8", + "@angular/core": "18.2.8", + "@angular/platform-browser": "18.2.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.10" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.7.tgz", + "integrity": "sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-decorators": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz", + "integrity": "sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.0", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/types": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", + "license": "MIT" + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.5.tgz", + "integrity": "sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)", + "peer": true + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", + "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", + "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", + "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", + "license": "MIT", + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", + "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", + "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", + "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", + "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", + "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", + "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", + "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", + "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.3.8.tgz", + "integrity": "sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^2.4.7", + "@inquirer/confirm": "^3.1.22", + "@inquirer/editor": "^2.1.22", + "@inquirer/expand": "^2.1.22", + "@inquirer/input": "^2.2.9", + "@inquirer/number": "^1.0.10", + "@inquirer/password": "^2.1.22", + "@inquirer/rawlist": "^2.2.4", + "@inquirer/search": "^1.0.7", + "@inquirer/select": "^2.4.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", + "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", + "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", + "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.15.tgz", + "integrity": "sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^1.5.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 6" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz", + "integrity": "sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.13.tgz", + "integrity": "sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.13.tgz", + "integrity": "sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.13.tgz", + "integrity": "sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.13.tgz", + "integrity": "sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz", + "integrity": "sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.1.tgz", + "integrity": "sha512-znN/Qm6M0U1t3iF10gu1hSxDkk18yz78yvk+AMB34UDzpXHiC1zbpIeV2CQNV5GCeafmCICmcn9y1qh7F54KTg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/sdk": "0.9.1", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.1.tgz", + "integrity": "sha512-rS1AsgRvIMAWK8oMprEBF0YQ3WvsqnumjinvAZU1Dqut5DICmpQMTPEO1OrAKyjO+PQgEhmq13HggzN6ebGLrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.9.1", + "@module-federation/sdk": "0.9.1", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/dts-plugin": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.9.1.tgz", + "integrity": "sha512-DezBrFaIKfDcEY7UhqyO1WbYocERYsR/CDN8AV6OvMnRlQ8u0rgM8qBUJwx0s+K59f+CFQFKEN4C8p7naCiHrw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/error-codes": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/sdk": "0.9.1", + "@module-federation/third-party-dts-extractor": "0.9.1", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.7.4", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.4", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/enhanced": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.9.1.tgz", + "integrity": "sha512-c9siKVjcgT2gtDdOTqEr+GaP2X/PWAS0OV424ljKLstFL1lcS/BIsxWFDmxPPl5hDByAH+1q4YhC1LWY4LNDQw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.9.1", + "@module-federation/data-prefetch": "0.9.1", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/error-codes": "0.9.1", + "@module-federation/inject-external-runtime-core-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/manifest": "0.9.1", + "@module-federation/rspack": "0.9.1", + "@module-federation/runtime-tools": "0.9.1", + "@module-federation/sdk": "0.9.1", + "btoa": "^1.2.1", + "upath": "2.0.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/error-codes": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.1.tgz", + "integrity": "sha512-q8spCvlwUzW42iX1irnlBTcwcZftRNHyGdlaoFO1z/fW4iphnBIfijzkigWQzOMhdPgzqN/up7XN+g5hjBGBtw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.9.1.tgz", + "integrity": "sha512-BPfzu1cqDU5BhM493enVF1VfxJWmruen0ktlHrWdJJlcddhZzyFBGaLAGoGc+83fS75aEllvJTEthw4kMViMQQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@module-federation/runtime-tools": "0.9.1" + } + }, + "node_modules/@module-federation/managers": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.9.1.tgz", + "integrity": "sha512-8hpIrvGfiODxS1qelTd7eaLRVF7jrp17RWgeH1DWoprxELANxm5IVvqUryB+7j+BhoQzamog9DL5q4MuNfGgIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/sdk": "0.9.1", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/manifest": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.9.1.tgz", + "integrity": "sha512-+GteKBXrAUkq49i2CSyWZXM4vYa+mEVXxR9Du71R55nXXxgbzAIoZj9gxjRunj9pcE8+YpAOyfHxLEdWngxWdg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/sdk": "0.9.1", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node": { + "version": "2.6.30", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.30.tgz", + "integrity": "sha512-TciyaA7yHg92XFld/pNw+GW3HRb49Ji6WxMYtZpjVqM8AXOvxKWMw3Mt5hnDTfwyGKGz/IWfrZM2pOQdGznrWw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/enhanced": "0.11.1", + "@module-federation/runtime": "0.11.1", + "@module-federation/sdk": "0.11.1", + "@module-federation/utilities": "3.1.48", + "btoa": "1.2.1", + "encoding": "^0.1.13", + "node-fetch": "2.7.0" + }, + "peerDependencies": { + "react": "^16||^17||^18", + "react-dom": "^16||^17||^18", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.11.1.tgz", + "integrity": "sha512-SUoJE7dEQZVUwBGN+mcMxLyQcQT0RAOZfcjp6Jq3uS6dTtEmJiR4KKGAaNYBlaszBh/HxmiM1U+zE3G126O7tQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/sdk": "0.11.1", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.11.1.tgz", + "integrity": "sha512-94CiNMHqFdaP93RzzEkMyAQcjXMdlSrsMd9R0htzW23keSnerWnmTcRfkvuzKSAR5cqYszGlrYH9CLyMl1T56A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.11.1", + "@module-federation/sdk": "0.11.1", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.11.1.tgz", + "integrity": "sha512-1fsnNb1dIYFoZ9Gk0gVXb/7+YDm0yWSBsVQvGLBOxMSaf1aF12mVi7MF9+l/ax4BgtgFvqVwekKssAbOXrjsig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/error-codes": "0.11.1", + "@module-federation/managers": "0.11.1", + "@module-federation/sdk": "0.11.1", + "@module-federation/third-party-dts-extractor": "0.11.1", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.8.2", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.4", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.11.1.tgz", + "integrity": "sha512-B+2kWuzkwEZvpLxwiah2gxHov9Xw2fmXZKvMqBwDSGCOobTtdipAjAeG0AXm7mdEO1Xw/SkZgEDLYQxW27exjA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.11.1", + "@module-federation/data-prefetch": "0.11.1", + "@module-federation/dts-plugin": "0.11.1", + "@module-federation/error-codes": "0.11.1", + "@module-federation/inject-external-runtime-core-plugin": "0.11.1", + "@module-federation/managers": "0.11.1", + "@module-federation/manifest": "0.11.1", + "@module-federation/rspack": "0.11.1", + "@module-federation/runtime-tools": "0.11.1", + "@module-federation/sdk": "0.11.1", + "btoa": "^1.2.1", + "upath": "2.0.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.11.1.tgz", + "integrity": "sha512-N1cs1qwrO8cU/OzfnBbr+3FaVbrJk6QEAsQ8H+YxGRrh/kHsR2BKpZCX79jTG27oDbz45FLjQ98YucMMXC24EA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.11.1.tgz", + "integrity": "sha512-giayNxsx7XK86aIzydjtnn8UD8qYyBcVwmsFEEXXA02Jod36CGRFcd0eQ6TzgVEF7kE3iZkpHEKJBGontl32Qg==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@module-federation/runtime-tools": "0.11.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/managers": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.11.1.tgz", + "integrity": "sha512-qEgJE4qFfIaPVpGncsCvn5eqC6VJ8wT2jwPF2+27cpU5IqZwvfIBZlIjUkGEDPjUtbS10JdGKBfLFrcI+p9i5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/sdk": "0.11.1", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.11.1.tgz", + "integrity": "sha512-y4zoS4QJMn6OVtY3Wkq3khtjVCU3J8Pnb1CbjM5xoJ7jy/qZhTnDJd194czoQgzx4MnP+BR5jshEQha9GCFPzg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/dts-plugin": "0.11.1", + "@module-federation/managers": "0.11.1", + "@module-federation/sdk": "0.11.1", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.11.1.tgz", + "integrity": "sha512-hhikMBb7qSWCKtoCPO1QLoJwu4BsZPAKs9nychLXakMPQEGByrnh/upVb1C2wep2C4Ax9sjuFT7zD/3CdHOmGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.11.1", + "@module-federation/dts-plugin": "0.11.1", + "@module-federation/inject-external-runtime-core-plugin": "0.11.1", + "@module-federation/managers": "0.11.1", + "@module-federation/manifest": "0.11.1", + "@module-federation/runtime-tools": "0.11.1", + "@module-federation/sdk": "0.11.1", + "btoa": "1.2.1" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.11.1.tgz", + "integrity": "sha512-yxxa/TRXaNggb34N+oL82J7r9+GZ3gYTCDyGibYqtsC5j7+9oB4tmc0UyhjrGMhg+fF8TAWFZjNKo7ZnyN9LcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/error-codes": "0.11.1", + "@module-federation/runtime-core": "0.11.1", + "@module-federation/sdk": "0.11.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.11.1.tgz", + "integrity": "sha512-6KxLfkCl05Ey69Xg/dsjf7fPit9qGXZ0lpwaG2agiCqC3JCDxYjT7tgGvnWhTXCcztb/ThpT+bHrRD4Kw8SMhA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/error-codes": "0.11.1", + "@module-federation/sdk": "0.11.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.11.1.tgz", + "integrity": "sha512-8UqMbHJSdkEvKlnlXpR/OjMA77bUbhtmv0I4UO+PA1zBga4y3/St6NOjD66NTINKeWEgsCt1aepXHspduXp33w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.11.1", + "@module-federation/webpack-bundler-runtime": "0.11.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.11.1.tgz", + "integrity": "sha512-QS6zevdQYLCGF6NFf0LysMGARh+dZxMeoRKKDUW5PYi3XOk+tjJ7QsDKybfcBZBNgBJfIuwxh4Oei6WOFJEfRg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.11.1.tgz", + "integrity": "sha512-oyyelSLGFObM699p192Cuk/LxEDdzSOywDUXrzPa/qSKNFii5WartjQRc4QPMLnsQaGD7fQVTTiBkvVBcWUdyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.11.1.tgz", + "integrity": "sha512-XlVegGyCBBLId8Jr6USjPOFYViQ0CCtoYjHpC8y1FOGtuXLGrvnEdFcl4XHlFlp3MY3Rxhr8QigrdZhYe5bRWg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.11.1", + "@module-federation/sdk": "0.11.1" + } + }, + "node_modules/@module-federation/rspack": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.1.tgz", + "integrity": "sha512-ZJqG75dWHhyTMa9I0YPJEV2XRt0MFxnDiuMOpI92esdmwWY633CBKyNh1XxcLd629YVeTv03+whr+Fz/f91JEw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.9.1", + "@module-federation/dts-plugin": "0.9.1", + "@module-federation/inject-external-runtime-core-plugin": "0.9.1", + "@module-federation/managers": "0.9.1", + "@module-federation/manifest": "0.9.1", + "@module-federation/runtime-tools": "0.9.1", + "@module-federation/sdk": "0.9.1" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.9.1.tgz", + "integrity": "sha512-jp7K06weabM5BF5sruHr/VLyalO+cilvRDy7vdEBqq88O9mjc0RserD8J+AP4WTl3ZzU7/GRqwRsiwjjN913dA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/error-codes": "0.9.1", + "@module-federation/runtime-core": "0.9.1", + "@module-federation/sdk": "0.9.1" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.9.1.tgz", + "integrity": "sha512-r61ufhKt5pjl81v7TkmhzeIoSPOaNtLynW6+aCy3KZMa3RfRevFxmygJqv4Nug1L0NhqUeWtdLejh4VIglNy5Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/error-codes": "0.9.1", + "@module-federation/sdk": "0.9.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.9.1.tgz", + "integrity": "sha512-JQZ//ab+lEXoU2DHAH+JtYASGzxEjXB0s4rU+6VJXc8c+oUPxH3kWIwzjdncg2mcWBmC1140DCk+K+kDfOZ5CQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.9.1", + "@module-federation/webpack-bundler-runtime": "0.9.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.1.tgz", + "integrity": "sha512-YQonPTImgnCqZjE/A+3N2g3J5ypR6kx1tbBzc9toUANKr/dw/S63qlh/zHKzWQzxjjNNVMdXRtTMp07g3kgEWg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.9.1.tgz", + "integrity": "sha512-KeIByP718hHyq+Mc53enZ419pZZ1fh9Ns6+/bYLkc3iCoJr/EDBeiLzkbMwh2AS4Qk57WW0yNC82xzf7r0Zrrw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/utilities": { + "version": "3.1.48", + "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.48.tgz", + "integrity": "sha512-eY1JrnVKNX/gECe121kzgHUu/P9jSrkxFzbm7Hs+eaMo+hhwCyqbwJTOi5kZzk9xDnnP6555nESk8+3ovKlOFw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/sdk": "0.11.1" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.11.1.tgz", + "integrity": "sha512-QS6zevdQYLCGF6NFf0LysMGARh+dZxMeoRKKDUW5PYi3XOk+tjJ7QsDKybfcBZBNgBJfIuwxh4Oei6WOFJEfRg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.1.tgz", + "integrity": "sha512-CxySX01gT8cBowKl9xZh+voiHvThMZ471icasWnlDIZb14KasZoX1eCh9wpGvwoOdIk9rIRT7h70UvW9nmop6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.9.1", + "@module-federation/sdk": "0.9.1" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@netlify/functions": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-3.0.4.tgz", + "integrity": "sha512-Ox8+ABI+nsLK+c4/oC5dpquXuEIjzfTlJrdQKgQijCsDQoje7inXFAtKDLvvaGvuvE+PVpMLwQcIUL6P9Ob1hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@netlify/serverless-functions-api": "1.36.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@netlify/serverless-functions-api": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.36.0.tgz", + "integrity": "sha512-z6okREyK8in0486a22Oro0k+YsuyEjDXJt46FpgeOgXqKJ9ElM8QPll0iuLBkpbH33ENiNbIPLd1cuClRQnhiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.9.tgz", + "integrity": "sha512-/apDvs4qevjSWoYw3h3/c/mILFrf2EgCJfBy9f3E7PEgi2tjifOIszBRrLQkVpeHAaFgEH8zKS2ol0hAmOl8sw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "typescript": ">=5.4 <5.6", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", + "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/devkit": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.8.5.tgz", + "integrity": "sha512-2p/yWPsbHpGn2veDYf/0b90FKglqNRc+avlpu0EQgAtLLl4RLWu16gvJYlngqWLYVP17pM1dXUSnvW5jJlDZIA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "19.8.5" + } + }, + "node_modules/@nrwl/js": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-19.8.5.tgz", + "integrity": "sha512-LOypqEkBUquhheUQBwo8KhiBc6EhBtAXCCMunSUY8F73qS0WODioUwNbmnfuEX9Pq5beDczjiCyQUvVAmgOaUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/js": "19.8.5" + } + }, + "node_modules/@nrwl/tao": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.8.5.tgz", + "integrity": "sha512-09hZxUknDESjHLhsfpiWOfe8VnZb4qDDRlOw9StHe1obxoOFr545ghQ7MbggU5yEk9KnEaUKnzEtHQl199NLaw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "nx": "19.8.5", + "tslib": "^2.3.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-darwin-arm64": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.5.tgz", + "integrity": "sha512-u0oS0LLzn4Xj50Q6K7xIVJDMHe5mBatOBcmwM/Jtu2j01N3yvZyoJnhxmK4I31wAgXhKYSbRIAMFzF9wdzgWhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-darwin-x64": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.5.tgz", + "integrity": "sha512-za2V0FpLrV9KUfGaegqZIirgu9cBOCefUqzEDWz5eFjdcdLMTvOpp53vHEsD+DE4XbDmvBHOLfSKVsT/lkfW1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-freebsd-x64": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.5.tgz", + "integrity": "sha512-jl9VUXGYRrpvKedX202J9Mq1gL4pS9ArFKAoAYzJCkyaKeIwrW3petLO+IZRP1pV3hI2EjjIG+Cl9D0SIqQrQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.5.tgz", + "integrity": "sha512-ZsBHugu+wrRsFETOcxtMJkq/Cyi4YMc1v4EtPaBMa22EfIsXZltYagTF6XWbCNfggoY5KAueF4Bpg0IiqVgFPw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.5.tgz", + "integrity": "sha512-cPt9ouuOKzfCa6CTHenWtJw32vqsgKbiavv683ZaZPeg3Y610hAF9vjeQWXDJi8kX1M5Sbox8suI9W3CzNzdFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.5.tgz", + "integrity": "sha512-r4e1cfpPAAfV8J+MDfhzqqfwlnsNOfOvWYxvsZDlJ/mRGo9jZqwRAdsnCN7ltd13NbHZ/LT/e7y3ih5+CG4GZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.5.tgz", + "integrity": "sha512-5fCxgGp6gW/zBt3TpNM4L1h/srmnzW/PWkA8WWSIpiJAXFTWq/p1H83jcAmk/bXaUxwOtr3viIjm9F17HRCLMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-linux-x64-musl": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.5.tgz", + "integrity": "sha512-UM/PJNi0SmsMosCdR6DcYHpZvdIXaByztXoA9ddM6Bc9MD0RJ86juyFKPCuvcD5Lir+msHGM74pCWK4qjpEiVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.5.tgz", + "integrity": "sha512-KqV1lLGuVIXa7Od+Sf4NLZmrX1Hx3pXoKpNvWEE9+x3w965GH9pTzSwy3S4+JbmuPboV8LFeMknrJcprgz/imA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.5.tgz", + "integrity": "sha512-oMEC17hno2C5hXmXD/HLJ9swJ86AVa0vw0NTjKWm1vnRNiJlhw9mA+hNTQcm1L2VUpQSUN60Jg+134LPZh6nCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nrwl/tao/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nrwl/tao/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nrwl/tao/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nrwl/tao/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nrwl/tao/node_modules/nx": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.8.5.tgz", + "integrity": "sha512-QB0E7ylVtnmo06T4cGU/Q/Pxpt5gcM/Jr9WCpwhTFOrzzHHPB3Rta6ISL4KvXeqPP4rCVT7kV46jquq6LQEGNw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.8.5", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "19.8.5", + "@nx/nx-darwin-x64": "19.8.5", + "@nx/nx-freebsd-x64": "19.8.5", + "@nx/nx-linux-arm-gnueabihf": "19.8.5", + "@nx/nx-linux-arm64-gnu": "19.8.5", + "@nx/nx-linux-arm64-musl": "19.8.5", + "@nx/nx-linux-x64-gnu": "19.8.5", + "@nx/nx-linux-x64-musl": "19.8.5", + "@nx/nx-win32-arm64-msvc": "19.8.5", + "@nx/nx-win32-x64-msvc": "19.8.5" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/tao/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nrwl/tao/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nrwl/tao/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nrwl/tao/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nrwl/tao/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nrwl/tao/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nrwl/vite": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nrwl/vite/-/vite-19.8.5.tgz", + "integrity": "sha512-02fWuRihb416l3Hl4gZK5DPbm/Q4pBOSB1RcJt/6qOcO7MvozlJJJLoSqAG93VrZq8BdRHJjyKDfjW/zVLRiQg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/vite": "19.8.5" + } + }, + "node_modules/@nrwl/workspace": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-19.8.5.tgz", + "integrity": "sha512-wAPZgwm1M3g8vIq8j3KlK2saYSCUx+nQxJUvAx+gNJ5cCaGpgYOiUI4sQQ2wo/8y6txcL4ZN5cYAiQb5cLp91Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/workspace": "19.8.5" + } + }, + "node_modules/@nx/angular": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.6.2.tgz", + "integrity": "sha512-5ND4bYBJcn9wjIdDZUeoZ47bfdp6mkgZrQXGlntZ3/EzevZS37k4SwokA4dtLv0MX/lAifTbofJ7XN5ZJU1EiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@nx/eslint": "20.6.2", + "@nx/js": "20.6.2", + "@nx/module-federation": "20.6.2", + "@nx/rspack": "20.6.2", + "@nx/web": "20.6.2", + "@nx/webpack": "20.6.2", + "@nx/workspace": "20.6.2", + "@phenomnomnominal/tsquery": "~5.0.1", + "@typescript-eslint/type-utils": "^8.0.0", + "enquirer": "~2.3.6", + "magic-string": "~0.30.2", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "piscina": "^4.4.0", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">= 17.0.0 < 20.0.0", + "@angular-devkit/core": ">= 17.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 17.0.0 < 20.0.0", + "@schematics/angular": ">= 17.0.0 < 20.0.0", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@nx/angular/node_modules/@nx/devkit": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.6.2.tgz", + "integrity": "sha512-n36iECrNrrRugh7Jfpe9A3PS6vjil57iLyJ9fE8plylWSHPJmsXRp5K6HH7q3hBu6UG3my1HgdproJwvF34a5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/angular/node_modules/@nx/js": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.6.2.tgz", + "integrity": "sha512-h6r1bPHL5u6IZHKYm+fdAgup5G5YOWjtbTddCP5TVWnKU7ume/5P8cpYch4jvc4T7+/PKJQxikdUz7isDztyJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.6.2", + "@nx/workspace": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/angular/node_modules/@nx/workspace": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.6.2.tgz", + "integrity": "sha512-sZc1UnmuiMJWCa23ycYX4h5NaxRTj+q8iqIOd5zjwLQ/LxY4gkaUpWJJIG8zwl4EF+PIjHPtbnIj78G4ZM2FJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.6.2", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/angular/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@nx/angular/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/angular/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/angular/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/angular/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/angular/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/angular/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/angular/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/angular/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/angular/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/angular/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/angular/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/angular/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/angular/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/angular/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nx/devkit": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.8.5.tgz", + "integrity": "sha512-5JW8K5ZbEQwsgIq5wh+6MDerR0ncS+wUPuYwE4CeyBIGk+YWF6OLGEXSqW/QZPhKgZnTVPIKGYYpdgHTS6G5wQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@nrwl/devkit": "19.8.5", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/eslint": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.6.2.tgz", + "integrity": "sha512-cWP+ayiP3WY2xyAPXPDxEQG38Vh+NqwUACrgzkswqo7F1zpFMEwoTFY36USoMr7+nfqnIy6haMYVtoezj+9MxA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@nx/js": "20.6.2", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.7.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/eslint/node_modules/@nx/devkit": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.6.2.tgz", + "integrity": "sha512-n36iECrNrrRugh7Jfpe9A3PS6vjil57iLyJ9fE8plylWSHPJmsXRp5K6HH7q3hBu6UG3my1HgdproJwvF34a5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/eslint/node_modules/@nx/js": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.6.2.tgz", + "integrity": "sha512-h6r1bPHL5u6IZHKYm+fdAgup5G5YOWjtbTddCP5TVWnKU7ume/5P8cpYch4jvc4T7+/PKJQxikdUz7isDztyJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.6.2", + "@nx/workspace": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/eslint/node_modules/@nx/workspace": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.6.2.tgz", + "integrity": "sha512-sZc1UnmuiMJWCa23ycYX4h5NaxRTj+q8iqIOd5zjwLQ/LxY4gkaUpWJJIG8zwl4EF+PIjHPtbnIj78G4ZM2FJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.6.2", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/eslint/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@nx/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/eslint/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/eslint/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/eslint/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/eslint/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/eslint/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/eslint/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/eslint/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/eslint/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/eslint/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/eslint/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/eslint/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/eslint/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/eslint/node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@nx/js": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-19.8.5.tgz", + "integrity": "sha512-rKKcoPEwVX30L7d5ZpUmQM8mSw3278acHxg/EhG/rsElBAxSuiKDPGCjN5kYufvsCwsg8v3jKtaBr+yR3ADBSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nrwl/js": "19.8.5", + "@nx/devkit": "19.8.5", + "@nx/workspace": "19.8.5", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "minimatch": "9.0.3", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^5.0.4" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/js/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/js/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/js/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/js/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nx/js/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/js/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/js/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/js/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/js/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/js/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/js/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/js/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/js/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/module-federation": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.6.2.tgz", + "integrity": "sha512-kVBeNRMAzBvWTZSo2T0TBZe0ogYHfFs78K2pcUUVuM+mubzNFFEE3sloPWDzkt2k0F91sCPs6yS+hmOJsfbNPw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/enhanced": "^0.9.0", + "@module-federation/node": "^2.6.26", + "@module-federation/sdk": "^0.9.0", + "@nx/devkit": "20.6.2", + "@nx/js": "20.6.2", + "@nx/web": "20.6.2", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.3", + "picocolors": "^1.1.0", + "tslib": "^2.3.0", + "webpack": "^5.88.0" + }, + "peerDependencies": { + "@rspack/core": "^1.1.5" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/devkit": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.6.2.tgz", + "integrity": "sha512-n36iECrNrrRugh7Jfpe9A3PS6vjil57iLyJ9fE8plylWSHPJmsXRp5K6HH7q3hBu6UG3my1HgdproJwvF34a5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/js": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.6.2.tgz", + "integrity": "sha512-h6r1bPHL5u6IZHKYm+fdAgup5G5YOWjtbTddCP5TVWnKU7ume/5P8cpYch4jvc4T7+/PKJQxikdUz7isDztyJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.6.2", + "@nx/workspace": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/workspace": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.6.2.tgz", + "integrity": "sha512-sZc1UnmuiMJWCa23ycYX4h5NaxRTj+q8iqIOd5zjwLQ/LxY4gkaUpWJJIG8zwl4EF+PIjHPtbnIj78G4ZM2FJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.6.2", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/module-federation/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@nx/module-federation/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/module-federation/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/module-federation/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/module-federation/node_modules/http-proxy-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", + "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/module-federation/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/module-federation/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/module-federation/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/module-federation/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/module-federation/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/module-federation/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/module-federation/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/module-federation/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.6.2.tgz", + "integrity": "sha512-ap7DJPx7goc0iXOaVETOmeTrQdWQfVVhM8rrjteARycJf7+kirEYPg9V/3ePA/lome7PudLVe2qGlOCaQbXbHw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.6.2.tgz", + "integrity": "sha512-xtOsd5Wh5J3/wzw0BVMNbzSjVEfc1IkgB53ofoEqBd80/dqqI/WIh8qkt+5oQjJwE2CHaZ+4UkVlwSylaHguPg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.6.2.tgz", + "integrity": "sha512-tSHAcIoSR4grW2uJNE+8ipHkB1PyGikYHBoy6iGu4upbLH0d3RqZVpiXS5qCY030XWo16yo4gXyMMyp84cjdDw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.6.2.tgz", + "integrity": "sha512-x4EK2ydPcKAu8/DlesoWx/hfnK/CYp6BEjss/lsffLLMXNmzhCMulxqYhjwE5m38hauHQFSVrkHq6gSZeGkB8Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.6.2.tgz", + "integrity": "sha512-OjJ6UA/varsVfhuKAV/GLVkPZk7CzRKeTW0xEB6Ik9XjllXruYmNvMhtBuD+MNWqkKld9aIjAQhnJ3YI8hjMRA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.6.2.tgz", + "integrity": "sha512-+Vq8STTtJi+o2BR2JmPf0CvZEotkMHYOlgzcFox8HBIRel3vXW2rJpISSExEtocb/qDj5+pRoiRf07vGY7utjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.6.2.tgz", + "integrity": "sha512-PzZvYuYhD5JBddVN5l/VukW2Ju/BubKqrH0P3ndgh1atH/eBljJegSHryAMHhR9wNygwLTvbpVQzU5jOBX2HDQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.6.2.tgz", + "integrity": "sha512-CZoWa6CY7fDHah49cnLSThbkvLoXkYtQ/2uEV7AzYm7k47VAOK191ymuEIRQKl4gw60e0BHr7T9UFsJoiJNohA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.6.2.tgz", + "integrity": "sha512-D9HFGyzqy6JqqokxoHAzsGmR6D+Y962ldcUrfaQWvBQSDDJRaDG0iL2crnj85pOh7NDMGF8avv2gv39oUxATaw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.6.2.tgz", + "integrity": "sha512-WlSGOpt6lUC9NujVAi3Ky3wp/Ys+qAbxmrU5YKhuXhjVsuqPKw97OwptjXAdEt71Wxvdp4Ghlw12Pn9YScN0kw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/rspack": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-20.6.2.tgz", + "integrity": "sha512-IMf44+WCFEdAeZ+ICEShQlgjuWTUTPWbnw/+/ehAkLwgMGiU9c1kcNMr0IprxeVh8T1vrtLt7o328lnWQCgjCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@nx/js": "20.6.2", + "@nx/module-federation": "20.6.2", + "@nx/web": "20.6.2", + "@phenomnomnominal/tsquery": "~5.0.1", + "@rspack/core": "^1.1.5", + "@rspack/dev-server": "^1.0.9", + "@rspack/plugin-react-refresh": "^1.0.0", + "autoprefixer": "^10.4.9", + "browserslist": "^4.21.4", + "css-loader": "^6.4.0", + "enquirer": "~2.3.6", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "picocolors": "^1.1.0", + "postcss": "^8.4.38", + "postcss-import": "~14.1.0", + "postcss-loader": "^8.1.1", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "ts-checker-rspack-plugin": "^1.1.1", + "tslib": "^2.3.0", + "webpack": "^5.80.0", + "webpack-node-externals": "^3.0.0" + }, + "peerDependencies": { + "@module-federation/enhanced": "^0.9.0", + "@module-federation/node": "^2.6.26" + } + }, + "node_modules/@nx/rspack/node_modules/@nx/devkit": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.6.2.tgz", + "integrity": "sha512-n36iECrNrrRugh7Jfpe9A3PS6vjil57iLyJ9fE8plylWSHPJmsXRp5K6HH7q3hBu6UG3my1HgdproJwvF34a5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/rspack/node_modules/@nx/js": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.6.2.tgz", + "integrity": "sha512-h6r1bPHL5u6IZHKYm+fdAgup5G5YOWjtbTddCP5TVWnKU7ume/5P8cpYch4jvc4T7+/PKJQxikdUz7isDztyJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.6.2", + "@nx/workspace": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/rspack/node_modules/@nx/workspace": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.6.2.tgz", + "integrity": "sha512-sZc1UnmuiMJWCa23ycYX4h5NaxRTj+q8iqIOd5zjwLQ/LxY4gkaUpWJJIG8zwl4EF+PIjHPtbnIj78G4ZM2FJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.6.2", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/rspack/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@nx/rspack/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/rspack/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nx/rspack/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/rspack/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/rspack/node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@nx/rspack/node_modules/http-proxy-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", + "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@nx/rspack/node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/rspack/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/rspack/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/rspack/node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/@nx/rspack/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@nx/rspack/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/rspack/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/rspack/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/rspack/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/rspack/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/rspack/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nx/rspack/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/rspack/node_modules/sass": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/@nx/rspack/node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@nx/rspack/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/rspack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/rspack/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/vite": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-19.8.5.tgz", + "integrity": "sha512-wNvduwhB6cvP0TOT50WWAM/00Wl56wXJBXVxKPTIURIOHyHehHvqfErIi44R1A5jBrQv33xzUEa9ZVdP327tpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nrwl/vite": "19.8.5", + "@nx/devkit": "19.8.5", + "@nx/js": "19.8.5", + "@phenomnomnominal/tsquery": "~5.0.1", + "@swc/helpers": "~0.5.0", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "tsconfig-paths": "^4.1.2" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vitest": "^1.3.1 || ^2.0.0" + } + }, + "node_modules/@nx/web": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.6.2.tgz", + "integrity": "sha512-nl+fqZMFQFDezfaVD2gHDsV3LostBoBJT2fxSZOkVuZVXe0AIrbyxIbAXgOI9wXUjiGvl2OiHEe9OMbN2ig8jA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@nx/js": "20.6.2", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/web/node_modules/@nx/devkit": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.6.2.tgz", + "integrity": "sha512-n36iECrNrrRugh7Jfpe9A3PS6vjil57iLyJ9fE8plylWSHPJmsXRp5K6HH7q3hBu6UG3my1HgdproJwvF34a5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/web/node_modules/@nx/js": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.6.2.tgz", + "integrity": "sha512-h6r1bPHL5u6IZHKYm+fdAgup5G5YOWjtbTddCP5TVWnKU7ume/5P8cpYch4jvc4T7+/PKJQxikdUz7isDztyJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.6.2", + "@nx/workspace": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/web/node_modules/@nx/workspace": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.6.2.tgz", + "integrity": "sha512-sZc1UnmuiMJWCa23ycYX4h5NaxRTj+q8iqIOd5zjwLQ/LxY4gkaUpWJJIG8zwl4EF+PIjHPtbnIj78G4ZM2FJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.6.2", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/web/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@nx/web/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/web/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/web/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/web/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/web/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/web/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/web/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/web/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/web/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/web/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/web/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/web/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/web/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/webpack": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.6.2.tgz", + "integrity": "sha512-3IY8GDYBxQGa9s+IgHNutd+u+p2/EWy6tJ6w+Rg1pfFnwVEUtJJnnNCLIcsslhKONPQaVbG5kFQZAyLETuRRdw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@nx/devkit": "20.6.2", + "@nx/js": "20.6.2", + "@phenomnomnominal/tsquery": "~5.0.1", + "ajv": "^8.12.0", + "autoprefixer": "^10.4.9", + "babel-loader": "^9.1.2", + "browserslist": "^4.21.4", + "copy-webpack-plugin": "^10.2.4", + "css-loader": "^6.4.0", + "css-minimizer-webpack-plugin": "^5.0.0", + "fork-ts-checker-webpack-plugin": "7.2.13", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "mini-css-extract-plugin": "~2.4.7", + "parse5": "4.0.0", + "picocolors": "^1.1.0", + "postcss": "^8.4.38", + "postcss-import": "~14.1.0", + "postcss-loader": "^6.1.1", + "rxjs": "^7.8.0", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "stylus": "^0.64.0", + "stylus-loader": "^7.1.0", + "terser-webpack-plugin": "^5.3.3", + "ts-loader": "^9.3.1", + "tsconfig-paths-webpack-plugin": "4.0.0", + "tslib": "^2.3.0", + "webpack": "^5.80.0", + "webpack-dev-server": "^5.0.4", + "webpack-node-externals": "^3.0.0", + "webpack-subresource-integrity": "^5.1.0" + } + }, + "node_modules/@nx/webpack/node_modules/@nx/devkit": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.6.2.tgz", + "integrity": "sha512-n36iECrNrrRugh7Jfpe9A3PS6vjil57iLyJ9fE8plylWSHPJmsXRp5K6HH7q3hBu6UG3my1HgdproJwvF34a5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/webpack/node_modules/@nx/js": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.6.2.tgz", + "integrity": "sha512-h6r1bPHL5u6IZHKYm+fdAgup5G5YOWjtbTddCP5TVWnKU7ume/5P8cpYch4jvc4T7+/PKJQxikdUz7isDztyJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.6.2", + "@nx/workspace": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/webpack/node_modules/@nx/workspace": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.6.2.tgz", + "integrity": "sha512-sZc1UnmuiMJWCa23ycYX4h5NaxRTj+q8iqIOd5zjwLQ/LxY4gkaUpWJJIG8zwl4EF+PIjHPtbnIj78G4ZM2FJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nx/devkit": "20.6.2", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.6.2", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/webpack/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@nx/webpack/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/webpack/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nx/webpack/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/webpack/node_modules/copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/@nx/webpack/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/webpack/node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@nx/webpack/node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/webpack/node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/webpack/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/webpack/node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/@nx/webpack/node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@nx/webpack/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/webpack/node_modules/mini-css-extract-plugin": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", + "integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/webpack/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/webpack/node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nx/webpack/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/webpack/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@nx/webpack/node_modules/sass": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/@nx/webpack/node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@nx/webpack/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/webpack/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/webpack/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/workspace": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.8.5.tgz", + "integrity": "sha512-SwvhYetHQMT4IroVku1OjboPnsOC9kv2TURrN4x7NKdYM/4aYAxC1sdabhpMFpqLXSJTUMgOT82hpD3peGbFQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nrwl/workspace": "19.8.5", + "@nx/devkit": "19.8.5", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "19.8.5", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-darwin-arm64": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.5.tgz", + "integrity": "sha512-u0oS0LLzn4Xj50Q6K7xIVJDMHe5mBatOBcmwM/Jtu2j01N3yvZyoJnhxmK4I31wAgXhKYSbRIAMFzF9wdzgWhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-darwin-x64": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.5.tgz", + "integrity": "sha512-za2V0FpLrV9KUfGaegqZIirgu9cBOCefUqzEDWz5eFjdcdLMTvOpp53vHEsD+DE4XbDmvBHOLfSKVsT/lkfW1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-freebsd-x64": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.5.tgz", + "integrity": "sha512-jl9VUXGYRrpvKedX202J9Mq1gL4pS9ArFKAoAYzJCkyaKeIwrW3petLO+IZRP1pV3hI2EjjIG+Cl9D0SIqQrQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.5.tgz", + "integrity": "sha512-ZsBHugu+wrRsFETOcxtMJkq/Cyi4YMc1v4EtPaBMa22EfIsXZltYagTF6XWbCNfggoY5KAueF4Bpg0IiqVgFPw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.5.tgz", + "integrity": "sha512-cPt9ouuOKzfCa6CTHenWtJw32vqsgKbiavv683ZaZPeg3Y610hAF9vjeQWXDJi8kX1M5Sbox8suI9W3CzNzdFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.5.tgz", + "integrity": "sha512-r4e1cfpPAAfV8J+MDfhzqqfwlnsNOfOvWYxvsZDlJ/mRGo9jZqwRAdsnCN7ltd13NbHZ/LT/e7y3ih5+CG4GZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.5.tgz", + "integrity": "sha512-5fCxgGp6gW/zBt3TpNM4L1h/srmnzW/PWkA8WWSIpiJAXFTWq/p1H83jcAmk/bXaUxwOtr3viIjm9F17HRCLMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-musl": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.5.tgz", + "integrity": "sha512-UM/PJNi0SmsMosCdR6DcYHpZvdIXaByztXoA9ddM6Bc9MD0RJ86juyFKPCuvcD5Lir+msHGM74pCWK4qjpEiVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.5.tgz", + "integrity": "sha512-KqV1lLGuVIXa7Od+Sf4NLZmrX1Hx3pXoKpNvWEE9+x3w965GH9pTzSwy3S4+JbmuPboV8LFeMknrJcprgz/imA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.5.tgz", + "integrity": "sha512-oMEC17hno2C5hXmXD/HLJ9swJ86AVa0vw0NTjKWm1vnRNiJlhw9mA+hNTQcm1L2VUpQSUN60Jg+134LPZh6nCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/workspace/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/workspace/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/workspace/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/workspace/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/workspace/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/workspace/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/workspace/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/workspace/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nx/workspace/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/workspace/node_modules/nx": { + "version": "19.8.5", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.8.5.tgz", + "integrity": "sha512-QB0E7ylVtnmo06T4cGU/Q/Pxpt5gcM/Jr9WCpwhTFOrzzHHPB3Rta6ISL4KvXeqPP4rCVT7kV46jquq6LQEGNw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.8.5", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "19.8.5", + "@nx/nx-darwin-x64": "19.8.5", + "@nx/nx-freebsd-x64": "19.8.5", + "@nx/nx-linux-arm-gnueabihf": "19.8.5", + "@nx/nx-linux-arm64-gnu": "19.8.5", + "@nx/nx-linux-arm64-musl": "19.8.5", + "@nx/nx-linux-x64-gnu": "19.8.5", + "@nx/nx-linux-x64-musl": "19.8.5", + "@nx/nx-win32-arm64-msvc": "19.8.5", + "@nx/nx-win32-x64-msvc": "19.8.5" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nx/workspace/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/workspace/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/workspace/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/workspace/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nx/workspace/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/workspace/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/@nx/workspace/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/workspace/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@oozcitak/dom": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", + "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.5.1.tgz", + "integrity": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==", + "bundleDependencies": [ + "napi-wasm" + ], + "dev": true, + "license": "MIT", + "dependencies": { + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "napi-wasm": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", + "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esquery": "^1.4.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.4.tgz", + "integrity": "sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + }, + "engines": { + "node": ">=18.16.0" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.3.tgz", + "integrity": "sha512-iombbn8ckOixMtuV1p3f8jN6vqhXefNjJttoPaJDMeIk/yIGhkkL3OrHkEjE9SRsgoAx1vBUU2GtgggjvA5hCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.4", + "@sindresorhus/is": "^7.0.1", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/dumper/node_modules/supports-color": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz", + "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.1.tgz", + "integrity": "sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.1.tgz", + "integrity": "sha512-1CqQfiG456v9ZgYBG9xRQHnpXjt8WoSnDwdkX6gxktuK69v2037hTAR1eh0DGIqpZ1p4k82cGH8yTNwt7/pI9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.0.tgz", + "integrity": "sha512-Ji00EiLQRXq0pJIz5pAjGF9MfQvQVsQehc6uIis6sqat8tG/zh25Zi64w6HVGEDgJEzUeq/CuUlD0emu3Hdaqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-alias": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", + "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz", + "integrity": "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", + "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", + "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", + "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", + "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", + "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", + "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.8.tgz", + "integrity": "sha512-T3FMB3N9P1AbSAryfkSRJkPtmeSYs/Gj9zUZoPz1ckPEIcWZmpUOQbJylldjbw5waxtCL1haHNbi0pcSvxiaJw==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.2.8", + "@rspack/binding-darwin-x64": "1.2.8", + "@rspack/binding-linux-arm64-gnu": "1.2.8", + "@rspack/binding-linux-arm64-musl": "1.2.8", + "@rspack/binding-linux-x64-gnu": "1.2.8", + "@rspack/binding-linux-x64-musl": "1.2.8", + "@rspack/binding-win32-arm64-msvc": "1.2.8", + "@rspack/binding-win32-ia32-msvc": "1.2.8", + "@rspack/binding-win32-x64-msvc": "1.2.8" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.8.tgz", + "integrity": "sha512-bDlrlroY3iMlzna/3i1gD6eRmhJW2zRyC3Ov6aR1micshVQ9RteigYZWkjZuQfyC5Z8dCcLUQJVojz+pqp0JXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.8.tgz", + "integrity": "sha512-0/qOVbMuzZ+WbtDa4TbH46R4vph/W6MHcXbrXDO+vpdTMFDVJ64DnZXT7aqvGcY+7vTCIGm0GT+6ooR4KaIX8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.8.tgz", + "integrity": "sha512-En/SMl45s19iUVb1/ZDFQvFDxIjnlfk7yqV3drMWWAL5HSgksNejaTIFTO52aoohIBbmwuk5wSGcbU0G0IFiPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.8.tgz", + "integrity": "sha512-N1oZsXfJ9VLLcK7p1PS65cxLYQCZ7iqHW2OP6Ew2+hlz/d1hzngxgzrtZMCXFOHXDvTzVu5ff6jGS2v7+zv2tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.8.tgz", + "integrity": "sha512-BdPaepoLKuaVwip4QK/nGqNi1xpbCWSxiycPbKRrGqKgt/QGihxxFgiqr4EpWQVIJNIMy4nCsg4arO0+H1KWGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.8.tgz", + "integrity": "sha512-GFv0Bod268OcXIcjeLoPlK0oz8rClEIxIRFkz+ejhbvfCwRJ+Fd+EKaaKQTBfZQujPqc0h2GctIF25nN5pFTmA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.8.tgz", + "integrity": "sha512-aEU+uJdbvJJGrzzAsjbjrPeNbG/bcG8JoXK2kSsUB+/sWHTIkHX0AQ3oX3aV/lcLKgZWrUxLAfLoCXEnIHMEyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.8.tgz", + "integrity": "sha512-GHYzNOSoiLyG9elLTmMqADJMQzjll+co4irp5AgZ+KHG9EVq0qEHxDqDIJxZnUA15U8JDvCgo6YAo3T0BFEL0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.8.tgz", + "integrity": "sha512-EigKLhKLH1kfv1e/ZgXuSKlIjkbyneJtiLbNDz7EeEVFGV1XMM6bsCea1sb2WOxsPYiOX4Q5JmR1j1KGrZS/LA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rspack/core": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.8.tgz", + "integrity": "sha512-ppj3uQQtkhgrYDLrUqb33YbpNEZCpAudpfVuOHGsvUrAnu1PijbfJJymoA5ZvUhM+HNMvPI5D1ie97TXyb0UVg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime-tools": "0.8.4", + "@rspack/binding": "1.2.8", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001702" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@rspack/tracing": "^1.x", + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@rspack/tracing": { + "optional": true + }, + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz", + "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@rspack/core/node_modules/@module-federation/runtime": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz", + "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/error-codes": "0.8.4", + "@module-federation/sdk": "0.8.4" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz", + "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.8.4", + "@module-federation/webpack-bundler-runtime": "0.8.4" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/sdk": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz", + "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "isomorphic-rslog": "0.0.6" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz", + "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.8.4", + "@module-federation/sdk": "0.8.4" + } + }, + "node_modules/@rspack/dev-server": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.0.tgz", + "integrity": "sha512-/IMfxE5SWhZ0+6xrlJzsJwJV7a0FpsY51gDBmsjGTCCa+V8ucXNxS2233V4YG/ESAM4URJEKaHzNLAGtwCSW1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chokidar": "^3.6.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "^6.2.0", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.2.0", + "ws": "^8.16.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rspack/dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/@rspack/dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@rspack/dev-server/node_modules/webpack-dev-server": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", + "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.7", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@rspack/plugin-react-refresh": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.0.1.tgz", + "integrity": "sha512-KSBc3bsr3mrAPViv7w9MpE9KEWm6q87EyRXyHlRfJ9PpQ56NbX9KZ7AXo7jPeECb0q5sfpM2PSEf+syBiMgLSw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "error-stack-parser": "^2.1.4", + "html-entities": "^2.5.2" + }, + "peerDependencies": { + "react-refresh": ">=0.10.0 <1.0.0" + }, + "peerDependenciesMeta": { + "react-refresh": { + "optional": true + } + } + }, + "node_modules/@schematics/angular": { + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.9.tgz", + "integrity": "sha512-LlMHZQ6f8zrqSK24OBXi4u2MTNHNu9ZN6JXpbElq0bz/9QkUR2zy+Kk2wLpPxCwXYTZby7/xgHiTzXvG+zTdhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "18.2.9", + "@angular-devkit/schematics": "18.2.9", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", + "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.7.tgz", + "integrity": "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.22.0.tgz", + "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "minimatch": "^9.0.3", + "mkdirp": "^3.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", + "license": "MIT" + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz", + "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.7.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.6.tgz", + "integrity": "sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/qs": { + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", + "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.10.0.tgz", + "integrity": "sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/utils": "8.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", + "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/nft": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.29.2.tgz", + "integrity": "sha512-A/Si4mrTkQqJ6EXJKv5EYCDQ3NL6nJXxG8VGXePsaiQigsomHYQC9xSpX8qGk7AEZk4b1ssbYIqJ0ISQQ7bfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^10.4.5", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-plugin-const-enum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", + "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.3.3", + "@babel/traverse": "^7.16.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", + "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "peer": true, + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true, + "license": "MIT/X11", + "peer": true + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.0.2.tgz", + "integrity": "sha512-6Tzk1/TNeI3WBPpK0j/Ss4+gPj3PUJYbWl/MWDJBThFvwNGNkXtd7Cz8BJtD4aRwoGHtzQD0SnxamgUiBH0/Nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.1.8", + "defu": "^6.1.4", + "dotenv": "^16.4.7", + "exsolve": "^1.0.0", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.5", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.0.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/c12/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/c12/node_modules/pkg-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/c12/node_modules/pkg-types/node_modules/confbox": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.1.tgz", + "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==", + "dev": true, + "license": "MIT" + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001707", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/clipboardy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-block-writer": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", + "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true, + "license": "ISC" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compatx": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.1.8.tgz", + "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==", + "dev": true, + "license": "MIT" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT", + "peer": true + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz", + "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/critters": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "postcss-media-query-parser": "^0.2.3" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/croner": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/croner/-/croner-9.0.0.tgz", + "integrity": "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", + "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0", + "peer": true + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cytoscape": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", + "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "license": "MIT", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/default-gateway/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/default-gateway/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==", + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^4.18.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/type-fest": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.38.0.tgz", + "integrity": "sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/elkjs": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", + "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==", + "license": "EPL-2.0" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.23.0.tgz", + "integrity": "sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==", + "dev": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", + "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "peer": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-file-up": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", + "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", + "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-file-up": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", + "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "vue-template-compiler": "*", + "webpack": "^5.11.0" + }, + "peerDependenciesMeta": { + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/front-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT", + "peer": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true, + "license": "Unlicense", + "peer": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port-please": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/giget/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", + "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/h3": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", + "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.3", + "defu": "^6.1.4", + "destr": "^2.0.3", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.0", + "radix3": "^1.1.2", + "ufo": "^1.5.4", + "uncrypto": "^0.1.3" + } + }, + "node_modules/h3/node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "dev": true, + "license": "MIT" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz", + "integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.10", + "debug": "^4.3.4", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/http-shutdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", + "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/httpxy": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.7.tgz", + "integrity": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/index-to-position": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.0.0.tgz", + "integrity": "sha512-sCO7uaLVhRJ25vz1o8s9IFM3nVS4DkuQnyjMwiQPKvQuBYBDmb8H7zx8ki7nVh4HJQOdVWebyvLE0qt+clruxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ioredis": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.0.tgz", + "integrity": "sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is64bit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "system-architecture": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-rslog": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", + "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.17.6" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/katex": { + "version": "0.16.21", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", + "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.2.0.tgz", + "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/koa": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", + "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "license": "ISC", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/listhen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.9.0.tgz", + "integrity": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.4.1", + "@parcel/watcher-wasm": "^2.4.1", + "citty": "^0.1.6", + "clipboardy": "^4.0.0", + "consola": "^3.2.3", + "crossws": ">=0.2.0 <0.4.0", + "defu": "^6.1.4", + "get-port-please": "^3.1.2", + "h3": "^1.12.0", + "http-shutdown": "^1.2.2", + "jiti": "^2.1.2", + "mlly": "^1.7.1", + "node-forge": "^1.3.1", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "ufo": "^1.5.4", + "untun": "^0.1.3", + "uqr": "^0.1.2" + }, + "bin": { + "listen": "bin/listhen.mjs", + "listhen": "bin/listhen.mjs" + } + }, + "node_modules/listhen/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.13.tgz", + "integrity": "sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "msgpackr": "^1.10.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.0.13", + "@lmdb/lmdb-darwin-x64": "3.0.13", + "@lmdb/lmdb-linux-arm": "3.0.13", + "@lmdb/lmdb-linux-arm64": "3.0.13", + "@lmdb/lmdb-linux-x64": "3.0.13", + "@lmdb/lmdb-win32-x64": "3.0.13" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/marked": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz", + "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/marked-gfm-heading-id": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-3.2.0.tgz", + "integrity": "sha512-Xfxpr5lXLDLY10XqzSCA9l2dDaiabQUgtYM9hw8yunyVsB/xYBRpiic6BOiY/EAJw1ik1eWr1ET1HKOAPZBhXg==", + "license": "MIT", + "dependencies": { + "github-slugger": "^2.0.0" + }, + "peerDependencies": { + "marked": ">=4 <13" + } + }, + "node_modules/marked-highlight": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.2.0.tgz", + "integrity": "sha512-36LzwtVf7HEbbMITKU4j+iZuyWKgdXJfgYr4F5j27vs79oRPyApuBF3WkS5OsqO1+1lypWxztad7zNRM4qgXFw==", + "license": "MIT", + "peerDependencies": { + "marked": ">=4 <15" + } + }, + "node_modules/marked-mangle": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/marked-mangle/-/marked-mangle-1.1.9.tgz", + "integrity": "sha512-eLTXr1xQzba/WZp/trPS0HkR9W02ifasH6IWPrBv++eO2m8POiwV4muQ6Tof2C5Fhdo3z8ggXs6VGw1f931Vsg==", + "license": "MIT", + "peerDependencies": { + "marked": ">=4 <15" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0", + "peer": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "license": "Unlicense", + "peer": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "10.9.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.3.tgz", + "integrity": "sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^6.0.1", + "@types/d3-scale": "^4.0.3", + "@types/d3-scale-chromatic": "^3.0.0", + "cytoscape": "^3.28.1", + "cytoscape-cose-bilkent": "^4.1.0", + "d3": "^7.4.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "^3.0.5 <3.1.7", + "elkjs": "^0.9.0", + "katex": "^0.16.9", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/nice-napi/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nitropack": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.11.7.tgz", + "integrity": "sha512-ghqLa3Q4X9qaQiUyspWxxoU1fY2nwfSJqhOH+COqyCp7Vgj4oM1EM1L0YNSQUF16T2tAoOWg8woXGq0EH5Y6wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cloudflare/kv-asset-handler": "^0.4.0", + "@netlify/functions": "^3.0.2", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-inject": "^5.0.5", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-replace": "^6.0.2", + "@rollup/plugin-terser": "^0.4.4", + "@vercel/nft": "^0.29.2", + "archiver": "^7.0.1", + "c12": "^3.0.2", + "chokidar": "^4.0.3", + "citty": "^0.1.6", + "compatx": "^0.1.8", + "confbox": "^0.2.1", + "consola": "^3.4.2", + "cookie-es": "^2.0.0", + "croner": "^9.0.0", + "crossws": "^0.3.4", + "db0": "^0.3.1", + "defu": "^6.1.4", + "destr": "^2.0.3", + "dot-prop": "^9.0.0", + "esbuild": "^0.25.1", + "escape-string-regexp": "^5.0.0", + "etag": "^1.8.1", + "exsolve": "^1.0.4", + "globby": "^14.1.0", + "gzip-size": "^7.0.0", + "h3": "^1.15.1", + "hookable": "^5.5.3", + "httpxy": "^0.1.7", + "ioredis": "^5.6.0", + "jiti": "^2.4.2", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "listhen": "^1.9.0", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "mime": "^4.0.6", + "mlly": "^1.7.4", + "node-fetch-native": "^1.6.6", + "node-mock-http": "^1.0.0", + "ofetch": "^1.4.1", + "ohash": "^2.0.11", + "openapi-typescript": "^7.6.1", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.1.0", + "pretty-bytes": "^6.1.1", + "radix3": "^1.1.2", + "rollup": "^4.36.0", + "rollup-plugin-visualizer": "^5.14.0", + "scule": "^1.3.0", + "semver": "^7.7.1", + "serve-placeholder": "^2.0.2", + "serve-static": "^1.16.2", + "source-map": "^0.7.4", + "std-env": "^3.8.1", + "ufo": "^1.5.4", + "ultrahtml": "^1.5.3", + "uncrypto": "^0.1.3", + "unctx": "^2.4.1", + "unenv": "^2.0.0-rc.15", + "unimport": "^4.1.2", + "unplugin-utils": "^0.2.4", + "unstorage": "^1.15.0", + "untyped": "^2.0.0", + "unwasm": "^0.3.9", + "youch": "^4.1.0-beta.6", + "youch-core": "^0.3.2" + }, + "bin": { + "nitro": "dist/cli/index.mjs", + "nitropack": "dist/cli/index.mjs" + }, + "engines": { + "node": "^16.11.0 || >=17.0.0" + }, + "peerDependencies": { + "xml2js": "^0.6.2" + }, + "peerDependenciesMeta": { + "xml2js": { + "optional": true + } + } + }, + "node_modules/nitropack/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", + "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-android-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", + "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", + "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", + "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", + "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", + "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", + "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", + "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", + "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", + "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", + "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", + "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", + "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", + "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", + "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/nitropack/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", + "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/nitropack/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/nitropack/node_modules/confbox": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.1.tgz", + "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nitropack/node_modules/db0": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.1.tgz", + "integrity": "sha512-3RogPLE2LLq6t4YiFCREyl572aBjkfMvfwPyN51df00TbPbryL3XqBYuJ/j6mgPssPK8AKfYdLxizaO5UG10sA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@electric-sql/pglite": "*", + "@libsql/client": "*", + "better-sqlite3": "*", + "drizzle-orm": "*", + "mysql2": "*", + "sqlite3": "*" + }, + "peerDependenciesMeta": { + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "drizzle-orm": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/nitropack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nitropack/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/nitropack/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/nitropack/node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nitropack/node_modules/ignore": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/nitropack/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/nitropack/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nitropack/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/nitropack/node_modules/mime": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.6.tgz", + "integrity": "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/nitropack/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nitropack/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/nitropack/node_modules/pkg-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/nitropack/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/nitropack/node_modules/rollup": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", + "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.37.0", + "@rollup/rollup-android-arm64": "4.37.0", + "@rollup/rollup-darwin-arm64": "4.37.0", + "@rollup/rollup-darwin-x64": "4.37.0", + "@rollup/rollup-freebsd-arm64": "4.37.0", + "@rollup/rollup-freebsd-x64": "4.37.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", + "@rollup/rollup-linux-arm-musleabihf": "4.37.0", + "@rollup/rollup-linux-arm64-gnu": "4.37.0", + "@rollup/rollup-linux-arm64-musl": "4.37.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-musl": "4.37.0", + "@rollup/rollup-linux-s390x-gnu": "4.37.0", + "@rollup/rollup-linux-x64-gnu": "4.37.0", + "@rollup/rollup-linux-x64-musl": "4.37.0", + "@rollup/rollup-win32-arm64-msvc": "4.37.0", + "@rollup/rollup-win32-ia32-msvc": "4.37.0", + "@rollup/rollup-win32-x64-msvc": "4.37.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/nitropack/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nitropack/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nitropack/node_modules/unstorage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", + "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.3", + "h3": "^1.15.0", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.5.4" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "license": "MIT", + "peer": true + }, + "node_modules/node-mock-http": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", + "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-schedule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", + "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.6.2.tgz", + "integrity": "sha512-FvdDpBRgTdlTO0ixFjtZnMsp25MMBUzHcylVphekVY4vdFOnJ54f9Y64oncqcj70gyKX6Qn9g9+hEzV4bomYeQ==", + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.8.3", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "20.6.2", + "@nx/nx-darwin-x64": "20.6.2", + "@nx/nx-freebsd-x64": "20.6.2", + "@nx/nx-linux-arm-gnueabihf": "20.6.2", + "@nx/nx-linux-arm64-gnu": "20.6.2", + "@nx/nx-linux-arm64-musl": "20.6.2", + "@nx/nx-linux-x64-gnu": "20.6.2", + "@nx/nx-linux-x64-musl": "20.6.2", + "@nx/nx-win32-arm64-msvc": "20.6.2", + "@nx/nx-win32-x64-msvc": "20.6.2" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/nx/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT", + "peer": true + }, + "node_modules/nx/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nx/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "license": "MIT", + "peer": true + }, + "node_modules/nx/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nx/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/nx/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "peer": true + }, + "node_modules/nx/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/nx/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nx/node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/nypm": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.0.tgz", + "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "pathe": "^2.0.3", + "pkg-types": "^2.0.0", + "tinyexec": "^0.3.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/confbox": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.1.tgz", + "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nypm/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/nypm/node_modules/pkg-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "dev": true, + "license": "MIT", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true, + "peer": true + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-typescript": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.6.1.tgz", + "integrity": "sha512-F7RXEeo/heF3O9lOXo2bNjCOtfp7u+D6W3a3VNEH2xE6v+fxLtn5nq0uvUcA1F5aT+CMhNeC5Uqtg5tlXFX/ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "^1.28.0", + "ansi-colors": "^4.1.3", + "change-case": "^5.4.4", + "parse-json": "^8.1.0", + "supports-color": "^9.4.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "openapi-typescript": "bin/cli.js" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/openapi-typescript/node_modules/parse-json": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.2.0.tgz", + "integrity": "sha512-eONBZy4hm2AgxjNFd8a4nyDJnzUAH0g34xSQAwWEVGCjdZ4ZL7dKZBfq267GWP/JaS9zW62Xs2FeAdDvpHHJGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.0.0", + "type-fest": "^4.37.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-typescript/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/openapi-typescript/node_modules/type-fest": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.38.0.tgz", + "integrity": "sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "peer": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ordered-binary": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.2.tgz", + "integrity": "sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==", + "dev": true, + "license": "MIT" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/piscina": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", + "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.2", + "pathe": "^1.1.2" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/portfinder": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.35.tgz", + "integrity": "sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT", + "peer": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rambda": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", + "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dev": true, + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true, + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", + "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz", + "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^8.4.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "rolldown": "1.x", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.0.tgz", + "integrity": "sha512-Ibq5DzxjSf9f/IJmKeHVeXlVqiZWdRJF+RXy6v6UupvMYVMU5Ei+teSFBvvpPD5bB2QhhnU/OJlSM0EBCtfr9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.86.0", + "sass-embedded-android-arm64": "1.86.0", + "sass-embedded-android-ia32": "1.86.0", + "sass-embedded-android-riscv64": "1.86.0", + "sass-embedded-android-x64": "1.86.0", + "sass-embedded-darwin-arm64": "1.86.0", + "sass-embedded-darwin-x64": "1.86.0", + "sass-embedded-linux-arm": "1.86.0", + "sass-embedded-linux-arm64": "1.86.0", + "sass-embedded-linux-ia32": "1.86.0", + "sass-embedded-linux-musl-arm": "1.86.0", + "sass-embedded-linux-musl-arm64": "1.86.0", + "sass-embedded-linux-musl-ia32": "1.86.0", + "sass-embedded-linux-musl-riscv64": "1.86.0", + "sass-embedded-linux-musl-x64": "1.86.0", + "sass-embedded-linux-riscv64": "1.86.0", + "sass-embedded-linux-x64": "1.86.0", + "sass-embedded-win32-arm64": "1.86.0", + "sass-embedded-win32-ia32": "1.86.0", + "sass-embedded-win32-x64": "1.86.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.0.tgz", + "integrity": "sha512-NS8v6BCbzskXUMBtzfuB+j2yQMgiwg5edKHTYfQU7gAWai2hkRhS06YNEMff3aRxV0IFInxPRHOobd8xWPHqeA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.0.tgz", + "integrity": "sha512-r7MZtlAI2VFUnKE8B5UOrpoE6OGpdf1dIB6ndoxb3oiURgMyfTVU7yvJcL12GGvtVwQ2boCj6dq//Lqq9CXPlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-ia32": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.0.tgz", + "integrity": "sha512-UjfElrGaOTNOnxLZLxf6MFndFIe7zyK+81f83BioZ7/jcoAd6iCHZT8yQMvu8wINyVodPcaXZl8KxlKcl62VAA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.0.tgz", + "integrity": "sha512-TsqCLxHWLFS2mbpUkL/nge3jSkaPK2VmLkkoi5iO/EQT4SFvm1lNUgPwlLXu9DplZ+aqGVzRS9Y6Psjv+qW7kw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.0.tgz", + "integrity": "sha512-8Q263GgwGjz7Jkf7Eghp7NrwqskDL95WO9sKrNm9iOd2re/M48W7RN/lpdcZwrUnEOhueks0RRyYyZYBNRz8Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.0.tgz", + "integrity": "sha512-d8oMEaIweq1tjrb/BT43igDviOMS1TeDpc51QF7vAHkt9drSjPmqEmbqStdFYPAGZj1j0RA4WCRoVl6jVixi/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.0.tgz", + "integrity": "sha512-5NLRtn0ZUDBkfpKOsgLGl9B34po4Qui8Nff/lXTO+YkxBQFX4GoMkYNk9EJqHwoLLzICsxIhNDMMDiPGz7Fdrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.0.tgz", + "integrity": "sha512-b6wm0+Il+blJDleRXAqA6JISGMjRb0/thTEg4NWgmiJwUoZjDycj5FTbfYPnLXjCEIMGaYmW3patrJ3JMJcT3Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.0.tgz", + "integrity": "sha512-50A+0rhahRDRkKkv+qS7GDAAkW1VPm2RCX4zY4JWydhV4NwMXr6HbkLnsJ2MGixCyibPh59iflMpNBhe7SEMNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.0.tgz", + "integrity": "sha512-h0mr9w71TV3BRPk9JHr0flnRCznhkraY14gaj5T+t78vUFByOUMxp4hTr+JpZAR5mv0mIeoMwrQYwWJoqKI0mw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.0.tgz", + "integrity": "sha512-KZU70jBMVykC9HzS+o2FhrJaprFLDk3LWXVPtBFxgLlkcQ/apCkUCh2WVNViLhI2U4NrMSnTvd4kDnC/0m8qIw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.0.tgz", + "integrity": "sha512-5OZjiJIUyhvKJIGNDEjyRUWDe+W91hq4Bji27sy8gdEuDzPWLx4NzwpKwsBUALUfyW/J5dxgi0ZAQnI3HieyQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.0.tgz", + "integrity": "sha512-vq9wJ7kaELrsNU6Ld6kvrIHxoIUWaD+5T6TQVj4SJP/iw1NjonyCDMQGGs6UgsIEzvaIwtlSlDbRewAq+4PchA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.0.tgz", + "integrity": "sha512-UZJPu4zKe3phEzoSVRh5jcSicBBPe+jEbVNALHSSz881iOAYnDQXHITGeQ4mM1/7e/LTyryHk6EPBoaLOv6JrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.0.tgz", + "integrity": "sha512-8taAgbWMk4QHneJcouWmWZJlmKa2O03g4I/CFo4bfMPL87bibY90pAsSDd+C+t81g0+2aK0/lY/BoB0r3qXLiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.0.tgz", + "integrity": "sha512-yREY6o2sLwiiA03MWHVpnUliLscz0flEmFW/wzxYZJDqg9eZteB3hUWgZD63eLm2PTZsYxDQpjAHpa48nnIEmA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.0.tgz", + "integrity": "sha512-sH0F8np9PTgTbFcJWxfr1NzPkL5ID2NcpMtZyKPTdnn9NkE/L2UwXSo6xOvY0Duc4Hg+58wSrDnj6KbvdeHCPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.0.tgz", + "integrity": "sha512-4O1XVUxLTIjMOvrziYwEZgvFqC5sF6t0hTAPJ+h2uiAUZg9Joo0PvuEedXurjISgDBsb5W5DTL9hH9q1BbP4cQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.0.tgz", + "integrity": "sha512-zuSP2axkGm4VaJWt38P464H+4424Swr9bzFNfbbznxe3Ue4RuqSBqwiLiYdg9Q1cecTQ2WGH7G7WO56KK7WLwg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.0.tgz", + "integrity": "sha512-GVX0CHtukr3kjqfqretSlPiJzV7V4JxUjpRZV+yC9gUMTiDErilJh2Chw1r0+MYiYvumCDUSDlticmvJs7v0tA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.0.tgz", + "integrity": "sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-placeholder": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", + "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", + "license": "MIT" + }, + "node_modules/stylus": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.64.0.tgz", + "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@adobe/css-tools": "~4.3.3", + "debug": "^4.3.2", + "glob": "^10.4.5", + "sax": "~1.4.1", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/stylus-loader": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.3.tgz", + "integrity": "sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-glob": "^3.2.12", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/system-architecture": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", + "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/terser": { + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-checker-rspack-plugin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.1.tgz", + "integrity": "sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@rspack/lite-tapable": "^1.0.0", + "chokidar": "^3.5.3", + "memfs": "^4.14.0", + "minimatch": "^9.0.5", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0", + "typescript": ">=3.8.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + } + } + }, + "node_modules/ts-checker-rspack-plugin/node_modules/memfs": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/ts-checker-rspack-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-loader": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-morph": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-21.0.1.tgz", + "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.22.0", + "code-block-writer": "^12.0.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "license": "MIT", + "peer": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tuf-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", + "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==", + "dev": true, + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unctx": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.4.1.tgz", + "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17", + "unplugin": "^2.1.0" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unctx/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.15", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", + "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "exsolve": "^1.0.4", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "ufo": "^1.5.4" + } + }, + "node_modules/unenv/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.1.2.tgz", + "integrity": "sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "pkg-types": "^1.3.1", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "tinyglobby": "^0.2.11", + "unplugin": "^2.2.0", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport/node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unimport/node_modules/local-pkg/node_modules/confbox": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.1.tgz", + "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport/node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/unimport/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/unimport/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/unimport/node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "peer": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.2.tgz", + "integrity": "sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz", + "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/untun": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.5", + "consola": "^3.2.3", + "pathe": "^1.1.1" + }, + "bin": { + "untun": "bin/untun.mjs" + } + }, + "node_modules/untyped": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-2.0.0.tgz", + "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "defu": "^6.1.4", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/untyped/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/unwasm": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.9.tgz", + "integrity": "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "knitwork": "^1.0.0", + "magic-string": "^0.30.8", + "mlly": "^1.6.1", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "unplugin": "^1.10.0" + } + }, + "node_modules/unwasm/node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.15", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.15.tgz", + "integrity": "sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", + "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitefu": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.6.tgz", + "integrity": "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", + "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/web-worker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", + "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz", + "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC", + "peer": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlbuilder2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", + "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/dom": "1.15.10", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "js-yaml": "3.14.1" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/xmlbuilder2/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/xmlbuilder2/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/xmlbuilder2/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "4.1.0-beta.6", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.6.tgz", + "integrity": "sha512-y1aNsEeoLXnWb6pI9TvfNPIxySyo4Un3OGxKn7rsNj8+tgSquzXEWkzfA5y6gU0fvzmQgvx3JBn/p51qQ8Xg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/dumper": "^0.6.3", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/youch-core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.2.tgz", + "integrity": "sha512-fusrlIMLeRvTFYLUjJ9KzlGC3N+6MOPJ68HNj/yJv2nz7zq8t4HEviLms2gkdRPUS7F5rZ5n+pYx9r88m6IE1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.0", + "error-stack-parser-es": "^1.0.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/youch/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zone.js": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", + "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..d84ae5453 --- /dev/null +++ b/package.json @@ -0,0 +1,54 @@ +{ + "name": "analog-project", + "version": "0.0.0", + "type": "module", + "private": true, + "engines": { + "node": ">=18.13.0" + }, + "scripts": { + "dev": "ng serve", + "ng": "ng", + "start": "npm run dev", + "build": "ng build", + "watch": "ng build --watch", + "test": "ng test" + }, + "dependencies": { + "@analogjs/content": "^1.9.0", + "@analogjs/router": "^1.9.0", + "@angular/animations": "^18.0.0", + "@angular/common": "^18.0.0", + "@angular/compiler": "^18.0.0", + "@angular/core": "^18.0.0", + "@angular/forms": "^18.2.8", + "@angular/platform-browser": "^18.0.0", + "@angular/platform-browser-dynamic": "^18.2.8", + "@angular/platform-server": "^18.2.8", + "@angular/router": "^18.2.8", + "front-matter": "^4.0.2", + "marked": "^5.1.2", + "marked-gfm-heading-id": "^3.2.0", + "marked-highlight": "^2.2.0", + "marked-mangle": "^1.1.9", + "mermaid": "^10.9.2", + "prismjs": "^1.29.0", + "rxjs": "~7.5.6", + "tslib": "^2.8.0", + "zone.js": "^0.14.10" + }, + "devDependencies": { + "@analogjs/platform": "^1.9.0", + "@analogjs/vite-plugin-angular": "^1.9.0", + "@angular-devkit/build-angular": "^18.2.9", + "@angular/cli": "^18.2.9", + "@angular/compiler-cli": "^18.2.8", + "autoprefixer": "^10.4.14", + "jsdom": "^22.1.0", + "postcss": "^8.4.47", + "tailwindcss": "^3.4.14", + "typescript": "~5.4.2", + "vite": "^5.4.9", + "vitest": "^1.6.0" + } +} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 000000000..12a703d90 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Race_Element/race-element-icon-2.ico b/public/favicon.ico similarity index 100% rename from Race_Element/race-element-icon-2.ico rename to public/favicon.ico diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 000000000..f41b352bb --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,17 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RouterTestingModule, AppComponent], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 000000000..c05a51231 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,68 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { SocialsComponent } from "./components/socials/socials.component"; +import { RouteMeta } from '@analogjs/router'; + + +export const routeMeta: RouteMeta = { + meta: [ + { + property: 'og:title', + content: 'Race Element', + }, + { + property: 'og:description', + content: 'Solutions for Sim Racing', + }, + { + property: 'twitter:title', + content: 'Race Element', + }, + ], +}; + +@Component({ + selector: 'app-root', + standalone: true, + template: ` +
+ +
+ +
Race Element
+
+

Solutions for Simulators

+
+ +
+ +
+ + + +
+ +
+ + + +
+ GitHub Downloads (specific asset, all releases) +

© 2022 - {{ThisYear}} Reinier Klarenberg

+
+
+ `, + styles: [ + ` + `, + ], + imports: [RouterOutlet, SocialsComponent] +}) +export class AppComponent { + ThisYear: number = new Date().getFullYear(); +} diff --git a/src/app/app.config.server.ts b/src/app/app.config.server.ts new file mode 100644 index 000000000..8b5a665d1 --- /dev/null +++ b/src/app/app.config.server.ts @@ -0,0 +1,15 @@ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { + provideServerRendering, + ɵSERVER_CONTEXT as SERVER_CONTEXT, +} from '@angular/platform-server'; +import { appConfig } from './app.config'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(), + { provide: SERVER_CONTEXT, useValue: 'ssr-analog' }, + ], +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/src/app/app.config.ts b/src/app/app.config.ts new file mode 100644 index 000000000..ab2255f75 --- /dev/null +++ b/src/app/app.config.ts @@ -0,0 +1,16 @@ +import { provideHttpClient, withFetch } from '@angular/common/http'; +import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +import { provideClientHydration } from '@angular/platform-browser'; +import { provideFileRouter } from '@analogjs/router'; +import { provideContent, withMarkdownRenderer } from '@analogjs/content'; +import { withPrismHighlighter } from "@analogjs/content/prism-highlighter"; + +export const appConfig: ApplicationConfig = { + providers: [ + provideZoneChangeDetection({ eventCoalescing: true }), + provideFileRouter(), + provideHttpClient(withFetch()), + provideClientHydration(), + provideContent(withMarkdownRenderer(), withPrismHighlighter()), + ], +}; diff --git a/src/app/components/socials/socials.component.css b/src/app/components/socials/socials.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/components/socials/socials.component.html b/src/app/components/socials/socials.component.html new file mode 100644 index 000000000..1fd025538 --- /dev/null +++ b/src/app/components/socials/socials.component.html @@ -0,0 +1,12 @@ +
+ @for (item of SocialItems; track $index) { + +
+ {{item.Text}} +
+
+ } +
diff --git a/src/app/components/socials/socials.component.spec.ts b/src/app/components/socials/socials.component.spec.ts new file mode 100644 index 000000000..473c5cf7e --- /dev/null +++ b/src/app/components/socials/socials.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SocialsComponent } from './socials.component'; + +describe('SocialsComponent', () => { + let component: SocialsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SocialsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SocialsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/socials/socials.component.ts b/src/app/components/socials/socials.component.ts new file mode 100644 index 000000000..ca164e611 --- /dev/null +++ b/src/app/components/socials/socials.component.ts @@ -0,0 +1,27 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-socials', + standalone: true, + imports: [], + templateUrl: './socials.component.html', + styleUrl: './socials.component.css' +}) +export class SocialsComponent implements OnInit { + SocialItems: ISocialItem[] = []; + + ngOnInit(): void { + this.SocialItems = [ + { Text: "GitHub", Href: "https://github.com/RiddleTime/Race-Element" }, + { Text: "Discord", Href: "https://discord.gg/26AAEW5mUq" }, + { Text: "X", Href: "https://x.com/Race_Element" }, + { Text: "Donate", Href: "/guide/sponsor" }, + ]; + } + +} + +export interface ISocialItem { + Text: string; + Href: string; +} diff --git a/src/app/pages/analytics/index.page.ts b/src/app/pages/analytics/index.page.ts new file mode 100644 index 000000000..fe2918383 --- /dev/null +++ b/src/app/pages/analytics/index.page.ts @@ -0,0 +1,29 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Title } from '@angular/platform-browser'; + +@Component({ + standalone: true, + template: ` +
+

.

+
+ `, + imports: [] +}) +export default class AnalyticsComponent implements OnInit { + + constructor(private route: ActivatedRoute, private title: Title) { + + } + + ngOnInit(): void { + this.route.queryParams.subscribe((params: { [x: string]: any; }) => { + let version = params['version']; + if (version !== undefined) { + this.title.setTitle("Race Element Startup " + version) + } + }); + } + +} \ No newline at end of file diff --git a/src/app/pages/guide/[slug].page.ts b/src/app/pages/guide/[slug].page.ts new file mode 100644 index 000000000..fb099dd5d --- /dev/null +++ b/src/app/pages/guide/[slug].page.ts @@ -0,0 +1,48 @@ +import { Component,OnInit,ViewEncapsulation } from '@angular/core'; +import { injectContent, MarkdownComponent } from '@analogjs/content'; +import { AsyncPipe, CommonModule } from '@angular/common'; +import PostAttributes from '../../post-attributes'; +import { Meta } from '@angular/platform-browser'; + +@Component({ + selector: 'app-guides-post', + standalone: true, + imports: [AsyncPipe, MarkdownComponent, CommonModule], + template: ` + @if (post | async; as post) { +
+

+ @if(post.attributes.type !== undefined){ + Guides > + } + {{post.attributes.title}} +

+
+ +
+
+ } + `, + styles: [ + ` + `, + ], + encapsulation: ViewEncapsulation.None, +}) +export default class GuideSlugComponent implements OnInit { + readonly post = injectContent({ + param: 'slug', + subdirectory: 'guide', + }); + + constructor(private meta: Meta) {} + + ngOnInit(): void { + this.post.forEach(x => { + this.meta.updateTag({ name: `og:url`, content: `https://race.elementfuture.com/guide/${x.attributes.slug}` }) + this.meta.updateTag({ name: `og:title`, content: `Race Element - Guide | ${x.attributes.title}` }) + this.meta.updateTag({ name: `og:description`, content: `${x.attributes.description}` }) + this.meta.updateTag({ name: `twitter:title`, content: `Race Element - Guide | ${x.attributes.title}` }) + }); + } +} diff --git a/src/app/pages/guide/index.page.ts b/src/app/pages/guide/index.page.ts new file mode 100644 index 000000000..0b0fca751 --- /dev/null +++ b/src/app/pages/guide/index.page.ts @@ -0,0 +1,61 @@ +import { Component, OnInit } from '@angular/core'; +import { injectContentFiles } from '@analogjs/content'; +import PostAttributes from '../../post-attributes'; +import { RouterLink } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { RouteMeta } from '@analogjs/router'; + +export const routeMeta: RouteMeta = { + meta: [ + { + property: 'og:title', + content: 'Race Element - Guides', + }, + { + property: 'twitter:title', + content: 'Race Element - Guides', + }, + ], +}; + +@Component({ + selector: 'app-guides', + standalone: true, + imports: [RouterLink, CommonModule], + template: ` +
+

Guides

+
+ @for (post of posts;track post.attributes.slug) { + +
+
+

{{ post.attributes.title }}

+
+
+

{{ post.attributes.description }}

+
+
+
+ } +
+
+ `, + styles: [ + ` + + `, + ], +}) +export default class GuidesIndexComponent implements OnInit { + readonly posts = injectContentFiles((contentFile) => { + return contentFile.attributes.type === 'guide'; + }); + + ngOnInit(): void { + this.posts.sort((a, b) => { + return b.attributes.title < a.attributes.title ? 1 : b.attributes.title > a.attributes.title ? -1 : 0; + }); + } + +} diff --git a/src/app/pages/index.page.ts b/src/app/pages/index.page.ts new file mode 100644 index 000000000..fd0292680 --- /dev/null +++ b/src/app/pages/index.page.ts @@ -0,0 +1,6 @@ +import { RouteMeta } from '@analogjs/router'; + +export const routeMeta: RouteMeta = { + redirectTo: '/news', + pathMatch: 'full', +}; diff --git a/src/app/pages/news/[slug].page.ts b/src/app/pages/news/[slug].page.ts new file mode 100644 index 000000000..d9e18ca63 --- /dev/null +++ b/src/app/pages/news/[slug].page.ts @@ -0,0 +1,46 @@ +import { Component,OnInit,ViewEncapsulation } from '@angular/core'; +import { injectContent, MarkdownComponent } from '@analogjs/content'; +import { AsyncPipe, CommonModule } from '@angular/common'; +import PostAttributes from '../../post-attributes'; +import { Meta } from '@angular/platform-browser'; + +@Component({ + selector: 'app-news-post', + standalone: true, + imports: [AsyncPipe, MarkdownComponent, CommonModule], + template: ` + @if (post | async; as post) { +
+

+ News > {{post.attributes.title}} +

+
+

{{post.attributes.date !== undefined? (post.attributes.date | date:'longDate') : ''}}

+ +
+
+ } + `, + styles: [ + ` + `, + ], + encapsulation: ViewEncapsulation.None, +}) +export default class NewsSlugComponent implements OnInit{ + readonly post = injectContent({ + param: 'slug', + subdirectory: 'news', + }); + + constructor(private meta: Meta) {} + + ngOnInit(): void { + this.post.forEach(x => { + this.meta.updateTag({ name: `og:url`, content: `https://race.elementfuture.com/news/${x.attributes.slug}` }); + this.meta.updateTag({ name: `og:title`, content: `Race Element - News | ${x.attributes.title}` }); + this.meta.updateTag({ name: `og:description`, content: `${x.attributes.description}` }); + this.meta.updateTag({ name: `twitter:title`, content: `Race Element - News | ${x.attributes.title}` }); + }); + } +} diff --git a/src/app/pages/news/index.page.ts b/src/app/pages/news/index.page.ts new file mode 100644 index 000000000..bb7833cdb --- /dev/null +++ b/src/app/pages/news/index.page.ts @@ -0,0 +1,70 @@ +import { Component, OnInit } from '@angular/core'; +import { injectContentFiles } from '@analogjs/content'; +import PostAttributes from '../../post-attributes'; +import { RouterLink } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { RouteMeta } from '@analogjs/router'; + +export const routeMeta: RouteMeta = { + meta: [ + { + property: 'og:title', + content: 'Race Element - News', + }, + { + property: 'twitter:title', + content: 'Race Element - News', + }, + ], +}; + +@Component({ + selector: 'app-news', + standalone: true, + imports: [RouterLink, CommonModule], + template: ` + + `, + styles: [ + ` + + `, + ], +}) +export default class NewsIndexComponent implements OnInit { + + readonly posts = injectContentFiles((contentFile) => { + return contentFile.attributes.type === 'news'; + }); + + ngOnInit(): void { + this.posts.sort((a, b) => { + if (a.attributes.date === undefined || b.attributes.date === undefined) { + if (a.attributes.date !== undefined) { + return -1; + } + + return b.attributes.title < a.attributes.title ? 1 : b.attributes.title > a.attributes.title ? -1 : 0; + } + + return a.attributes.date < b.attributes.date ? 1 : -1 + }); + } +} diff --git a/src/app/pages/setup/index.page.ts b/src/app/pages/setup/index.page.ts new file mode 100644 index 000000000..f854294fb --- /dev/null +++ b/src/app/pages/setup/index.page.ts @@ -0,0 +1,46 @@ +import { RouteMeta } from '@analogjs/router'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +export const routeMeta: RouteMeta = { + meta: [ + { + property: 'og:title', + content: 'Race Element - SetupLink', + }, + { + property: 'twitter:title', + content: 'Race Element - SetupLink', + }, + ], +}; + +@Component({ + standalone: true, + template: ` +
+

Trying to Open Race Element's Setup Importer

+
+ `, + imports: [] +}) +export default class SetupLinkPage implements OnInit { + + // https://race.elementfuture.com/setup?.... + + setupLink: string = ''; + constructor(private route: ActivatedRoute) { + + } + + ngOnInit(): void { + this.route.queryParams.subscribe((params: { [x: string]: any; }) => { + let link = params['link']; + if (link !== undefined) { + this.setupLink = link; + console.log(this.setupLink); + window.location.assign('RaceElement://setup=' + this.setupLink); + } + }); + } +} diff --git a/src/app/post-attributes.ts b/src/app/post-attributes.ts new file mode 100644 index 000000000..1bb22cfc8 --- /dev/null +++ b/src/app/post-attributes.ts @@ -0,0 +1,7 @@ +export default interface PostAttributes { + type: string; + title: string; + slug: string; + description: string; + date: Date | undefined; +} diff --git a/src/content/guide/features.md b/src/content/guide/features.md new file mode 100644 index 000000000..e1bc4d1be --- /dev/null +++ b/src/content/guide/features.md @@ -0,0 +1,58 @@ +--- +title: Features +slug: features +description: General features +--- +## **[Open Download and Installation Guide](/guide/how-to-get-started)** +Main Menu of Race Element + +# Race Element +Race Element is a lightweight application for racing simulators which is designed to run with minimum system requirements. This application is completely free and open source(GPL-3). + +# Supported Racing Simulators +- Assetto Corsa Competizione +- Assetto Corsa +- Assetto Corsa EVO +- American Truck Simulator +- Automobilista 2 +- Euro Truck Simulator 2 +- iRacing +- RaceRoom + +# HUDs (40+) +HUDs(Head-up displays) are 2D graphics that can be used to provide you data whilst driving. There are a various amount of HUDs that each provides you useful information in a minimalistic manner whilst being highly configurable. +- Scalable +- Modular +- Custom Configuration +- Very Low performance hit as the app doesn't use your gpu to render the HUDs. +- Can be used for stream only +- Render up to 200 Hz + +# Data +The app represents data recorded during driving into so called Race Weekend Databases(RWDB files). These Race Weekends can be viewed in the Data tab of the application and provide you essential information such as lap- and sectortimes, fuel usage and the conditions of each lap. + +# Setups +- View setups +- Browse setups +- Compare setups +- Copy setups to the clipboard or to another track +- Import setups by drag and drop on-top of the app(even works straight from discord) +- Share Setups and Import with SetupLinks for Race Element, unique links where the Setup is the Link. + +# Liveries +The Liveries tab provides functionality to manage liveries, Race Element automatically scans the right folders and shows you all your custom liveries. +- Browse the Files and folders of a livery straight from the app +- Create the base for a Custom Livery on the fly, the days of manually setting up a custom livery are gone +- Drag and Drop to Import Livery Archives(.zip, .rar, .7z), either single liveries or livery packs +- Export Livery Archives as a Zip archive, either single liveries or livery packs +- Tag Liveries to Categorize them, create a friends tag + +# Streaming +- Setup Hider for OBS and Streamlabs. +- Display HUDs on stream with OBS and Streamlabs. +- Twitch Chat HUD. +- Twitch Chat bot delivering Game specific information. + +# Hardware +- Automatic steering lock for certain wheelbases( sets max steering lock based on chosen car). +- Adaptive trigger FFB for PS5 controller in combination with DSX. diff --git a/src/content/guide/guide-DSX.md b/src/content/guide/guide-DSX.md new file mode 100644 index 000000000..664c9a7a7 --- /dev/null +++ b/src/content/guide/guide-DSX.md @@ -0,0 +1,33 @@ +--- +title: "Using DSX for Dualsense Active Triggers" +slug: DSX +description: How to set up DSX and Race Element +type: guide +--- +# What are active triggers? +Active triggers is Force Feedback based on the physics of the car which is applied to the left and right trigger. It allows you to feel under and oversteer during acceleration and braking. + +# Supported Games +- Assetto Corsa +- Assetto Corsa Competizione +- Assetto Corsa EVO +- RaceRoom + +# DSX +1. Open steam +2. Go to your Library +3. Right click DSX and go to Properties (Don't have DSX yet? **[Get DSX on Steam](https://store.steampowered.com/app/1812620/DSX/)** ) +4. Go to Betas and select `dsx_v3.1_beta - v3.1 Beta` +5. Open DSX and at the left bottom click Settings +6. Open the Networking tab +7. Make sure the Firewall Rules are okay, if it's not then allow DSX to fix it +8. Enable `Incoming UDP` + +# Race Element +1. Open Race Element (Don't have Race Element yet? **[Race Element Download and Installation Guide](/guide/how-to-get-started)** ) +2. Make sure the game selection is set correctly +3. Open the HUD Tab +4. At the bottom of the Hud Tab, Click the Pitwall Section +5. Click DSX +6. You can alter behaviour for Braking and Acceleration +7. To activate it read **[The guide for using the HUD Tab](/guide/how-to-use-huds)** diff --git a/src/content/guide/guide-get-started.md b/src/content/guide/guide-get-started.md new file mode 100644 index 000000000..da0ac1b2f --- /dev/null +++ b/src/content/guide/guide-get-started.md @@ -0,0 +1,16 @@ +--- +title: "Get Started" +slug: how-to-get-started +description: Downloading and Installing Race Element +type: guide +--- + +# Download and Installation +1. **Download** the app. The link will lead you to the latest version at GitHub. +2. Place **RaceElement.exe** in any folder of My Documents. If the app is not located there you will encounter issues with the auto-updater. +3. Then simply run the app. Do **not** run it as admin, since this will prevent some features from working. + +# Guides +The app includes an about tab which contains a guide section, read this carefully since it includes instructions on how to use for example the HUDs. + +There are multiple guides posted on this web page which you can find [here](/guide/). diff --git a/src/content/guide/guide-huds-and-streaming.md b/src/content/guide/guide-huds-and-streaming.md new file mode 100644 index 000000000..f5f576c0c --- /dev/null +++ b/src/content/guide/guide-huds-and-streaming.md @@ -0,0 +1,19 @@ +--- +title: "HUDs and Streaming" +slug: huds-and-streaming +description: Setting up the HUDs with OBS or Streamlabs +type: guide +--- + +# Recording the Entire Desktop +If you want to share all your HUDs you can record the entire desktop since the HUDs themselves are not part of the game. + +# Recording a Single HUD + +1. *Race Element:* **Enable the 'Window' option for the HUD you want to show.** +2. *Race Element:* **Enable Always Visible (blue eye button in HUD Tab).** +3. *Stream Software:* **Add a new `Window capture` source in your stream software.** +4. *Stream Software:* **Set the Capture method to ```Windows Graphics Capture```** +5. *Stream Software:* **Select the HUD Window.** +6. *Stream Software:* **Set Window match priority to ```Window title must match```** +7. *(optional) Race Element:* **If you don't want to see the hud and only use it for your stream, disable the always on top option for that HUD.** diff --git a/src/content/guide/guide-multi-sim.md b/src/content/guide/guide-multi-sim.md new file mode 100644 index 000000000..1bc2ae38a --- /dev/null +++ b/src/content/guide/guide-multi-sim.md @@ -0,0 +1,38 @@ +--- +title: "Multi-Sim" +slug: multi-sim +description: Getting Race Element Ready for Multi-Sim +type: guide +--- +# Auto-switching +Race Element has an option in the main menu of the app that allows it to automatically switch itself to any supported running simulator. Without it you'll have to manually switch between games, you can do so by clicking the game selector in the left bottom of the app. + +# Prequisites +For some games you need are required to do some small steps so Race Element has access to all data it needs. + +## Assetto Corsa 1 +AC 1 needs the Crew Chief plugin installed. It will provide more telemetry on opponents cars than the telemetry that comes with AC1 out of the box. Once Crew Chief installs the plugin, it doesn't need to run while playing AC and using Race Element HUDs. The installation steps are: + +1. Install Crew Chief from https://thecrewchief.org/forumdisplay.php?28-Download-and-Links +2. Start Crew Chief. Select "Assetto Corsa" as "Game" and use the "Start Crew Chief Button". It should provide a dialog saying it will install the Crew Chief plugin +3. Start AC1. Select the "Crew Chief" app on the right border where all the apps are listed. At this point Crew Chief does not have to be running anymore. + +## American Truck Simulator & Euro Truck Simulator 2 +Both simulators require a plugin to be installed before any data can be read from the game. +1. For both simulators you will need to "Install" a plugin: *scs-telemetry.dll* +2. Download the latest release and Follow the installation instructions here: **https://github.com/RenCloud/scs-sdk-plugin?tab=readme-ov-file#installation** + +## Automobilista 2 +1. Go to Options +2. Go to System Options +3. Enable Telemetry + +## Forza Horizon 5 +1. Go to Options +2. Go to HUD AND GAMEPLAY +3. Set Data Out to `On` +4. Set Data Out IP Address to `127.0.0.1` +5. Set Data Out Port to `5300` +6. Restart Forza Horizon 5. +7. Restart Race Element. +8. If Windows asks permission for network access allow it else race element won't be able to receive data from Forza Horizon 5. diff --git a/src/content/guide/guide-setup-hider.md b/src/content/guide/guide-setup-hider.md new file mode 100644 index 000000000..84624924c --- /dev/null +++ b/src/content/guide/guide-setup-hider.md @@ -0,0 +1,26 @@ +--- +title: "Setup Hider for Streaming" +slug: setup-hider +description: Setting up the setup hider with OBS or Streamlabs +type: guide +--- + +# How does it work? +Assetto Corsa Competizione has data for developers that allows us to see when the Setup Screen is open. Race Element uses this with the integration of streamlabs or OBS. It sends a signal to the configured streaming software to make a Source item visible or to hide it based on the data from Assetto Corsa Competizione. + +# OBS +Make sure you are running OBS version 28 or higher. +1. *OBS*: **Add Any type of Source to your active Scene, name it `SetupHider`. This can be text, image, video, a website, basically anything even a Scene Source.** +2. *OBS*: **At the top menu: Click Tools and Open the WebSocket Server Settings.** +3. *OBS*: **In the WebSocket Server Settings window, Make sure `Enable WebSocket Server` is checked.** +4. *OBS*: **In the WebSocket Server Settings window, Click `Show Connect Info`** +5. *Race Element:* **Open the Main Settings Tab on the left -> Open the Streaming Tab.** +6. *Race Element:* **Set the Software to `OBS`** +7. *OBS/Race Element*: **Copy the Server IP, Server Port and Server Password from OBS and paste them in Race Element's OBS Settings.** +8. *Race Element:*: **Click Save and then at the bottom Enable the SetupHider.** + +# StreamLabs +1. *StreamLabs*: **Add Any type of Source to your active Scene, name it `SetupHider`. This can be text, image, video, a website, basically anything even a Scene Source.** +2. *Race Element:* **Open the Main Settings Tab on the left -> Open the Streaming Tab.** +3. *Race Element:* **Set the Software to `StreamLabs`.** +4. *Race Element:* **Click Save and then at the bottom Enable the SetupHider.** diff --git a/_posts/2023-01-12-start-minimized.md b/src/content/guide/guide-starting-race-element-minimized.md similarity index 62% rename from _posts/2023-01-12-start-minimized.md rename to src/content/guide/guide-starting-race-element-minimized.md index de25fc8a6..7a4ceffce 100644 --- a/_posts/2023-01-12-start-minimized.md +++ b/src/content/guide/guide-starting-race-element-minimized.md @@ -1,15 +1,13 @@ --- -layout: post -title: Starting the app minimized +title: "Starting Race Element Minimized" +slug: start-the-app-minimized description: How to start the app in minimized mode -tags: guide +type: guide --- +# Startup Parameter +Race Element has got a command line parameter that allows you to start it minimized: `/StartMinimized` -## Start the app minimized - -Race Element has got a command line paramater that allows you to start it minimized: `/StartMinimized` - -### Starting the app and ACC using one batch file. +# Starting the app and ACC using one batch file. You could make a batch file that for example starts race element in minimized mode and launches Assetto Corsa Competizione through steam. ``` START "Race Element" "PATH_TO_FOLDER_OF_RACE_ELEMENT\RaceElement.exe" /StartMinimized diff --git a/src/content/guide/guide-using-hud-tab.md b/src/content/guide/guide-using-hud-tab.md new file mode 100644 index 000000000..a3853b9a8 --- /dev/null +++ b/src/content/guide/guide-using-hud-tab.md @@ -0,0 +1,36 @@ +--- +title: "Using the HUD Tab" +slug: how-to-use-huds +description: Custom HUDs for Sim Racing +type: guide +--- +# HUDs +The HUD Tab contains HUDs(Heads up displays)/Overlays. HUDs are 2D graphics that overlay the game. Every HUD can be moved around and can be freely customized. + +# Activation +Activated HUDs will show a green marker in the left side HUD list. +You can activate a HUD by: +- Double clicking them in the left side HUD List. +- Clicking the Title of the HUD in the right side panel. +- Right clicking whilst in the right side panel whilst a HUD is shown. + +# Visibility +By default the activated HUDs will only become visible once you are driving and the engine of the car is running. +Now if you want to have them showing at any time, you can enable the Always Visible mode, this is a Eye toggle-button on the bottom-left of the HUD tab. +- Don't see any HUDs? make sure you have activated the ones you want to use. +- When the game is in Fullscreen mode, tap F11 twice. This will allow other windows to be on top whilst in full screen mode. + +# Movement +Activated HUDs can be moved with the mouse by enabling the \'movement mode\'. +You can toggle the movement mode by: +- Keyboard: Control + Home +- Click the movement mode button in the bottom-left. +- Clicking your scroll wheel(middle mouse button) in the right side panel. + +# Customization +HUDs can be customized using the options in the right side panel. HUDs can only be customized when they are **not activated** and when the movement mode is disabled. You will be able to see a the preview image based on the hud configuration. +By default every HUD contains an option to set the Scale, the Opacity, Enabling \'Window mode\' and choosing whether the HUDs should be \'Always On Top\'. +Aside from these default options there are HUD specific options like changes in shape, color or information. + +# Adjusting a HUD + diff --git a/_posts/2023-01-15-how-to-use-liveries.md b/src/content/guide/guide-using-liveries-tab.md similarity index 73% rename from _posts/2023-01-15-how-to-use-liveries.md rename to src/content/guide/guide-using-liveries-tab.md index 3defe798d..360f21006 100644 --- a/_posts/2023-01-15-how-to-use-liveries.md +++ b/src/content/guide/guide-using-liveries-tab.md @@ -1,34 +1,33 @@ --- -layout: post -title: How to use the liveries tab -description: ACC Liveries and Race Element. -tags: guide +title: "Using the Liveries Tab" +slug: how-to-use-liveries +description: ACC Liveries and Race Element +type: guide --- +The Liveries tab in Race Element provides functionality to view liveries for Assetto Corsa Competizione. These liveries consist of a json file and a folder where the actual decals and sponsors are located. -The Liveries tab provides functionality to view liveries for Assetto Corsa Competizione. These liveries consist of a json file and a folder where the actual decals and sponsors are located. - -## Browsing liveries +# Browsing liveries By right clicking a livery in the list, options appear to open the json file of the livery and the custom skin directory of that livery. This should give you easy access to the correct folder when for example creating a livery and you want to open up the files inside. You can also Delete the livery files, this is permanent so be warned! If you have manually imported a livery you can click the refresh button to rescan the livery folders. -## Importing liveries +# Importing liveries You can either Drag and Drop ".rar, .7z and .zip" on top of Race Element or click the Import Liveries button and select them by hand. The importer will scan the archive for the livery json files and according to these files will look for the custom skins folders. Once a list appears of succesfully imported liveries you can set a tag for liveries by highlighting them. -## Exporting liveries +# Exporting liveries A single livery can be exported by right clicking the livery and clicking "Save Skin as zip archive". Skin packs can be created by right clicking single liveries/Teams/Cars and clicking Add to Skin Pack. After you have chosen the liveries you can decide to not include the dds files as these will increase the size of your skin pack. -## Tagging Liveries -Liveries once imported can be tagged with a so called Tag. Tagged liveries can also be exported by right clicking them. +# Tagging Liveries +Liveries once imported can be tagged with a so called Tag. Livery Tags can be exported by right clicking in them in the list. Before you can tag a livery you will need to create a new Tag which can be done in the Tags tab. -## Generating DDS(DirectDraw Surface) files +# Generating DDS(DirectDraw Surface) files The Liveries tool allows you to generate the DDS files which the game uses in the showroom and in the races. There is a button to generate them in bulk or when the selected skin contains for example a sponsors.png, but no sponsors_1.dds, a button will appear in the display panel to generate the files. This might take a while and takes use of your GPU. diff --git a/src/content/guide/guide-using-setups-tab.md b/src/content/guide/guide-using-setups-tab.md new file mode 100644 index 000000000..d627473e8 --- /dev/null +++ b/src/content/guide/guide-using-setups-tab.md @@ -0,0 +1,36 @@ +--- +title: "Using the Setups Tab" +slug: how-to-use-setups +description: Using ACC Setups with Race Element +type: guide +--- +# Setups +The Setups Tab allows you to view, compare, import and share Setups for Assetto Corsa Competizione. +These Setups are .json files which the app is able to convert into real data. + +# Browsing +The Setup Browser is divided by Tracks then Car models and then the actual setups. +- Refresh the setups by right clicking the Browse tab at the top. +- Right Click Tracks and Car models to open the directory with windows explorer. + +# Viewing and Comparing Setups +The Setup browser can display the setups just like they are displayed within the simulator. +- Click a setup and it will become visible on the right side of the browser. +## Comparing Setups +Race Element allows you to compare 2 setups. +- Right Click a setup to add it to Compare 1 or Compare 2. +- Visit the Compare Tab at the right top to see the difference between the 2 setups that you have selected. + +# Importing Setups with the Setup Importer +The app has got the ability to import a Setup and place it in the correct folder. There are multiple types of methods to open a setup in the Setup Importer. +- Drag and Drop a .json which is a Setup on-top of the app. +- If someone sends you a .json setup in discord, you can drag the download button and drop it on-top of the app. +- Click a SetupLink, the setup importer will automatically open for you. + +# Sharing Setups +When Right Clicking a Setup in the browser tree, you have multiple sharing options. +- Copy to clipboard: Copies the .json file to the clipboard. +## SetupLink +A SetupLink is a shareable link which contains the entire Setup, this means you can share a setup on the web without actually ever uploading it to any server. +- Copy as SetupLink: Creates a SetupLink and copies that to the clipboard. +- Copy As SetupLink for Discord: Does the same as a normal SetupLink but packages it in Markdown so it's nice and readable for discord sharing. diff --git a/src/content/guide/guide-video-guides.md b/src/content/guide/guide-video-guides.md new file mode 100644 index 000000000..9044dcb88 --- /dev/null +++ b/src/content/guide/guide-video-guides.md @@ -0,0 +1,17 @@ +--- +title: "Video Guides" +slug: video-guides +description: A collection of video-guides made by other people in various languages +type: guide +--- +# Video Guides +As my spare time is mostly involving the development of the app, I rely on the community to create video guides in for example other languages than English. If you have made a guide, please let me know so I can add it. + +# English +## RACE ELEMENT HUD FULL SETUP GUIDE +![IMAGE ALT TEXT](http://img.youtube.com/vi/hN0RnRmo4ZE/0.jpg) + +# Portuguese / Português +## RACE ELEMENT | ESSE APP VAI SER O SEU MELHOR AMIGO NO ACC! ![IMAGE ALT TEXT](http://img.youtube.com/vi/D8XTKFrADiM/0.jpg) +## COMO utilizar o Race Elements | Assetto Corsa Competizione ![IMAGE ALT TEXT](http://img.youtube.com/vi/dP3ELQzdgG0/0.jpg) +## Race Element: O Melhor APP de HUD para Sim Racing! (Setup Completo) ![IMAGE ALT TEXT](http://img.youtube.com/vi/jlLtwicXDYE/0.jpg) diff --git a/src/content/guide/sponsor.md b/src/content/guide/sponsor.md new file mode 100644 index 000000000..41fef53fd --- /dev/null +++ b/src/content/guide/sponsor.md @@ -0,0 +1,20 @@ +--- +title: Sponsor +slug: sponsor +description: Support Developement +--- + +# Sponsor +- **Donate with PayPal** +- **Become a Patreon** + +# Costs +Sponsoring Race Element, an open source project on GitHub, offers multiple benefits that extend beyond just supporting the development of the software. Firstly, Race Element is dedicated to providing free access to its application, which means that any financial support directly contributes to enhancing and maintaining the project without any paywalls or exclusive features. This approach ensures that the tool remains accessible to a broad audience, thereby democratizing access to advanced features in the racing simulation community. By sponsoring, you help cover costs such as domain hosting, purchasing new simulators, and maintaining subscriptions necessary for integrating or enhancing features within the app, which are crucial for continuous improvement and innovation. + +# Income and Education +Moreover, sponsoring Race Element through platforms like Patreon or PayPal donations directly supports the developer's ability to focus on project development rather than balancing it with other income sources. This can lead to faster updates, bug fixes, and the introduction of new, exciting features, which benefits the entire user base. +The open-source nature of Race Element means that contributions from sponsors help not just the project but foster a community where developers and users collaborate. +This collaborative environment can lead to educational opportunities, where users can learn from the development process or even contribute back to the project, enhancing their skills in software development or racing simulation. + +# Open-Source +By supporting Race Element, sponsors are investing in the longevity and health of the open-source ecosystem. Open-source projects like Race Element rely on community support to thrive, and sponsorship helps ensure that such projects can continue to evolve without becoming commercialized or abandoned. This support can set a precedent for other open-source initiatives, encouraging more developers to create and maintain free, high-quality software. Additionally, for companies or individuals who benefit from the software, sponsorship is a way to give back to the community, ensuring that the tools they depend on continue to receive the necessary attention and resources. This not only aids in maintaining the software but also drives innovation in the racing simulation sector, potentially leading to breakthroughs that could benefit the wider community. diff --git a/src/content/guide/twitch-chat-bot-commands.md b/src/content/guide/twitch-chat-bot-commands.md new file mode 100644 index 000000000..8c2b6a148 --- /dev/null +++ b/src/content/guide/twitch-chat-bot-commands.md @@ -0,0 +1,23 @@ +--- +title: Twitch Chat Bot Commands +slug: twitch-chat-bot-commands +description: A list of all available chat bot commands and how to use them +type: guide +--- +**Every Race Element Chat Command starts with: `+`** + +# Available Commands +- **`+app`** *Links to the Race Element website and discord.* +- **`+ahead` `+behind`** *Race info for the car ahead or behind, based on position, not relative.* +- **`+p`** *Race info for the car at the requested global position. Use like `+p 1`.* +- **`+#`** *Race info for the car with the requested entry number. Use like `+# 992`.* +- **`+diff`** *Shows the difference in lap times and sectors for the currently viewed car vs the requested car. Use like `+diff ahead`, `+diff behind`, `+diff p 1`, `+diff # 1`* +- **`+temps`** *Current ambient and track temperature, with more detail when the car is being driven.* +- **`+damage`** *Total damage in repair time, this data is only available when the driver is in the car.* +- **`+purple`** *Best valid lap in the lobby for the current session.* +- **`+potential`** *Potential best lap based on the fastest sectors from valid laps. Requires valid laps.* +- **`+session`** *Current Session type.* +- **`+track`** *Current track.* +- **`+car`** *Current car.* +- **`+angle`** *Steering angle(lock-to-lock) for the current car.* +- **`+fuel`** *Calculates fuel, parameters are `[minutes] [liters/lap] [laptime]`, use like `+fuel 60 3 2:10`.* diff --git a/src/content/news/Assette-Corsa-EVO-and-Race-Element.md b/src/content/news/Assette-Corsa-EVO-and-Race-Element.md new file mode 100644 index 000000000..bf11765a8 --- /dev/null +++ b/src/content/news/Assette-Corsa-EVO-and-Race-Element.md @@ -0,0 +1,15 @@ +--- +title: Assetto Corsa EVO and Race Element +slug: Assetto-Corsa-EVO-Race-Element-Future +description: Why was Race Element prepared for a future simulator in the Assetto Corsa Series? +date: 2025-01-15 +type: news +--- +# Assetto Corsa EVO +As soon as there is a 3rd party API available, we will immediately act and try to support this as soon as possible so you can use your minimalistic and highly customizable HUDs with your new favorite Racing Simulator! + +# Race Element already supports 7 driving simulators! +Over the past months contributors on github have been working hard on making it possible to write code only once for multiple simulators. This has translated over to for example the DSX support which now provides active triggers for both Assetto Corsa and RaceRoom using the DualSense controller. Race Element is ready to provide a good basic HUD integration system that is ready for the new Assetto Corsa EVO! + +# Low Performance Impact +The Custom Rendering Pipeline of Race Element allows it to be highly customizable whilst certainly effecient considering the HUDs refresh up to 240 Hz! This will translate over to Assetto Corsa EVO as it will support Ray Tracing and multiple other advances over the older series. The less random loads on your Graphics Card the better, Race Element prevents this by not using the graphics card for rendering. diff --git a/src/content/news/assetto-corsa-evo-early-access-supported.md b/src/content/news/assetto-corsa-evo-early-access-supported.md new file mode 100644 index 000000000..61b5a6ce0 --- /dev/null +++ b/src/content/news/assetto-corsa-evo-early-access-supported.md @@ -0,0 +1,12 @@ +--- +title: Assetto Corsa EVO Early Access is now supported by Race Element! +slug: Assetto-Corsa-EVO-Race-Element-supported +description: Custom HUDs & Adaptive Triggers DualSense Controller +date: 2025-01-20 +type: news +--- +# Optimized HUDs and High Refreshrates. +Initially there is support for several highly optimized HUDs, they only utilize your cpu to render so your graphics card isn't being interrupted when already being heavily loaded by Assetto Corsa EVO. The Shift Bar can render up to 240Hz, so you will never miss a shift! + +# DualSense Adaptive(Active) Triggers +Race Element is able to use the game's 3rd party telemetry data to provide active triggers for the DualSense Controller. This highly improves the playability and enjoyment when playing Assetto Corsa EVO. You will need DSX on steam for this to work, but it is worth it. diff --git a/src/content/news/news-dualsense-active-triggers.md b/src/content/news/news-dualsense-active-triggers.md new file mode 100644 index 000000000..6149d09d1 --- /dev/null +++ b/src/content/news/news-dualsense-active-triggers.md @@ -0,0 +1,14 @@ +--- +title: Active Triggers +slug: 2023-10-19-dualsense-active-triggers +description: Race Element now provides adaptive trigger feedback +date: 2023-10-19 +type: news +--- +# DualSenseX +A couple of a days ago I came accross an app called DualSenseX(DSX in short). +This app allowed me to send commands to the Playstation 5 controller so the triggers would actually react to braking force, traction control and abs. + +The functionality to send these commands has been added to Race Element 0.2.4.0 + +Check out the guide in the discord how to get started and bring the experience with a Dual Sense to another level: [https://discord.com/channels/962649775478558811/1164558784119705630](https://discord.com/channels/962649775478558811/1164558784119705630) diff --git a/src/content/news/news-highspeed-rendering.md b/src/content/news/news-highspeed-rendering.md new file mode 100644 index 000000000..e752ea866 --- /dev/null +++ b/src/content/news/news-highspeed-rendering.md @@ -0,0 +1,18 @@ +--- +title: Highspeed Rendering +slug: highspeed-rendering +description: Rendering Overlays at 200 Hz with minimal CPU usage +date: 2024-11-09 +type: news +--- +# Intro +Simulators are able to provide data at rates higher than 60 Hz, monitors these days are able to render beyond 100 Hz, so why are HUDs in most cases not rendering at high speeds? +It's obvious that higher refresh rates cost more computing power but thanks to clever engineering Race Element can render quick with minimal overhead. + +# Efficiency and Feedback +The first 200 Hz HUD in Race Element is the newly added Shift Bar HUD. It will allow you to spot the right moment instead of losing laptime whilst waiting for a 30-60 hz shift bar to blink. +Another HUD which demonstrates the highspeed rendering is the 3D HUD in the pitwall, which can ultimately push the limits of the current render pipeline at 500Hz and beyond. + +# What is next? +After experiencing the shift from 60 Hz to 200 hz it is only a matter of time for other HUDs to gain quicker refresh rates. +The new Shift Bar HUD serves as an example that Race Element's renderer is not only quick but that it's capable of doing so with minimal cpu usage. diff --git a/src/content/news/news-new-website.md b/src/content/news/news-new-website.md new file mode 100644 index 000000000..c856ff561 --- /dev/null +++ b/src/content/news/news-new-website.md @@ -0,0 +1,19 @@ +--- +title: New website +slug: 2024-06-12-new-website-2024 +description: From Ruby to Angular +date: 2024-06-12 +type: news +--- +# Old website with Ruby impossible to update +A week ago I noticed the build was failing for the ruby website. It was a really nifty system where I only had to write articles in markdown format. Since the SetupLinks were added I wanted to add a few additional changes but after a bit of research I noticed that the system in use was end of life. +Where I already manually started editing the build result, it would defeat the purpose of writing articles in markdown. It was a chapter that came to and end but sometimes these things happen and we need to move on. + +# New website now uses Angular +As I was familiar with Angular and even AngularJS, the choice was fairly easy. The only issue was that I didn't want to rewrite all articles and guides from scratch. So the choice for static site generation was mandatory. +The website is now generated with [Analog](https://analogjs.org/) which allows me to continue writing articles with markdown whilst splitting up the news and guide section. Additionally the website is now entirely designed in-house. So we have full control! + +# Changes +SetupLinks have been changed, instead of `https://race.elementfuture.com?setup=` the base has now become `https://race.elementfuture.com/setup?link=` +The app will be updated to handle this change. Unfortunately you will have to do this change manually for SetupLinks that you have already created or have received. +The actual data system has not changed so by just adjusting the first part of the link your SetupLink will open Race Element again. diff --git a/src/content/news/news-nexusmods-listing.md b/src/content/news/news-nexusmods-listing.md new file mode 100644 index 000000000..d07e7c85f --- /dev/null +++ b/src/content/news/news-nexusmods-listing.md @@ -0,0 +1,12 @@ +--- +title: Race Element is now listed at NexusMods +slug: nexus-mods-listing +description: The first mod for Assetto Corsa Competizione at NexusMods! +date: 2024-06-19 +type: news +--- +# What is NexusMods +NexusMods is a website that hosts and serves mods for various games, it has over 50 million registered users as of June 2024. It launched back in 2007 but has it roots back to 2001 as a Morrowind fansite. Race Element is the first Assetto Corsa Competizione Mod at NexusMods! + +# Visit Race Element at NexusMods +**https://www.nexusmods.com/assettocorsacompetizione/mods/1** diff --git a/src/content/news/news-posts-on-other-websites.md b/src/content/news/news-posts-on-other-websites.md new file mode 100644 index 000000000..ad897e222 --- /dev/null +++ b/src/content/news/news-posts-on-other-websites.md @@ -0,0 +1,16 @@ +--- +title: Official Posts on Other Websites +slug: 2022-04-25-official-posts +description: The only places where Race Element is officially posted +date: 2022-04-25 +type: news +--- +# Official Listings +To prevent confusion what is not and what is, here is a list of websites with official posts: +- Official Assetto Corsa Forums: **https://www.assettocorsa.net/forum/index.php?threads/71454** +- Official RaceRoom Forums: **https://forum.kw-studios.com/index.php?threads/race-element-solutions-for-simracing.19690/** +- Overtake.GG: **https://www.overtake.gg/downloads/race-element.50578/** +- Steam Guide: **https://steamcommunity.com/sharedfiles/filedetails/?id=2811480721** +### NexusMods (listed for different games as the app suports both): +- ACC: **https://www.nexusmods.com/assettocorsacompetizione/mods/1** +- AC EVO: **https://www.nexusmods.com/assettocorsaevo/mods/2** diff --git a/src/content/news/news-setuplink.md b/src/content/news/news-setuplink.md new file mode 100644 index 000000000..42ce9dc4d --- /dev/null +++ b/src/content/news/news-setuplink.md @@ -0,0 +1,15 @@ +--- +title: SetupLinks Are Added! +slug: 2024-06-06-setup-links +description: You can now share your setups as a SetupLink, these open up race element's setup importer automatically +date: 2024-06-06 +type: news +--- +# SetupLinks +If you are running Race Element 1.1 or higher you will be able to to create SetupLinks in the Setup Tab. +When clicked, these SetupLinks open up the setup importer for race element. +You are able to create them for discord as well, basically for markdown. + +For discord such a link would look like this: +[SetupLink: s1 +Bentley Continental GT3 2018 - nurburgring](https://race.elementfuture.com/setup?link=UEsDBBQAAAAIAE8QyFjnVZwE9QIAAEUHAAAHAAAAczEuanNvbo1UW0%2FbMBR%2BZtL%2BQ5XnrPIttsPbWoT2UDbERXtACLmJ10bkNteBVYj%2FvmOnDU4p05APVT5%2FPvdzXj5%2FOokyZb6rSkenk2ipa1vq7UPW1Lao4UOVDytLHwjCMoodeak2RXatbddGp%2FD9AnIS2a3RG%2F%2FdAz0yb6q26eocFKP4Db4E7qYzzt7dJEHxJOFx%2F8sm94726smRKotVXYEPI8WZqpba%2BLfwBA6BM7nf6296tRQunCSJk%2BF6Y5Utsvmbii90KonAiRA0kYQlEvgeowIhzjkjgmNCASRTylGKUsBpSrngsgcTSdMkEZwJgRIkQ09%2BdHYBSVQ7b6cIISk44VIQjGXCCYPA9zCnJMEp2KSUCgG6%2FQVnUsoUc2ePM0Tk6IIRnGIsGOhkg%2BFMbaw2i3MwCo6H2NUIAwQgyEfj0CDvutSZNU1dZAclnWNgin18cxLUVS03wZ2e316oNrj%2B1enyovgTNgJYqbQ124Vq3VMUOLCxRlm92o6sOxXA43sF9WVhr23TPw66C1ozNAxx2JlRj%2FpS5Uf60UB1%2FnHdOht7ZyZ3Htw5tHPppvmaBy%2FGsxCQP5qI%2Fx6Kk316xoGSAfsoVDwwPggW9%2Fev%2Fuc%2BqNgltJEvI52i1P8h5tqUS%2BarBf%2B8S5HKn1Sd6fxwLVQ6WyvoI1XOVOkYo4qqq9m58xkMsHiArvp52cUVPa%2B1LqFL%2B8SksTsYOxkaftlVresEx7pt%2BwTG7jA4R1lndbA%2FsJd3vJ9FnTfPgbaDVbJ0ibxpzO%2FOuUZQCM8K5dqS0aCpc1W12ownytsqd1Yw6PcinYz8OYfx7TkQkhfPHThGL10tB1XErUUnzMkhbdBGQIsXTx%2FvXm2aYzUzRa6%2F6WK13vkTT%2Fg7j02TL3S9sus%2BeVMGe5VIDLuKwYolsK%2BPYV%2FklEqMEiYFbF8mYQ8eBd92eVsW1vo9Hk4z1G3lmnpUkLMu6x2GhNBRoLkpnmANqaIexdkaXTbKTUcybnWgZo%2Bzpr3Ztq7uFCbh9S9QSwECFAAUAAAACABPEMhY51WcBPUCAABFBwAABwAAAAAAAAAAAAAAAIEAAAAAczEuanNvblBLBQYAAAAAAQABADUAAAAaAwAAAAA%3D) diff --git a/src/content/news/news-signpath.md b/src/content/news/news-signpath.md new file mode 100644 index 000000000..39a867f2d --- /dev/null +++ b/src/content/news/news-signpath.md @@ -0,0 +1,23 @@ +--- +title: Digitally Signed App +slug: 2023-04-29-signpath +description: Race Element is now released with a certificate with SignPath +date: 2023-04-29 +type: news +--- + +# Certificates and trusted sources +Some time ago I have gotten a bit frustrated that the app was not signed with a certificate. At least a certificate that browsers and other security software use to check for legitimate software. +Browsers would keep warning users that the app was probably not secure. +With the app being build and the source being verified each build will be trusted by at least browser. + +# SignPath Foundation +SignPath Foundation provides reliable code signing for Open Source projects. +No more installation warnings. Certificates provided by SignPath Foundation are recognized by operating systems, browsers and Java. +No more untrusted binaries. Rest assured that signed code is compiled straight from the source code repository. If you trust the source, you can trust the binary. + + + +Free code signing provided by [SignPath.io](https://signpath.io?utm_source=foundation&utm_medium=github&utm_campaign=race-element), certificate by [SignPath Foundation](https://signpath.org?utm_source=foundation&utm_medium=github&utm_campaign=race-element) + + diff --git a/src/content/news/pushing-too-hard.md b/src/content/news/pushing-too-hard.md new file mode 100644 index 000000000..2b63a5c55 --- /dev/null +++ b/src/content/news/pushing-too-hard.md @@ -0,0 +1,15 @@ +--- +title: Pushing Too Hard and How To Fix It +slug: overdriving-the-car-simracing-arnout +description: An article by SimRacing Arnout +date: 2024-09-09 +type: news +--- +# Pushing Too Hard - By SimRacing Arnout +Arnout has written an article at his substack which helps you to understand one of the most important parts of physics in simracing, wheelslip. +The article shows how to utilize Race Element to visually see over and understeer. +- **https://arnouthoekstra.substack.com/p/pushing-too-hard** + +# Who is Arnout? +Arnout also known as SimRacing Arnout is a dutch simracing driver willing to provide his knowledge to everyone willing to learn, at Race Element we share that vision. +- **SimRacing Arnout at Youtube** diff --git a/src/content/news/version-2-released.md b/src/content/news/version-2-released.md new file mode 100644 index 000000000..1236ba64f --- /dev/null +++ b/src/content/news/version-2-released.md @@ -0,0 +1,17 @@ +--- +title: Race Element 2.0 +slug: race-element-2-released +description: Multi-Sim support is added! +date: 2024-09-24 +type: news +--- +# Race Element 2.0 +With version 2 the app has become a multi-sim app, it now supports: Assetto Corsa, Assetto Corsa Competizione, iRacing and RaceRoom. +The original ACC support remains with the 3 new simulators gaining support for the HUD system. + +# Dynamic HUD Tab +Not every HUD is supported for every simulator as not every simulator provides the same data about the cars and other drivers, the HUD tab now reloads itself and only shows those HUDs that are compatible with the selected simulator. + +# What's to come? +There is more common data to be mapped for the existing simulators to provide a better experience for HUDs like standings and relatives. +Additionally other simulators like rFactor 2 and perhaps automobilista will be added. diff --git a/Race_Element/Fonts/ConthraxSb.ttf b/src/fonts/ConthraxSb.ttf similarity index 100% rename from Race_Element/Fonts/ConthraxSb.ttf rename to src/fonts/ConthraxSb.ttf diff --git a/src/main.server.ts b/src/main.server.ts new file mode 100644 index 000000000..3bac771c1 --- /dev/null +++ b/src/main.server.ts @@ -0,0 +1,24 @@ +import 'zone.js/node'; +import { enableProdMode } from '@angular/core'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { renderApplication } from '@angular/platform-server'; + +import { config } from './app/app.config.server'; +import { AppComponent } from './app/app.component'; + +if (import.meta.env.PROD) { + enableProdMode(); +} + +export function bootstrap() { + return bootstrapApplication(AppComponent, config); +} + +export default async function render(url: string, document: string) { + const html = await renderApplication(bootstrap, { + document, + url, + }); + + return html; +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 000000000..e77461139 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,7 @@ +import 'zone.js'; +import { bootstrapApplication } from '@angular/platform-browser'; + +import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; + +bootstrapApplication(AppComponent, appConfig); diff --git a/src/server/routes/v1/hello.ts b/src/server/routes/v1/hello.ts new file mode 100644 index 000000000..594c5d716 --- /dev/null +++ b/src/server/routes/v1/hello.ts @@ -0,0 +1,3 @@ +import { defineEventHandler } from 'h3'; + +export default defineEventHandler(() => ({ message: 'Hello World' })); diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 000000000..d17621368 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,159 @@ +/* Tailwind directives */ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* You can add global styles to this file, and also import other style files */ +:root { + font-family: Roboto, Inter, Avenir, Helvetica, Arial, sans-serif; + /* font-size: 16px; */ + /* line-height: 24px; */ + /* font-weight: 400; */ + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #141414; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + + +} + +@font-face { + font-family: 'Conthrax'; + font-style: normal; + src: url(./fonts/ConthraxSb.ttf); +} + +.analog-markdown { + line-height: 1.4rem; + @apply md:text-base; + @apply select-none; + + >h1 { + @apply md:text-xl; + font-weight: 700; + margin-bottom: -0.8em; + @apply rounded-tl-xl; + @apply border-l-2; + @apply pl-2; + @apply pt-2; + @apply mt-2; + @apply border-red-900; + } + + >h2 { + font-size: 14px !important; + @apply md:text-lg !important; + font-size: large; + font-weight: 600; + margin-bottom: -1em; + @apply pl-2; + @apply rounded-tl-xl; + @apply border-l-2; + @apply border-red-950; + } + + >ul { + list-style-type: disc; + padding-left: 1.5em; + margin-top: -1em; + margin-bottom: -1em; + + >li { + margin-bottom: -1em; + } + } + + >ol { + list-style-type: number; + padding-left: 1.3em; + margin-top: -1em; + margin-bottom: -1em; + + >li { + margin-bottom: -1em; + } + } + + >p { + padding-left: 0.2em; + margin-bottom: -1em; + } + + >code { + background: rgba(0, 0, 0, 0.8); + @apply rounded-sm; + } +} + +code { + color: rgba(255, 69, 0, 1); + font-weight: 800; + background-color: #0e0e0e; +} + +a { + font-weight: 500; + color: orangered; + text-decoration: inherit; +} + +a:hover { + color: orange; +} + +body { + margin: 0 auto; + /* place-items: center; */ + min-width: 320px; + min-height: 100vh; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} + +button:hover { + border-color: #646cff; +} + +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +.card { + padding: 2em; +} + +.logo { + @apply box-content; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} diff --git a/src/test-setup.ts b/src/test-setup.ts new file mode 100644 index 000000000..edf6f1d21 --- /dev/null +++ b/src/test-setup.ts @@ -0,0 +1,12 @@ +import '@analogjs/vite-plugin-angular/setup-vitest'; + +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; +import { getTestBed } from '@angular/core/testing'; + +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tailwind.config.cjs b/tailwind.config.cjs new file mode 100644 index 000000000..86a86233e --- /dev/null +++ b/tailwind.config.cjs @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./index.html', './src/**/*.{html,ts,md,otf}'], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 000000000..237854028 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": ["src/main.ts", "src/main.server.ts"], + "include": [ + "src/**/*.d.ts", + "src/app/routes/**/*.ts", + "src/app/pages/**/*.page.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..94e11863a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,31 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022", "dom"], + "useDefineForClassFields": false, + "skipLibCheck": true + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 000000000..3e9185737 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,11 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "target": "es2016", + "types": ["node", "vitest/globals"] + }, + "files": ["src/test-setup.ts"], + "include": ["src/**/*.spec.ts", "src/**/*.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..0157cafcb --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,64 @@ +/// + +import { defineConfig } from 'vite'; +import analog, { type PrerenderContentFile } from '@analogjs/platform'; + +// https://vitejs.dev/config/ +export default defineConfig(({ mode }) => ({ + build: { + target: ['es2020'], + }, + resolve: { + mainFields: ['module'], + }, + plugins: [ + analog({ + static: true, + prerender: { + routes: [ + '/', + '/setup', + '/news', + { + contentDir: 'src/content/news', + transform: (file: PrerenderContentFile) => { + // do not include files marked as draft in frontmatter + if (file.attributes['draft']) { + return false; + } + // use the slug from frontmatter if defined, otherwise use the files basename + const slug = file.attributes['slug'] || file.name; + return `/news/${slug}`; + }, + }, + '/guide', + { + contentDir: 'src/content/guide', + transform: (file: PrerenderContentFile) => { + // do not include files marked as draft in frontmatter + if (file.attributes['draft']) { + return false; + } + // use the slug from frontmatter if defined, otherwise use the files basename + const slug = file.attributes['slug'] || file.name; + return `/guide/${slug}`; + }, + }, + ], + sitemap: { + host: 'https://race.elementfuture.com/', + } + }, + }), + ], + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['src/test-setup.ts'], + include: ['**/*.spec.ts'], + reporters: ['default'], + }, + define: { + 'import.meta.vitest': mode !== 'production', + }, +}));