diff --git a/.github/workflows/cooker-selfhosted.yml b/.github/workflows/cooker-selfhosted.yml index 43d086c9..4ffb693a 100644 --- a/.github/workflows/cooker-selfhosted.yml +++ b/.github/workflows/cooker-selfhosted.yml @@ -1,32 +1,31 @@ name: "Build cooker" on: - # push: - # branches: - # - cooker* - # - feat* - # paths: - # - '.github/workflows/**' - # - 'automation_tools/**' - # - 'emu-configs/**' - # - 'es-configs/**' - # - 'functions/**' - # - 'rd-submodules/**' - # - '*.sh' - # - 'net.retrodeck.retrodeck.yml' - # - 'net.retrodeck.retrodeck.appdata.xml' - # pull_request: - # branches: - # - cooker* + push: + branches: + - cooker* + - feat* + paths: + - '.github/workflows/**' + - 'automation_tools/**' + - 'emu-configs/**' + - 'es-configs/**' + - 'functions/**' + - 'rd-submodules/**' + - '*.sh' + - 'net.retrodeck.retrodeck.yml' + - 'net.retrodeck.retrodeck.appdata.xml' + pull_request: + branches: + - cooker* # Italy (CET): 11:00 PM # Japan (JST): 7:00 AM - schedule: - - cron: '0 22 * * *' + # schedule: + # - cron: '0 22 * * *' workflow_dispatch: - jobs: Building_RetroDECK: @@ -49,6 +48,33 @@ jobs: - name: Generate cooker build ID run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh" + - name: Get branch name + id: branch_name + run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV + + # if it's a feature branch it will not marked as "latest" cooker version + - name: "Set makeLatest (cooker only)" + run: | + if [[ "$BRANCH_NAME" == 'feat/'* || "$BRANCH_NAME" == 'refs/'* ]]; then + echo "MAKE_LATEST=false" >> $GITHUB_ENV + else + echo "MAKE_LATEST=true" >> $GITHUB_ENV + fi + + # if the branch is coming from a PR the tag should be manually built + - name: "Generate version tag" + run: | + if [[ "$BRANCH_NAME" == 'refs/'* ]]; then + pr_number=$(echo ${{env.BRANCH_NAME}} | awk -F'/' '{print $3}') + source_branch=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/pulls/$pr_number" | jq -r '.head.ref') + source_branch=${source_branch//\//-} + echo "[DEBUG] source branch is: $source_branch" + echo "TAG=PR-$pr_number-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV + else + echo "TAG=${{env.BRANCH_NAME}}-${{ env.buildid }}" >> $GITHUB_ENV + fi + echo "Version TAG: ${{ env.TAG }}" + # backing up manifest in case download fails and hashes must be recalculated - name: Manifest backup run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" @@ -109,23 +135,10 @@ jobs: id: commits continue-on-error: true - - name: Get branch name - id: branch_name - run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV - - # if it's a feature branch it will not marked as "latest" cooker version - - name: "Set makeLatest (cooker only)" - run: | - if [[ "$BRANCH_NAME" == 'feat/'* ]]; then - echo "MAKE_LATEST=false" >> $GITHUB_ENV - else - echo "MAKE_LATEST=true" >> $GITHUB_ENV - fi - - name: Publish the flatpak in a new cooker release uses: ncipollo/release-action@v1 with: - tag: "${{env.BRANCH_NAME}}-${{ env.buildid }}" + tag: "${{env.TAG}}" body: | # Release Notes (Cooker) This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}. @@ -134,12 +147,12 @@ jobs: ## Commits since last release ${{ steps.commits.outputs.commits }} - For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/qQcrFvaA2C) on our Discord server. + For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server. Cooker channel is provided for the community to test fixes and explore new functionality. Please DO NOT open issues or ask support on this build. - artifacts: "RetroDECK-cooker.flatpak,RetroDECK-Artifact.tar.gz" + artifacts: "RetroDECK-cooker.flatpak,RetroDECK-cooker.flatpak.sha,RetroDECK-Artifact.tar.gz" allowUpdates: true makeLatest: ${{env.MAKE_LATEST}} # if it's a feat branch is not considered the latest build token: ${{ secrets.TRIGGER_BUILD_TOKEN }} @@ -154,3 +167,53 @@ jobs: path: RetroDECK-cooker.flatpak continue-on-error: true + # - name: Upload RetroDECK-cooker.flatpak to Gitea Release + # run: | + # # Set variables for Gitea host, organization, repository, access token, and release details + # GITEA_HOST="repo.retrodeck.net" + # ORGANIZATION="RetroDECK" + # REPO="RetroDECK-cooker" + # GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}" + # RELEASE_NAME="RetroDECK ${{env.TAG}}" + # TAG="${{env.TAG}}" + # RELEASE_BODY="# Release Notes (Cooker) + # This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}. + # On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}}). + + # ## Commits since last release + # ${{ steps.commits.outputs.commits }} + + # For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server. + + # Cooker channel is provided for the community to test fixes and explore new functionality. + # Please DO NOT open issues or ask support on this build." + + # # Create a release using curl and capture the release ID + # release_response=$(curl -X POST \ + # -H "Authorization: token ${GITEA_TOKEN}" \ + # -H "Content-Type: application/json" \ + # -d "{\"tag_name\":\"$TAG\",\"name\":\"$RELEASE_NAME\",\"body\":\"$RELEASE_BODY\"}" \ + # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases") + + # # Extract the release ID from the response + # release_id=$(echo $release_response | jq -r '.id') + + # # Upload artifacts + # curl -X POST \ + # -H "Authorization: token ${GITEA_TOKEN}" \ + # -H "Content-Type: multipart/form-data" \ + # -F "attachment=@RetroDECK-cooker.flatpak" \ + # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak" + + # # Upload artifacts sha + # curl -X POST \ + # -H "Authorization: token ${GITEA_TOKEN}" \ + # -H "Content-Type: multipart/form-data" \ + # -F "attachment=@RetroDECK-cooker.flatpak.sha" \ + # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak.sha" + + # curl -X POST \ + # -H "Authorization: token ${GITEA_TOKEN}" \ + # -H "Content-Type: multipart/form-data" \ + # -F "attachment=@RetroDECK-Artifact.tar.gz" \ + # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz" diff --git a/.github/workflows/main-selfhosted.yml b/.github/workflows/main-selfhosted.yml index 2618d7ba..567aec26 100644 --- a/.github/workflows/main-selfhosted.yml +++ b/.github/workflows/main-selfhosted.yml @@ -108,7 +108,7 @@ jobs: tag: ${{ env.REL_VER }} name: "RetroDECK v${{ env.REL_VER }}" bodyFile: "body.md" - artifacts: "RetroDECK.flatpak,RetroDECK-Artifact.tar.gz" + artifacts: "RetroDECK.flatpak,RetroDECK.flatpak.sha,RetroDECK-Artifact.tar.gz" allowUpdates: true makeLatest: true token: ${{ secrets.TRIGGER_BUILD_TOKEN }} @@ -122,3 +122,36 @@ jobs: name: retrodeck-flatpak path: RetroDECK.flatpak continue-on-error: true + + - name: Publish the flatpak in a new release on Gitea + uses: ncipollo/release-action@v1 + env: + REL_VER: ${{ env.REL_VER }} + with: + tag: ${{ env.REL_VER }} + name: "RetroDECK v${{ env.REL_VER }}" + bodyFile: "body.md" + artifacts: "RetroDECK.flatpak,RetroDECK-Artifact.tar.gz" + allowUpdates: true + makeLatest: true + token: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }} + repo: "https://repo.retrodeck.net/RetroDECK/RetroDECK" + continue-on-error: true + + - name: Upload RetroDECK.flatpak to Gitea Release + run: | + curl -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -F "file=@RetroDECK.flatpak" \ + "https://repo.retrodeck.net/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak" + env: + GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }} + + - name: Upload RetroDECK.flatpak.sha to Gitea Release + run: | + curl -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -F "file=@RetroDECK.flatpak.sha" \ + "https://repo.retrodeck.net/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak.sha" + env: + GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }} diff --git a/.github/workflows/removed/remove-artifacts.yml b/.github/workflows/remove-artifacts.yml similarity index 100% rename from .github/workflows/removed/remove-artifacts.yml rename to .github/workflows/remove-artifacts.yml diff --git a/.gitignore b/.gitignore index d2569309..05fda91c 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ rd-submodules/es-de/patches-tmp* .local/ buildid *.bak +incconfigs/ # Python # ########## diff --git a/README.md b/README.md index 88b3f7cb..d260662c 100644 --- a/README.md +++ b/README.md @@ -46,15 +46,15 @@ For more information read up here: RetroDECK is a [EmulationStation Desktop Edition](https://es-de.org) (ES-DE) powered Linux [Flatpak application](https://flathub.org/apps/net.retrodeck.retrodeck) that thanks to its `RetroDECK Framework` it builds-in and manage a variety of emulators and other software that allows you to play your favorite retro (and even not-so-retro) games in one complete package. ### So what does that mean? -It means that RetroDECK provides all the emulators, systems and a frontend. RetroDECK configures them for you and put them into one application you can download from Flathub. +It means that RetroDECK provides all the emulators, systems and a frontend. RetroDECK configures them for you and puts them into one application you can download from Flathub. By being one application RetroDECK can put all important files in one location for all the emulators, instead of having them spread out over your entire system and even add features on top to orchestrate them seamlessly. ### The RetroDECK Framework -As previously mentioned, RetroDECK also adds the `RetroDECK Framework` on top of the emulators and ES-DE interface that allows deeper integrations between emulators and easier exposure to a variety of features that you otherwise need to set per emulator basis to create a uniformity between them. +As previously mentioned, RetroDECK also adds the `RetroDECK Framework` on top of the emulators and ES-DE interface which allows deeper integrations between emulators and easier exposure to a variety of features that you otherwise need to set on a per emulator basis to create a uniformity between them. -The `RetroDECK Configurator` is a `Utility` that some parts of exposes the `RetroDECK Framework` to the RetroDECK users. +The `RetroDECK Configurator` is a `Utility` that exposes some parts of the `RetroDECK Framework` to the RetroDECK users. **What can the RetroDECK Framework and by extent the RetroDECK Configurator do?** @@ -67,18 +67,18 @@ It can help with: - Auto installing some free BIOSes - Install prebuilt Steam Input profiles for devices like the Steam Deck and external controllers - Easier management of `mods`, `roms`, `texture_packs`, `scraped media`, `screenshots`, `saves / states` `gamelists` and more -- Give access to global presets that can be acitivated to configure things over many emulators in one go like: `RetroAchievements` +- Give access to global presets that can be activated to configure things over many emulators in one go like: `RetroAchievements` `Borders` `Widescreen Mode` `Swaping A/B X/Y for Nintendo Games` For our long term vision you can check out the following wiki page: [RetroDECK: Visions and Goals](https://retrodeck.readthedocs.io/en/latest/wiki_about/visions-and-goals/) ### How to get support? -Use the supports channels on [Discord](https://discord.gg/Dz3szYsP8g) `🤝-community-support` and `🆘-support`. +Use the supports channels on [Discord](https://discord.gg/WDc5C9YWMx) `🤝-community-support` and `🆘-support`. ### The RetroDECK community: [Website](https://retrodeck.net)
[Wiki](https://github.com/XargonWan/RetroDECK/wiki)
-[Discord](https://discord.gg/Dz3szYsP8g)
+[Discord](https://discord.gg/WDc5C9YWMx)
[Lemmy](https://lemmy.zip/c/retrodeck)
[Subreddit](https://www.reddit.com/r/retrodeck) @@ -99,6 +99,7 @@ Read up here on how to help out, there is something for everyone: | [RetroDECK](https://github.com/XargonWan/RetroDECK) | This one, our main repo where the core of the project is | | [RetroDECK-cooker](https://github.com/XargonWan/RetroDECK-cooker) | Where we publish our test build, no code is hosted here | | [RetroDECK-Wiki](https://github.com/XargonWan/RetroDECK-Wiki) | Where our wiki source code is | +| [RetroDECK-website](https://github.com/XargonWan/RetroDECK-website) | Where our website source code is | | [RetroDECK on Flathub](https://github.com/flathub/net.retrodeck.retrodeck) | Our little space in Flathub's organization | | [RetroDECK-MAME](https://github.com/XargonWan/RetroDECK-MAME) | MAME is big to build, so it's pre-built here and then imported in the build | | [RetroDECK-ES-DE](https://github.com/XargonWan/RetroDECK-ES-DE) | This is where we store our patched fork of ES-DE | @@ -109,7 +110,7 @@ Read up here on how to help out, there is something for everyone: Please check out the [Wiki](https://github.com/XargonWan/RetroDECK/wiki) for even more information. ## The FAQ -The RetroDECK [FAQ](https://github.com/XargonWan/RetroDECK/wiki/FAQs%3A-Frequently-asked-questions) on the wiki has a vast variety of questions and awnsers. +The RetroDECK [FAQ](https://github.com/XargonWan/RetroDECK/wiki/FAQs%3A-Frequently-asked-questions) on the wiki has a vast variety of questions and answers. # How to get support? -Use the supports channels on [Discord](https://discord.gg/Dz3szYsP8g). +Use the supports channels on [Discord](https://discord.gg/WDc5C9YWMx). diff --git a/automation_tools/appdata_management.sh b/automation_tools/appdata_management.sh index f6cdfb19..9eb2ba4e 100755 --- a/automation_tools/appdata_management.sh +++ b/automation_tools/appdata_management.sh @@ -7,24 +7,24 @@ source automation_tools/version_extractor.sh # Fetch appdata version appdata_version=$(fetch_appdata_version) -echo -e "Appdata:\t\t$appdata_version" +log i "Appdata:\t\t$appdata_version" # Defining manifest file location appdata_file="net.retrodeck.retrodeck.appdata.xml" # Check if release with appdata_version already exists if grep -q "version=\"$appdata_version\"" "$appdata_file"; then - echo "Deleting existing release version $appdata_version..." + log i "Deleting existing release version $appdata_version..." # Remove the existing release entry sed -i "//d" "$appdata_file" fi -echo "Adding new release version $appdata_version..." +log i "Adding new release version $appdata_version..." # Get today's date in the required format (YYYY-MM-DD) today_date=$(date +"%Y-%m-%d") -echo "Today is $today_date" +log i "Today is $today_date" # Construct the release snippet release_snippet="\ diff --git a/automation_tools/cooker_build_id.sh b/automation_tools/cooker_build_id.sh old mode 100644 new mode 100755 diff --git a/automation_tools/flatpak_build_bundle.sh b/automation_tools/flatpak_build_bundle.sh index 3568ebb7..8e79186f 100755 --- a/automation_tools/flatpak_build_bundle.sh +++ b/automation_tools/flatpak_build_bundle.sh @@ -4,6 +4,8 @@ if [ "${GITHUB_REF##*/}" = "main" ]; then flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK.flatpak" net.retrodeck.retrodeck + sha256sum RetroDECK.flatpak > RetroDECK.flatpak.sha else flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK-cooker.flatpak" net.retrodeck.retrodeck + sha256sum RetroDECK-cooker.flatpak > RetroDECK-cooker.flatpak.sha fi \ No newline at end of file diff --git a/automation_tools/install_dependencies.sh b/automation_tools/install_dependencies.sh index 91503927..3daa4edb 100755 --- a/automation_tools/install_dependencies.sh +++ b/automation_tools/install_dependencies.sh @@ -1,6 +1,31 @@ #!/bin/bash -# This scritp is installing the required dependencies to correctly run the pipeline and buold the flatpak +# This script is installing the required dependencies to correctly run the pipeline and build the flatpak + +unset pkg_mgr + +# rpm-ostree must be checked before dnf because a dnf (wrapper) command also works on rpm-ostree distros (not what we want) +for potential_pkg_mgr in apt pacman rpm-ostree dnf; do + command -v "$potential_pkg_mgr" &> /dev/null && pkg_mgr="$potential_pkg_mgr" && break +done + +case "$pkg_mgr" in + apt) + sudo apt install -y flatpak flatpak-builder p7zip-full xmlstarlet bzip2 curl jq + ;; + pacman) + sudo pacman -S --noconfirm flatpak flatpak-builder p7zip xmlstarlet bzip2 + ;; + rpm-ostree) + echo "When using a distro with rpm-ostree, you shouldn't build directly on the host. Try using a distrobox." + exit 1 + ;; + dnf) + sudo dnf install -y flatpak flatpak-builder p7zip p7zip-plugins xmlstarlet bzip2 curl + ;; + *) + echo "Package manager $pkg_mgr not supported. Please open an issue." + ;; +esac -sudo apt install -y flatpak flatpak-builder p7zip-full xmlstarlet bzip2 curl jq flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo -flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo \ No newline at end of file +flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo diff --git a/build-locally.sh b/developer_toolbox/build_retrodeck_locally.sh similarity index 86% rename from build-locally.sh rename to developer_toolbox/build_retrodeck_locally.sh index 373d5b10..85b9e90e 100755 --- a/build-locally.sh +++ b/developer_toolbox/build_retrodeck_locally.sh @@ -1,7 +1,8 @@ #!/bin/bash -# TODO: FEDORA -# sudo dnf install -y flatpak flatpak-builder p7zip p7zip-plugins xmlstarlet bzip2 curl +# WARNING: run this script from the project root folder, not from here!! + +git submodule update --init --recursive export GITHUB_WORKSPACE="." cp net.retrodeck.retrodeck.appdata.xml net.retrodeck.retrodeck.appdata.xml.bak diff --git a/developer_toolbox/inject_framework.sh b/developer_toolbox/inject_framework.sh new file mode 100755 index 00000000..65a16c35 --- /dev/null +++ b/developer_toolbox/inject_framework.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# WARNING: run this script from the project root folder, not from here!! + +# This script is used to inject framework and config files inside a RetroDECK cooker installation +# To apply the injected config you have to reset the targeted component from the Configurator +# Please know what you're doing, if you need to undo this you need to completely uninstall and reinstall RetroDECK flatpak +# Please not that this may create a dirty situation where older files are still in place as the action is add and overwrite + +flatpak_user_installation="$HOME/.local/share/flatpak/app/net.retrodeck.retrodeck/current/active/files" +flatpak_system_installation="/var/lib/flatpak/app/net.retrodeck.retrodeck/current/active/files" + +if [ -d "$flatpak_user_installation" ]; then + echo "RetroDECK is installed in user mode, proceeding." + app="$flatpak_user_installation" +elif [ -d "$flatpak_system_installation" ]; then + echo "RetroDECK is installed in system mode, proceeding." + app="$flatpak_system_installation" +else + echo "RetroDECK installation not found, quitting" + exit 1 +fi + +sudo cp -vfr "res/binding_icons" "$app/retrodeck/binding_icons" +sudo cp -vfr "emu-configs/"** "$app/retrodeck/emu-configs/" +sudo cp -vfr "tools" "$app" +sudo cp -vfr "retrodeck.sh" "$app/bin/" +sudo cp -vfr "functions/"** "$app/libexec/" diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index 8b137891..00000000 --- a/docs/.nojekyll +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/.well-known/org.flathub.VerifiedApps.txt b/docs/.well-known/org.flathub.VerifiedApps.txt deleted file mode 100644 index 0eb41220..00000000 --- a/docs/.well-known/org.flathub.VerifiedApps.txt +++ /dev/null @@ -1 +0,0 @@ -b98237ec-72ae-4779-bc52-2802057a83ff \ No newline at end of file diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 4e46fbf8..00000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -retrodeck.net \ No newline at end of file diff --git a/docs/assets/bootstrap/css/bootstrap.min.css b/docs/assets/bootstrap/css/bootstrap.min.css deleted file mode 100644 index eedff215..00000000 --- a/docs/assets/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,12 +0,0 @@ -@charset "UTF-8";/*! - * Bootswatch v5.2.0 (https://bootswatch.com) - * Theme: lux - * Copyright 2012-2022 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v5.2.0 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */@import url(https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600&display=swap);:root{--bs-blue:#007bff;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#d9534f;--bs-orange:#fd7e14;--bs-yellow:#f0ad4e;--bs-green:#4bbf73;--bs-teal:#20c997;--bs-cyan:#1f9bcf;--bs-black:#000;--bs-white:#fff;--bs-gray:#919aa1;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#f7f7f9;--bs-gray-300:#eceeef;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#919aa1;--bs-gray-700:#55595c;--bs-gray-800:#343a40;--bs-gray-900:#1a1a1a;--bs-primary:#1a1a1a;--bs-secondary:#fff;--bs-success:#4bbf73;--bs-info:#1f9bcf;--bs-warning:#f0ad4e;--bs-danger:#d9534f;--bs-light:#fff;--bs-dark:#343a40;--bs-primary-rgb:26,26,26;--bs-secondary-rgb:255,255,255;--bs-success-rgb:75,191,115;--bs-info-rgb:31,155,207;--bs-warning-rgb:240,173,78;--bs-danger-rgb:217,83,79;--bs-light-rgb:255,255,255;--bs-dark-rgb:52,58,64;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:85,89,92;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:"Nunito Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#55595c;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#eceeef;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#1a1a1a;--bs-link-hover-color:#151515;--bs-code-color:#e83e8c;--bs-highlight-bg:#fcefdc}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:600;line-height:1.2;color:#1a1a1a}.h1,h1{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h1,h1{font-size:2rem}}.h2,h2{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h2,h2{font-size:1.75rem}}.h3,h3{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h3,h3{font-size:1.5rem}}.h4,h4{font-size:1.25rem}.h5,h5{font-size:1rem}.h6,h6{font-size:.75rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color)}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#919aa1;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#919aa1}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#919aa1}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:rgba(0, 0, 0, 0.05);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d1d1d1;--bs-table-border-color:#bcbcbc;--bs-table-striped-bg:#c7c7c7;--bs-table-striped-color:#000;--bs-table-active-bg:#bcbcbc;--bs-table-active-color:#000;--bs-table-hover-bg:#c1c1c1;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:white;--bs-table-border-color:#e6e6e6;--bs-table-striped-bg:#f2f2f2;--bs-table-striped-color:#000;--bs-table-active-bg:#e6e6e6;--bs-table-active-color:#000;--bs-table-hover-bg:#ececec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#dbf2e3;--bs-table-border-color:#c5dacc;--bs-table-striped-bg:#d0e6d8;--bs-table-striped-color:#000;--bs-table-active-bg:#c5dacc;--bs-table-active-color:#000;--bs-table-hover-bg:#cbe0d2;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#d2ebf5;--bs-table-border-color:#bdd4dd;--bs-table-striped-bg:#c8dfe9;--bs-table-striped-color:#000;--bs-table-active-bg:#bdd4dd;--bs-table-active-color:#000;--bs-table-hover-bg:#c2d9e3;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fcefdc;--bs-table-border-color:#e3d7c6;--bs-table-striped-bg:#efe3d1;--bs-table-striped-color:#000;--bs-table-active-bg:#e3d7c6;--bs-table-active-color:#000;--bs-table-hover-bg:#e9ddcc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f7dddc;--bs-table-border-color:#dec7c6;--bs-table-striped-bg:#ebd2d1;--bs-table-striped-color:#000;--bs-table-active-bg:#dec7c6;--bs-table-active-color:#000;--bs-table-hover-bg:#e4cccc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#fff;--bs-table-border-color:#e6e6e6;--bs-table-striped-bg:#f2f2f2;--bs-table-striped-color:#000;--bs-table-active-bg:#e6e6e6;--bs-table-active-color:#000;--bs-table-hover-bg:#ececec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#343a40;--bs-table-border-color:#484e53;--bs-table-striped-bg:#3e444a;--bs-table-striped-color:#fff;--bs-table-active-bg:#484e53;--bs-table-active-color:#fff;--bs-table-hover-bg:#43494e;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:.75rem;padding-bottom:.75rem;margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:2rem;padding-bottom:2rem;font-size:1.25rem}.col-form-label-sm{padding-top:.5rem;padding-bottom:.5rem;font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#919aa1}.form-control{display:block;width:100%;padding:.75rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.5;color:#55595c;background-color:#f7f7f9;background-clip:padding-box;border:0 solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#55595c;background-color:#f7f7f9;border-color:#8d8d8d;outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#919aa1;opacity:1}.form-control::placeholder{color:#919aa1;opacity:1}.form-control:disabled{background-color:#eceeef;opacity:1}.form-control::-webkit-file-upload-button{padding:.75rem 1.5rem;margin:-.75rem -1.5rem;-webkit-margin-end:1.5rem;margin-inline-end:1.5rem;color:#55595c;background-color:#eceeef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:0;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.75rem 1.5rem;margin:-.75rem -1.5rem;-webkit-margin-end:1.5rem;margin-inline-end:1.5rem;color:#55595c;background-color:#eceeef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:0;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#e0e2e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e0e2e3}.form-control-plaintext{display:block;width:100%;padding:.75rem 0;margin-bottom:0;line-height:1.5;color:#55595c;background-color:transparent;border:solid transparent;border-width:0 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 1rem);padding:.5rem 1rem;font-size:.875rem}.form-control-sm::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-sm::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg{min-height:calc(1.5em + 4rem);padding:2rem 2rem;font-size:1.25rem}.form-control-lg::-webkit-file-upload-button{padding:2rem 2rem;margin:-2rem -2rem;-webkit-margin-end:2rem;margin-inline-end:2rem}.form-control-lg::file-selector-button{padding:2rem 2rem;margin:-2rem -2rem;-webkit-margin-end:2rem;margin-inline-end:2rem}textarea.form-control{min-height:calc(1.5em + 1.5rem)}textarea.form-control-sm{min-height:calc(1.5em + 1rem)}textarea.form-control-lg{min-height:calc(1.5em + 4rem)}.form-control-color{width:3rem;height:calc(1.5em + 1.5rem);padding:.75rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important}.form-control-color.form-control-sm{height:calc(1.5em + 1rem)}.form-control-color.form-control-lg{height:calc(1.5em + 4rem)}.form-select{display:block;width:100%;padding:.75rem 4.5rem .75rem 1.5rem;-moz-padding-start:calc(1.5rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#55595c;background-color:#f7f7f9;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1.5rem center;background-size:16px 12px;border:0 solid #ced4da;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#8d8d8d;outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1.5rem;background-image:none}.form-select:disabled{background-color:#f7f7f9}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #55595c}.form-select-sm{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:.875rem}.form-select-lg{padding-top:2rem;padding-bottom:2rem;padding-left:2rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#f7f7f9;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#8d8d8d;outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25)}.form-check-input:checked{background-color:#1a1a1a;border-color:#1a1a1a}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#1a1a1a;border-color:#1a1a1a;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%238d8d8d'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(26,26,26,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(26,26,26,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#1a1a1a;border:0;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bababa}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#eceeef;border-color:transparent}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#1a1a1a;border:0;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#bababa}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#eceeef;border-color:transparent}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:3.5rem;line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem 1.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:0 solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem 1.5rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:0 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.75rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.5;color:#55595c;text-align:center;white-space:nowrap;background-color:#eceeef;border:0 solid #ced4da}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:2rem 2rem;font-size:1.25rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.5rem 1rem;font-size:.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:6rem}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select,.input-group>:not(:first-child):not(.dropdown-menu):not(.form-floating):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#4bbf73}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(75,191,115,.9)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#4bbf73;padding-right:calc(1.5em + 1.5rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%234bbf73' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .375rem) center;background-size:calc(.75em + .75rem) calc(.75em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#4bbf73;box-shadow:0 0 0 .25rem rgba(75,191,115,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 1.5rem);background-position:top calc(.375em + .375rem) right calc(.375em + .375rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#4bbf73}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:8.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%234bbf73' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right 1.5rem center,center right 4.5rem;background-size:16px 12px,calc(.75em + .75rem) calc(.75em + .75rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#4bbf73;box-shadow:0 0 0 .25rem rgba(75,191,115,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + 1.5rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#4bbf73}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#4bbf73}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(75,191,115,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#4bbf73}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#d9534f}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(217,83,79,.9)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#d9534f;padding-right:calc(1.5em + 1.5rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23d9534f'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23d9534f' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .375rem) center;background-size:calc(.75em + .75rem) calc(.75em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#d9534f;box-shadow:0 0 0 .25rem rgba(217,83,79,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 1.5rem);background-position:top calc(.375em + .375rem) right calc(.375em + .375rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#d9534f}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:8.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23d9534f'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23d9534f' stroke='none'/%3e%3c/svg%3e");background-position:right 1.5rem center,center right 4.5rem;background-size:16px 12px,calc(.75em + .75rem) calc(.75em + .75rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#d9534f;box-shadow:0 0 0 .25rem rgba(217,83,79,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + 1.5rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#d9534f}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#d9534f}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(217,83,79,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#d9534f}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{--bs-btn-padding-x:1.5rem;--bs-btn-padding-y:0.75rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:600;--bs-btn-line-height:1.5rem;--bs-btn-color:#55595c;--bs-btn-bg:transparent;--bs-btn-border-width:0;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check:focus+.btn,.btn:focus{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:active+.btn,.btn-check:checked+.btn,.btn.active,.btn.show,.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:active+.btn:focus,.btn-check:checked+.btn:focus,.btn.active:focus,.btn.show:focus,.btn:active:focus{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#1a1a1a;--bs-btn-border-color:#1a1a1a;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#161616;--bs-btn-hover-border-color:#151515;--bs-btn-focus-shadow-rgb:60,60,60;--bs-btn-active-color:#fff;--bs-btn-active-bg:#151515;--bs-btn-active-border-color:#141414;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#1a1a1a;--bs-btn-disabled-border-color:#1a1a1a}.btn-secondary{--bs-btn-color:#000;--bs-btn-bg:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:white;--bs-btn-hover-border-color:white;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#000;--bs-btn-active-bg:white;--bs-btn-active-border-color:white;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#fff;--bs-btn-disabled-border-color:#fff}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#4bbf73;--bs-btn-border-color:#4bbf73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#40a262;--bs-btn-hover-border-color:#3c995c;--bs-btn-focus-shadow-rgb:102,201,136;--bs-btn-active-color:#fff;--bs-btn-active-bg:#3c995c;--bs-btn-active-border-color:#388f56;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#4bbf73;--bs-btn-disabled-border-color:#4bbf73}.btn-info{--bs-btn-color:#fff;--bs-btn-bg:#1f9bcf;--bs-btn-border-color:#1f9bcf;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1a84b0;--bs-btn-hover-border-color:#197ca6;--bs-btn-focus-shadow-rgb:65,170,214;--bs-btn-active-color:#fff;--bs-btn-active-bg:#197ca6;--bs-btn-active-border-color:#17749b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#1f9bcf;--bs-btn-disabled-border-color:#1f9bcf}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#f0ad4e;--bs-btn-border-color:#f0ad4e;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f2b969;--bs-btn-hover-border-color:#f2b560;--bs-btn-focus-shadow-rgb:204,147,66;--bs-btn-active-color:#000;--bs-btn-active-bg:#f3bd71;--bs-btn-active-border-color:#f2b560;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f0ad4e;--bs-btn-disabled-border-color:#f0ad4e}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#d9534f;--bs-btn-border-color:#d9534f;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#b84743;--bs-btn-hover-border-color:#ae423f;--bs-btn-focus-shadow-rgb:223,109,105;--bs-btn-active-color:#fff;--bs-btn-active-bg:#ae423f;--bs-btn-active-border-color:#a33e3b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#d9534f;--bs-btn-disabled-border-color:#d9534f}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d9d9d9;--bs-btn-hover-border-color:#cccccc;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#000;--bs-btn-active-bg:#cccccc;--bs-btn-active-border-color:#bfbfbf;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#fff;--bs-btn-disabled-border-color:#fff}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#52585d;--bs-btn-hover-border-color:#484e53;--bs-btn-focus-shadow-rgb:82,88,93;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5d6166;--bs-btn-active-border-color:#484e53;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#343a40;--bs-btn-disabled-border-color:#343a40}.btn-outline-primary{--bs-btn-color:#1a1a1a;--bs-btn-border-color:#1a1a1a;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1a1a1a;--bs-btn-hover-border-color:#1a1a1a;--bs-btn-focus-shadow-rgb:26,26,26;--bs-btn-active-color:#fff;--bs-btn-active-bg:#1a1a1a;--bs-btn-active-border-color:#1a1a1a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#1a1a1a;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1a1a1a;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#fff;--bs-btn-hover-border-color:#fff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-active-color:#000;--bs-btn-active-bg:#fff;--bs-btn-active-border-color:#fff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#fff;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#4bbf73;--bs-btn-border-color:#4bbf73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#4bbf73;--bs-btn-hover-border-color:#4bbf73;--bs-btn-focus-shadow-rgb:75,191,115;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4bbf73;--bs-btn-active-border-color:#4bbf73;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#4bbf73;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#4bbf73;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#1f9bcf;--bs-btn-border-color:#1f9bcf;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1f9bcf;--bs-btn-hover-border-color:#1f9bcf;--bs-btn-focus-shadow-rgb:31,155,207;--bs-btn-active-color:#fff;--bs-btn-active-bg:#1f9bcf;--bs-btn-active-border-color:#1f9bcf;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#1f9bcf;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1f9bcf;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#f0ad4e;--bs-btn-border-color:#f0ad4e;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f0ad4e;--bs-btn-hover-border-color:#f0ad4e;--bs-btn-focus-shadow-rgb:240,173,78;--bs-btn-active-color:#000;--bs-btn-active-bg:#f0ad4e;--bs-btn-active-border-color:#f0ad4e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f0ad4e;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f0ad4e;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#d9534f;--bs-btn-border-color:#d9534f;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#d9534f;--bs-btn-hover-border-color:#d9534f;--bs-btn-focus-shadow-rgb:217,83,79;--bs-btn-active-color:#fff;--bs-btn-active-bg:#d9534f;--bs-btn-active-border-color:#d9534f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#d9534f;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#d9534f;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#fff;--bs-btn-hover-border-color:#fff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-active-color:#000;--bs-btn-active-bg:#fff;--bs-btn-active-border-color:#fff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#fff;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#343a40;--bs-btn-hover-border-color:#343a40;--bs-btn-focus-shadow-rgb:52,58,64;--bs-btn-active-color:#fff;--bs-btn-active-bg:#343a40;--bs-btn-active-border-color:#343a40;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#343a40;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#343a40;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#919aa1;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:60,60,60;text-decoration:underline}.btn-link:focus{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:2rem;--bs-btn-padding-x:2rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#55595c;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#1a1a1a;--bs-dropdown-link-hover-color:#171717;--bs-dropdown-link-hover-bg:#f7f7f9;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#1a1a1a;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#919aa1;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:1000;display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#eceeef;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#eceeef;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#1a1a1a;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:0}.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:1.5rem;padding-left:1.5rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#919aa1;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#eceeef;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#f7f7f9 #f7f7f9 #eceeef;--bs-nav-tabs-link-active-color:#55595c;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#eceeef #eceeef #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(var(--bs-nav-tabs-border-width) * -1);background:0 0;border:var(--bs-nav-tabs-border-width) solid transparent}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(var(--bs-nav-tabs-border-width) * -1)}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#1a1a1a}.nav-pills .nav-link{background:0 0;border:0}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:1.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.3);--bs-navbar-hover-color:#1a1a1a;--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:#1a1a1a;--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:#1a1a1a;--bs-navbar-brand-hover-color:#1a1a1a;--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.3%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:#fff;--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color:#000;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23171717'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#8d8d8d;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(26, 26, 26, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#171717;--bs-accordion-active-bg:#e8e8e8}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(var(--bs-accordion-border-width) * -1) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#919aa1;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#919aa1;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:transparent;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#f7f7f9;--bs-pagination-hover-border-color:transparent;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#f7f7f9;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(26, 26, 26, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#1a1a1a;--bs-pagination-active-border-color:#1a1a1a;--bs-pagination-disabled-color:#919aa1;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:transparent;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#101010;--bs-alert-bg:#d1d1d1;--bs-alert-border-color:#bababa}.alert-primary .alert-link{color:#0d0d0d}.alert-secondary{--bs-alert-color:#999999;--bs-alert-bg:white;--bs-alert-border-color:white}.alert-secondary .alert-link{color:#7a7a7a}.alert-success{--bs-alert-color:#2d7345;--bs-alert-bg:#dbf2e3;--bs-alert-border-color:#c9ecd5}.alert-success .alert-link{color:#245c37}.alert-info{--bs-alert-color:#135d7c;--bs-alert-bg:#d2ebf5;--bs-alert-border-color:#bce1f1}.alert-info .alert-link{color:#0f4a63}.alert-warning{--bs-alert-color:#90682f;--bs-alert-bg:#fcefdc;--bs-alert-border-color:#fbe6ca}.alert-warning .alert-link{color:#735326}.alert-danger{--bs-alert-color:#82322f;--bs-alert-bg:#f7dddc;--bs-alert-border-color:#f4cbca}.alert-danger .alert-link{color:#682826}.alert-light{--bs-alert-color:#999999;--bs-alert-bg:white;--bs-alert-border-color:white}.alert-light .alert-link{color:#7a7a7a}.alert-dark{--bs-alert-color:#1f2326;--bs-alert-bg:#d6d8d9;--bs-alert-border-color:#c2c4c6}.alert-dark .alert-link{color:#191c1e}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#f7f7f9;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#1a1a1a;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{--bs-list-group-color:#1a1a1a;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#55595c;--bs-list-group-action-hover-color:#55595c;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#55595c;--bs-list-group-action-active-bg:#f7f7f9;--bs-list-group-disabled-color:#919aa1;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#1a1a1a;--bs-list-group-active-border-color:#1a1a1a;display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(var(--bs-list-group-border-width) * -1);border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#101010;background-color:#d1d1d1}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#101010;background-color:#bcbcbc}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#101010;border-color:#101010}.list-group-item-secondary{color:#999;background-color:#fff}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#999;background-color:#e6e6e6}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#999;border-color:#999}.list-group-item-success{color:#2d7345;background-color:#dbf2e3}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#2d7345;background-color:#c5dacc}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#2d7345;border-color:#2d7345}.list-group-item-info{color:#135d7c;background-color:#d2ebf5}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#135d7c;background-color:#bdd4dd}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#135d7c;border-color:#135d7c}.list-group-item-warning{color:#90682f;background-color:#fcefdc}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#90682f;background-color:#e3d7c6}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#90682f;border-color:#90682f}.list-group-item-danger{color:#82322f;background-color:#f7dddc}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#82322f;background-color:#dec7c6}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#82322f;border-color:#82322f}.list-group-item-light{color:#999;background-color:#fff}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#999;background-color:#e6e6e6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#999;border-color:#999}.list-group-item-dark{color:#1f2326;background-color:#d6d8d9}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1f2326;background-color:#c1c2c3}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#919aa1;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{position:absolute;z-index:1090;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(var(--bs-toast-padding-x) * -.5);margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(var(--bs-modal-header-padding-y) * -.5) calc(var(--bs-modal-header-padding-x) * -.5) calc(var(--bs-modal-header-padding-y) * -.5) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:var(--bs-heading-color);--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#55595c;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(var(--bs-popover-arrow-width) * -.5);content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;-webkit-animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(var(--bs-offcanvas-padding-y) * -.5);margin-right:calc(var(--bs-offcanvas-padding-x) * -.5);margin-bottom:calc(var(--bs-offcanvas-padding-y) * -.5)}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(26,26,26,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(255,255,255,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(75,191,115,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!important;background-color:RGBA(31,155,207,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(240,173,78,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(217,83,79,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(255,255,255,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(52,58,64,var(--bs-bg-opacity,1))!important}.link-primary{color:#1a1a1a!important}.link-primary:focus,.link-primary:hover{color:#151515!important}.link-secondary{color:#fff!important}.link-secondary:focus,.link-secondary:hover{color:#fff!important}.link-success{color:#4bbf73!important}.link-success:focus,.link-success:hover{color:#3c995c!important}.link-info{color:#1f9bcf!important}.link-info:focus,.link-info:hover{color:#197ca6!important}.link-warning{color:#f0ad4e!important}.link-warning:focus,.link-warning:hover{color:#f3bd71!important}.link-danger{color:#d9534f!important}.link-danger:focus,.link-danger:hover{color:#ae423f!important}.link-light{color:#fff!important}.link-light:focus,.link-light:hover{color:#fff!important}.link-dark{color:#343a40!important}.link-dark:focus,.link-dark:hover{color:#2a2e33!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.325rem + .9vw)!important}.fs-2{font-size:calc(1.3rem + .6vw)!important}.fs-3{font-size:calc(1.275rem + .3vw)!important}.fs-4{font-size:1.25rem!important}.fs-5{font-size:1rem!important}.fs-6{font-size:.75rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#919aa1!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2rem!important}.fs-2{font-size:1.75rem!important}.fs-3{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.navbar{font-size:.875rem;font-weight:600;text-transform:uppercase}.navbar-nav .nav-link{padding-top:.715rem;padding-bottom:.715rem}.navbar-brand{margin-right:2rem}.bg-light{border:1px solid rgba(0,0,0,.1)}.bg-light.navbar-fixed-top{border-width:0 0 1px}.bg-light.navbar-bottom-top{border-width:1px 0 0}.nav-item{margin-right:2rem}.btn{font-size:.875rem;text-transform:uppercase}.btn-group-sm>.btn,.btn-sm{font-size:10px}.btn-warning,.btn-warning:focus,.btn-warning:hover,.btn-warning:not([disabled]):not(.disabled):active{color:#fff}.btn-outline-secondary{color:#919aa1;border-color:#919aa1}.btn-outline-secondary:not([disabled]):not(.disabled):active,.btn-outline-secondary:not([disabled]):not(.disabled):focus,.btn-outline-secondary:not([disabled]):not(.disabled):hover{color:#fff;background-color:#ced4da;border-color:#ced4da}.btn-outline-secondary:not([disabled]):not(.disabled):focus{box-shadow:0 0 0 .2rem rgba(206,212,218,.5)}[class*=btn-outline-]{border-width:2px}.border-secondary{border:1px solid #ced4da!important}body{font-weight:200;letter-spacing:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-transform:uppercase;letter-spacing:3px}.text-secondary{color:#55595c!important}th{font-size:.875rem;text-transform:uppercase}.table td,.table th{padding:1.5rem}.table-sm td,.table-sm th{padding:.75rem}.dropdown-menu{font-size:.875rem;text-transform:none}.badge{padding-top:.28rem}.badge-pill{border-radius:10rem}.badge.bg-light,.badge.bg-secondary{color:#343a40}.card .h1,.card .h2,.card .h3,.card .h4,.card .h5,.card .h6,.card h1,.card h2,.card h3,.card h4,.card h5,.card h6,.list-group-item .h1,.list-group-item .h2,.list-group-item .h3,.list-group-item .h4,.list-group-item .h5,.list-group-item .h6,.list-group-item h1,.list-group-item h2,.list-group-item h3,.list-group-item h4,.list-group-item h5,.list-group-item h6{color:inherit} \ No newline at end of file diff --git a/docs/assets/bootstrap/js/bootstrap.min.js b/docs/assets/bootstrap/js/bootstrap.min.js deleted file mode 100644 index 2328c971..00000000 --- a/docs/assets/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v5.2.0 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},m=t=>{"function"==typeof t&&t()},_=(e,i,n=!0)=>{if(!n)return void m(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),m(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function D(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function S(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const o of Object.keys(s))if(o.includes(n)){const n=s[o];S(t,e,i,n.callable,n.delegationSelector)}}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){D(t,e,i,n,!1)},one(t,e,i,n){D(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const i of Object.keys(c)){const n=i.replace(w,"");if(!a||e.includes(n)){const e=c[i];S(t,l,r,e.callable,e.delegationSelector)}}}else{if(!Object.keys(c).length)return;S(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());let l=new Event(e,{bubbles:o,cancelable:!0});return l=j(l,i),a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e){for(const[i,n]of Object.entries(e||{}))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}const M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};function $(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function W(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${W(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${W(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=$(t.dataset[n])}return e},getDataAttribute:(t,e)=>$(t.getAttribute(`data-bs-${W(e)}`))};class F{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const s=e[n],r=t[n],a=o(r)?"element":null==(i=r)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(a))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}var i}}class z extends F{constructor(t,e){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(e),H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.0"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;P.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class q extends z{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(q,"close"),g(q);const V='[data-bs-toggle="button"]';class K extends z{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),g(K);const Q={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))}},X={endCallback:null,leftCallback:null,rightCallback:null},Y={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class U extends F{constructor(t,e){super(),this._element=t,t&&U.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return X}static get DefaultType(){return Y}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),m(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&m(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const G="next",J="prev",Z="left",tt="right",et="slid.bs.carousel",it="carousel",nt="active",st={ArrowLeft:tt,ArrowRight:Z},ot={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},rt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class at extends z{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=Q.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===it&&this.cycle()}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(J)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,et,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,et,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?G:J;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&U.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of Q.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(Z)),rightCallback:()=>this._slide(this._directionToOrder(tt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new U(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=st[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=Q.findOne(".active",this._indicatorsElement);e.classList.remove(nt),e.removeAttribute("aria-current");const i=Q.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(nt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===G,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(nt),i.classList.remove(nt,c,l),this._isSliding=!1,r(et)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return Q.findOne(".active.carousel-item",this._element)}_getItems(){return Q.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===Z?J:G:t===Z?G:J}_orderToDirection(t){return p()?t===J?Z:tt:t===J?tt:Z}static jQueryInterface(t){return this.each((function(){const e=at.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=n(this);if(!e||!e.classList.contains(it))return;t.preventDefault();const i=at.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=Q.find('[data-bs-ride="carousel"]');for(const e of t)at.getOrCreateInstance(e)})),g(at);const lt="show",ct="collapse",ht="collapsing",dt='[data-bs-toggle="collapse"]',ut={parent:null,toggle:!0},ft={parent:"(null|element)",toggle:"boolean"};class pt extends z{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const n=Q.find(dt);for(const t of n){const e=i(t),n=Q.find(e).filter((t=>t===this._element));null!==e&&n.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ut}static get DefaultType(){return ft}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>pt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);for(const t of this._triggerArray){const e=n(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(dt);for(const e of t){const t=n(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=Q.find(":scope .collapse .collapse",this._config.parent);return Q.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",dt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this),n=Q.find(e);for(const t of n)pt.getOrCreateInstance(t,{toggle:!1}).toggle()})),g(pt);var gt="top",mt="bottom",_t="right",bt="left",vt="auto",yt=[gt,mt,_t,bt],wt="start",At="end",Et="clippingParents",Tt="viewport",Ct="popper",Ot="reference",xt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+At])}),[]),kt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+At])}),[]),Lt="beforeRead",Dt="read",St="afterRead",It="beforeMain",Nt="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",$t=[Lt,Dt,St,It,Nt,Pt,jt,Mt,Ht];function Wt(t){return t?(t.nodeName||"").toLowerCase():null}function Bt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Ft(t){return t instanceof Bt(t).Element||t instanceof Element}function zt(t){return t instanceof Bt(t).HTMLElement||t instanceof HTMLElement}function Rt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Bt(t).ShadowRoot||t instanceof ShadowRoot)}const qt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Wt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Wt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Vt(t){return t.split("-")[0]}var Kt=Math.max,Qt=Math.min,Xt=Math.round;function Yt(t,e){void 0===e&&(e=!1);var i=t.getBoundingClientRect(),n=1,s=1;if(zt(t)&&e){var o=t.offsetHeight,r=t.offsetWidth;r>0&&(n=Xt(i.width)/r||1),o>0&&(s=Xt(i.height)/o||1)}return{width:i.width/n,height:i.height/s,top:i.top/s,right:i.right/n,bottom:i.bottom/s,left:i.left/n,x:i.left/n,y:i.top/s}}function Ut(t){var e=Yt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Gt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&Rt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Jt(t){return Bt(t).getComputedStyle(t)}function Zt(t){return["table","td","th"].indexOf(Wt(t))>=0}function te(t){return((Ft(t)?t.ownerDocument:t.document)||window.document).documentElement}function ee(t){return"html"===Wt(t)?t:t.assignedSlot||t.parentNode||(Rt(t)?t.host:null)||te(t)}function ie(t){return zt(t)&&"fixed"!==Jt(t).position?t.offsetParent:null}function ne(t){for(var e=Bt(t),i=ie(t);i&&Zt(i)&&"static"===Jt(i).position;)i=ie(i);return i&&("html"===Wt(i)||"body"===Wt(i)&&"static"===Jt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Jt(t).position)return null;var i=ee(t);for(Rt(i)&&(i=i.host);zt(i)&&["html","body"].indexOf(Wt(i))<0;){var n=Jt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function se(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function oe(t,e,i){return Kt(t,Qt(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Vt(i.placement),l=se(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Ut(o),u="y"===l?gt:bt,f="y"===l?mt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],g=r[l]-i.rects.reference[l],m=ne(o),_=m?"y"===l?m.clientHeight||0:m.clientWidth||0:0,b=p/2-g/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=oe(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Gt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,g=void 0===p?0:p,m="function"==typeof h?h({x:f,y:g}):{x:f,y:g};f=m.x,g=m.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=bt,y=gt,w=window;if(c){var A=ne(i),E="clientHeight",T="clientWidth";A===Bt(i)&&"static"!==Jt(A=te(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===gt||(s===bt||s===_t)&&o===At)&&(y=mt,g-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,g*=l?1:-1),s!==bt&&(s!==gt&&s!==mt||o!==At)||(v=_t,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&he),x=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:Xt(e*n)/n||0,y:Xt(i*n)/n||0}}({x:f,y:g}):{x:f,y:g};return f=x.x,g=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+g+"px)":"translate3d("+f+"px, "+g+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?g+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Vt(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Bt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var ge={left:"right",right:"left",bottom:"top",top:"bottom"};function me(t){return t.replace(/left|right|bottom|top/g,(function(t){return ge[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Bt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Yt(te(t)).left+ve(t).scrollLeft}function we(t){var e=Jt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ae(t){return["html","body","#document"].indexOf(Wt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ae(ee(t))}function Ee(t,e){var i;void 0===e&&(e=[]);var n=Ae(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Bt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ee(ee(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Ce(t,e){return e===Tt?Te(function(t){var e=Bt(t),i=te(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):Ft(e)?function(t){var e=Yt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=te(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Kt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Kt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Jt(s||i).direction&&(a+=Kt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(te(t)))}function Oe(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Vt(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case gt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?se(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case At:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function xe(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?Et:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ct:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,g=re("number"!=typeof p?p:ae(p,yt)),m=h===Ct?Ot:Ct,_=t.rects.popper,b=t.elements[u?m:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ee(ee(t)),i=["absolute","fixed"].indexOf(Jt(t).position)>=0&&zt(t)?ne(t):t;return Ft(i)?e.filter((function(t){return Ft(t)&&Gt(t,i)&&"body"!==Wt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Ce(t,i);return e.top=Kt(n.top,e.top),e.right=Qt(n.right,e.right),e.bottom=Qt(n.bottom,e.bottom),e.left=Kt(n.left,e.left),e}),Ce(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}(Ft(b)?b:b.contextElement||te(t.elements.popper),r,l),y=Yt(t.elements.reference),w=Oe({reference:y,element:_,strategy:"absolute",placement:s}),A=Te(Object.assign({},_,w)),E=h===Ct?A:y,T={top:v.top-E.top+g.top,bottom:E.bottom-v.bottom+g.bottom,left:v.left-E.left+g.left,right:E.right-v.right+g.right},C=t.modifiersData.offset;if(h===Ct&&C){var O=C[s];Object.keys(T).forEach((function(t){var e=[_t,mt].indexOf(t)>=0?1:-1,i=[gt,mt].indexOf(t)>=0?"y":"x";T[t]+=O[i]*e}))}return T}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?kt:l,h=ce(n),d=h?a?xt:xt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=xe(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Vt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Le={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,g=i.allowedAutoPlacements,m=e.options.placement,_=Vt(m),b=l||(_!==m&&p?function(t){if(Vt(t)===vt)return[];var e=me(t);return[be(t),e,be(e)]}(m):[me(m)]),v=[m].concat(b).reduce((function(t,i){return t.concat(Vt(i)===vt?ke(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:g}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,D=L?"width":"height",S=xe(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?_t:bt:k?mt:gt;y[D]>w[D]&&(I=me(I));var N=me(I),P=[];if(o&&P.push(S[x]<=0),a&&P.push(S[I]<=0,S[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var j=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[gt,_t,mt,bt].some((function(e){return t[e]>=0}))}const Ie={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=xe(e,{elementContext:"reference"}),a=xe(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ne={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=kt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Vt(t),s=[bt,gt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Oe({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,g=void 0===p?0:p,m=xe(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Vt(e.placement),b=ce(e.placement),v=!b,y=se(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof g?g(Object.assign({},e.rects,{placement:e.placement})):g,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,D="y"===y?gt:bt,S="y"===y?mt:_t,I="y"===y?"height":"width",N=A[y],P=N+m[D],j=N-m[S],M=f?-T[I]/2:0,H=b===wt?E[I]:T[I],$=b===wt?-T[I]:-E[I],W=e.elements.arrow,B=f&&W?Ut(W):{width:0,height:0},F=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=F[D],R=F[S],q=oe(0,E[I],B[I]),V=v?E[I]/2-M-q-z-O.mainAxis:H-q-z-O.mainAxis,K=v?-E[I]/2+M+q+R+O.mainAxis:$+q+R+O.mainAxis,Q=e.elements.arrow&&ne(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=oe(f?Qt(P,N+V-Y-X):P,N,f?Kt(j,U):j);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?gt:bt,tt="x"===y?mt:_t,et=A[w],it="y"===w?"height":"width",nt=et+m[Z],st=et-m[tt],ot=-1!==[gt,bt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=oe(t,e,i);return n>i?i:n}(at,et,lt):oe(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n,s,o=zt(e),r=zt(e)&&function(t){var e=t.getBoundingClientRect(),i=Xt(e.width)/t.offsetWidth||1,n=Xt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=te(e),l=Yt(t,r),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Wt(e)||we(a))&&(c=(n=e)!==Bt(n)&&zt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ve(n)),zt(e)?((h=Yt(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var $e={placement:"bottom",modifiers:[],strategy:"absolute"};function We(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=Q.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Qe,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=Q.find(Je);for(const i of e){const e=li.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ke,Qe].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=Q.findOne(Ge,t.delegateTarget.parentNode),o=li.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ye,Ge,li.dataApiKeydownHandler),P.on(document,Ye,Ze,li.dataApiKeydownHandler),P.on(document,Xe,li.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",li.clearMenus),P.on(document,Xe,Ge,(function(t){t.preventDefault(),li.getOrCreateInstance(this).toggle()})),g(li);const ci=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",hi=".sticky-top",di="padding-right",ui="margin-right";class fi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,di,(e=>e+t)),this._setElementAttributes(ci,di,(e=>e+t)),this._setElementAttributes(hi,ui,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,di),this._resetElementAttributes(ci,di),this._resetElementAttributes(hi,ui)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of Q.find(t,this._element))e(i)}}const pi="show",gi="mousedown.bs.backdrop",mi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},_i={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class bi extends F{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return mi}static get DefaultType(){return _i}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void m(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(pi),this._emulateAnimation((()=>{m(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(pi),this._emulateAnimation((()=>{this.dispose(),m(t)}))):m(t)}dispose(){this._isAppended&&(P.off(this._element,gi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,gi,(()=>{m(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const vi=".bs.focustrap",yi="backward",wi={autofocus:!0,trapElement:null},Ai={autofocus:"boolean",trapElement:"element"};class Ei extends F{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return wi}static get DefaultType(){return Ai}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,vi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,vi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=Q.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===yi?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?yi:"forward")}}const Ti="hidden.bs.modal",Ci="show.bs.modal",Oi="modal-open",xi="show",ki="modal-static",Li={backdrop:!0,focus:!0,keyboard:!0},Di={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Si extends z{constructor(t,e){super(t,e),this._dialog=Q.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new fi,this._addEventListeners()}static get Default(){return Li}static get DefaultType(){return Di}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,Ci,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Oi),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(xi),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){for(const t of[window,this._dialog])P.off(t,".bs.modal");this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ei({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=Q.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(xi),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{if("Escape"===t.key)return this._config.keyboard?(t.preventDefault(),void this.hide()):void this._triggerBackdropTransition()})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{t.target===t.currentTarget&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Oi),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Ti)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(ki)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(ki),this._queueCallback((()=>{this._element.classList.remove(ki),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Si.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,Ci,(t=>{t.defaultPrevented||P.one(e,Ti,(()=>{a(this)&&this.focus()}))}));const i=Q.findOne(".modal.show");i&&Si.getInstance(i).hide(),Si.getOrCreateInstance(e).toggle(this)})),R(Si),g(Si);const Ii="show",Ni="showing",Pi="hiding",ji=".offcanvas.show",Mi="hidePrevented.bs.offcanvas",Hi="hidden.bs.offcanvas",$i={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Bi extends z{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return $i}static get DefaultType(){return Wi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Ni),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Ii),this._element.classList.remove(Ni),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pi),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Ii,Pi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new fi).reset(),P.trigger(this._element,Hi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new bi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,Mi)}:null})}_initializeFocusTrap(){return new Ei({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,Mi))}))}static jQueryInterface(t){return this.each((function(){const e=Bi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,Hi,(()=>{a(this)&&this.focus()}));const i=Q.findOne(ji);i&&i!==e&&Bi.getInstance(i).hide(),Bi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of Q.find(ji))Bi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of Q.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Bi.getOrCreateInstance(t).hide()})),R(Bi),g(Bi);const Fi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),zi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ri=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,qi=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Fi.has(i)||Boolean(zi.test(t.nodeValue)||Ri.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Vi={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Ki={allowList:Vi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Qi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Xi={entry:"(string|element|function|null)",selector:"(string|element)"};class Yi extends F{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Ki}static get DefaultType(){return Qi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Xi)}_setContent(t,e,i){const n=Q.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)qi(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ui=new Set(["sanitize","allowList","sanitizeFn"]),Gi="fade",Ji="show",Zi=".modal",tn="hide.bs.modal",en="hover",nn="focus",sn={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},on={allowList:Vi,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},rn={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class an extends z{constructor(t,e){if(void 0===qe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=!1,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners()}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled){if(t){const e=this._initializeOnDelegatedTarget(t);return e._activeTrigger.click=!e._activeTrigger.click,void(e._isWithActiveTrigger()?e._enter():e._leave())}this._isShown()?this._leave():this._enter()}}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(Zi),tn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this.tip&&(this.tip.remove(),this.tip=null);const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper?this._popper.update():this._popper=this._createPopper(i),i.classList.add(Ji),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{const t=this._isHovered;this._isHovered=!1,P.trigger(this._element,this.constructor.eventName("shown")),t&&this._leave()}),this.tip,this._isAnimated())}hide(){if(!this._isShown())return;if(P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented)return;const t=this._getTipElement();if(t.classList.remove(Ji),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=!1,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||t.remove(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")),this._disposePopper())}),this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Gi,Ji),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Gi),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Yi({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._config.originalTitle}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Gi)}_isShown(){return this.tip&&this.tip.classList.contains(Ji)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,i=sn[e.toUpperCase()];return Re(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>this.toggle(t)));else if("manual"!==e){const t=e===en?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===en?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?nn:en]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?nn:en]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(Zi),tn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._config.originalTitle;t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ui.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.originalTitle=this._element.getAttribute("title")||"","number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=an.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(an);const ln={...an.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},cn={...an.DefaultType,content:"(null|string|element|function)"};class hn extends an{static get Default(){return ln}static get DefaultType(){return cn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=hn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(hn);const dn="click.bs.scrollspy",un="active",fn="[href]",pn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null},gn={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element"};class mn extends z{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return pn}static get DefaultType(){return gn}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,dn),P.on(this._config.target,dn,fn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:[.1,.5,1],rootMargin:this._getRootMargin()};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_getRootMargin(){return this._config.offset?`${this._config.offset}px 0px -30%`:this._config.rootMargin}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=Q.find(fn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=Q.findOne(e.hash,this._element);a(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(un),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))Q.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(un);else for(const e of Q.parents(t,".nav, .list-group"))for(const t of Q.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(un)}_clearActiveClass(t){t.classList.remove(un);const e=Q.find("[href].active",t);for(const t of e)t.classList.remove(un)}static jQueryInterface(t){return this.each((function(){const e=mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of Q.find('[data-bs-spy="scroll"]'))mn.getOrCreateInstance(t)})),g(mn);const _n="ArrowLeft",bn="ArrowRight",vn="ArrowUp",yn="ArrowDown",wn="active",An="fade",En="show",Tn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Cn=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${Tn}`;class On extends z{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(wn),this._activate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.focus(),t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(En)}),t,t.classList.contains(An)))}_deactivate(t,e){t&&(t.classList.remove(wn),t.blur(),this._deactivate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(En)}),t,t.classList.contains(An)))}_keydown(t){if(![_n,bn,vn,yn].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[bn,yn].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&On.getOrCreateInstance(i).show()}_getChildren(){return Q.find(Cn,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=n(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=Q.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",wn),n(".dropdown-menu",En),n(".dropdown-item",wn),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(wn)}_getInnerElement(t){return t.matches(Cn)?t:Q.findOne(Cn,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=On.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",Tn,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||On.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of Q.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))On.getOrCreateInstance(t)})),g(On);const xn="hide",kn="show",Ln="showing",Dn={animation:"boolean",autohide:"boolean",delay:"number"},Sn={animation:!0,autohide:!0,delay:5e3};class In extends z{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Sn}static get DefaultType(){return Dn}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(xn),d(this._element),this._element.classList.add(kn,Ln),this._queueCallback((()=>{this._element.classList.remove(Ln),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Ln),this._queueCallback((()=>{this._element.classList.add(xn),this._element.classList.remove(Ln,kn),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(kn),super.dispose()}isShown(){return this._element.classList.contains(kn)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=In.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(In),g(In),{Alert:q,Button:K,Carousel:at,Collapse:pt,Dropdown:li,Modal:Si,Offcanvas:Bi,Popover:hn,ScrollSpy:mn,Tab:On,Toast:In,Tooltip:an}})); diff --git a/docs/assets/css/Features-Clean.css b/docs/assets/css/Features-Clean.css deleted file mode 100644 index 5dbb37c9..00000000 --- a/docs/assets/css/Features-Clean.css +++ /dev/null @@ -1,75 +0,0 @@ -.features-clean { - color: #313437; - background-color: #fff; - padding-bottom: 30px; -} - -@media (max-width:767px) { - .features-clean { - padding-bottom: 10px; - } -} - -.features-clean p { - color: #7d8285; -} - -.features-clean h2 { - font-weight: bold; - margin-bottom: 40px; - padding-top: 40px; - color: inherit; -} - -@media (max-width:767px) { - .features-clean h2 { - margin-bottom: 25px; - padding-top: 25px; - font-size: 24px; - } -} - -.features-clean .intro { - font-size: 16px; - max-width: 500px; - margin: 0 auto 60px; -} - -@media (max-width:767px) { - .features-clean .intro { - margin-bottom: 40px; - } -} - -.features-clean .item { - min-height: 100px; - padding-left: 80px; - margin-bottom: 40px; -} - -@media (max-width:767px) { - .features-clean .item { - min-height: 0; - } -} - -.features-clean .item .name { - font-size: 20px; - font-weight: bold; - margin-top: 0; - margin-bottom: 20px; - color: inherit; -} - -.features-clean .item .description { - font-size: 15px; - margin-bottom: 0; -} - -.features-clean .item .icon { - font-size: 40px; - color: #1485ee; - float: left; - margin-left: -65px; -} - diff --git a/docs/assets/css/Footer-Basic.css b/docs/assets/css/Footer-Basic.css deleted file mode 100644 index 985cf4a8..00000000 --- a/docs/assets/css/Footer-Basic.css +++ /dev/null @@ -1,60 +0,0 @@ -.footer-basic { - padding: 40px 0; - background-color: #ffffff; - color: #4b4c4d; -} - -.footer-basic ul { - padding: 0; - list-style: none; - text-align: center; - font-size: 18px; - line-height: 1.6; - margin-bottom: 0; -} - -.footer-basic li { - padding: 0 10px; -} - -.footer-basic ul a { - color: inherit; - text-decoration: none; - opacity: 0.8; -} - -.footer-basic ul a:hover { - opacity: 1; -} - -.footer-basic .social { - text-align: center; - padding-bottom: 25px; -} - -.footer-basic .social > a { - font-size: 24px; - width: 40px; - height: 40px; - line-height: 40px; - display: inline-block; - text-align: center; - border-radius: 50%; - border: 1px solid #ccc; - margin: 0 8px; - color: inherit; - opacity: 0.75; -} - -.footer-basic .social > a:hover { - opacity: 0.9; -} - -.footer-basic .copyright { - margin-top: 15px; - text-align: center; - font-size: 13px; - color: #aaa; - margin-bottom: 0; -} - diff --git a/docs/assets/css/Header-Blue.css b/docs/assets/css/Header-Blue.css deleted file mode 100644 index d650f37e..00000000 --- a/docs/assets/css/Header-Blue.css +++ /dev/null @@ -1,217 +0,0 @@ -.header-blue { - background: linear-gradient(135deg, #172a74, #21a9af); - background-color: #184e8e; - padding-bottom: 80px; - font-family: 'Source Sans Pro', sans-serif; -} - -@media (min-width:768px) { - .header-blue { - padding-bottom: 120px; - } -} - -.header-blue .navbar { - background: transparent; - padding-top: .75rem; - padding-bottom: .75rem; - color: #fff; - border-radius: 0; - box-shadow: none; - border: none; -} - -@media (min-width:768px) { - .header-blue .navbar { - padding-top: 1rem; - padding-bottom: 1rem; - } -} - -.header-blue .navbar .navbar-brand { - font-weight: bold; - color: inherit; -} - -.header-blue .navbar .navbar-brand:hover { - color: #f0f0f0; -} - -.header-blue .navbar .navbar-collapse { - border-top: 1px solid rgba(255,255,255,0.3); - margin-top: .5rem; -} - -@media (min-width:768px) { - .header-blue .navbar .navbar-collapse { - border-color: transparent; - margin: 0; - } -} - -.header-blue .navbar .navbar-collapse span .login { - color: #d9d9d9; - margin-right: .5rem; - text-decoration: none; -} - -.header-blue .navbar .navbar-collapse span .login:hover { - color: #fff; -} - -.header-blue .navbar .navbar-toggler { - border-color: rgba(255,255,255,0.3); -} - -.header-blue .navbar .navbar-toggler:hover, .header-blue .navbar-toggler:focus { - background: none; -} - -@media (min-width: 768px) { - .header-blue .navbar-nav .nav-link { - padding-left: .7rem; - padding-right: .7rem; - } -} - -@media (min-width: 992px) { - .header-blue .navbar-nav .nav-link { - padding-left: 1.2rem; - padding-right: 1.2rem; - } -} - -.header-blue .navbar .navbar-nav > li > .dropdown-menu { - margin-top: -5px; - box-shadow: 0 4px 8px rgba(0,0,0,.1); - background-color: #fff; - border-radius: 2px; -} - -.header-blue .navbar .dropdown-menu .dropdown-item:focus, .header-blue .navbar .dropdown-menu .dropdown-item { - line-height: 2; - color: #37434d; -} - -.header-blue .navbar .dropdown-menu .dropdown-item:focus, .header-blue .navbar .dropdown-menu .dropdown-item:hover { - background: #ebeff1; -} - -.header-blue .action-button, .header-blue .action-button:not(.disabled):active { - border: 1px solid rgba(255,255,255,0.7); - border-radius: 40px; - color: #ebeff1; - box-shadow: none; - text-shadow: none; - padding: .3rem .8rem; - background: transparent; - transition: background-color 0.25s; - outline: none; -} - -.header-blue .action-button:hover { - color: #fff; -} - -.header-blue .navbar form label { - color: #d9d9d9; -} - -.header-blue .navbar form .search-field { - display: inline-block; - width: 80%; - background: none; - border: none; - border-bottom: 1px solid transparent; - border-radius: 0; - color: #ccc; - box-shadow: none; - color: inherit; - transition: border-bottom-color 0.3s; -} - -.header-blue .navbar form .search-field:focus { - border-bottom: 1px solid #ccc; -} - -.header-blue .hero { - margin-top: 20px; - text-align: center; -} - -@media (min-width:768px) { - .header-blue .hero { - margin-top: 60px; - text-align: left; - } -} - -.header-blue .hero h1 { - color: #fff; - font-size: 40px; - margin-top: 0; - margin-bottom: 15px; - font-weight: 300; - line-height: 1.4; -} - -@media (min-width:992px) { - .header-blue .hero h1 { - margin-top: 190px; - margin-bottom: 24px; - line-height: 1.2; - } -} - -.header-blue .hero p { - color: rgba(255,255,255,0.8); - font-size: 20px; - margin-bottom: 30px; - font-weight: 300; -} - -.header-blue .phone-holder { - text-align: right; -} - -.header-blue div.phone-mockup { - position: relative; - max-width: 300px; - margin: 20px; - display: inline-block; - z-index: 1; -} - -.header-blue .phone-mockup img.device { - width: 100%; - height: auto; -} - -.header-blue .phone-mockup .screen { - position: absolute; - width: 94%; - height: 98%; - top: 1%; - left: 3%; - border: 1px solid #444; - border-radius: 20px; - background-color: #aaa; - overflow: hidden; - background: url(screen-content-phone.jpg); - background-size: cover; - background-position: center; - z-index: -1; -} - -.header-blue .phone-mockup .screen:before { - content: ''; - background-color: #fff; - position: absolute; - width: 70%; - height: 140%; - top: -12%; - right: -60%; - transform: rotate(-19deg); - opacity: 0.2; -} - diff --git a/docs/assets/css/Highlight-Blue.css b/docs/assets/css/Highlight-Blue.css deleted file mode 100644 index dc24e054..00000000 --- a/docs/assets/css/Highlight-Blue.css +++ /dev/null @@ -1,64 +0,0 @@ -.highlight-blue { - color: #fff; - background-color: #1e6add; - padding: 50px 0; -} - -.highlight-blue p { - color: #c4d5ef; - line-height: 1.5; -} - -.highlight-blue h2 { - font-weight: normal; - margin-bottom: 25px; - line-height: 1.5; - padding-top: 0; - margin-top: 0; - color: inherit; -} - -.highlight-blue .intro { - font-size: 16px; - max-width: 500px; - margin: 0 auto 25px; -} - -.highlight-blue .buttons { - text-align: center; -} - -.highlight-blue .buttons .btn { - padding: 16px 32px; - margin: 6px; - border: none; - background: none; - box-shadow: none; - text-shadow: none; - opacity: 0.9; - text-transform: uppercase; - font-weight: bold; - font-size: 13px; - letter-spacing: 0.4px; - line-height: 1; -} - -.highlight-blue .buttons .btn:hover { - opacity: 1; -} - -.highlight-blue .buttons .btn:active { - transform: translateY(1px); -} - -.highlight-blue .buttons .btn-primary, .highlight-blue .buttons .btn-primary:active { - border: 2px solid rgba(255,255,255,0.7); - border-radius: 6px; - color: #ebeff1; - box-shadow: none; - text-shadow: none; - padding: 14px 24px; - background: transparent; - transition: background-color 0.25s; -} - diff --git a/docs/assets/css/Highlight-Clean.css b/docs/assets/css/Highlight-Clean.css deleted file mode 100644 index 01ddd1bd..00000000 --- a/docs/assets/css/Highlight-Clean.css +++ /dev/null @@ -1,59 +0,0 @@ -.highlight-clean { - color: #313437; - background-color: #fff; - padding: 50px 0; -} - -.highlight-clean p { - color: #7d8285; -} - -.highlight-clean h2 { - font-weight: bold; - margin-bottom: 25px; - line-height: 1.5; - padding-top: 0; - margin-top: 0; - color: inherit; -} - -.highlight-clean .intro { - font-size: 16px; - max-width: 500px; - margin: 0 auto 25px; -} - -.highlight-clean .buttons { - text-align: center; -} - -.highlight-clean .buttons .btn { - padding: 16px 32px; - margin: 6px; - border: none; - background: none; - box-shadow: none; - text-shadow: none; - opacity: 0.9; - text-transform: uppercase; - font-weight: bold; - font-size: 13px; - letter-spacing: 0.4px; - line-height: 1; - outline: none; - background-color: #ddd; -} - -.highlight-clean .buttons .btn:hover { - opacity: 1; -} - -.highlight-clean .buttons .btn:active { - transform: translateY(1px); -} - -.highlight-clean .buttons .btn-primary { - background-color: #055ada; - color: #fff; -} - diff --git a/docs/assets/css/Navigation-Clean.css b/docs/assets/css/Navigation-Clean.css deleted file mode 100644 index 1df4fd3e..00000000 --- a/docs/assets/css/Navigation-Clean.css +++ /dev/null @@ -1,77 +0,0 @@ -.navigation-clean { - background: #ffffff; - padding-top: .75rem; - padding-bottom: .75rem; - color: #333; - border-radius: 0; - box-shadow: none; - border: none; - margin-bottom: 0; -} - -@media (min-width:768px) { - .navigation-clean { - padding-top: 1rem; - padding-bottom: 1rem; - } -} - -.navigation-clean .navbar-brand { - font-weight: bold; - color: inherit; -} - -.navigation-clean .navbar-brand:hover { - color: #222; -} - -.navigation-clean .navbar-toggler { - border-color: #ddd; -} - -.navigation-clean .navbar-toggler:hover, .navigation-clean .navbar-toggler:focus { - background: none; -} - -.navigation-clean .navbar-toggler { - color: #888; -} - -.navigation-clean.navbar-light .navbar-nav .nav-link.active, .navigation-clean.navbar-light .navbar-nav .nav-link.active:focus, .navigation-clean.navbar-light .navbar-nav .nav-link.active:hover { - color: #8f8f8f; - box-shadow: none; - background: none; - pointer-events: none; -} - -.navigation-clean.navbar .navbar-nav .nav-link { - padding-left: 18px; - padding-right: 18px; -} - -.navigation-clean.navbar-light .navbar-nav .nav-link { - color: #465765; -} - -.navigation-clean.navbar-light .navbar-nav .nav-link:focus, .navigation-clean.navbar-light .navbar-nav .nav-link:hover { - color: #37434d !important; - background-color: transparent; -} - -.navigation-clean .navbar-nav > li > .dropdown-menu { - margin-top: -5px; - box-shadow: none; - background-color: #fff; - border-radius: 2px; -} - -.navigation-clean .dropdown-menu .dropdown-item:focus, .navigation-clean .dropdown-menu .dropdown-item { - line-height: 2; - color: #37434d; -} - -.navigation-clean .dropdown-menu .dropdown-item:focus, .navigation-clean .dropdown-menu .dropdown-item:hover { - background: #eee; - color: inherit; -} - diff --git a/docs/assets/css/Simple-Slider-Simple-Slider.css b/docs/assets/css/Simple-Slider-Simple-Slider.css deleted file mode 100644 index e18d712d..00000000 --- a/docs/assets/css/Simple-Slider-Simple-Slider.css +++ /dev/null @@ -1,25 +0,0 @@ -.simple-slider .swiper-slide { - height: 500px; - background-repeat: no-repeat; - background-size: cover; - background-position: center; -} - -.simple-slider .swiper-button-next, .simple-slider .swiper-button-prev { - width: 50px; - margin-left: 20px; - margin-right: 20px; -} - -@media (max-width:767px) { - .simple-slider .swiper-button-next, .simple-slider .swiper-button-prev { - display: none; - } -} - -@media (max-width:767px) { - .simple-slider .swiper-slide { - height: 360px; - } -} - diff --git a/docs/assets/fonts/FontAwesome.otf b/docs/assets/fonts/FontAwesome.otf deleted file mode 100644 index 401ec0f3..00000000 Binary files a/docs/assets/fonts/FontAwesome.otf and /dev/null differ diff --git a/docs/assets/fonts/fa-brands-400.eot b/docs/assets/fonts/fa-brands-400.eot deleted file mode 100644 index baf40576..00000000 Binary files a/docs/assets/fonts/fa-brands-400.eot and /dev/null differ diff --git a/docs/assets/fonts/fa-brands-400.svg b/docs/assets/fonts/fa-brands-400.svg deleted file mode 100644 index 843c1c78..00000000 --- a/docs/assets/fonts/fa-brands-400.svg +++ /dev/null @@ -1,3535 +0,0 @@ - - - - - -Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/fonts/fa-brands-400.ttf b/docs/assets/fonts/fa-brands-400.ttf deleted file mode 100644 index 99163287..00000000 Binary files a/docs/assets/fonts/fa-brands-400.ttf and /dev/null differ diff --git a/docs/assets/fonts/fa-brands-400.woff b/docs/assets/fonts/fa-brands-400.woff deleted file mode 100644 index f9e3bcd0..00000000 Binary files a/docs/assets/fonts/fa-brands-400.woff and /dev/null differ diff --git a/docs/assets/fonts/fa-brands-400.woff2 b/docs/assets/fonts/fa-brands-400.woff2 deleted file mode 100644 index 51c07aef..00000000 Binary files a/docs/assets/fonts/fa-brands-400.woff2 and /dev/null differ diff --git a/docs/assets/fonts/fa-regular-400.eot b/docs/assets/fonts/fa-regular-400.eot deleted file mode 100644 index 04e25cba..00000000 Binary files a/docs/assets/fonts/fa-regular-400.eot and /dev/null differ diff --git a/docs/assets/fonts/fa-regular-400.svg b/docs/assets/fonts/fa-regular-400.svg deleted file mode 100644 index f1f7e6cb..00000000 --- a/docs/assets/fonts/fa-regular-400.svg +++ /dev/null @@ -1,803 +0,0 @@ - - - - - -Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/fonts/fa-regular-400.ttf b/docs/assets/fonts/fa-regular-400.ttf deleted file mode 100644 index 9c6249c0..00000000 Binary files a/docs/assets/fonts/fa-regular-400.ttf and /dev/null differ diff --git a/docs/assets/fonts/fa-regular-400.woff b/docs/assets/fonts/fa-regular-400.woff deleted file mode 100644 index 2873e438..00000000 Binary files a/docs/assets/fonts/fa-regular-400.woff and /dev/null differ diff --git a/docs/assets/fonts/fa-regular-400.woff2 b/docs/assets/fonts/fa-regular-400.woff2 deleted file mode 100644 index a34bd652..00000000 Binary files a/docs/assets/fonts/fa-regular-400.woff2 and /dev/null differ diff --git a/docs/assets/fonts/fa-solid-900.eot b/docs/assets/fonts/fa-solid-900.eot deleted file mode 100644 index 39716a7b..00000000 Binary files a/docs/assets/fonts/fa-solid-900.eot and /dev/null differ diff --git a/docs/assets/fonts/fa-solid-900.svg b/docs/assets/fonts/fa-solid-900.svg deleted file mode 100644 index cfd0e2f4..00000000 --- a/docs/assets/fonts/fa-solid-900.svg +++ /dev/null @@ -1,4700 +0,0 @@ - - - - - -Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/fonts/fa-solid-900.ttf b/docs/assets/fonts/fa-solid-900.ttf deleted file mode 100644 index ac4baa21..00000000 Binary files a/docs/assets/fonts/fa-solid-900.ttf and /dev/null differ diff --git a/docs/assets/fonts/fa-solid-900.woff b/docs/assets/fonts/fa-solid-900.woff deleted file mode 100644 index 23002f8a..00000000 Binary files a/docs/assets/fonts/fa-solid-900.woff and /dev/null differ diff --git a/docs/assets/fonts/fa-solid-900.woff2 b/docs/assets/fonts/fa-solid-900.woff2 deleted file mode 100644 index b37f209d..00000000 Binary files a/docs/assets/fonts/fa-solid-900.woff2 and /dev/null differ diff --git a/docs/assets/fonts/font-awesome.min.css b/docs/assets/fonts/font-awesome.min.css deleted file mode 100644 index 540440ce..00000000 --- a/docs/assets/fonts/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/docs/assets/fonts/fontawesome-all.min.css b/docs/assets/fonts/fontawesome-all.min.css deleted file mode 100644 index 27e7ddd2..00000000 --- a/docs/assets/fonts/fontawesome-all.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Font Awesome Free 5.12.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/docs/assets/fonts/fontawesome-webfont.eot b/docs/assets/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca9..00000000 Binary files a/docs/assets/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/docs/assets/fonts/fontawesome-webfont.svg b/docs/assets/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e..00000000 --- a/docs/assets/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/fonts/fontawesome-webfont.ttf b/docs/assets/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2f..00000000 Binary files a/docs/assets/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/docs/assets/fonts/fontawesome-webfont.woff b/docs/assets/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4..00000000 Binary files a/docs/assets/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/docs/assets/fonts/fontawesome-webfont.woff2 b/docs/assets/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc60..00000000 Binary files a/docs/assets/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/docs/assets/fonts/fontawesome5-overrides.min.css b/docs/assets/fonts/fontawesome5-overrides.min.css deleted file mode 100644 index 498a1042..00000000 --- a/docs/assets/fonts/fontawesome5-overrides.min.css +++ /dev/null @@ -1 +0,0 @@ -.fab.fa-bitcoin:before{content:"\f379"}.far.fa-calendar:before,.fas.fa-calendar:before{content:"\f133"}.far.fa-clipboard:before,.fas.fa-clipboard:before{content:"\f328"}.fab.fa-facebook-f:before{content:"\f39e"}.fab.fa-google-plus:before{content:"\f2b3"}.fas.fa-hotel:before{content:"\f594"}.fab.fa-linkedin:before{content:"\f08c"}.fas.fa-reply:before{content:"\f3e5"}.fas.fa-thermometer:before{content:"\f491"}.fab.fa-vimeo:before{content:"\f40a"}.far.fa-window-close:before,.fas.fa-window-close:before{content:"\f410"}.fab.fa-youtube-square:before{content:"\f431"} \ No newline at end of file diff --git a/docs/assets/fonts/ionicons.eot b/docs/assets/fonts/ionicons.eot deleted file mode 100644 index 92a3f20a..00000000 Binary files a/docs/assets/fonts/ionicons.eot and /dev/null differ diff --git a/docs/assets/fonts/ionicons.min.css b/docs/assets/fonts/ionicons.min.css deleted file mode 100644 index baba9e93..00000000 --- a/docs/assets/fonts/ionicons.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@charset "UTF-8";/*! - Ionicons, v2.0.0 - Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ - https://twitter.com/benjsperry https://twitter.com/ionicframework - MIT License: https://github.com/driftyco/ionicons - - Android-style icons originally built by Google’s - Material Design Icons: https://github.com/google/material-design-icons - used under CC BY http://creativecommons.org/licenses/by/4.0/ - Modified icons to fit ionicon’s grid from original. -*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=2.0.0");src:url("../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"),url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"),url("../fonts/ionicons.woff?v=2.0.0") format("woff"),url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"} diff --git a/docs/assets/fonts/ionicons.svg b/docs/assets/fonts/ionicons.svg deleted file mode 100644 index 49fc8f36..00000000 --- a/docs/assets/fonts/ionicons.svg +++ /dev/null @@ -1,2230 +0,0 @@ - - - - - -Created by FontForge 20120731 at Thu Dec 4 09:51:48 2014 - By Adam Bradley -Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/fonts/ionicons.ttf b/docs/assets/fonts/ionicons.ttf deleted file mode 100644 index c4e46324..00000000 Binary files a/docs/assets/fonts/ionicons.ttf and /dev/null differ diff --git a/docs/assets/fonts/ionicons.woff b/docs/assets/fonts/ionicons.woff deleted file mode 100644 index 5f3a14e0..00000000 Binary files a/docs/assets/fonts/ionicons.woff and /dev/null differ diff --git a/docs/assets/img/RetroDeck Wallpaper.png b/docs/assets/img/RetroDeck Wallpaper.png deleted file mode 100644 index c4458b8c..00000000 Binary files a/docs/assets/img/RetroDeck Wallpaper.png and /dev/null differ diff --git a/docs/assets/img/icon_circle_16x16.png b/docs/assets/img/icon_circle_16x16.png deleted file mode 100644 index 244350d9..00000000 Binary files a/docs/assets/img/icon_circle_16x16.png and /dev/null differ diff --git a/docs/assets/img/icon_circle_1_32x32.png b/docs/assets/img/icon_circle_1_32x32.png deleted file mode 100644 index ee50205e..00000000 Binary files a/docs/assets/img/icon_circle_1_32x32.png and /dev/null differ diff --git a/docs/assets/img/icon_circle_2_180x180.png b/docs/assets/img/icon_circle_2_180x180.png deleted file mode 100644 index bab446bb..00000000 Binary files a/docs/assets/img/icon_circle_2_180x180.png and /dev/null differ diff --git a/docs/assets/img/icon_circle_3_192x192.png b/docs/assets/img/icon_circle_3_192x192.png deleted file mode 100644 index d55c7e67..00000000 Binary files a/docs/assets/img/icon_circle_3_192x192.png and /dev/null differ diff --git a/docs/assets/img/icon_circle_4_512x512.png b/docs/assets/img/icon_circle_4_512x512.png deleted file mode 100644 index f06467a3..00000000 Binary files a/docs/assets/img/icon_circle_4_512x512.png and /dev/null differ diff --git a/docs/assets/img/logo_stacked_esde.png b/docs/assets/img/logo_stacked_esde.png deleted file mode 100644 index 9ba88276..00000000 Binary files a/docs/assets/img/logo_stacked_esde.png and /dev/null differ diff --git a/docs/assets/img/logo_unstacked.svg b/docs/assets/img/logo_unstacked.svg deleted file mode 100644 index 9de96f02..00000000 --- a/docs/assets/img/logo_unstacked.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - diff --git a/docs/assets/img/rd-esde-logo.svg b/docs/assets/img/rd-esde-logo.svg deleted file mode 100644 index e4b76a32..00000000 --- a/docs/assets/img/rd-esde-logo.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/img/screen01.jpeg b/docs/assets/img/screen01.jpeg deleted file mode 100644 index 8918a07e..00000000 Binary files a/docs/assets/img/screen01.jpeg and /dev/null differ diff --git a/docs/assets/img/screen02.jpeg b/docs/assets/img/screen02.jpeg deleted file mode 100644 index 9e2de1a4..00000000 Binary files a/docs/assets/img/screen02.jpeg and /dev/null differ diff --git a/docs/assets/img/screen03.jpeg b/docs/assets/img/screen03.jpeg deleted file mode 100644 index 980a8794..00000000 Binary files a/docs/assets/img/screen03.jpeg and /dev/null differ diff --git a/docs/assets/img/screen04.jpeg b/docs/assets/img/screen04.jpeg deleted file mode 100644 index db74ee0c..00000000 Binary files a/docs/assets/img/screen04.jpeg and /dev/null differ diff --git a/docs/assets/img/screen05.jpeg b/docs/assets/img/screen05.jpeg deleted file mode 100644 index 3ce14b43..00000000 Binary files a/docs/assets/img/screen05.jpeg and /dev/null differ diff --git a/docs/assets/img/screen06.jpeg b/docs/assets/img/screen06.jpeg deleted file mode 100644 index 4d2e52f1..00000000 Binary files a/docs/assets/img/screen06.jpeg and /dev/null differ diff --git a/docs/assets/js/Lightbox-Gallery.js b/docs/assets/js/Lightbox-Gallery.js deleted file mode 100644 index cce539fa..00000000 --- a/docs/assets/js/Lightbox-Gallery.js +++ /dev/null @@ -1,3 +0,0 @@ -if (document.querySelectorAll('[data-bss-baguettebox]').length > 0) { - baguetteBox.run('[data-bss-baguettebox]', { animation: 'slideIn' }); -} \ No newline at end of file diff --git a/docs/assets/js/Simple-Slider.js b/docs/assets/js/Simple-Slider.js deleted file mode 100644 index 49ae5d05..00000000 --- a/docs/assets/js/Simple-Slider.js +++ /dev/null @@ -1,19 +0,0 @@ -document.addEventListener("DOMContentLoaded", function() { - - // Initializing the swiper plugin for the slider. - // Read more here: http://idangero.us/swiper/api/ - - var mySwiper = new Swiper('.swiper-container', { - loop: true, - pagination: { - el: '.swiper-pagination' , - clickable: true - }, - paginationClickable: true, - navigation: { - nextEl: '.swiper-button-next', - prevEl: '.swiper-button-prev' - } - }); - -}); \ No newline at end of file diff --git a/docs/assets/js/scroll.js b/docs/assets/js/scroll.js deleted file mode 100644 index 3ae27e07..00000000 --- a/docs/assets/js/scroll.js +++ /dev/null @@ -1,10 +0,0 @@ -//add smooth scrolling when clicking any anchor link -document.querySelectorAll('a[href^="#"]').forEach(anchor => { - anchor.addEventListener('click', function (e) { - e.preventDefault(); - document.querySelector(this.getAttribute('href')).scrollIntoView({ - behavior: 'smooth' - }); - }); -}); -// Go to Other Element Smoothly \ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index eaf0043b..00000000 --- a/docs/index.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - RetroDECK - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-

-

RetroDECK is a polished and beginner-friendly environment for playing your retro games on Steam Deck and Linux Desktop, available with just one click from the Discover app or wherever you get your flatpaks.

-
- - -
-
- - - -
-
-
-
-

POWERED BY ES-DE & THE RETRODECK FRAMEWORK

-

Together with ES-DE, other software and RetroDECK's own Framework. We are trying to bring you the best all-in-one system out there.

-
-
-
-
- -
-
- -
-

designed for you

-
- -
-
-

pickup and play

-

No configuration is needed to start. You provide the games and we provide the play.

-
-
-

quick resume

-

Quit your game and pick it up exactly where you left off.

-
-
-

rewind & fast forward

-

Go back in time and retry without having to restart your game or skip over that long conversation.

-
-
-

The Configurator

-

A super powerful multi-tool interface that allows you to have quick access to the advanced functions and tweak them to your desire.

-
-
-

Flatpak

-

Everything is contained within one application and not over your entire filesystem. Only one place to look and one place to backu.!

-
-
-

Use your system

-

With RetroDECK there is no need to replace your existing Linux / SteamOS to get a all-in-one retro gaming solution. Install it on what you already have.

-
-
-

Hotkey System

-

Features a in-depth global hotkey system with radial menus in addition to button combos via Steam Input.

-
-
-

cheats

-

Can't surpass THAT point? Don't want to farm? Enable cheats and play smoothly.

-
-
-

metadata & Images

-

From the ES-DE frontend you can pull information to your library to create a beautiful user experience from various sources, that fits your style.

-
-
-

Retro Achievements

-

Get rewarded while you play! RetroDECK tracks your progress and awards you when you go the extra mile.

-
-
-
-
- -
-
-
-
-

Always evolving & Improving

-

The RetroDECK Team always have several things in the works, what follows is just a tiny selection. To stay up to date on latest RetroDECK news check the the Wiki and join the Discord.

-
- -
-
-
-
-
- -
-

Planned / In-progress Features

-
- -
-
-

online gaming

-

Tools to make it easier to play with your friends online.

-
-
-

cloud saves and backup

-

RetroDECK will backup your progression and sync it across multiple devices.

-
-
-

Multi-User System

-

Use local RetroDECK users or bind Steam Deck users to your own saves and emulator configurations.

-
-
-

Configurator Godot Edition

-

The new controller friendly configurator with even more advanced tools.

-
-
-

Add seperate games to Steam

-

Tools for adding all your favorite games as seperate entries in Steam with the click of a button.

-
-
-

More Content

-

RetroDECK will support even more Emulators / Game Engines / Tools and Systems.

-
-
-
-
- -
-
-
-
-

Support RetroDECK or the software we use

-

Help us keep the game preservation ecosystem alive and healthy.

-
- -
-
-
- -
- - - - -
- - - - - - - - - diff --git a/emu-configs/PCSX2/GS.ini b/emu-configs/PCSX2/GS.ini index 93ca603a..59ad1298 100644 --- a/emu-configs/PCSX2/GS.ini +++ b/emu-configs/PCSX2/GS.ini @@ -38,18 +38,18 @@ UserHacks_CPU_FB_Conversion = 0 UserHacks_DisableDepthSupport = 0 UserHacks_DisablePartialInvalidation = 1 UserHacks_Disable_Safe_Features = 0 -UserHacks_HalfPixelOffset = 0 -UserHacks_Half_Bottom_Override = -1 -UserHacks_SkipDraw_End = 0 -UserHacks_SkipDraw_Start = 0 +UserHacks_HalfPixelOffset = 1 +UserHacks_Half_Bottom_Override = 1 +UserHacks_SkipDraw = 0 +UserHacks_SkipDraw_Offset = 0 UserHacks_TCOffsetX = 0 UserHacks_TCOffsetY = 0 UserHacks_TextureInsideRt = 0 UserHacks_TriFilter = 0 UserHacks_WildHack = 0 -UserHacks_align_sprite_X = 0 +UserHacks_align_sprite_X = 1 UserHacks_merge_pp_sprite = 0 -UserHacks_round_sprite_offset = 0 +UserHacks_round_sprite_offset = 2 aa1 = 1 accurate_blending_unit = 1 accurate_date = 1 @@ -58,7 +58,8 @@ capture_enabled = 0 capture_out_dir = /tmp/GS_Capture capture_threads = 4 conservative_framebuffer = 1 -crc_hack_level = -1 +crc_hack_level = 4 +disable_hw_gl_draw = 0 disable_shader_cache = 0 dithering_ps2 = 2 dump = 0 @@ -70,8 +71,14 @@ interlace = 7 linear_present = 1 mipmap = 1 mipmap_hw = -1 +override_GL_ARB_clear_texture = -1 +override_GL_ARB_direct_state_access = -1 +override_GL_ARB_gpu_shader5 = -1 override_GL_ARB_shader_image_load_store = -1 override_GL_ARB_sparse_texture = -1 +override_GL_ARB_sparse_texture2 = -1 +override_GL_ARB_texture_barrier = -1 +override_geometry_shader = -1 paltex = 0 png_compression_level = 1 preload_frame_with_gs_data = 0 diff --git a/emu-configs/PCSX2/PCSX2.ini b/emu-configs/PCSX2/PCSX2.ini index bd77bf0f..c818b225 100644 --- a/emu-configs/PCSX2/PCSX2.ini +++ b/emu-configs/PCSX2/PCSX2.ini @@ -1,11 +1,16 @@ [UI] SettingsVersion = 1 -MainWindowGeometry = AdnQywADAAAAAAAAAAAAAAAAA7UAAAJ/AAAAAAAAAAAAAAO1AAACfwAAAAAAAAAABQAAAAAAAAAAAAAAA7UAAAJ/ -MainWindowState = AAAA/wAAAAD9AAAAAAAAA7YAAAJXAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIAAAAAAP////8AAAAAAAAAAA== +InhibitScreensaver = true +MainWindowGeometry = AdnQywADAAAAAAaHAAADIQAACqAAAAXWAAAGhwAAAz0AAAqgAAAF1gAAAAAAAAAADwAAAAaHAAADPQAACqAAAAXW +MainWindowState = AAAA/wAAAAD9AAAAAAAABBoAAAJxAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIAAAAAAP////8AAAAAAAAAAA== PauseOnFocusLoss = true StartFullscreen = true +StartPaused = false ConfirmShutdown = false - +HideMouseCursor = true +RenderToSeparateWindow = false +HideMainWindowWhenRunning = false +DisableWindowResize = false [EmuCore] CdvdVerboseReads = false @@ -19,16 +24,18 @@ EnableNoInterlacingPatches = false EnableRecordingTools = true EnableGameFixes = true SaveStateOnShutdown = false +EnableDiscordPresence = true +InhibitScreensaver = true ConsoleToStdio = false HostFs = false -PatchBios = false -PatchRegion = BackupSavestate = true SavestateZstdCompression = true McdEnableEjection = true McdFolderAutoManage = true +WarnAboutUnsafeSettings = true GzipIsoIndexTemplate = $(f).pindex.tmp BlockDumpSaveDirectory = +EnableFastBoot = true [EmuCore/Speedhacks] @@ -58,29 +65,34 @@ EnableIOP = true EnableEECache = false EnableVU0 = true EnableVU1 = true -vuOverflow = true -vuExtraOverflow = false -vuSignOverflow = false -vuUnderflow = false +EnableFastmem = true +PauseOnTLBMiss = false +vu0Overflow = true +vu0ExtraOverflow = false +vu0SignOverflow = false +vu0Underflow = false +vu1Overflow = true +vu1ExtraOverflow = false +vu1SignOverflow = false +vu1Underflow = false fpuOverflow = true fpuExtraOverflow = false fpuFullMode = false -StackFrameChecks = false -PreBlockCheckEE = false -PreBlockCheckIOP = false [EmuCore/GS] VsyncQueueSize = 2 FrameLimitEnable = true VsyncEnable = 0 -FramerateNTSC = 59.940000 -FrameratePAL = 50.000000 +FramerateNTSC = 59.94 +FrameratePAL = 50 SyncToHostRefreshRate = false AspectRatio = Auto 4:3/3:2 FMVAspectRatioSwitch = Off -Zoom = 100.000000 -StretchY = 100.000000 +ScreenshotSize = 0 +ScreenshotFormat = 0 +ScreenshotQuality = 50 +StretchY = 100 CropLeft = 0 CropTop = 0 CropRight = 0 @@ -90,13 +102,12 @@ disable_interlace_offset = false pcrtc_offsets = false pcrtc_overscan = false IntegerScaling = false -linear_present = true UseDebugDevice = false UseBlitSwapChain = false disable_shader_cache = false DisableDualSourceBlend = false DisableFramebufferFetch = false -ThreadedPresentation = false +DisableThreadedPresentation = false SkipDuplicateFrames = false OsdShowMessages = true OsdShowSpeed = false @@ -106,26 +117,30 @@ OsdShowGPU = false OsdShowResolution = false OsdShowGSStats = false OsdShowIndicators = true -HWDisableReadbacks = false -accurate_date = true +OsdShowSettings = false +OsdShowInputs = false +OsdShowFrameTimes = false +HWSpinGPUForReadbacks = false +HWSpinCPUForReadbacks = false paltex = false autoflush_sw = true preload_frame_with_gs_data = false -wrap_gs_mem = false mipmap = true UserHacks = false UserHacks_align_sprite_X = false UserHacks_AutoFlush = false UserHacks_CPU_FB_Conversion = false +UserHacks_ReadTCOnClose = false UserHacks_DisableDepthSupport = false UserHacks_DisablePartialInvalidation = false UserHacks_Disable_Safe_Features = false UserHacks_merge_pp_sprite = false UserHacks_WildHack = false -UserHacks_TextureInsideRt = false +UserHacks_TextureInsideRt = 0 +UserHacks_TargetPartialInvalidation = false +UserHacks_EstimateTextureRegion = false fxaa = false ShadeBoost = false -shaderfx = false dump = false save = false savef = false @@ -139,19 +154,28 @@ DumpPaletteTextures = true LoadTextureReplacements = false LoadTextureReplacementsAsync = true PrecacheTextureReplacements = false -deinterlace = 7 -OsdScale = 250 -Renderer = -1 +EnableVideoCapture = true +EnableVideoCaptureParameters = false +VideoCaptureAutoResolution = false +EnableAudioCapture = true +EnableAudioCaptureParameters = false +linear_present_mode = 1 +deinterlace_mode = 0 +OsdScale = 100 +Renderer = 14 upscale_multiplier = 1 mipmap_hw = -1 accurate_blending_unit = 1 crc_hack_level = -1 filter = 2 texture_preloading = 2 -GSDumpCompression = 1 +GSDumpCompression = 2 +HWDownloadMode = 0 +CASMode = 0 +CASSharpness = 50 dithering_ps2 = 2 MaxAnisotropy = 0 -extrathreads = 2 +extrathreads = 3 extrathreads_height = 4 TVShader = 0 UserHacks_SkipDraw_Start = 0 @@ -162,17 +186,45 @@ UserHacks_round_sprite_offset = 0 UserHacks_TCOffsetX = 0 UserHacks_TCOffsetY = 0 UserHacks_CPUSpriteRenderBW = 0 -UserHacks_TriFilter = -1 +UserHacks_CPUCLUTRender = 0 +UserHacks_GPUTargetCLUTMode = 0 +TriFilter = -1 OverrideTextureBarriers = -1 OverrideGeometryShaders = -1 ShadeBoost_Brightness = 50 ShadeBoost_Contrast = 50 ShadeBoost_Saturation = 50 +png_compression_level = 1 saven = 0 savel = 5000 -Adapter = -shaderfx_conf = shaders/GS_FX_Settings.ini -shaderfx_glsl = shaders/GS.fx +CaptureContainer = mp4 +VideoCaptureCodec = +VideoCaptureParameters = +AudioCaptureCodec = +AudioCaptureParameters = +VideoCaptureBitrate = 6000 +VideoCaptureWidth = 640 +VideoCaptureHeight = 480 +AudioCaptureBitrate = 160 +Adapter = (Default) +HWDumpDirectory = +SWDumpDirectory = + +[SPU2/Debug] +Global_Enable = false +Show_Messages = false +Show_Messages_Key_On_Off = false +Show_Messages_Voice_Off = false +Show_Messages_DMA_Transfer = false +Show_Messages_AutoDMA = false +Show_Messages_Overruns = false +Show_Messages_CacheStats = false +Log_Register_Access = false +Log_DMA_Transfers = false +Log_WAVE_Output = false +Dump_Info = false +Dump_Memory = false +Dump_Regs = false [SPU2/Mixing] @@ -190,7 +242,11 @@ VolumeAdjustLFE = 0.000000 [SPU2/Output] OutputModule = cubeb -Latency = 100 +BackendName = +DeviceName = +Latency = 60 +OutputLatency = 20 +OutputLatencyMinimal = false SynchMode = 0 SpeakerConfiguration = 0 DplDecodingLevel = 0 @@ -199,7 +255,7 @@ DplDecodingLevel = 0 [DEV9/Eth] EthEnable = false EthApi = Unset -EthDevice = +EthDevice = EthLogDNS = false InterceptDHCP = false PS2IP = 0.0.0.0 @@ -229,6 +285,7 @@ FpuMulHack = false FpuNegDivHack = false XgKickHack = false EETimingHack = false +InstantDMAHack = false SoftwareRendererFMVHack = false SkipMPEGHack = false OPHFlagHack = false @@ -241,6 +298,7 @@ IbitHack = false VUSyncHack = false VUOverflowHack = false BlitInternalFPSHack = false +FullVU0SyncHack = false [EmuCore/Profiler] @@ -266,15 +324,34 @@ Enabled = false EE.bitset = 0 IOP.bitset = 0 +[USB1] +Type = None + + +[USB2] +Type = None + + +[Achievements] +Enabled = false +TestMode = false +UnofficialTestMode = false +RichPresence = true +ChallengeMode = false +Leaderboards = true +Notifications = true +SoundEffects = true +PrimedIndicators = true + [Filenames] -BIOS = +BIOS = [Framerate] -NominalScalar = 1.000000 -TurboScalar = 2.000000 -SlomoScalar = 0.500000 +NominalScalar = 1 +TurboScalar = 2 +SlomoScalar = 0.5 [MemoryCards] @@ -303,14 +380,18 @@ SaveStates = RETRODECKHOMEDIR/states/ps2/pcsx2 MemoryCards = RETRODECKHOMEDIR/saves/ps2/pcsx2/memcards Logs = logs Cheats = cheats +Covers = covers CheatsWS = cheats_ws CheatsNI = cheats_ni Cache = cache Textures = textures InputProfiles = inputprofiles +Videos = videos [InputSources] +Keyboard = true +Mouse = true SDL = true SDLControllerEnhancedMode = false XInput = false @@ -370,6 +451,7 @@ R1 = SDL-0/RightShoulder R2 = SDL-0/+RightTrigger L3 = SDL-0/LeftStick R3 = SDL-0/RightStick +Analog = SDL-0/Guide LUp = SDL-0/-LeftY LRight = SDL-0/+LeftX LDown = SDL-0/+LeftY @@ -383,12 +465,39 @@ LargeMotor = SDL-0/LargeMotor [Pad2] -Type = None +Type = DualShock2 Deadzone = 0.000000 AxisScale = 1.330000 LargeMotorScale = 1.000000 SmallMotorScale = 1.000000 -PressureModifier = 0.500000 +PressureModifier = 0.300000 +Up = SDL-1/DPadUp +Right = SDL-1/DPadRight +Down = SDL-1/DPadDown +Left = SDL-1/DPadLeft +Triangle = SDL-1/Y +Circle = SDL-1/B +Cross = SDL-1/A +Square = SDL-1/X +Select = SDL-1/Back +Start = SDL-1/Start +L1 = SDL-1/LeftShoulder +L2 = SDL-1/+LeftTrigger +R1 = SDL-1/RightShoulder +R2 = SDL-1/+RightTrigger +L3 = SDL-1/LeftStick +R3 = SDL-1/RightStick +Analog = SDL-1/Guide +LUp = SDL-1/-LeftY +LRight = SDL-1/+LeftX +LDown = SDL-1/+LeftY +LLeft = SDL-1/-LeftX +RUp = SDL-1/-RightY +RRight = SDL-1/+RightX +RDown = SDL-1/+RightY +RLeft = SDL-1/-RightX +LargeMotor = SDL-1/LargeMotor +SmallMotor = SDL-1/SmallMotor [Pad3] @@ -452,6 +561,6 @@ RecursivePaths = RETRODECKHOMEDIR/roms/ps2 [Achievements] Enabled = false ChallengeMode = false -Username = -Token = -LoginTimestamp = +Username = +Token = +LoginTimestamp = diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P1-Gyro.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P1-Gyro.xml new file mode 100644 index 00000000..83531018 --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/SteamInput-P1-Gyro.xml @@ -0,0 +1,142 @@ + + + Wii U GamePad + SteamInput-P1-Gyro + + DSUController + 0 + Controller 1 + true + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + 127.0.0.1 + 26760 + + + + SDLController + 0_03000000de280000ff11000001000000 + Steam Virtual Gamepad + 0 + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 24 + + + + 23 + + + + 22 + + + + 21 + + + + 20 + + + + 19 + + + + 18 + + + + 17 + + + + 16 + + + + 15 + + + + 14 + + + + 13 + + + + 12 + + + + 11 + + + + 10 + + + + 9 + + + + 8 + + + + 7 + + + + 6 + + + + 5 + + + + 4 + + + + 3 + + + + 2 + + + + 1 + + + + + diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P1.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P1.xml new file mode 100644 index 00000000..e62e1b06 --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/SteamInput-P1.xml @@ -0,0 +1,121 @@ + + + Wii U GamePad + SteamInput-P1 + + SDLController + 0_03000000de280000ff11000001000000 + Steam Virtual Gamepad + 0 + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 24 + + + + 23 + + + + 22 + + + + 21 + + + + 20 + + + + 19 + + + + 18 + + + + 17 + + + + 16 + + + + 15 + + + + 14 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 10 + + + + 11 + + + + 12 + + + + 13 + + + + + diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P2.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P2.xml new file mode 100644 index 00000000..2311676f --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/SteamInput-P2.xml @@ -0,0 +1,121 @@ + + + Wii U Pro Controller + SteamInput-P2 + + SDLController + 1_03000000de280000ff11000001000000 + Steam Virtual Gamepad + 0 + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 25 + + + + 24 + + + + 23 + + + + 22 + + + + 21 + + + + 20 + + + + 19 + + + + 18 + + + + 17 + + + + 16 + + + + 15 + + + + 14 + + + + 13 + + + + 12 + + + + 10 + + + + 9 + + + + 8 + + + + 7 + + + + 6 + + + + 5 + + + + 4 + + + + 3 + + + + 2 + + + + 1 + + + + + diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P3.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P3.xml new file mode 100644 index 00000000..b79243d5 --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/SteamInput-P3.xml @@ -0,0 +1,121 @@ + + + Wii U Pro Controller + SteamInput-P3 + + SDLController + 2_03000000de280000ff11000001000000 + Steam Virtual Gamepad + 0 + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 13 + + + + 14 + + + + 15 + + + + 16 + + + + 17 + + + + 18 + + + + 19 + + + + 20 + + + + 21 + + + + 22 + + + + 23 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 10 + + + + 12 + + + + 25 + + + + 24 + + + + + diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P4.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P4.xml new file mode 100644 index 00000000..ce184168 --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/SteamInput-P4.xml @@ -0,0 +1,121 @@ + + + Wii U Pro Controller + SteamInput-P4 + + SDLController + 3_03000000de280000ff11000001000000 + Steam Virtual Gamepad + 0 + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 13 + + + + 14 + + + + 15 + + + + 16 + + + + 17 + + + + 18 + + + + 19 + + + + 20 + + + + 21 + + + + 22 + + + + 23 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 10 + + + + 12 + + + + 25 + + + + 24 + + + + + diff --git a/emu-configs/cemu/controllerProfiles/controller0.xml b/emu-configs/cemu/controllerProfiles/controller0.xml index d39fbe71..e62e1b06 100644 --- a/emu-configs/cemu/controllerProfiles/controller0.xml +++ b/emu-configs/cemu/controllerProfiles/controller0.xml @@ -1,11 +1,12 @@ Wii U GamePad + SteamInput-P1 SDLController - 0_030079f6de280000ff11000001000000 + 0_03000000de280000ff11000001000000 Steam Virtual Gamepad - 1 + 0 0.25 1 @@ -65,19 +66,19 @@ 1 - - - - 2 + + 2 + + 3 - + 4 - + 5 diff --git a/emu-configs/cemu/controllerProfiles/controller1.xml b/emu-configs/cemu/controllerProfiles/controller1.xml new file mode 100644 index 00000000..8cd44de7 --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/controller1.xml @@ -0,0 +1,120 @@ + + + Wii U Pro Controller + SteamInput-P2 + + SDLController + 1_03000000de280000ff11000001000000 + Steam Virtual Gamepad + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 13 + + + + 14 + + + + 15 + + + + 16 + + + + 17 + + + + 18 + + + + 19 + + + + 20 + + + + 21 + + + + 22 + + + + 23 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 10 + + + + 12 + + + + 25 + + + + 24 + + + + + diff --git a/emu-configs/cemu/controllerProfiles/controller2.xml b/emu-configs/cemu/controllerProfiles/controller2.xml new file mode 100644 index 00000000..ed9033cf --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/controller2.xml @@ -0,0 +1,120 @@ + + + Wii U Pro Controller + SteamInput-P3 + + SDLController + 2_03000000de280000ff11000001000000 + Steam Virtual Gamepad + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 24 + + + + 25 + + + + 12 + + + + 10 + + + + 9 + + + + 8 + + + + 7 + + + + 6 + + + + 5 + + + + 4 + + + + 3 + + + + 13 + + + + 14 + + + + 1 + + + + 15 + + + + 2 + + + + 16 + + + + 17 + + + + 18 + + + + 19 + + + + 20 + + + + 21 + + + + 22 + + + + 23 + + + + + diff --git a/emu-configs/cemu/controllerProfiles/controller3.xml b/emu-configs/cemu/controllerProfiles/controller3.xml new file mode 100644 index 00000000..c2c639ad --- /dev/null +++ b/emu-configs/cemu/controllerProfiles/controller3.xml @@ -0,0 +1,120 @@ + + + Wii U Pro Controller + SteamInput-P4 + + SDLController + 3_03000000de280000ff11000001000000 + Steam Virtual Gamepad + + 0.25 + 1 + + + 0.25 + 1 + + + 0.25 + 1 + + + + 24 + + + + 25 + + + + 12 + + + + 10 + + + + 9 + + + + 8 + + + + 7 + + + + 6 + + + + 5 + + + + 4 + + + + 3 + + + + 13 + + + + 14 + + + + 1 + + + + 15 + + + + 2 + + + + 16 + + + + 17 + + + + 18 + + + + 19 + + + + 20 + + + + 21 + + + + 22 + + + + 23 + + + + + diff --git a/emu-configs/cemu/settings.xml b/emu-configs/cemu/settings.xml index af643efb..62a1e269 100644 --- a/emu-configs/cemu/settings.xml +++ b/emu-configs/cemu/settings.xml @@ -101,7 +101,7 @@ 2147483649 false - 0 + 1 1 @@ -110,4 +110,4 @@ - \ No newline at end of file + diff --git a/emu-configs/citra/qt-config.ini b/emu-configs/citra/qt-config.ini index d67c1316..989f06ee 100644 --- a/emu-configs/citra/qt-config.ini +++ b/emu-configs/citra/qt-config.ini @@ -55,11 +55,13 @@ profiles\1\button_gpio14="code:80,engine:keyboard" profiles\1\button_gpio14\default=true profiles\1\button_home="code:66,engine:keyboard" profiles\1\button_home\default=true -profiles\1\button_l="button:4,engine:sdl,guid:030079f6de280000ff11000001000000,port:0" +profiles\1\button_l="axis:2,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5" profiles\1\button_l\default=false profiles\1\button_left="direction:left,engine:sdl,guid:030079f6de280000ff11000001000000,hat:0,port:0" profiles\1\button_left\default=false -profiles\1\button_r="button:5,engine:sdl,guid:030079f6de280000ff11000001000000,port:0" +profiles\1\button_power="code:86,engine:keyboard" +profiles\1\button_power\default=true +profiles\1\button_r="axis:5,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5" profiles\1\button_r\default=false profiles\1\button_right="direction:right,engine:sdl,guid:030079f6de280000ff11000001000000,hat:0,port:0" profiles\1\button_right\default=false @@ -73,16 +75,16 @@ profiles\1\button_x="button:2,engine:sdl,guid:030079f6de280000ff11000001000000,p profiles\1\button_x\default=false profiles\1\button_y="button:3,engine:sdl,guid:030079f6de280000ff11000001000000,port:0" profiles\1\button_y\default=false -profiles\1\button_zl="axis:2,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5" +profiles\1\button_zl="button:4,engine:sdl,guid:030079f6de280000ff11000001000000,port:0" profiles\1\button_zl\default=false -profiles\1\button_zr="axis:5,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5" +profiles\1\button_zr="button:5,engine:sdl,guid:030079f6de280000ff11000001000000,port:0" profiles\1\button_zr\default=false profiles\1\c_stick="axis_x:3,axis_y:4,deadzone:0.100000,engine:sdl,guid:030079f6de280000ff11000001000000,port:0" profiles\1\c_stick\default=false profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:030079f6de280000ff11000001000000,port:0" profiles\1\circle_pad\default=false -profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" -profiles\1\motion_device\default=true +profiles\1\motion_device=engine:cemuhookudp +profiles\1\motion_device\default=false profiles\1\name=default profiles\1\name\default=true profiles\1\touch_device=engine:emu_window @@ -202,7 +204,7 @@ LLE\SPI=false LLE\SPI\default=true LLE\SSL=false LLE\SSL\default=true -gdbstub_port=@Variant(\0\0\0\x85`q) +gdbstub_port=24689 gdbstub_port\default=true record_frame_times=false renderer_debug=false @@ -213,34 +215,34 @@ use_gdbstub\default=true [Layout] anaglyph_shader_name=dubois (builtin) anaglyph_shader_name\default=true -custom_bottom_bottom=@Variant(\0\0\0\x85\x1\xe0) +custom_bottom_bottom=480 custom_bottom_bottom\default=true -custom_bottom_left=@Variant(\0\0\0\x85\0() +custom_bottom_left=40 custom_bottom_left\default=true -custom_bottom_right=@Variant(\0\0\0\x85\x1h) +custom_bottom_right=360 custom_bottom_right\default=true -custom_bottom_top=@Variant(\0\0\0\x85\0\xf0) +custom_bottom_top=240 custom_bottom_top\default=true custom_layout=false custom_layout\default=true -custom_second_layer_opacity=@Variant(\0\0\0\x85\0\x64) +custom_second_layer_opacity=100 custom_second_layer_opacity\default=true -custom_top_bottom=@Variant(\0\0\0\x85\0\xf0) +custom_top_bottom=240 custom_top_bottom\default=true -custom_top_left=@Variant(\0\0\0\x85\0\0) +custom_top_left=0 custom_top_left\default=true -custom_top_right=@Variant(\0\0\0\x85\x1\x90) +custom_top_right=400 custom_top_right\default=true -custom_top_top=@Variant(\0\0\0\x85\0\0) +custom_top_top=0 custom_top_top\default=true factor_3d=0 factor_3d\default=true filter_mode=true filter_mode\default=true -large_screen_proportion=@Variant(\0\0\0\x87@\x80\0\0) +large_screen_proportion=4 large_screen_proportion\default=true -layout_option=0 -layout_option\default=true +layout_option=2 +layout_option\default=false mono_render_option=0 mono_render_option\default=true pp_shader_name=none (builtin) @@ -253,6 +255,8 @@ upright_screen=false upright_screen\default=true [Miscellaneous] +enable_gamemode=true +enable_gamemode\default=true log_filter=*:Info log_filter\default=true @@ -269,12 +273,13 @@ bg_red=0 bg_red\default=true frame_limit=100 frame_limit\default=true -graphics_api=1 -graphics_api\default=true +frame_limit_alternate=500 +graphics_api=2 +graphics_api\default=false physical_device=0 physical_device\default=true -resolution_factor=1 -resolution_factor\default=true +resolution_factor=2 +resolution_factor\default=false shaders_accurate_mul=true shaders_accurate_mul\default=true spirv_shader_gen=true @@ -283,6 +288,8 @@ texture_filter=0 texture_filter\default=true texture_filter_name=Linear (Default) texture_filter_name\default=false +texture_sampling=0 +texture_sampling\default=true use_disk_shader_cache=true use_disk_shader_cache\default=true use_hw_renderer=true @@ -299,12 +306,18 @@ allow_plugin_loader=true allow_plugin_loader\default=true init_clock=0 init_clock\default=true +init_ticks_override=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0) +init_ticks_override\default=true +init_ticks_type=0 +init_ticks_type\default=true init_time=@Variant(\0\0\0\x84\0\0\0\0\x38m5\xbd) init_time\default=true init_time_offset=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0) init_time_offset\default=true is_new_3ds=true is_new_3ds\default=true +lle_applets=false +lle_applets\default=true plugin_loader=false plugin_loader\default=true region_value=-1 @@ -338,6 +351,14 @@ Multiplayer\ip\default=true Multiplayer\ip_ban_list\size=0 Multiplayer\max_player=8 Multiplayer\max_player\default=true +Multiplayer\multiplayer_filter_games_owned=false +Multiplayer\multiplayer_filter_games_owned\default=true +Multiplayer\multiplayer_filter_hide_empty=false +Multiplayer\multiplayer_filter_hide_empty\default=true +Multiplayer\multiplayer_filter_hide_full=false +Multiplayer\multiplayer_filter_hide_full\default=true +Multiplayer\multiplayer_filter_text= +Multiplayer\multiplayer_filter_text\default=true Multiplayer\nickname= Multiplayer\nickname\default=true Multiplayer\port=24872 @@ -381,6 +402,18 @@ Shortcuts\Main%20Window\Advance%20Frame\Context=1 Shortcuts\Main%20Window\Advance%20Frame\Context\default=false Shortcuts\Main%20Window\Advance%20Frame\KeySeq= Shortcuts\Main%20Window\Advance%20Frame\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context=1 +Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context\default=true +Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq=Ctrl+M +Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=1 +Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=1 +Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=true Shortcuts\Main%20Window\Capture%20Screenshot\Context=3 Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+X @@ -400,7 +433,7 @@ Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq\default=false Shortcuts\Main%20Window\Exit%20Citra\Context=1 Shortcuts\Main%20Window\Exit%20Citra\Context\default=true Shortcuts\Main%20Window\Exit%20Citra\KeySeq=Ctrl+Q -Shortcuts\Main%20Window\Exit%20Citra\KeySeq\default=false +Shortcuts\Main%20Window\Exit%20Citra\KeySeq\default=true Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1 Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Ctrl+O @@ -429,6 +462,26 @@ Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context=1 Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context\default=true Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq=Ctrl+A Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq\default=false +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq=Ctrl+B +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq=Ctrl+N +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context=1 +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context\default=false +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq= +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq\default=false +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq=Ctrl+L +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq=Ctrl+R +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq\default=true Shortcuts\Main%20Window\Mute%20Audio\Context=1 Shortcuts\Main%20Window\Mute%20Audio\Context\default=true Shortcuts\Main%20Window\Mute%20Audio\KeySeq= @@ -464,13 +517,13 @@ Shortcuts\Main%20Window\Toggle%203D\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context=2 Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context\default=true Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq=F7 -Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq\default=false +Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq\default=true Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context=1 -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=false +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=true Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq= Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context=1 -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=true +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=false Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq= Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\Context=1 @@ -483,19 +536,19 @@ Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq=Ctrl+L Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context=1 Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context\default=true -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq= -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=false +Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=Ctrl+S +Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context=1 Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context\default=false Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq= -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4 \0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0t\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64) -UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4\x1f\0\0\x1\x8f\0\0\0\0\0\0\0\0\0\0\x4\x1f\0\0\x1\x8f\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\0\0\0\x4\x1f\0\0\x1\x8f) +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq\default=false +UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\0\0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\x6T\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\xd6\0\0\0\xb4\0\0\x4*\0\0\x2\x43\0\0\0\xd6\0\0\0\xb4\0\0\x4*\0\0\x2\x43\0\0\0\0\0\0\0\0\x5\0\0\0\0\xd6\0\0\0\xb4\0\0\x4*\0\0\x2\x43) UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) -UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k) +UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xaa\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x41\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xc3\0\xff\xff\xff\0\0\x4 \0\0\x1^\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa9\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x41\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xc2\0\xff\xff\xff\0\0\x5\0\0\0\x3 \0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false @@ -514,6 +567,8 @@ fullscreen=true fullscreen\default=false hideInactiveMouse=false hideInactiveMouse\default=true +muteWhenInBackground=false +muteWhenInBackground\default=true pauseWhenInBackground=false pauseWhenInBackground\default=true saveStateWarning=true @@ -534,12 +589,12 @@ theme\default=false [Utility] async_custom_loading=true async_custom_loading\default=true -custom_textures=false -custom_textures\default=true +custom_textures=true +custom_textures\default=false dump_textures=false dump_textures\default=true -preload_textures=false -preload_textures\default=true +preload_textures=true +preload_textures\default=false [VideoDumping] audio_bitrate=64000 @@ -563,5 +618,5 @@ citra_token= citra_username=RetroDECK enable_telemetry=false enable_telemetry\default=false -web_api_url=https://api.citra-emu.org -web_api_url\default=true \ No newline at end of file +web_api_url= +web_api_url\default=false diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard_simple.vdf similarity index 92% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard_simple.vdf index 7e6100aa..5246fe57 100755 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard_simple.vdf @@ -913,7 +913,7 @@ { "id" "19" "mode" "radial_menu" - "name" "Global Radial" + "name" "Simple Radial" "description" "" "inputs" { @@ -1105,7 +1105,7 @@ { "bindings" { - "binding" "key_press F4, F4, RD-F4.png, " + "binding" "key_press F8, F8, RD-F8.png, " } "settings" { @@ -1118,66 +1118,6 @@ } } "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" { "activators" { @@ -1197,7 +1137,7 @@ { } } - "touch_menu_button_14" + "touch_menu_button_11" { "activators" { @@ -1218,7 +1158,7 @@ { } } - "touch_menu_button_15" + "touch_menu_button_12" { "activators" { @@ -1239,7 +1179,7 @@ { } } - "touch_menu_button_16" + "touch_menu_button_13" { "activators" { @@ -1260,7 +1200,7 @@ { } } - "touch_menu_button_17" + "touch_menu_button_14" { "activators" { @@ -1281,7 +1221,7 @@ { } } - "touch_menu_button_18" + "touch_menu_button_15" { "activators" { @@ -1302,7 +1242,7 @@ { } } - "touch_menu_button_19" + "touch_menu_button_16" { "activators" { @@ -1323,10 +1263,230 @@ { } } + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } } - "settings" + } + "group" + { + "id" "7" + "mode" "switches" + "name" "" + "description" "" + "inputs" { - "touchmenu_button_fire_type" "0" + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 1, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button y, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, , " + } + } + } + "disabled_activators" + { + } + } } } "group" @@ -1362,7 +1522,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 0, RetroDECK - Set, , " + "binding" "controller_action CHANGE_PRESET 1 0 1, , " } } "Full_Press" @@ -1419,7 +1579,7 @@ { "bindings" { - "binding" "xinput_button a, , " + "binding" "xinput_button y, , " } } } @@ -1428,103 +1588,6 @@ } } "button_back_right" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button x, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "7" - "mode" "switches" - "name" "" - "description" "" - "inputs" - { - "button_escape" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button start, , " - } - } - } - "disabled_activators" - { - } - } - "button_menu" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button select, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "controller_action CHANGE_PRESET 2 0 0, , " - } - } - } - "disabled_activators" - { - } - } - "left_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button shoulder_left, , " - } - } - } - "disabled_activators" - { - } - } - "right_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button shoulder_right, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_left" { "activators" { @@ -1540,7 +1603,7 @@ { } } - "button_back_right" + "button_back_left_upper" { "activators" { @@ -1556,6 +1619,38 @@ { } } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , " + } + } + } + "disabled_activators" + { + } + } } } "preset" diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3.vdf deleted file mode 100755 index d9eb5f66..00000000 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3.vdf +++ /dev/null @@ -1,1591 +0,0 @@ -"controller_mappings" -{ - "version" "3" - "revision" "93" - "title" "RetroDECK: DualShock 3 v.1b" - "description" "RetroDECK: PS3 - DualShock 3 - v.1b" - "creator" "" - "progenitor" "" - "url" "" - "export_type" "" - "controller_type" "controller_ps3" - "controller_caps" "1590271" - "major_revision" "0" - "minor_revision" "0" - "Timestamp" "-925476208" - "actions" - { - "Default" - { - "title" "RetroDECK - Set" - "legacy_set" "1" - } - "Preset_1000001" - { - "title" "Global Hotkeys - Set" - "legacy_set" "1" - } - } - "action_layers" - { - } - "group" - { - "id" "0" - "mode" "four_buttons" - "name" "" - "description" "" - "inputs" - { - "button_a" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button A, , " - } - } - } - "disabled_activators" - { - } - } - "button_b" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button B, , " - } - } - } - "disabled_activators" - { - } - } - "button_x" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button X, , " - } - } - } - "disabled_activators" - { - } - } - "button_y" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button Y, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "1" - "mode" "dpad" - "name" "" - "description" "" - "inputs" - { - "dpad_north" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button dpad_up, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_south" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button dpad_down, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_east" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button dpad_right, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_west" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button dpad_left, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "2" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button JOYSTICK_RIGHT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "3" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button JOYSTICK_LEFT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "4" - "mode" "trigger" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button TRIGGER_LEFT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "output_trigger" "1" - } - } - "group" - { - "id" "5" - "mode" "trigger" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button TRIGGER_RIGHT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "output_trigger" "2" - } - } - "group" - { - "id" "6" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button JOYSTICK_RIGHT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "8" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button JOYSTICK_RIGHT, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "9" - "mode" "dpad" - "name" "" - "description" "" - "inputs" - { - "dpad_north" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_UP, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_south" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_DOWN, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_east" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_RIGHT, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_west" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_LEFT, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "requires_click" "0" - "haptic_intensity_override" "0" - } - } - "group" - { - "id" "12" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Swap Screens, , " - "binding" "key_press TAB, Swap Screens, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "11" - "mode" "four_buttons" - "name" "" - "description" "" - "inputs" - { - "button_a" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Pause / Resume, , " - "binding" "key_press P, Pause / Resume, , " - } - } - } - "disabled_activators" - { - } - } - "button_b" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Take Screenshot, , " - "binding" "key_press X, Take Screenshot, , " - } - } - } - "disabled_activators" - { - } - } - "button_x" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Fullscreen Toggle, , " - "binding" "key_press RETURN, Fullscreen Toggle, , " - } - } - } - "disabled_activators" - { - } - } - "button_y" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Open Menu, , " - "binding" "key_press M, Open Menu, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "13" - "mode" "trigger" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Rewind, , " - "binding" "key_press KEYPAD_DASH, Rewind, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "output_trigger" "1" - } - } - "group" - { - "id" "14" - "mode" "trigger" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Fast forward, , " - "binding" "key_press KEYPAD_PLUS, Fast forward, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "output_trigger" "2" - } - } - "group" - { - "id" "15" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press ESCAPE, Escape, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "16" - "mode" "dpad" - "name" "" - "description" "" - "inputs" - { - "dpad_north" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Increase Emulation Speed, , " - "binding" "key_press 1, Increase Emulation Speed, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_south" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Decrease Emulation Speed, , " - "binding" "key_press 2, Decrease Emulation Speed, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_east" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Next State Slot, , " - "binding" "key_press K, Next State Slot, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_west" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Previous State Slot, , " - "binding" "key_press J, Previous State Slot, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "requires_click" "0" - "haptic_intensity_override" "0" - } - } - "group" - { - "id" "17" - "mode" "joystick_mouse" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button LEFT, , " - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "output_joystick" "2" - } - } - "group" - { - "id" "18" - "mode" "dpad" - "name" "" - "description" "" - "inputs" - { - "dpad_north" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Swap Screens, , " - "binding" "key_press TAB, Swap Screens, , " - } - } - } - "disabled_activators" - { - } - } - "dpad_south" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, , " - } - } - } - "disabled_activators" - { - } - } - "dpad_east" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press RETURN, Enter, , " - } - } - } - "disabled_activators" - { - } - } - "dpad_west" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press ESCAPE, Escape, , " - } - } - } - "disabled_activators" - { - } - } - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button RIGHT, , " - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "requires_click" "0" - } - } - "group" - { - "id" "10" - "mode" "switches" - "name" "" - "description" "" - "inputs" - { - "button_escape" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Quit Emulator, , " - "binding" "key_press Q, Quit Emulator, , " - } - } - } - "disabled_activators" - { - } - } - "button_menu" - { - "activators" - { - "release" - { - "bindings" - { - "binding" "controller_action CHANGE_PRESET 1 0 0, RetroDECK - Set, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button SELECT, , " - } - } - } - "disabled_activators" - { - } - } - "left_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Load State, , " - "binding" "key_press A, Load State, , " - } - } - } - "disabled_activators" - { - } - } - "right_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Save State, , " - "binding" "key_press S, Save State, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_left" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button a, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_right" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button x, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "7" - "mode" "switches" - "name" "" - "description" "" - "inputs" - { - "button_escape" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button start, , " - } - } - } - "disabled_activators" - { - } - } - "button_menu" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button select, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "controller_action CHANGE_PRESET 2 0 0, , " - } - } - } - "disabled_activators" - { - } - } - "left_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button shoulder_left, , " - } - } - } - "disabled_activators" - { - } - } - "right_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button shoulder_right, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_left" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button a, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_right" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button x, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "19" - "mode" "radial_menu" - "name" "dial" - "description" "" - "inputs" - { - "touch_menu_button_0" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_1" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press ESCAPE, Escape, RD-ESC.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_2" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press RETURN, Enter, RD-Enter.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_3" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press TAB, Tab, RD-Tab.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_4" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_5" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press SPACE, Space, RD-space.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_6" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_7" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_ALT, Alt, RD-alt.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_8" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F1, F1, RD-F1.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_9" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F4, F4, RD-F4.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F10, F10, RD-F10.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_14" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, " - "binding" "key_press R, Restart / Reset, RD-system-reboot.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_15" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, " - "binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_16" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, " - "binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_17" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, " - "binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_18" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, " - "binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_19" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, " - "binding" "key_press D, Swap Disc, RD-application-x-iso.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "touchmenu_button_fire_type" "0" - } - } - "preset" - { - "id" "0" - "name" "Default" - "group_source_bindings" - { - "7" "switch active" - "0" "button_diamond active" - "3" "joystick active" - "4" "left_trigger active" - "5" "right_trigger active" - "8" "right_joystick active" - "9" "dpad active" - } - } - "preset" - { - "id" "1" - "name" "Preset_1000001" - "group_source_bindings" - { - "10" "switch active" - "11" "button_diamond active" - "12" "joystick inactive" - "18" "joystick inactive" - "19" "joystick active" - "13" "left_trigger active" - "14" "right_trigger active" - "15" "right_joystick inactive" - "17" "right_joystick active" - "16" "dpad active" - } - } - "settings" - { - "left_trackpad_mode" "0" - "right_trackpad_mode" "0" - } -} diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3_simple.vdf similarity index 86% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3_simple.vdf index 479ce25d..13b4ffe0 100755 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3_simple.vdf @@ -1,20 +1,20 @@ "controller_mappings" { "version" "3" - "revision" "81" - "title" "RetroDECK: DualShock 4 v.1b" - "description" "RetroDECK: PS4 - DualShock 4 - v.1b" + "revision" "93" + "title" "RetroDECK: DualShock 3 v.1b" + "description" "RetroDECK: PS3 - DualShock 3 - v.1b" "creator" "" "progenitor" "" "url" "" "export_type" "" - "controller_type" "controller_ps4" - "controller_caps" "" + "controller_type" "controller_ps3" + "controller_caps" "1590271" "major_revision" "0" "minor_revision" "0" - "Timestamp" "1079447734" + "Timestamp" "-925476208" "actions" - { + { "Default" { "title" "RetroDECK - Set" @@ -474,8 +474,8 @@ } "group" { - "id" "10" - "mode" "single_button" + "id" "12" + "mode" "joystick_move" "name" "" "description" "" "inputs" @@ -488,7 +488,12 @@ { "bindings" { - "binding" "xinput_button START, , " + "binding" "key_press LEFT_CONTROL, Swap Screens, , " + "binding" "key_press TAB, Swap Screens, , " + } + "settings" + { + "haptic_intensity" "2" } } } @@ -501,92 +506,6 @@ "group" { "id" "11" - "mode" "single_button" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button RIGHT, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "14" - "mode" "absolute_mouse" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button LEFT, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "15" - "mode" "absolute_mouse" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button RIGHT, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "19" "mode" "four_buttons" "name" "" "description" "" @@ -601,7 +520,7 @@ "bindings" { "binding" "key_press LEFT_CONTROL, Pause / Resume, , " - "binding" "key_press A, Pause / Resume, , " + "binding" "key_press P, Pause / Resume, , " } } } @@ -618,7 +537,7 @@ "bindings" { "binding" "key_press LEFT_CONTROL, Take Screenshot, , " - "binding" "key_press B, Take Screenshot, , " + "binding" "key_press X, Take Screenshot, , " } } } @@ -664,98 +583,7 @@ } "group" { - "id" "20" - "mode" "absolute_mouse" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button RIGHT, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "21" - "mode" "absolute_mouse" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "mouse_button LEFT, Left Click, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "22" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Swap Screens, , " - "binding" "key_press TAB, Swap Screens, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "23" + "id" "13" "mode" "trigger" "name" "" "description" "" @@ -790,7 +618,7 @@ } "group" { - "id" "24" + "id" "14" "mode" "trigger" "name" "" "description" "" @@ -825,7 +653,7 @@ } "group" { - "id" "25" + "id" "15" "mode" "joystick_move" "name" "" "description" "" @@ -851,7 +679,7 @@ } "group" { - "id" "26" + "id" "16" "mode" "dpad" "name" "" "description" "" @@ -950,7 +778,7 @@ } "group" { - "id" "29" + "id" "17" "mode" "joystick_mouse" "name" "" "description" "" @@ -964,7 +792,7 @@ { "bindings" { - "binding" "mouse_button LEFT, Left Click, , " + "binding" "mouse_button LEFT, , " } } } @@ -980,7 +808,7 @@ } "group" { - "id" "30" + "id" "18" "mode" "dpad" "name" "" "description" "" @@ -1059,7 +887,7 @@ { "bindings" { - "binding" "mouse_button RIGHT, Right Click, , " + "binding" "mouse_button RIGHT, , " } } } @@ -1075,13 +903,13 @@ } "group" { - "id" "33" - "mode" "absolute_mouse" + "id" "10" + "mode" "switches" "name" "" "description" "" "inputs" { - "click" + "button_escape" { "activators" { @@ -1089,11 +917,97 @@ { "bindings" { - "binding" "mouse_button MIDDLE, , " + "binding" "key_press LEFT_CONTROL, Quit Emulator, , " + "binding" "key_press Q, Quit Emulator, , " } - "settings" + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "release" + { + "bindings" { - "haptic_intensity" "1" + "binding" "controller_action CHANGE_PRESET 1 0 0, RetroDECK - Set, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Load State, , " + "binding" "key_press A, Load State, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Save State, , " + "binding" "key_press S, Save State, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " } } } @@ -1105,13 +1019,13 @@ } "group" { - "id" "35" - "mode" "absolute_mouse" + "id" "7" + "mode" "switches" "name" "" "description" "" "inputs" { - "click" + "button_escape" { "activators" { @@ -1119,11 +1033,94 @@ { "bindings" { - "binding" "mouse_button MIDDLE, , " + "binding" "xinput_button start, , " } - "settings" + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" { - "haptic_intensity" "1" + "binding" "xinput_button select, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " } } } @@ -1135,9 +1132,9 @@ } "group" { - "id" "37" + "id" "19" "mode" "radial_menu" - "name" "Global Radial" + "name" "Simple Radial" "description" "" "inputs" { @@ -1329,7 +1326,7 @@ { "bindings" { - "binding" "key_press F4, F4, RD-F4.png, " + "binding" "key_press F8, F8, RD-F8.png, " } "settings" { @@ -1342,66 +1339,6 @@ } } "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" { "activators" { @@ -1421,7 +1358,7 @@ { } } - "touch_menu_button_14" + "touch_menu_button_11" { "activators" { @@ -1442,7 +1379,7 @@ { } } - "touch_menu_button_15" + "touch_menu_button_12" { "activators" { @@ -1463,7 +1400,7 @@ { } } - "touch_menu_button_16" + "touch_menu_button_13" { "activators" { @@ -1484,7 +1421,7 @@ { } } - "touch_menu_button_17" + "touch_menu_button_14" { "activators" { @@ -1505,7 +1442,7 @@ { } } - "touch_menu_button_18" + "touch_menu_button_15" { "activators" { @@ -1526,7 +1463,7 @@ { } } - "touch_menu_button_19" + "touch_menu_button_16" { "activators" { @@ -1547,21 +1484,7 @@ { } } - } - "settings" - { - "touchmenu_button_fire_type" "0" - } - } - "group" - { - "id" "38" - "mode" "single_button" - "name" "" - "description" "" - "inputs" - { - "click" + "touch_menu_button_17" { "activators" { @@ -1569,11 +1492,12 @@ { "bindings" { - "binding" "mouse_button RIGHT, Right Click, , " + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " } "settings" { - "haptic_intensity" "0" + "haptic_intensity" "2" } } } @@ -1581,17 +1505,7 @@ { } } - } - } - "group" - { - "id" "39" - "mode" "single_button" - "name" "" - "description" "" - "inputs" - { - "click" + "touch_menu_button_18" { "activators" { @@ -1599,11 +1513,12 @@ { "bindings" { - "binding" "mouse_button MIDDLE, Middle Click, , " + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " } "settings" { - "haptic_intensity" "0" + "haptic_intensity" "2" } } } @@ -1611,48 +1526,7 @@ { } } - } - "gameactions" - { - } - } - "group" - { - "id" "41" - "mode" "dpad" - "name" "" - "description" "" - "inputs" - { - } - "settings" - { - "requires_click" "0" - } - } - "group" - { - "id" "42" - "mode" "dpad" - "name" "" - "description" "" - "inputs" - { - } - "settings" - { - "requires_click" "0" - } - } - "group" - { - "id" "43" - "mode" "single_button" - "name" "" - "description" "" - "inputs" - { - "click" + "touch_menu_button_19" { "activators" { @@ -1660,7 +1534,12 @@ { "bindings" { - "binding" "mouse_button MIDDLE, , " + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" } } } @@ -1757,7 +1636,7 @@ { "bindings" { - "binding" "xinput_button a, , " + "binding" "xinput_button y, , " } } } @@ -1766,6 +1645,22 @@ } } "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" { "activators" { @@ -1781,11 +1676,43 @@ { } } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, , " + } + } + } + "disabled_activators" + { + } + } } } "group" { - "id" "18" + "id" "10" "mode" "switches" "name" "" "description" "" @@ -1873,7 +1800,7 @@ { "bindings" { - "binding" "xinput_button a, , " + "binding" "xinput_button y, , " } } } @@ -1882,6 +1809,22 @@ } } "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" { "activators" { @@ -1897,6 +1840,38 @@ { } } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , " + } + } + } + "disabled_activators" + { + } + } } } "preset" @@ -1907,21 +1882,11 @@ { "7" "switch active" "0" "button_diamond active" - "1" "left_trackpad inactive" - "11" "left_trackpad active" - "15" "left_trackpad inactive" - "2" "right_trackpad inactive" - "6" "right_trackpad inactive" - "10" "right_trackpad inactive" - "14" "right_trackpad active" "3" "joystick active" "4" "left_trigger active" "5" "right_trigger active" "8" "right_joystick active" "9" "dpad active" - "35" "center_trackpad inactive" - "43" "center_trackpad inactive" - "41" "gyro active" } } "preset" @@ -1930,22 +1895,16 @@ "name" "Preset_1000001" "group_source_bindings" { - "18" "switch active" - "19" "button_diamond active" - "20" "left_trackpad inactive" - "38" "left_trackpad active" - "21" "right_trackpad active" - "22" "joystick inactive" - "30" "joystick inactive" - "37" "joystick active" - "23" "left_trigger active" - "24" "right_trigger active" - "25" "right_joystick inactive" - "29" "right_joystick active" - "26" "dpad active" - "33" "center_trackpad inactive" - "39" "center_trackpad inactive" - "42" "gyro active" + "10" "switch active" + "11" "button_diamond active" + "12" "joystick inactive" + "18" "joystick inactive" + "19" "joystick active" + "13" "left_trigger active" + "14" "right_trigger active" + "15" "right_joystick inactive" + "17" "right_joystick active" + "16" "dpad active" } } "settings" diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4_simple.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4_simple.vdf new file mode 100755 index 00000000..f440bed0 --- /dev/null +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4_simple.vdf @@ -0,0 +1,2280 @@ +"controller_mappings" +{ + "version" "3" + "revision" "81" + "title" "RetroDECK: DualShock 4 v.1b" + "description" "RetroDECK: PS4 - DualShock 4 - v.1b" + "creator" "" + "progenitor" "" + "url" "" + "export_type" "" + "controller_type" "controller_ps4" + "controller_caps" "" + "major_revision" "0" + "minor_revision" "0" + "Timestamp" "1079447734" + "actions" + { + "Default" + { + "title" "RetroDECK - Set" + "legacy_set" "1" + } + "Preset_1000001" + { + "title" "Global Hotkeys - Set" + "legacy_set" "1" + } + } + "action_layers" + { + } + "group" + { + "id" "0" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button A, , " + } + } + } + "disabled_activators" + { + } + } + "button_b" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button B, , " + } + } + } + "disabled_activators" + { + } + } + "button_x" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button X, , " + } + } + } + "disabled_activators" + { + } + } + "button_y" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button Y, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "1" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_up, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_down, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_right, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_left, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "2" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "3" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "4" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "1" + } + } + "group" + { + "id" "5" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_RIGHT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "2" + } + } + "group" + { + "id" "6" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "8" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "9" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_UP, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_DOWN, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_RIGHT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_LEFT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "haptic_intensity_override" "0" + } + } + "group" + { + "id" "10" + "mode" "single_button" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button START, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "11" + "mode" "single_button" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "14" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "15" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "19" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Pause / Resume, , " + "binding" "key_press A, Pause / Resume, , " + } + } + } + "disabled_activators" + { + } + } + "button_b" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Take Screenshot, , " + "binding" "key_press B, Take Screenshot, , " + } + } + } + "disabled_activators" + { + } + } + "button_x" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Fullscreen Toggle, , " + "binding" "key_press RETURN, Fullscreen Toggle, , " + } + } + } + "disabled_activators" + { + } + } + "button_y" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Open Menu, , " + "binding" "key_press M, Open Menu, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "20" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "21" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, Left Click, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "22" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Swap Screens, , " + "binding" "key_press TAB, Swap Screens, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "23" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Rewind, , " + "binding" "key_press KEYPAD_DASH, Rewind, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "1" + } + } + "group" + { + "id" "24" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Fast forward, , " + "binding" "key_press KEYPAD_PLUS, Fast forward, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "2" + } + } + "group" + { + "id" "25" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press ESCAPE, Escape, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "26" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Increase Emulation Speed, , " + "binding" "key_press 1, Increase Emulation Speed, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Decrease Emulation Speed, , " + "binding" "key_press 2, Decrease Emulation Speed, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Next State Slot, , " + "binding" "key_press K, Next State Slot, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Previous State Slot, , " + "binding" "key_press J, Previous State Slot, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "haptic_intensity_override" "0" + } + } + "group" + { + "id" "29" + "mode" "joystick_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, Left Click, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_joystick" "2" + } + } + "group" + { + "id" "30" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Swap Screens, , " + "binding" "key_press TAB, Swap Screens, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RETURN, Enter, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press ESCAPE, Escape, , " + } + } + } + "disabled_activators" + { + } + } + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, Right Click, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "33" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button MIDDLE, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "35" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button MIDDLE, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "37" + "mode" "radial_menu" + "name" "Simple Radial" + "description" "" + "inputs" + { + "touch_menu_button_0" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_1" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press ESCAPE, Escape, RD-ESC.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_2" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RETURN, Enter, RD-Enter.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_3" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press TAB, Tab, RD-Tab.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_4" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_5" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press SPACE, Space, RD-space.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_6" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_7" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Alt, RD-alt.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F1, F1, RD-F1.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_9" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F8, F8, RD-F8.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_10" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F10, F10, RD-F10.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_11" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, " + "binding" "key_press R, Restart / Reset, RD-system-reboot.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_12" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, " + "binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_13" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, " + "binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_14" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, " + "binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_15" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, " + "binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_16" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, " + "binding" "key_press D, Swap Disc, RD-application-x-iso.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "7" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 1, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button y, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "10" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Quit Emulator, , " + "binding" "key_press Q, Quit Emulator, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 1 0 1, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Load State, , " + "binding" "key_press A, Load State, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Save State, , " + "binding" "key_press S, Save State, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button y, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "38" + "mode" "single_button" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, Right Click, , " + } + "settings" + { + "haptic_intensity" "0" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "39" + "mode" "single_button" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button MIDDLE, Middle Click, , " + } + "settings" + { + "haptic_intensity" "0" + } + } + } + "disabled_activators" + { + } + } + } + "gameactions" + { + } + } + "group" + { + "id" "41" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "42" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "43" + "mode" "single_button" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button MIDDLE, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "7" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 1, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "18" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Quit Emulator, , " + "binding" "key_press Q, Quit Emulator, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 1 0 1, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Load State, , " + "binding" "key_press A, Load State, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Save State, , " + "binding" "key_press S, Save State, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "preset" + { + "id" "0" + "name" "Default" + "group_source_bindings" + { + "7" "switch active" + "0" "button_diamond active" + "1" "left_trackpad inactive" + "11" "left_trackpad active" + "15" "left_trackpad inactive" + "2" "right_trackpad inactive" + "6" "right_trackpad inactive" + "10" "right_trackpad inactive" + "14" "right_trackpad active" + "3" "joystick active" + "4" "left_trigger active" + "5" "right_trigger active" + "8" "right_joystick active" + "9" "dpad active" + "35" "center_trackpad inactive" + "43" "center_trackpad inactive" + "41" "gyro active" + } + } + "preset" + { + "id" "1" + "name" "Preset_1000001" + "group_source_bindings" + { + "18" "switch active" + "19" "button_diamond active" + "20" "left_trackpad inactive" + "38" "left_trackpad active" + "21" "right_trackpad active" + "22" "joystick inactive" + "30" "joystick inactive" + "37" "joystick active" + "23" "left_trigger active" + "24" "right_trigger active" + "25" "right_joystick inactive" + "29" "right_joystick active" + "26" "dpad active" + "33" "center_trackpad inactive" + "39" "center_trackpad inactive" + "42" "gyro active" + } + } + "settings" + { + "left_trackpad_mode" "0" + "right_trackpad_mode" "0" + } +} diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense_simple.vdf similarity index 85% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense_simple.vdf index 58797a73..634b532b 100755 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense_simple.vdf @@ -1137,7 +1137,7 @@ { "id" "45" "mode" "radial_menu" - "name" "Global Radial" + "name" "Simple Radial" "description" "" "inputs" { @@ -1329,7 +1329,7 @@ { "bindings" { - "binding" "key_press F4, F4, RD-F4.png, " + "binding" "key_press F8, F8, RD-F8.png, " } "settings" { @@ -1342,66 +1342,6 @@ } } "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" { "activators" { @@ -1421,7 +1361,7 @@ { } } - "touch_menu_button_14" + "touch_menu_button_11" { "activators" { @@ -1442,7 +1382,7 @@ { } } - "touch_menu_button_15" + "touch_menu_button_12" { "activators" { @@ -1463,7 +1403,7 @@ { } } - "touch_menu_button_16" + "touch_menu_button_13" { "activators" { @@ -1484,7 +1424,7 @@ { } } - "touch_menu_button_17" + "touch_menu_button_14" { "activators" { @@ -1505,7 +1445,7 @@ { } } - "touch_menu_button_18" + "touch_menu_button_15" { "activators" { @@ -1526,7 +1466,7 @@ { } } - "touch_menu_button_19" + "touch_menu_button_16" { "activators" { @@ -1547,10 +1487,394 @@ { } } + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } } - "settings" + } + "group" + { + "id" "7" + "mode" "switches" + "name" "" + "description" "" + "inputs" { - "touchmenu_button_fire_type" "0" + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 1, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button y, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "10" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Quit Emulator, , " + "binding" "key_press Q, Quit Emulator, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 1 0 1, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Load State, , " + "binding" "key_press A, Load State, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Save State, , " + "binding" "key_press S, Save State, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button y, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , " + } + } + } + "disabled_activators" + { + } + } } } "group" diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon_simple.vdf similarity index 85% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon_simple.vdf index dfb479ca..c80c0468 100755 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon_simple.vdf @@ -1159,7 +1159,7 @@ { "id" "38" "mode" "radial_menu" - "name" "Global Radial" + "name" "Simple Radial" "description" "" "inputs" { @@ -1351,7 +1351,7 @@ { "bindings" { - "binding" "key_press F4, F4, RD-F4.png, " + "binding" "key_press F8, F8, RD-F8.png, " } "settings" { @@ -1364,66 +1364,6 @@ } } "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" { "activators" { @@ -1443,7 +1383,7 @@ { } } - "touch_menu_button_14" + "touch_menu_button_11" { "activators" { @@ -1464,7 +1404,7 @@ { } } - "touch_menu_button_15" + "touch_menu_button_12" { "activators" { @@ -1485,7 +1425,7 @@ { } } - "touch_menu_button_16" + "touch_menu_button_13" { "activators" { @@ -1506,7 +1446,7 @@ { } } - "touch_menu_button_17" + "touch_menu_button_14" { "activators" { @@ -1527,7 +1467,7 @@ { } } - "touch_menu_button_18" + "touch_menu_button_15" { "activators" { @@ -1548,7 +1488,7 @@ { } } - "touch_menu_button_19" + "touch_menu_button_16" { "activators" { @@ -1569,10 +1509,394 @@ { } } + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } } - "settings" + } + "group" + { + "id" "7" + "mode" "switches" + "name" "" + "description" "" + "inputs" { - "touchmenu_button_fire_type" "0" + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 1, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button y, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "10" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Quit Emulator, , " + "binding" "key_press Q, Quit Emulator, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 1 0 1, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Load State, , " + "binding" "key_press A, Load State, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Save State, , " + "binding" "key_press S, Save State, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button y, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button a, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button x, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button b, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , " + } + } + } + "disabled_activators" + { + } + } } } "group" diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_neptune.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_full.vdf similarity index 85% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_neptune.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_full.vdf index 8de2683f..a70c5839 100644 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_neptune.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_full.vdf @@ -1,18 +1,18 @@ "controller_mappings" { "version" "3" - "revision" "1706" - "title" "RetroDECK: Official Layout - v0.7.1b" - "description" "The Official RetroDECK Layout" + "revision" "1864" + "title" "RetroDECK: Steam Deck - Neptune v.1.1b FULL" + "description" "RetroDECK: Steam Deck - Neptune v.1.1b FULL" "creator" "" "progenitor" "" "url" "" - "export_type" "personal_cloud" + "export_type" "" "controller_type" "controller_neptune" "controller_caps" "23117823" "major_revision" "0" "minor_revision" "0" - "Timestamp" "-918096944" + "Timestamp" "-1157598368" "actions" { "Default" @@ -57,7 +57,7 @@ } "Preset_1000008" { - "title" "Emulators: Specific Features Menu - Set" + "title" "Emulator / Engine Specific - Set" "legacy_set" "1" } "Preset_1000009" @@ -80,11 +80,6 @@ "title" "DS Menu - Set" "legacy_set" "1" } - "Preset_1000014" - { - "title" "Secrets Menu - Set" - "legacy_set" "1" - } "Preset_1000015" { "title" "3DS Menu - Set" @@ -95,6 +90,16 @@ "title" "Switch Menu - Set" "legacy_set" "1" } + "Preset_1000017" + { + "title" "ScummVM Menu - Set" + "legacy_set" "1" + } + "Preset_1000018" + { + "title" "GZDOOM Menu - Set" + "legacy_set" "1" + } } "action_layers" { @@ -1107,7 +1112,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 14 0 1, RetroDECK, RD-icon_circle_2_180x180.png, " + "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, " } } } @@ -1123,7 +1128,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 3 0 1, Quick, RD-org.xfce.session.png, " + "binding" "controller_action CHANGE_PRESET 3 0 0, Quick, RD-org.xfce.session.png, " } } } @@ -1139,7 +1144,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 4 0 1, State, RD-folder-blue-games.png, " + "binding" "controller_action CHANGE_PRESET 4 0 0, State, RD-folder-blue-games.png, " } } } @@ -1155,7 +1160,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 5 0 1, Speed & Frames, RD-supertuxkart.png, " + "binding" "controller_action CHANGE_PRESET 5 0 0, Speed & Frames, RD-supertuxkart.png, " } } } @@ -1171,7 +1176,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 6 0 1, Display & Graphics, RD-preferences-desktop-display.png, " + "binding" "controller_action CHANGE_PRESET 6 0 0, Display & Graphics, RD-preferences-desktop-display.png, " } } } @@ -1187,7 +1192,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 7 0 1, General, RD-io.github.antimicrox.antimicrox.png, " + "binding" "controller_action CHANGE_PRESET 7 0 0, General, RD-io.github.antimicrox.antimicrox.png, " } } } @@ -1203,7 +1208,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 9 0 1, Specific, RD-folder-applications.png, " + "binding" "controller_action CHANGE_PRESET 9 0 0, Specific, RD-folder-applications.png, " } } } @@ -1219,7 +1224,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 8 0 1, Steam Deck, RD-steam.png, " + "binding" "controller_action CHANGE_PRESET 8 0 0, Steam Deck, RD-steam.png, " } } } @@ -1448,7 +1453,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, #232323 #FFFFFF" + "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, #232323 #FFFFFF" } } } @@ -1515,8 +1520,8 @@ { "bindings" { - "binding" "key_press LEFT_CONTROL, Take Screenshot, RD-camera-photo.png, " - "binding" "key_press X, Take Screenshot, RD-camera-photo.png, " + "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, " + "binding" "key_press S, Save State, RD-document-save.png, " } } } @@ -1532,8 +1537,8 @@ { "bindings" { - "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, " - "binding" "key_press S, Save State, RD-document-save.png, " + "binding" "key_press LEFT_CONTROL, Take Screenshot, RD-camera-photo.png, " + "binding" "key_press X, Take Screenshot, RD-camera-photo.png, " } } } @@ -1549,8 +1554,8 @@ { "bindings" { - "binding" "key_press LEFT_CONTROL, Load State, RD-folder-blue-backup.png, " - "binding" "key_press A, Load State, RD-folder-blue-backup.png, " + "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, " + "binding" "key_press R, Restart / Reset, RD-system-reboot.png, " } } } @@ -1559,23 +1564,6 @@ } } "touch_menu_button_7" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Pause / Resume, RD-media-playback-pause.png, " - "binding" "key_press P, Pause / Resume, RD-media-playback-pause.png, " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_8" { "activators" { @@ -1592,6 +1580,40 @@ { } } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Load State, RD-folder-blue-backup.png, " + "binding" "key_press A, Load State, RD-folder-blue-backup.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_9" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Pause / Resume, RD-media-playback-pause.png, " + "binding" "key_press P, Pause / Resume, RD-media-playback-pause.png, " + } + } + } + "disabled_activators" + { + } + } "touch_menu_button_10" { "activators" @@ -1608,23 +1630,6 @@ { } } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, " - "binding" "key_press R, Restart / Reset, RD-system-reboot.png, " - } - } - } - "disabled_activators" - { - } - } } "settings" { @@ -1731,7 +1736,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, " } } } @@ -1740,57 +1745,6 @@ } } "touch_menu_button_1" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Previous State, RD-go-previous.png, #232323 #FFFFFF" - "binding" "key_press J, Previous State, RD-go-previous.png, #232323 #FFFFFF" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_2" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Next State, RD-go-next.png, " - "binding" "key_press K, Next State, RD-go-next.png, " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_3" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, " - "binding" "key_press S, Save State, RD-document-save.png, " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_4" { "activators" { @@ -1807,6 +1761,57 @@ { } } + "touch_menu_button_2" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Previous State, RD-go-previous.png, #232323 #FFFFFF" + "binding" "key_press J, Previous State, RD-go-previous.png, #232323 #FFFFFF" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_3" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Undo Save, RD-Arrow-34.png, " + "binding" "key_press 9, Undo Save, RD-Arrow-34.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_4" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, " + "binding" "key_press S, Save State, RD-document-save.png, " + } + } + } + "disabled_activators" + { + } + } "touch_menu_button_5" { "activators" @@ -1815,8 +1820,8 @@ { "bindings" { - "binding" "key_press LEFT_CONTROL, Undo Load, RD-Arrow-33.png, " - "binding" "key_press 8, Undo Load, RD-Arrow-33.png, " + "binding" "key_press LEFT_CONTROL, Next State, RD-go-next.png, " + "binding" "key_press K, Next State, RD-go-next.png, " } } } @@ -1832,8 +1837,8 @@ { "bindings" { - "binding" "key_press LEFT_CONTROL, Undo Save, RD-Arrow-34.png, " - "binding" "key_press 9, Undo Save, RD-Arrow-34.png, " + "binding" "key_press LEFT_CONTROL, Undo Load, RD-Arrow-33.png, " + "binding" "key_press 8, Undo Load, RD-Arrow-33.png, " } } } @@ -2196,7 +2201,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, " } } } @@ -2678,7 +2683,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, " } } } @@ -3143,7 +3148,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, " } } } @@ -3659,7 +3664,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, " } } } @@ -3675,7 +3680,7 @@ { "bindings" { - "binding" "controller_action SCREENSHOT, Steam Screenshot, RD-applets-screenshooter.png, " + "binding" "key_press ESCAPE, Escape, RD-ESC.png, " } } } @@ -3691,7 +3696,7 @@ { "bindings" { - "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, RD-preferences-desktop-keyboard.png, " + "binding" "key_press RETURN, Enter, RD-Enter.png, " } } } @@ -3707,7 +3712,7 @@ { "bindings" { - "binding" "key_press ESCAPE, Escape, RD-ESC.png, " + "binding" "key_press SPACE, Space, RD-space.png, " } } } @@ -3723,8 +3728,7 @@ { "bindings" { - "binding" "key_press LEFT_ALT, ALT + F4, RD-F4.png, " - "binding" "key_press F4, ALT + F4, RD-F4.png, " + "binding" "key_press TAB, Tab, RD-Tab.png, " } } } @@ -3740,7 +3744,7 @@ { "bindings" { - "binding" "key_press TAB, Tab, RD-Tab.png, " + "binding" "key_press LEFT_SHIFT, Shift, RD-shift.png, " } } } @@ -3756,7 +3760,7 @@ { "bindings" { - "binding" "key_press RETURN, Enter, RD-Enter.png, " + "binding" "key_press LEFT_CONTROL, Ctrl, RD-ctrl.png, " } } } @@ -3765,6 +3769,38 @@ } } "touch_menu_button_7" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Alt, RD-alt.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_9" { "activators" { @@ -3780,6 +3816,135 @@ { } } + "touch_menu_button_10" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F4, F4, RD-F4.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_11" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F5, F5, RD-F5.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_12" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F7, F7, RD-F7.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_13" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F8, F8, RD-F8.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_14" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F10, F10, RD-F10.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_15" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, RD-preferences-desktop-keyboard.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_16" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SCREENSHOT, Steam Screenshot, RD-applets-screenshooter.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + } + } + "disabled_activators" + { + } + } } "settings" { @@ -4123,7 +4288,7 @@ { "id" "128" "mode" "radial_menu" - "name" "Emulators: Specific Features - Menu" + "name" "Emulator / Engine Specific - Menu" "description" "" "inputs" { @@ -4135,7 +4300,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, " } } } @@ -4151,7 +4316,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 10 0 1, MAME, RD-mame.png, " + "binding" "controller_action CHANGE_PRESET 10 0 0, MAME, RD-mame.png, " } } } @@ -4167,7 +4332,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 11 0 1, RetroArch, RD-retroarch.png, " + "binding" "controller_action CHANGE_PRESET 11 0 0, RetroArch, RD-retroarch.png, " } } } @@ -4183,7 +4348,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 12 0 1, Gamecube & Wii, RD-dolphin.png, " + "binding" "controller_action CHANGE_PRESET 12 0 0, Gamecube & Wii, RD-dolphin.png, " } } } @@ -4199,7 +4364,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 13 0 1, NDS, RD-melonds.png, " + "binding" "controller_action CHANGE_PRESET 13 0 0, NDS, RD-melonds.png, " } } } @@ -4215,7 +4380,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 15 0 1, 3DS, RD-citra.png, " + "binding" "controller_action CHANGE_PRESET 14 0 0, 3DS, RD-citra.png, " } } } @@ -4231,7 +4396,39 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 16 0 1, Switch, RD-ryujinx.png, " + "binding" "controller_action CHANGE_PRESET 15 0 0, Switch, RD-ryujinx.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_7" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 17 0 0, GZDoom, RD-gzdoom.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 16 0 0, SCUMMVM, RD-click.png, " } } } @@ -4594,7 +4791,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " } } } @@ -4611,6 +4808,7 @@ "bindings" { "binding" "key_press LEFT_ALT, Service Mode, RD-emblem-documents.png, " + "binding" "key_press S, Service Mode, RD-emblem-documents.png, " "binding" "key_press 0, Service Mode, RD-emblem-documents.png, " } } @@ -4628,6 +4826,7 @@ "bindings" { "binding" "key_press LEFT_ALT, Button 1 - Service, RD-Arcade-BLUE.png, " + "binding" "key_press S, Button 1 - Service, RD-Arcade-BLUE.png, " "binding" "key_press 1, Button 1 - Service, RD-Arcade-BLUE.png, " } } @@ -4645,6 +4844,7 @@ "bindings" { "binding" "key_press LEFT_ALT, Button 2 - Service, RD-Arcade-GREEN.png, " + "binding" "key_press S, Button 2 - Service, RD-Arcade-GREEN.png, " "binding" "key_press 2, Button 2 - Service, RD-Arcade-GREEN.png, " } } @@ -4662,6 +4862,7 @@ "bindings" { "binding" "key_press LEFT_ALT, Button 3 - Service, RD-Arcade-RED.png, " + "binding" "key_press S, Button 3 - Service, RD-Arcade-RED.png, " "binding" "key_press 3, Button 3 - Service, RD-Arcade-RED.png, " } } @@ -4679,6 +4880,7 @@ "bindings" { "binding" "key_press LEFT_ALT, Button 4 - Service, RD-Arcade-YELLOW.png, " + "binding" "key_press S, Button 4 - Service, RD-Arcade-YELLOW.png, " "binding" "key_press 4, Button 4 - Service, RD-Arcade-YELLOW.png, " } } @@ -4695,8 +4897,9 @@ { "bindings" { - "binding" "key_press LEFT_ALT, Bill / Note - Player 1, RD-emblem-generic.png, " - "binding" "key_press 5, Bill / Note - Player 1, RD-emblem-generic.png, " + "binding" "key_press LEFT_ALT, Insert Bill, RD-emblem-generic.png, " + "binding" "key_press B, Insert Bill, RD-emblem-generic.png, " + "binding" "key_press 1, Insert Bill, RD-emblem-generic.png, " } } } @@ -4712,8 +4915,81 @@ { "bindings" { - "binding" "key_press LEFT_ALT, Tilt - Player 1, RD-emblem-synchronizing.png, " - "binding" "key_press 6, Tilt - Player 1, RD-emblem-synchronizing.png, " + "binding" "key_press LEFT_ALT, Tilt - Player 4, RD-tilt-4.png, " + "binding" "key_press T, Tilt - Player 4, RD-tilt-4.png, " + "binding" "key_press 4, Tilt - Player 4, RD-tilt-4.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Tilt - Player 3, RD-tilt-3.png, " + "binding" "key_press T, Tilt - Player 3, RD-tilt-3.png, " + "binding" "key_press 3, Tilt - Player 3, RD-tilt-3.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_9" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Tilt - Player 2, RD-tilt-2.png, " + "binding" "key_press T, Tilt - Player 2, RD-tilt-2.png, " + "binding" "key_press 2, Tilt - Player 2, RD-tilt-2.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_10" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Tilt - Player 1, RD-tilt-1.png, " + "binding" "key_press T, Tilt - Player 1, RD-tilt-1.png, " + "binding" "key_press 1, Tilt - Player 1, RD-tilt-1.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_11" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Tilt, rd-tilt.png, " + "binding" "key_press T, Tilt, rd-tilt.png, " + "binding" "key_press 0, Tilt, rd-tilt.png, " } } } @@ -5002,7 +5278,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " } } } @@ -5035,8 +5311,8 @@ { "bindings" { - "binding" "key_press LEFT_CONTROL, Previous Cheat, RD-go-previous.png, " - "binding" "key_press F, Previous Cheat, RD-go-previous.png, " + "binding" "key_press LEFT_CONTROL, Cheats Toggle, RD-utilities-terminal.png, " + "binding" "key_press C, Cheats Toggle, RD-utilities-terminal.png, " } } } @@ -5052,8 +5328,8 @@ { "bindings" { - "binding" "key_press LEFT_CONTROL, Cheats Toggle, RD-utilities-terminal.png, " - "binding" "key_press C, Cheats Toggle, RD-utilities-terminal.png, " + "binding" "key_press LEFT_CONTROL, Previous Cheat, RD-go-previous.png, " + "binding" "key_press F, Previous Cheat, RD-go-previous.png, " } } } @@ -5524,7 +5800,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " } } } @@ -5533,40 +5809,6 @@ } } "touch_menu_button_1" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_ALT, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, " - "binding" "key_press H, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_2" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press LEFT_ALT, Freelook Mode - Toggle, RD-preferences-system-search.png, " - "binding" "key_press F, Freelook Mode - Toggle, RD-preferences-system-search.png, " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_3" { "activators" { @@ -5583,6 +5825,40 @@ { } } + "touch_menu_button_2" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, " + "binding" "key_press H, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_3" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Freelook Mode - Toggle, RD-preferences-system-search.png, " + "binding" "key_press F, Freelook Mode - Toggle, RD-preferences-system-search.png, " + } + } + } + "disabled_activators" + { + } + } "touch_menu_button_4" { "activators" @@ -5591,8 +5867,8 @@ { "bindings" { - "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-emblem-encrypted-unlocked.png, #232323 #ADA200" - "binding" "key_press Z, Wiimote - Upright Mode, RD-emblem-encrypted-unlocked.png, #232323 #ADA200" + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " } } } @@ -5608,8 +5884,8 @@ { "bindings" { - "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-emblem-encrypted-locked.png, #232323 #48B119" - "binding" "key_press X, Wiimote - Sideways Mode, RD-emblem-encrypted-locked.png, #232323 #48B119" + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " } } } @@ -5625,8 +5901,80 @@ { "bindings" { - "binding" "key_press LEFT_ALT, Reset Freelook Camera, RD-preferences-system-search.png, #232323 #AD0000" - "binding" "key_press R, Reset Freelook Camera, RD-preferences-system-search.png, #232323 #AD0000" + "binding" "key_press LEFT_ALT, Reset Freelook Camera, RD-view-refresh.png, " + "binding" "key_press R, Reset Freelook Camera, RD-view-refresh.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_7" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Sync Wii Mote 4, RD-wii-4.png, " + "binding" "key_press W, Sync Wii Mote 4, RD-wii-4.png, " + "binding" "key_press 4, Sync Wii Mote 4, RD-wii-4.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Sync Wii Mote 3, RD-wii-3.png, " + "binding" "key_press W, Sync Wii Mote 3, RD-wii-3.png, " + "binding" "key_press 3, Sync Wii Mote 3, RD-wii-3.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_9" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Sync Wii Mote 2, RD-wii-2.png, " + "binding" "key_press W, Sync Wii Mote 2, RD-wii-2.png, " + "binding" "key_press 2, Sync Wii Mote 2, RD-wii-2.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_10" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Sync Wii Mote 1, RD-wii-1.png, " + "binding" "key_press W, Sync Wii Mote 1, RD-wii-1.png, " + "binding" "key_press 1, Sync Wii Mote 1, RD-wii-1.png, " } } } @@ -5989,7 +6337,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " } } } @@ -6022,8 +6370,8 @@ { "bindings" { - "binding" "key_press LEFT_ALT, Play Microphone, RD-media-playback-start.png, " - "binding" "key_press P, Play Microphone, RD-media-playback-start.png, " + "binding" "key_press LEFT_ALT, Blow Microphone, RD-media-playback-start.png, " + "binding" "key_press P, Blow Microphone, RD-media-playback-start.png, " } } } @@ -6451,530 +6799,6 @@ } } "group" - { - "id" "189" - "mode" "four_buttons" - "name" "" - "description" "" - "inputs" - { - "button_a" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button A, , " - } - } - } - "disabled_activators" - { - } - } - "button_b" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button B, , " - } - } - } - "disabled_activators" - { - } - } - "button_x" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button X, , " - } - } - } - "disabled_activators" - { - } - } - "button_y" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button Y, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "190" - "mode" "radial_menu" - "name" "Secrets - Menu" - "description" "" - "inputs" - { - "touch_menu_button_0" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_1" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_UP, Konami Deck, RD-retrodeck-compact.png, " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_UP, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_DOWN, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_DOWN, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_LEFT, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_RIGHT, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_LEFT, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_RIGHT, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press A, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press B, , " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_2" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press 3, Here be dragons!, RD-vcmi.png, " - "binding" "key_press 2, Here be dragons!, RD-vcmi.png, " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press 1, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press 6, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press 7, , " - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_3" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press I, You can do it!, RD-gzdoom.png, " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press D, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press D, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press Q, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "key_press D, , " - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "touchmenu_button_fire_type" "1" - } - } - "group" - { - "id" "191" - "mode" "absolute_mouse" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Soft_Press" - { - "bindings" - { - "binding" "mouse_button LEFT, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "192" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button JOYSTICK_LEFT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "deadzone_inner_radius" "7199" - } - } - "group" - { - "id" "193" - "mode" "trigger" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button TRIGGER_LEFT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "output_trigger" "1" - } - } - "group" - { - "id" "194" - "mode" "trigger" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button TRIGGER_RIGHT, , " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "output_trigger" "2" - } - } - "group" - { - "id" "195" - "mode" "joystick_move" - "name" "" - "description" "" - "inputs" - { - "click" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button JOYSTICK_RIGHT, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "196" - "mode" "dpad" - "name" "" - "description" "" - "inputs" - { - "dpad_north" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_UP, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_south" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_DOWN, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_east" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_RIGHT, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - "dpad_west" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button DPAD_LEFT, , " - } - "settings" - { - "haptic_intensity" "1" - } - } - } - "disabled_activators" - { - } - } - } - "settings" - { - "requires_click" "0" - "haptic_intensity_override" "0" - } - } - "group" - { - "id" "197" - "mode" "mouse_joystick" - "name" "" - "description" "" - "inputs" - { - } - } - "group" { "id" "199" "mode" "four_buttons" @@ -7064,7 +6888,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " } } } @@ -7461,7 +7285,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, " + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " } } } @@ -7959,6 +7783,1175 @@ } } "group" + { + "id" "222" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "223" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "225" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button A, , " + } + } + } + "disabled_activators" + { + } + } + "button_b" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button B, , " + } + } + } + "disabled_activators" + { + } + } + "button_x" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button X, , " + } + } + } + "disabled_activators" + { + } + } + "button_y" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button Y, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "226" + "mode" "radial_menu" + "name" "ScummVM - Menu" + "description" "" + "inputs" + { + "touch_menu_button_0" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_1" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press O, Open, rd-pc-open.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_2" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press C, Close, rd-pc-close.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_3" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F, Fight, rd-pc-fight.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_4" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press U, Use, rd-pc-use.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_5" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press P, Pick-Up, rd-pc-pickup.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_6" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press S, Push / Shove, rd-pc-push.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_7" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press Y, Pull / Yank, rd-pc-pull.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press L, Look-At, rd-pc-look.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_9" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press T, Talk To, rd-pc-talk.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_10" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press G, Give, rd-pc-give.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_11" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press M, Move, rd-pc-move.png, " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "touchmenu_button_fire_type" "1" + } + } + "group" + { + "id" "227" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "228" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "deadzone_inner_radius" "7199" + } + } + "group" + { + "id" "229" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "1" + } + } + "group" + { + "id" "230" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_RIGHT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "2" + } + } + "group" + { + "id" "231" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "232" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_UP, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_DOWN, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_RIGHT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_LEFT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "haptic_intensity_override" "0" + } + } + "group" + { + "id" "233" + "mode" "mouse_joystick" + "name" "" + "description" "" + "inputs" + { + } + } + "group" + { + "id" "234" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "235" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "236" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "237" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "238" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "239" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "240" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "241" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "242" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "243" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "244" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "246" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "247" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "248" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "250" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button A, , " + } + } + } + "disabled_activators" + { + } + } + "button_b" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button B, , " + } + } + } + "disabled_activators" + { + } + } + "button_x" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button X, , " + } + } + } + "disabled_activators" + { + } + } + "button_y" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button Y, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "251" + "mode" "radial_menu" + "name" "GZDoom - Menu" + "description" "" + "inputs" + { + "touch_menu_button_0" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_1" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press I, Get All Items, RD-freedoom-pack3.png, " + "binding" "key_press D, Get All Items, RD-freedoom-pack3.png, " + "binding" "key_press F, Get All Items, RD-freedoom-pack3.png, " + "binding" "key_press A, Get All Items, RD-freedoom-pack3.png, " + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_2" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press I, Get All Items + Keys, RD-freedoom-pack2.png, " + "binding" "key_press D, Get All Items + Keys, RD-freedoom-pack2.png, " + "binding" "key_press K, Get All Items + Keys, RD-freedoom-pack2.png, " + "binding" "key_press F, Get All Items + Keys, RD-freedoom-pack2.png, " + "binding" "key_press A, Get All Items + Keys, RD-freedoom-pack2.png, " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "touchmenu_button_fire_type" "1" + } + } + "group" + { + "id" "252" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "253" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "deadzone_inner_radius" "7199" + } + } + "group" + { + "id" "254" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "1" + } + } + "group" + { + "id" "255" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_RIGHT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "2" + } + } + "group" + { + "id" "256" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "257" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_UP, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_DOWN, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_RIGHT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_LEFT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "haptic_intensity_override" "0" + } + } + "group" + { + "id" "258" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" { "id" "34" "mode" "switches" @@ -7997,7 +8990,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -8077,7 +9070,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -8097,7 +9090,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -8162,7 +9155,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -8242,7 +9235,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -8262,7 +9255,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -8321,7 +9314,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, , " + "binding" "controller_action CHANGE_PRESET 1 0 0, , " } } "Full_Press" @@ -8394,7 +9387,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 1 0 1, , " + "binding" "controller_action CHANGE_PRESET 1 0 0, , " } } } @@ -8459,7 +9452,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -8539,7 +9532,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -8559,7 +9552,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -8624,7 +9617,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -8704,7 +9697,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -8724,7 +9717,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -8789,7 +9782,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -8869,7 +9862,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -8889,7 +9882,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -8954,7 +9947,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -9034,7 +10027,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -9054,7 +10047,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -9119,7 +10112,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -9199,7 +10192,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -9219,7 +10212,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -9284,7 +10277,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -9364,7 +10357,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -9384,7 +10377,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -9449,7 +10442,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -9529,7 +10522,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -9549,7 +10542,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -9614,7 +10607,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -9694,7 +10687,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -9714,7 +10707,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -9779,7 +10772,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -9859,7 +10852,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -9879,7 +10872,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -9944,7 +10937,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -10024,7 +11017,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -10044,172 +11037,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " - } - } - } - "disabled_activators" - { - } - } - "button_capture" - { - "activators" - { - "release" - { - "bindings" - { - "binding" "controller_action system_key_1, , " - } - } - } - "disabled_activators" - { - } - } - } - } - "group" - { - "id" "188" - "mode" "switches" - "name" "" - "description" "" - "inputs" - { - "button_escape" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button start, , " - } - } - } - "disabled_activators" - { - } - } - "button_menu" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button select, , " - } - } - "Full_Press" - { - "bindings" - { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " - } - } - } - "disabled_activators" - { - } - } - "left_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button shoulder_left, , " - } - } - } - "disabled_activators" - { - } - } - "right_bumper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button shoulder_right, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_left" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button B, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_right" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "xinput_button A, , " - } - } - } - "disabled_activators" - { - } - } - "button_back_left_upper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " - } - "settings" - { - "toggle" "1" - } - } - } - "disabled_activators" - { - } - } - "button_back_right_upper" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -10274,7 +11102,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -10354,7 +11182,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -10374,7 +11202,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -10439,7 +11267,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, , " } } } @@ -10519,7 +11347,7 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } "settings" { @@ -10539,7 +11367,337 @@ { "bindings" { - "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , " + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action system_key_1, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "224" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button select, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button B, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button A, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " + } + "settings" + { + "toggle" "1" + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action system_key_1, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "249" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button select, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button B, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button A, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " + } + "settings" + { + "toggle" "1" + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " } } } @@ -10588,7 +11746,8 @@ "8" "right_joystick active" "9" "dpad active" "14" "gyro inactive" - "15" "gyro active" + "15" "gyro inactive" + "222" "gyro active" } } "preset" @@ -10599,16 +11758,17 @@ { "19" "switch active" "16" "button_diamond active" - "23" "joystick inactive" - "219" "joystick active" + "23" "joystick active" + "219" "joystick inactive" "17" "left_trigger active" "18" "right_trigger active" - "22" "right_joystick inactive" - "218" "right_joystick active" + "22" "right_joystick active" + "218" "right_joystick inactive" "20" "dpad inactive" "21" "dpad active" "45" "gyro inactive" - "176" "gyro active" + "176" "gyro inactive" + "234" "gyro active" } } "preset" @@ -10627,7 +11787,8 @@ "41" "right_joystick active" "42" "dpad active" "43" "gyro inactive" - "177" "gyro active" + "177" "gyro inactive" + "235" "gyro active" } } "preset" @@ -10646,7 +11807,8 @@ "53" "right_joystick active" "54" "dpad active" "55" "gyro inactive" - "178" "gyro active" + "178" "gyro inactive" + "236" "gyro active" } } "preset" @@ -10665,7 +11827,8 @@ "63" "right_joystick active" "64" "dpad active" "65" "gyro inactive" - "179" "gyro active" + "179" "gyro inactive" + "237" "gyro active" } } "preset" @@ -10684,7 +11847,8 @@ "73" "right_joystick active" "74" "dpad active" "75" "gyro inactive" - "180" "gyro active" + "180" "gyro inactive" + "238" "gyro active" } } "preset" @@ -10703,7 +11867,8 @@ "83" "right_joystick active" "84" "dpad active" "85" "gyro inactive" - "181" "gyro active" + "181" "gyro inactive" + "239" "gyro active" } } "preset" @@ -10722,7 +11887,8 @@ "123" "right_joystick active" "124" "dpad active" "125" "gyro inactive" - "182" "gyro active" + "182" "gyro inactive" + "223" "gyro active" } } "preset" @@ -10741,7 +11907,8 @@ "133" "right_joystick active" "134" "dpad active" "135" "gyro inactive" - "183" "gyro active" + "183" "gyro inactive" + "240" "gyro active" } } "preset" @@ -10760,7 +11927,8 @@ "143" "right_joystick active" "144" "dpad active" "145" "gyro inactive" - "184" "gyro active" + "184" "gyro inactive" + "241" "gyro active" } } "preset" @@ -10779,7 +11947,8 @@ "153" "right_joystick active" "154" "dpad active" "155" "gyro inactive" - "185" "gyro active" + "185" "gyro inactive" + "242" "gyro active" } } "preset" @@ -10798,7 +11967,8 @@ "163" "right_joystick active" "164" "dpad active" "165" "gyro inactive" - "186" "gyro active" + "186" "gyro inactive" + "243" "gyro active" } } "preset" @@ -10817,30 +11987,13 @@ "173" "right_joystick active" "174" "dpad active" "175" "gyro inactive" - "187" "gyro active" + "187" "gyro inactive" + "244" "gyro active" } } "preset" { "id" "13" - "name" "Preset_1000014" - "group_source_bindings" - { - "188" "switch active" - "189" "button_diamond active" - "190" "left_trackpad active" - "191" "right_trackpad active" - "192" "joystick active" - "193" "left_trigger active" - "194" "right_trigger active" - "195" "right_joystick active" - "196" "dpad active" - "197" "gyro active" - } - } - "preset" - { - "id" "14" "name" "Preset_1000015" "group_source_bindings" { @@ -10853,12 +12006,13 @@ "204" "right_trigger active" "205" "right_joystick active" "206" "dpad active" - "207" "gyro active" + "207" "gyro inactive" + "246" "gyro active" } } "preset" { - "id" "15" + "id" "14" "name" "Preset_1000016" "group_source_bindings" { @@ -10871,7 +12025,45 @@ "214" "right_trigger active" "215" "right_joystick active" "216" "dpad active" - "217" "gyro active" + "217" "gyro inactive" + "247" "gyro active" + } + } + "preset" + { + "id" "15" + "name" "Preset_1000017" + "group_source_bindings" + { + "224" "switch active" + "225" "button_diamond active" + "226" "left_trackpad active" + "227" "right_trackpad active" + "228" "joystick active" + "229" "left_trigger active" + "230" "right_trigger active" + "231" "right_joystick active" + "232" "dpad active" + "233" "gyro inactive" + "248" "gyro active" + } + } + "preset" + { + "id" "16" + "name" "Preset_1000018" + "group_source_bindings" + { + "249" "switch active" + "250" "button_diamond active" + "251" "left_trackpad active" + "252" "right_trackpad active" + "253" "joystick active" + "254" "left_trigger active" + "255" "right_trigger active" + "256" "right_joystick active" + "257" "dpad active" + "258" "gyro active" } } "settings" @@ -10880,3 +12072,4 @@ "right_trackpad_mode" "0" } } + diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_simple.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_simple.vdf new file mode 100644 index 00000000..4c597417 --- /dev/null +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_simple.vdf @@ -0,0 +1,1918 @@ +"controller_mappings" +{ + "version" "3" + "revision" "1874" + "title" "RetroDECK: Steam Deck - Neptune v.1b SIMPLE" + "description" "RetroDECK: Steam Deck - Neptune v.1b SIMPLE" + "creator" "" + "progenitor" "" + "url" "" + "export_type" "" + "controller_type" "controller_neptune" + "controller_caps" "23117823" + "major_revision" "0" + "minor_revision" "0" + "Timestamp" "-942108240" + "actions" + { + "Default" + { + "title" "RetroDECK - Set" + "legacy_set" "1" + } + "Preset_1000001" + { + "title" "Global Hotkeys - Set" + "legacy_set" "1" + } + } + "action_layers" + { + } + "localization" + { + "english" + { + "title" "Gamepad with Gyro" + "description" "The template works best for games that are designed with a gamepad in mind, but also support a desktop mouse for camera control or aim. This uses both the right pad and the gyro to allow for the most precise aim in games which support gamepad and mouse." + } + } + "group" + { + "id" "0" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button A, , " + } + } + } + "disabled_activators" + { + } + } + "button_b" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button B, , " + } + } + } + "disabled_activators" + { + } + } + "button_x" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button X, , " + } + } + } + "disabled_activators" + { + } + } + "button_y" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button Y, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "1" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_up, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_down, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_right, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button dpad_left, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "2" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "3" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "deadzone_inner_radius" "7199" + } + } + "group" + { + "id" "4" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "1" + } + } + "group" + { + "id" "5" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button TRIGGER_RIGHT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "output_trigger" "2" + } + } + "group" + { + "id" "6" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "8" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button JOYSTICK_RIGHT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "9" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_UP, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_DOWN, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_RIGHT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button DPAD_LEFT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "haptic_intensity_override" "0" + } + } + "group" + { + "id" "10" + "mode" "single_button" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "xinput_button START, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "11" + "mode" "single_button" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "12" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "13" + "mode" "joystick_camera" + "name" "" + "description" "" + "inputs" + { + } + } + "group" + { + "id" "14" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + } + } + "group" + { + "id" "15" + "mode" "mouse_joystick" + "name" "" + "description" "" + "inputs" + { + } + } + "group" + { + "id" "16" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, PAUSE TOGGLE, , " + "binding" "key_press P, PAUSE TOGGLE, , " + } + } + } + "disabled_activators" + { + } + } + "button_b" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, CAPTURE SCREENSHOT, , " + "binding" "key_press X, CAPTURE SCREENSHOT, , " + } + } + } + "disabled_activators" + { + } + } + "button_x" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, FULLSCREEN TOGGLE, , " + "binding" "key_press RETURN, FULLSCREEN TOGGLE, , " + } + } + } + "disabled_activators" + { + } + } + "button_y" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Open Menu, , " + "binding" "key_press M, Open Menu, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "17" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, REWIND, , " + "binding" "key_press KEYPAD_DASH, REWIND, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "18" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, FAST FORWARD, , " + "binding" "key_press KEYPAD_PLUS, FAST FORWARD, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "20" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action empty_sub_command, , " + "binding" "controller_action empty_sub_command, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "21" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Increase Emulation Speed, , " + "binding" "key_press 1, Increase Emulation Speed, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Decrease Emulation Speed, , " + "binding" "key_press 2, Decrease Emulation Speed, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, NEXT SAVE SLOT, , " + "binding" "key_press K, NEXT SAVE SLOT, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, PREVIOUS SAVE SLOT, , " + "binding" "key_press J, PREVIOUS SAVE SLOT, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "haptic_intensity_override" "0" + } + } + "group" + { + "id" "22" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press ESCAPE, Escape, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "23" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, SWAP SCREENS, , " + "binding" "key_press TAB, SWAP SCREENS, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "45" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + } + } + "group" + { + "id" "176" + "mode" "mouse_joystick" + "name" "" + "description" "" + "inputs" + { + } + } + "group" + { + "id" "218" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_SHIFT, , " + "binding" "key_press W, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_SHIFT, , " + "binding" "key_press S, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_SHIFT, , " + "binding" "key_press D, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_SHIFT, , " + "binding" "key_press A, , " + } + } + } + "disabled_activators" + { + } + } + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press ESCAPE, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "219" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_SHIFT, , " + "binding" "key_press E, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_SHIFT, , " + "binding" "key_press Q, , " + } + } + } + "disabled_activators" + { + } + } + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, , " + "binding" "key_press TAB, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "235" + "mode" "radial_menu" + "name" "Simple Radial" + "description" "" + "inputs" + { + "touch_menu_button_0" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_1" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press ESCAPE, Escape, RD-ESC.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_2" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RETURN, Enter, RD-Enter.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_3" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press TAB, Tab, RD-Tab.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_4" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_5" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press SPACE, Space, RD-space.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_6" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_7" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Alt, RD-alt.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_8" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F1, F1, RD-F1.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_9" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F8, F8, RD-F8.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_10" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press F10, F10, RD-F10.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_11" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, " + "binding" "key_press R, Restart / Reset, RD-system-reboot.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_12" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, " + "binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_13" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, " + "binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_14" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, " + "binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_15" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, " + "binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_16" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, " + "binding" "key_press D, Swap Disc, RD-application-x-iso.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "222" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "234" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "236" + "mode" "reference" + "description" "" + "settings" + { + "referenced_mode" "235" + } + } + "group" + { + "id" "237" + "mode" "reference" + "description" "" + "settings" + { + "referenced_mode" "235" + } + } + "group" + { + "id" "238" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "7" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button start, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button select, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_left, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button shoulder_right, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button B, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "xinput_button A, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " + } + "settings" + { + "toggle" "1" + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action system_key_1, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "19" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, EXIT EMULATOR, , " + "binding" "key_press Q, EXIT EMULATOR, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 1 0 0, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "xinput_button SELECT, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, LOAD STATE, , " + "binding" "key_press A, LOAD STATE, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, SAVE STATE, , " + "binding" "key_press S, SAVE STATE, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_left_upper" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 1 0 0, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right_upper" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action CHANGE_PRESET 1 0 0, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action system_key_1, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "preset" + { + "id" "0" + "name" "Default" + "group_source_bindings" + { + "7" "switch active" + "0" "button_diamond active" + "1" "left_trackpad inactive" + "11" "left_trackpad inactive" + "236" "left_trackpad active" + "2" "right_trackpad inactive" + "6" "right_trackpad inactive" + "10" "right_trackpad inactive" + "12" "right_trackpad active" + "13" "right_trackpad inactive" + "3" "joystick active" + "235" "joystick inactive" + "4" "left_trigger active" + "5" "right_trigger active" + "8" "right_joystick active" + "9" "dpad active" + "14" "gyro inactive" + "15" "gyro inactive" + "222" "gyro active" + } + } + "preset" + { + "id" "1" + "name" "Preset_1000001" + "group_source_bindings" + { + "19" "switch active" + "16" "button_diamond active" + "237" "left_trackpad active" + "238" "right_trackpad active" + "23" "joystick active" + "219" "joystick inactive" + "17" "left_trigger active" + "18" "right_trigger active" + "22" "right_joystick active" + "218" "right_joystick inactive" + "20" "dpad inactive" + "21" "dpad active" + "45" "gyro inactive" + "176" "gyro inactive" + "234" "gyro active" + } + } + "settings" + { + "left_trackpad_mode" "0" + "right_trackpad_mode" "0" + } +} diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro_simple.vdf similarity index 97% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro_simple.vdf index c4c07a17..cf6d1e34 100755 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro_simple.vdf @@ -905,7 +905,7 @@ { "id" "22" "mode" "radial_menu" - "name" "Global Radial" + "name" "Simple Radial" "description" "" "inputs" { @@ -1097,7 +1097,7 @@ { "bindings" { - "binding" "key_press F4, F4, RD-F4.png, " + "binding" "key_press F8, F8, RD-F8.png, " } "settings" { @@ -1110,66 +1110,6 @@ } } "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" { "activators" { @@ -1189,7 +1129,7 @@ { } } - "touch_menu_button_14" + "touch_menu_button_11" { "activators" { @@ -1210,7 +1150,7 @@ { } } - "touch_menu_button_15" + "touch_menu_button_12" { "activators" { @@ -1231,7 +1171,7 @@ { } } - "touch_menu_button_16" + "touch_menu_button_13" { "activators" { @@ -1252,7 +1192,7 @@ { } } - "touch_menu_button_17" + "touch_menu_button_14" { "activators" { @@ -1273,7 +1213,7 @@ { } } - "touch_menu_button_18" + "touch_menu_button_15" { "activators" { @@ -1294,7 +1234,7 @@ { } } - "touch_menu_button_19" + "touch_menu_button_16" { "activators" { @@ -1315,10 +1255,69 @@ { } } - } - "settings" - { - "touchmenu_button_fire_type" "0" + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } } } "group" diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360_simple.vdf similarity index 97% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360_simple.vdf index d41448c8..ede54472 100755 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360_simple.vdf @@ -1134,7 +1134,7 @@ { "id" "19" "mode" "radial_menu" - "name" "dial" + "name" "Simple Radial" "description" "" "inputs" { @@ -1326,7 +1326,7 @@ { "bindings" { - "binding" "key_press F4, F4, RD-F4.png, " + "binding" "key_press F8, F8, RD-F8.png, " } "settings" { @@ -1339,66 +1339,6 @@ } } "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" { "activators" { @@ -1418,7 +1358,7 @@ { } } - "touch_menu_button_14" + "touch_menu_button_11" { "activators" { @@ -1439,7 +1379,7 @@ { } } - "touch_menu_button_15" + "touch_menu_button_12" { "activators" { @@ -1460,7 +1400,7 @@ { } } - "touch_menu_button_16" + "touch_menu_button_13" { "activators" { @@ -1481,7 +1421,7 @@ { } } - "touch_menu_button_17" + "touch_menu_button_14" { "activators" { @@ -1502,7 +1442,7 @@ { } } - "touch_menu_button_18" + "touch_menu_button_15" { "activators" { @@ -1523,7 +1463,7 @@ { } } - "touch_menu_button_19" + "touch_menu_button_16" { "activators" { @@ -1544,10 +1484,69 @@ { } } - } - "settings" - { - "touchmenu_button_fire_type" "0" + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } } } "preset" diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone_simple.vdf similarity index 97% rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone.vdf rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone_simple.vdf index 3899504b..a4464055 100755 --- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone.vdf +++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone_simple.vdf @@ -838,7 +838,7 @@ { "id" "20" "mode" "radial_menu" - "name" "Global Radial" + "name" "Simple Radial" "description" "" "inputs" { @@ -1030,7 +1030,7 @@ { "bindings" { - "binding" "key_press F4, F4, RD-F4.png, " + "binding" "key_press F8, F8, RD-F8.png, " } "settings" { @@ -1043,66 +1043,6 @@ } } "touch_menu_button_10" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F5, F5, RD-F5.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_11" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F7, F7, RD-F7.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_12" - { - "activators" - { - "Full_Press" - { - "bindings" - { - "binding" "key_press F8, F8, RD-F8.png, " - } - "settings" - { - "haptic_intensity" "2" - } - } - } - "disabled_activators" - { - } - } - "touch_menu_button_13" { "activators" { @@ -1122,7 +1062,7 @@ { } } - "touch_menu_button_14" + "touch_menu_button_11" { "activators" { @@ -1143,7 +1083,7 @@ { } } - "touch_menu_button_15" + "touch_menu_button_12" { "activators" { @@ -1164,7 +1104,7 @@ { } } - "touch_menu_button_16" + "touch_menu_button_13" { "activators" { @@ -1185,7 +1125,7 @@ { } } - "touch_menu_button_17" + "touch_menu_button_14" { "activators" { @@ -1206,7 +1146,7 @@ { } } - "touch_menu_button_18" + "touch_menu_button_15" { "activators" { @@ -1227,7 +1167,7 @@ { } } - "touch_menu_button_19" + "touch_menu_button_16" { "activators" { @@ -1248,10 +1188,69 @@ { } } - } - "settings" - { - "touchmenu_button_fire_type" "0" + "touch_menu_button_17" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, " + "binding" "key_press F4, ALT + F4, RD-alt-f4.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_18" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, " + "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + "touch_menu_button_19" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, " + "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } } } "group" @@ -1619,3 +1618,4 @@ "right_trackpad_mode" "0" } } + diff --git a/emu-configs/defaults/retrodeck/helper_files/Install-firmware-through-Ryujinx.txt b/emu-configs/defaults/retrodeck/helper_files/Install-firmware-through-Ryujinx.txt new file mode 100644 index 00000000..7d196eee --- /dev/null +++ b/emu-configs/defaults/retrodeck/helper_files/Install-firmware-through-Ryujinx.txt @@ -0,0 +1,10 @@ +Do not drop the firmware files here, install them via Ryujinx: + +RetroDECK Configurator -> Open Emulator -> Ryujinx -> Tools -> Install Firmware - Select the firmware zipped file + +Check the wiki for more information. + +Related wiki article can be found here: +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/ryujinx/ryujinx-guide/ + +The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt index 4deee10f..75153575 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt @@ -23,6 +23,6 @@ Texture folder directly - Move textures into the right ~/retrodeck/texture_packs/duckstation/ folder. Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/Duckstation%3A-Texture-Packs +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/duckstation/duckstation-texture-pack/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt index 33e9d9c8..961ff4a7 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt @@ -27,6 +27,6 @@ You want apply a texture pack to a game called ScaryCastle USA.nes and you have NOTE: On the Steam Deck go into GameMode first, then launch RetroDECK. Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/RetroArch-Mesen%3A-Texture-Packs +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/retroarch/retroarch-mesen-texture-pack/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt index 6cfe0670..825751aa 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt @@ -25,6 +25,6 @@ For compressed textures stored in .hts files, place them in the 'texture_packs/R For uncompressed textures stored in loose folders or files, place them in the 'texture_packs/RetroArch-Mupen64Plus/hires_texture/' folder. Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/RetroArch-Mupen64Plus-Next%3A-Texture-Packs +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/retroarch/retroarch-mupen64plus-texture-pack/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt index 807513b7..ed75e899 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt @@ -21,6 +21,6 @@ For direct texture folder: 3. Move textures into the correct '~/retrodeck/texture_packs/PCSX2/' folder. Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/PCSX2%3A-Texture-Packs +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/pcsx2/pcsx2-texture-pack/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt index 6fabb0e4..44a6da45 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt @@ -21,6 +21,6 @@ For adding textures: 3. Paste the textures into the correct '~/retrodeck/texture_packs/ppsspp/' folder. Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/PPSSPP%3A-Texture-Packs +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/ppsspp/ppsspp-texture-pack/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-citra-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-citra-mods.txt deleted file mode 100644 index 8918ba2d..00000000 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-citra-mods.txt +++ /dev/null @@ -1,19 +0,0 @@ -There are two ways of adding mods into Citra - -From Citra -- Extract any mod from compressed .zip or any other format to folders. -- Open up Citra inside RetroDECK Configurator by pressing Open Emulator - Citra. -- Right click on the game you want to add mods into. -- Click on Open Mods Location. -- Paste the mod files inside that directory, each folder is stored by the TITLLEID of the game. -- Quit Citra - -From the mod folder directly -- Extract any mod files from compressed .zip or any other format into folders. -- Go into ~/retrodeck/mods/citra/. The folders are all named by TITLEID. -- Past the mods into the right ~/retrodeck/mods/yuzu/ folder. - -Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/Citra%3A-Mods#citra---3ds - -The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-custom-emulators.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-custom-emulators.txt deleted file mode 100644 index 2c35cf4a..00000000 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-custom-emulators.txt +++ /dev/null @@ -1,16 +0,0 @@ -There is the possibility to provide custom emutlators provided by the user. - -At the moment the only one available is Yuzu. -Place your custom Yuzu files (AppImage and such) in the custom/yuzu folder without any other subfolders, like in the example: -retrodeck/customs/yuzu/yuzu*.AppImage - -WARNINGS on custom emulators: -- Custom emulators are self managed: means that RetroDECK Team is not supporting nor troubleshooting them. -- Custom emulators could potentially break other included emulators configs: use them at your own risk. -- Remember to make the binary executable, otherwise they won't be launched. -- Hotkeys might not be working if not configured by the users. - -Related wiki article can be found here: ---- - -The RetroDECK Team diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt index 33a50c8c..a9b96bc5 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt @@ -14,6 +14,6 @@ Notes: - GAME_ID is different for every game. Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/Dolphin-and-Primehack%3A-Mods +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-mod/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt index 1bcbbc05..8d3650e9 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt @@ -14,6 +14,6 @@ Notes: - GAME_ID is different for every game. Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/Dolphin-and-Primehack%3A-Mods +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-mod/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt index febbde78..e51a66b5 100644 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt +++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt @@ -17,6 +17,6 @@ For example the game `WipEout 2048 (EU)` has an ID that is `PCSF00007`. So simply add `PCSF00007` to the `WipEout 2048 (EU).psvita` file and the setup for this game is complete. Related wiki article can be found here: --- +https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/vita3k/vita3k-guide/ The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-yuzu-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-yuzu-mods.txt deleted file mode 100644 index 1f41c698..00000000 --- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-yuzu-mods.txt +++ /dev/null @@ -1,25 +0,0 @@ -There are two ways of adding mods into Yuzu - -From Yuzu directly -- Extract any mod files from compressed .zip or any other format to folders. -- Open up Yuzu inside RetroDECK Configurator by pressing Open Emulator - Yuzu. -- Right click on the game you want to add mods into. -- Click on Open Mod Data Destination. -- Paste the mod folders inside that directory. -- Right clicking on the game and selecting Properties. -- Enable the mods you want to enable by pressing the checkboxes in the Add-Ons tab and press OK. -- Quit Yuzu - -From the mods/yuzu folder -- Extract any mod files from compressed .zip or any other format into folders. -- Go into ~/retrodeck/mods/yuzu/ and file the right folder for the game you want to add mods to. The folders are all named by TITLEID. -- Move those folders into ~/retrodeck/mods/yuzu/ -- Open up Yuzu inside RetroDECK Configurator by pressing Open Emulator - Yuzu. -- Right clicking on the game and selecting Properties. -- Enable the mods you want to enable by pressing the checkboxes in the Add-Ons tab and press OK. -- Quit Yuzu - -Related wiki article can be found here: -https://github.com/XargonWan/RetroDECK/wiki/Yuzu%3A-Mods - -The RetroDECK Team \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/presets/gb_presets.cfg b/emu-configs/defaults/retrodeck/presets/gb_presets.cfg index d754c374..5c61c27b 100644 --- a/emu-configs/defaults/retrodeck/presets/gb_presets.cfg +++ b/emu-configs/defaults/retrodeck/presets/gb_presets.cfg @@ -10,3 +10,4 @@ change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Gambatte/ change^borders^input_overlay_scale_landscape^1.205000^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_y_offset_landscape^0.005000^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gb.rmp +change^rewind^rewind_enable^true^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg diff --git a/emu-configs/defaults/retrodeck/presets/gba_presets.cfg b/emu-configs/defaults/retrodeck/presets/gba_presets.cfg index b5a4fc03..7f4d649e 100644 --- a/emu-configs/defaults/retrodeck/presets/gba_presets.cfg +++ b/emu-configs/defaults/retrodeck/presets/gba_presets.cfg @@ -4,9 +4,10 @@ change^borders^custom_viewport_height^640^^/var/config/retroarch/config/mGBA/gba change^borders^custom_viewport_width^960^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^custom_viewport_x^160^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^custom_viewport_y^0^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg -change^borders^input_overlay_enable^true^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gba.cfg^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg +change^borders^input_overlay_enable^true^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_scale_landscape^1.2150000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_y_offset_landscape^0.020000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg -enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp +enable^abxy_button_swap^/var/config/retroarch/config/remaps/mGBA/gba.rmp +change^rewind^rewind_enable^true^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg diff --git a/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg b/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg index d6b2e107..4580722e 100644 --- a/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg +++ b/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg @@ -10,3 +10,4 @@ change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Gambatte/ change^borders^input_overlay_scale_landscape^1.205000^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_y_offset_landscape^-0.040000^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp +change^rewind^rewind_enable^true^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg diff --git a/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg b/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg index c566decf..59fccbf8 100644 --- a/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg +++ b/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg @@ -4,3 +4,4 @@ change^borders^input_overlay_aspect_adjust_landscape^0.100000^^/var/config/retro change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_scale_landscape^1.040000^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg +change^rewind^rewind_enable^true^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg diff --git a/emu-configs/defaults/retrodeck/presets/gg_presets.cfg b/emu-configs/defaults/retrodeck/presets/gg_presets.cfg index 2de18ce3..c2b58364 100644 --- a/emu-configs/defaults/retrodeck/presets/gg_presets.cfg +++ b/emu-configs/defaults/retrodeck/presets/gg_presets.cfg @@ -9,3 +9,4 @@ change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retro change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_scale_landscape^1.350000^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg change^borders^input_overlay_y_offset_landscape^0.020000^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg +change^rewind^rewind_enable^true^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg diff --git a/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg b/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg index 4d8c268e..2cbc3596 100644 --- a/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg +++ b/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg @@ -3,5 +3,5 @@ change^cheevos^cheevos_enable^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg change^cheevos^cheevos_token^$cheevos_token^^$raconf^$emuconfigs/retroarch/retroarch.cfg change^cheevos^cheevos_username^$cheevos_username^^$raconf^$emuconfigs/retroarch/retroarch.cfg change^cheevos_hardcore^cheevos_hardcore_mode_enable^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg -change^savestate_auto_load^savestate_auto_load^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg -change^savestate_auto_save^savestate_auto_save^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg +change^quick_resume^savestate_auto_load^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg +change^quick_resume^savestate_auto_save^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg diff --git a/emu-configs/defaults/retrodeck/presets/snes_presets.cfg b/emu-configs/defaults/retrodeck/presets/snes_presets.cfg index 06ce7b18..99825095 100644 --- a/emu-configs/defaults/retrodeck/presets/snes_presets.cfg +++ b/emu-configs/defaults/retrodeck/presets/snes_presets.cfg @@ -5,3 +5,4 @@ change^borders^input_overlay_scale_landscape^1.050000^^/var/config/retroarch/con change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg enable^abxy_button_swap^/var/config/retroarch/config/remaps/Snes9x/snes.rmp +change^rewind^rewind_enable^true^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg diff --git a/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg b/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg index c11d6a4c..a775d8bc 100644 --- a/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg +++ b/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg @@ -1,14 +1,27 @@ -neogeo.zip^^Unknown^Arcade (FinalBurn Neo)^Neo Geo BIOS (Required for this system) -neocdz.zip^^Unknown^Arcade (FinalBurn Neo)^Neo Geo CDZ BIOS (Required for this system) -decocass.zip^^Unknown^Arcade (FinalBurn Neo)^DECO Cassette System BIOS (Required for this system) -isgsm.zip^^Unknown^Arcade (FinalBurn Neo)^ISG Selection Master Type 2006 System BIOS (Required for this system) -midssio.zip^^Unknown^Arcade (FinalBurn Neo)^Midway SSIO Sound Board Internal ROM (Required for this system) -nmk004.zip^^Unknown^Arcade (FinalBurn Neo)^NMK004 Internal ROM (Required for this system) -pgm.zip^^Unknown^Arcade (FinalBurn Neo)^PGM System BIOS (Required for this system) -skns.zip^^Unknown^Arcade (FinalBurn Neo)^Super Kaneko Nova System BIOS (Required for this system) -ym2608.zip^^Unknown^Arcade (FinalBurn Neo)^YM2608 Internal ROM (Required for this system) -cchip.zip^^Unknown^Arcade (FinalBurn Neo)^C-Chip Internal ROM (Required for this system) -bubsys.zip^^Unknown^Arcade (FinalBurn Neo)^Bubble System BIOS (Required for this system) +panafz1.bin^^f47264dd47fe30f73ab3c010015c155b^3DO^Panasonic FZ-1 +panafz10.bin^^51f2f43ae2f3508a14d9f56597e2d3ce^3DO^Panasonic FZ-10 +panafz10-norsa.bin^^1477bda80dc33731a65468c1f5bcbee9^3DO^Panasonic FZ-10 [RSA Patch] +panafz10e-anvil.bin^^a48e6746bd7edec0f40cff078f0bb19f^3DO^Panasonic FZ-10-E [Anvil] +panafz10e-anvil-norsa.bin^^cf11bbb5a16d7af9875cca9de9a15e09^3DO^Panasonic FZ-10-E [Anvil RSA Patch] +panafz1j.bin^^a496cfdded3da562759be3561317b605^3DO^Panasonic FZ-1J +panafz1j-norsa.bin^^f6c71de7470d16abe4f71b1444883dc8^3DO^Panasonic FZ-1J [RSA Patch] +goldstar.bin^^8639fd5e549bd6238cfee79e3e749114^3DO^Goldstar GDO-101M +sanyotry.bin^^35fa1a1ebaaeea286dc5cd15487c13ea^3DO^Sanyo IMP-21J TRY +3do_arcade_saot.bin^^8970fc987ab89a7f64da9f8a8c4333ff^3DO^Shootout At Old Tucson +panafz1-kanji.bin^^b8dc97f778a6245c58e064b0312e8281^3DO^Panasonic FZ-1 Kanji ROM (Font ROM: required for some Japanese games. Optional otherwise.) +panafz10ja-anvil-kanji.bin^^428577250f43edc902ea239c50d2240d^3DO^Panasonic FZ-10JA Kanji ROM (Font ROM: required for some Japanese games. Optional otherwise.) +panafz1j-kanji.bin^^c23fb5d5e6bb1c240d02cf968972be37^3DO^Panasonic FZ-1J Kanji ROM (Font ROM: required for some Japanese games. Optional otherwise.) +neogeo.zip^^00dad01abdbf8ea9e79ad2fe11bdb182^Arcade (FinalBurn Neo)^Neo Geo BIOS (Required for this system) +neocdz.zip^^c733b4b7bd30fa849874d96c591c8639^Arcade (FinalBurn Neo)^Neo Geo CDZ BIOS (Required for this system) +decocass.zip^^b7e1189b341bf6a8e270017c096d21b0^Arcade (FinalBurn Neo)^DECO Cassette System BIOS (Required for this system) +isgsm.zip^^4a56d56e2219c5e2b006b66a4263c01c^Arcade (FinalBurn Neo)^ISG Selection Master Type 2006 System BIOS (Required for this system) +midssio.zip^^5904b0de768d1d506e766aa7e18994c1^Arcade (FinalBurn Neo)^Midway SSIO Sound Board Internal ROM (Required for this system) +nmk004.zip^^bfacf1a68792d5348f93cf724d2f1dda^Arcade (FinalBurn Neo)^NMK004 Internal ROM (Required for this system) +pgm.zip^^87cc944eef4c671aa2629a8ba48a08e0^Arcade (FinalBurn Neo)^PGM System BIOS (Required for this system) +skns.zip^^3f956c4e7008804cb47cbde49bd5b908^Arcade (FinalBurn Neo)^Super Kaneko Nova System BIOS (Required for this system) +ym2608.zip^^79ae0d2bb1901b7e606b6dc339b79a97^Arcade (FinalBurn Neo)^YM2608 Internal ROM (Required for this system) +cchip.zip^^df6f8a3d83c028a5cb9f2f2be60773f3^Arcade (FinalBurn Neo)^C-Chip Internal ROM (Required for this system) +bubsys.zip^^f81298afd68a1a24a49a1a2d9f087964^Arcade (FinalBurn Neo)^Bubble System BIOS (Required for this system) namcoc69.zip^^Unknown^Arcade (FinalBurn Neo)^Namco C69 BIOS (Required for this system) namcoc70.zip^^Unknown^Arcade (FinalBurn Neo)^Namco C70 BIOS (Required for this system) namcoc75.zip^^Unknown^Arcade (FinalBurn Neo)^Namco C75 BIOS (Required for this system) @@ -48,9 +61,9 @@ Complex.bin^^Unknown^Microsoft XBOX^Used by XEMU emulator Complex_4627v1.03.bin^^Unknown^Microsoft XBOX^Used by XEMU emulator Complex_4627.bin^^Unknown^Microsoft XBOX^Used by XEMU emulator syscard3.pce^^38179df8f4ac870017db21ebcbf53114^NEC PC Engine / CD^Super CD-ROM2 System V3.xx (Required) -syscard2.pce^^Unknown^NEC PC Engine / CD^CD-ROM System V2.xx -syscard1.pce^^Unknown^NEC PC Engine / CD^CD-ROM System V1.xx -gexpress.pce^^Unknown^NEC PC Engine / CD^Game Express CD Card +syscard2.pce^^3cdd6614a918616bfc41c862e889dd79^NEC PC Engine / CD^CD-ROM System V2.xx +syscard1.pce^^2b7ccb3d86baa18f6402c176f3065082^NEC PC Engine / CD^CD-ROM System V1.xx +gexpress.pce^^6d2cb14fc3e1f65ceb135633d1694122^NEC PC Engine / CD^Game Express CD Card font.bmp^np2kai/^7da1e5b7c482d4108d22a5b09631d967^NEC PC-98 (Neko Project II Kai)^Needed to display text (Required) FONT.ROM^np2kai/^2af6179d7de4893ea0b705c00e9a98d6^NEC PC-98 (Neko Project II Kai)^Alt font file (Required if normal font file is missing) bios.rom^np2kai/^e246140dec5124c5e404869a84caefce^NEC PC-98 (Neko Project II Kai)^BIOS file (Required) @@ -58,12 +71,12 @@ itf.rom^np2kai/^e9fc3890963b12cf15d0a2eea5815b72^NEC PC-98 (Neko Project II Kai) sound.rom^np2kai/^caf90f22197aed6f14c471c21e64658d^NEC PC-98 (Neko Project II Kai)^BIOS file (Required) bios9821.rom^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^Optional BIOS file d8000.rom^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^Optional BIOS file -2608_BD.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample -2608_SD.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample -2608_TOP.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample -2608_HH.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample -2608_TOM.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample -2608_RIM.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample +2608_BD.WAV^np2kai/^d94546e70f17fd899be8df3544ab6cbb^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample +2608_SD.WAV^np2kai/^d71004351c8bbfdad53b18222c061d49^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample +2608_TOP.WAV^np2kai/^593cff6597ab9380d822b8f824fd2c28^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample +2608_HH.WAV^np2kai/^08c54a0c1f774a5538a848a6665a34b4^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample +2608_TOM.WAV^np2kai/^96a4ead13f364734f79b0c58af2f0e1f^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample +2608_RIM.WAV^np2kai/^465ea0768b27da404aec45dfc501404b^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample n88.rom^^4f984e04a99d56c4cfe36115415d6eb8^NEC PC-8000 / PC-8800 series (QUASI88)^BIOS File (Required) n88n.rom^^2ff07b8769367321128e03924af668a0^NEC PC-8000 / PC-8800 series (QUASI88)^Required for PC-8000 series emulation. (N BASIC mode) disk.rom^^793f86784e5608352a5d7f03f03e0858^NEC PC-8000 / PC-8800 series (QUASI88)^Required for loading disk images @@ -72,14 +85,27 @@ n88_0.rom^^d675a2ca186c6efcd6277b835de4c7e5^NEC PC-8000 / PC-8800 series (QUASI8 n88_1.rom^^e844534dfe5744b381444dbe61ef1b66^NEC PC-8000 / PC-8800 series (QUASI88)^Optional BIOS file n88_2.rom^^6548fa45061274dee1ea8ae1e9e93910^NEC PC-8000 / PC-8800 series (QUASI88)^Optional BIOS file n88_3.rom^^fc4b76a402ba501e6ba6de4b3e8b4273^NEC PC-8000 / PC-8800 series (QUASI88)^Optional BIOS file +neocd_f.rom^^8834880c33164ccbe6476b559f3e37de^Neo Geo CD^Front Loader BIOS (At least 1 required) +neocd_sf.rom^^043d76d5f0ef836500700c34faef774d^Neo Geo CD^Front Loader BIOS (SMKDAN 0.7b DEC 2010) (At least 1 required) +neocd_t.rom^^de3cf45d227ad44645b22aa83b49f450^Neo Geo CD^Top Loader BIOS (At least 1 required) +neocd_st.rom^^f6325a33c6d63ea4b9162a3fa8c32727^Neo Geo CD^Top Loader BIOS (SMKDAN 0.7b DEC 2010) (At least 1 required) +neocd_z.rom^^11526d58d4c524daef7d5d677dc6b004^Neo Geo CD^CDZ BIOS (At least 1 required) +neocd_sz.rom^^971ee8a36fb72da57aed01758f0a37f5^Neo Geo CD^CDZ BIOS (SMKDAN 0.7b DEC 2010) (At least 1 required) +front-sp1.bin^^5c2366f25ff92d71788468ca492ebeca^Neo Geo CD^Front Loader BIOS (MAME) (At least 1 required) +top-sp1.bin^^122aee210324c72e8a11116e6ef9c0d0^Neo Geo CD^Top Loader BIOS (MAME) (At least 1 required) +neocd.bin^^f39572af7584cb5b3f70ae8cc848aba2^Neo Geo CD^CDZ BIOS (MAME) (At least 1 required) +uni-bioscd.rom^^08ca8b2dba6662e8024f9e789711c6fc^Neo Geo CD^Universe BIOS CD 3.3 +gb_bios.bin^^32fbbd84168d3482956eb3c5051637f5^Game Boy^Optional BIOS file (used to display the Nintendo logo at boot) +gbc_bios.bin^^dbfce9db9deaa2567f6a84fde55f9680^Game Boy Color^Optional BIOS file (used to display the Nintendo logo at boot) +gba_bios.bin^^a860e8c0b6d573d191e4ec7db1b1e4f6^Game Boy Advance^Optional BIOS file (used to display the Nintendo logo at boot) aes_keys.txt^citra/sysdata/^Unknown^Nintendo 3DS^Decryption keys used by Citra emulator bios7.bin^^df692a80a5b1bc90728bc3dfc76cd948^Nintendo DS^Used by MelonDS emulator (Required, see Wiki) bios9.bin^^a392174eb3e572fed6447e956bde4b25^Nintendo DS^Used by MelonDS emulator (Required, see Wiki) firmware.bin^^e45033d9b0fa6b0de071292bba7c9d13^Nintendo DS^Used by MelonDS emulator (Required, see Wiki) disksys.rom^^ca30b50f880eb660a320674ed365ef7a^Nintendo NES / Famicom^Family Computer Disk System BIOS - Required for Family Computer Disk System emulation bios.min^^1e4fb124a3a886865acb574f388c803d^Nintendo Pokemon Mini^Pokémon Mini BIOS - Optional -prod.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Yuzu (Required) -title.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Yuzu (Required) +prod.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Ryujinx (Required) +title.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Ryujinx (Required) pico8^pico-8/^Unknown^PICO-8^The PICO-8 executable (Required) pico8.dat^pico-8/^Unknown^PICO-8^A PICO-8 system file (Required) pico8_dyn^pico-8/^Unknown^PICO-8^A PICO-8 system file (Required) @@ -103,9 +129,9 @@ mpr-18811-mx.ic1^^255113ba943c92a54facd25a10fd780c^Sega Saturn^The King of Fight mpr-19367-mx.ic1^^1cd19988d1d72a3e7caa0b73234c96b4^Sega Saturn^Ultraman: Hikari no Kyojin Densetsu ROM Cartridge (Required for this game) iplrom.dat^keropi/^7fd4caabac1d9169e289f0f7bbf71d8e^Sharp X68000^X68000 BIOS (Required) cgrom.dat^keropi/^cb0a5cfcf7247a7eab74bb2716260269^Sharp X68000^Font file (Required) -iplrom30.dat^keropi/^Unknown^Sharp X68000^X68000 BIOS 2 -iplromco.dat^keropi/^Unknown^Sharp X68000^X68000 BIOS 3 -iplromxv.dat^keropi/^Unknown^Sharp X68000^X68000 BIOS 4 +iplrom30.dat^keropi/^f373003710ab4322642f527f567e020a^Sharp X68000^X68000 BIOS 2 +iplromco.dat^keropi/^cc78d4f4900f622bd6de1aed7f52592f^Sharp X68000^X68000 BIOS 3 +iplromxv.dat^keropi/^0617321daa182c3f3d6f41fd02fb3275^Sharp X68000^X68000 BIOS 4 psxonpsp660.bin^^c53ca5908936d412331790f4426c6c33^Sony PSX^PS1 BIOS (At least 1 required) scph5500.bin^^8dd7d5296a650fac7319bce665a6a53c^Sony PSX^PS1 JP BIOS (At least 1 required) scph5501.bin^^490f666e1afb15b7362b406ed1cea246^Sony PSX^PS1 US BIOS (At least 1 required) @@ -119,11 +145,11 @@ ps1_rom.bin^^81bbe60ba7a3d1cea1d48c14cbcc647b^Sony PSX^PS1 BIOS (At least 1 requ ps2-0200a-20040614.bin^^d333558cc14561c1fdc334c75d5f37b7^Sony PS2^PS2 US BIOS (At least 1 required) ps2-0200e-20040614.bin^^dc752f160044f2ed5fc1f4964db2a095^Sony PS2^PS2 EU BIOS (At least 1 required) ps2-0200j-20040614.bin^^0eee5d1c779aa50e94edd168b4ebf42e^Sony PS2^PS2 JP BIOS (At least 1 required) -128p-0.rom^fuse/^Unknown^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required) -128p-1.rom^fuse/^Unknown^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required) -trdos.rom^fuse/^Unknown^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required) -gluck.rom^fuse/^Unknown^ZX Spectrum^Pentagon 512K/1024 ROM (Required) -256s-0.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required) -256s-1.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required) -256s-2.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required) -256s-3.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required) +128p-0.rom^fuse/^a249565f03b98d004ee7f019570069cd^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required) +128p-1.rom^fuse/^6e09e5d3c4aef166601669feaaadc01c^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required) +trdos.rom^fuse/^0da70a5d2a0e733398e005b96b7e4ba6^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required) +gluck.rom^fuse/^d5869034604dbfd2c1d54170e874fd0a^ZX Spectrum^Pentagon 512K/1024 ROM (Required) +256s-0.rom^fuse/^b9fda5b6a747ff037365b0e2d8c4379a^ZX Spectrum^Scorpion 256K ROM (Required) +256s-1.rom^fuse/^643861ad34831b255bf2eb64e8b6ecb8^ZX Spectrum^Scorpion 256K ROM (Required) +256s-2.rom^fuse/^d8ad507b1c915a9acfe0d73957082926^ZX Spectrum^Scorpion 256K ROM (Required) +256s-3.rom^fuse/^ce0723f9bc02f4948c15d3b3230ae831^ZX Spectrum^Scorpion 256K ROM (Required) \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg b/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg index 140620f4..e70139e3 100644 --- a/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg +++ b/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg @@ -1,5 +1,6 @@ 1201^1231^0000^2359^rd-xmas-splash.svg 0209^0212^0000^2359^rd-lunar-dragon-splash.svg 0214^0214^0001^2359^rd-valentines-splash.svg +0304^0304^0000^2359^rd-gm-bday-splash.svg 0317^0317^0000^2359^rd-stpatricks-splash.svg 0429^0505^0000^2359^rd-kodomo-golden.svg diff --git a/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg b/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg index 0c1eb4f1..fdf9f19b 100644 --- a/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg +++ b/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg @@ -1,2 +1,3 @@ +true^RetroDECK Steam Controller Profiles Install^Install RetroDECK Steam Input profiles to Steam - Recommended^rd_controller_profile false^RPCS3 Firmware Install^Install firmware needed for PS3 emulation^rpcs3_firmware -false^RetroDECK Controller Profile^Install custom RetroDECK controller profile^rd_controller_profile +false^Vita3K Firmware Install^Install firmware needed for Vita3K emulation^vita3k_firmware diff --git a/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg b/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg index 8a3b9744..10630974 100644 --- a/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg +++ b/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg @@ -4,10 +4,8 @@ # The FILE name can have spaces in it, but the DESTINATION cannot, even in variable form # mods -how-to-install-citra-mods.txt^$mods_folder/Citra how-to-install-dolphin-mods.txt^$mods_folder/Dolphin how-to-install-primehack-mods.txt^$mods_folder/Primehack -how-to-install-yuzu-mods.txt^$mods_folder/Yuzu # textures how-to-install-Mesen-textures.txt^$texture_packs_folder/RetroArch-Mesen @@ -17,8 +15,6 @@ how-to-install-Mupen64Plus-textures.txt^$texture_packs_folder/RetroArch-Mupen64P how-to-install-Mupen64Plus-textures.txt^$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture how-to-install-Duckstation-textures.txt^$texture_packs_folder/Duckstation -# customs -how-to-install-custom-emulators.txt^$rdhome/customs - # emulators how-to-install-psvita-games.txt^$roms_folder/psvita +Install-firmware-through-Ryujinx.txt^$bios_folder/switch/firmware diff --git a/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg b/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg index d9c786d8..f717c3b0 100644 --- a/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg +++ b/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg @@ -1,5 +1,4 @@ Cemu -citra-emu dolphin-emu duckstation melonDS @@ -10,3 +9,4 @@ rpcs3 Ryujinx xemu yuzu +citra-emu diff --git a/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg b/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg index f324a56d..e668911a 100644 --- a/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg +++ b/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg @@ -1,4 +1,3 @@ -citra^Citra (Nintendo 3DS Standalone Emulator) dolphin^Dolphin (GameCube / Wii Standalone Emulator) duckstation^Duckstation (Sony Playstation Standalone Emulator) gb^Nintendo GameBoy @@ -14,4 +13,5 @@ psx_ra^Sony Playstation (RetroArch Core) retroarch^RetroArch (Multi-emulator Frontend) ryujinx^Ryujinx (Nintendo Switch Standalone Emulator) snes^Nintendo Super Nintendo -yuzu^Yuzu (Nintendo Switch Standalone Emulator) +yuzu^Yuzu (Nintendo Switch Standalone Emulator, via Ponzu) +citra^Citra (Nintendo 3DS Standalone Emulator, via Ponzu) \ No newline at end of file diff --git a/emu-configs/defaults/retrodeck/retrodeck.cfg b/emu-configs/defaults/retrodeck/retrodeck.cfg index 5cf0a8f2..88a33896 100644 --- a/emu-configs/defaults/retrodeck/retrodeck.cfg +++ b/emu-configs/defaults/retrodeck/retrodeck.cfg @@ -6,8 +6,8 @@ roms_folder=/home/deck/retrodeck/roms saves_folder=/home/deck/retrodeck/saves states_folder=/home/deck/retrodeck/states bios_folder=/home/deck/retrodeck/bios -media_folder=/home/deck/retrodeck/downloaded_media -themes_folder=/home/deck/retrodeck/themes +media_folder=/home/deck/retrodeck/ES-DE/downloaded_media +themes_folder=/home/deck/retrodeck/ES-DE/themes logs_folder=/home/deck/retrodeck/logs screenshots_folder=/home/deck/retrodeck/screenshots mods_folder=/home/deck/retrodeck/mods @@ -28,6 +28,8 @@ multi_user_mode=false ask_default_user=true default_user= developer_options=false +kiroi_ponzu=false +akai_ponzu=false [cheevos] duckstation=false @@ -39,6 +41,14 @@ duckstation=false pcsx2=false retroarch=false +[rewind] +gb=false +gba=false +gbc=false +genesis=false +gg=false +snes=false + [borders] gb=false gba=false @@ -56,27 +66,20 @@ psx_ra=false snes=false [abxy_button_swap] -citra=false gb=false gba=false gbc=false n64=false snes=false -yuzu=false +citra=false -[savestate_auto_load] -ppsspp=true -retroarch=true - -[savestate_auto_save] -duckstation=true -pcsx2=true +[quick_resume] retroarch=true [ask_to_exit] -citra=false dolphin=false duckstation=false pcsx2=false primehack=false -yuzu=false +citra=false +rpcs3=false diff --git a/emu-configs/defaults/yuzu/qt-config.ini b/emu-configs/defaults/yuzu/qt-config.ini index 5a18ed8a..36b5f350 100644 --- a/emu-configs/defaults/yuzu/qt-config.ini +++ b/emu-configs/defaults/yuzu/qt-config.ini @@ -89,60 +89,60 @@ player_0_body_color_left=4278893030 player_0_body_color_left\default=false player_0_body_color_right=4294917160 player_0_body_color_right\default=false -player_0_button_a="toggle:0,code:67,engine:keyboard" -player_0_button_a\default=true -player_0_button_b="toggle:0,code:88,engine:keyboard" -player_0_button_b\default=true +player_0_button_a="button:1,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_a\default=false +player_0_button_b="button:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_b\default=false player_0_button_color_left=4278197790 player_0_button_color_left\default=false player_0_button_color_right=4280158730 player_0_button_color_right\default=false -player_0_button_ddown="toggle:0,code:16777237,engine:keyboard" -player_0_button_ddown\default=true -player_0_button_dleft="toggle:0,code:16777234,engine:keyboard" -player_0_button_dleft\default=true -player_0_button_dright="toggle:0,code:16777236,engine:keyboard" -player_0_button_dright\default=true -player_0_button_dup="toggle:0,code:16777235,engine:keyboard" -player_0_button_dup\default=true -player_0_button_home="toggle:0,code:0,engine:keyboard" -player_0_button_home\default=true -player_0_button_l="toggle:0,code:81,engine:keyboard" -player_0_button_l\default=true -player_0_button_lstick="toggle:0,code:70,engine:keyboard" -player_0_button_lstick\default=true -player_0_button_minus="toggle:0,code:78,engine:keyboard" -player_0_button_minus\default=true -player_0_button_plus="toggle:0,code:77,engine:keyboard" -player_0_button_plus\default=true -player_0_button_r="toggle:0,code:69,engine:keyboard" -player_0_button_r\default=true -player_0_button_rstick="toggle:0,code:71,engine:keyboard" -player_0_button_rstick\default=true -player_0_button_screenshot="toggle:0,code:0,engine:keyboard" -player_0_button_screenshot\default=true -player_0_button_sl="toggle:0,code:81,engine:keyboard" -player_0_button_sl\default=true -player_0_button_sr="toggle:0,code:69,engine:keyboard" -player_0_button_sr\default=true -player_0_button_x="toggle:0,code:86,engine:keyboard" -player_0_button_x\default=true -player_0_button_y="toggle:0,code:90,engine:keyboard" -player_0_button_y\default=true -player_0_button_zl="toggle:0,code:82,engine:keyboard" -player_0_button_zl\default=true -player_0_button_zr="toggle:0,code:84,engine:keyboard" -player_0_button_zr\default=true +player_0_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_ddown\default=false +player_0_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_dleft\default=false +player_0_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_dright\default=false +player_0_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_dup\default=false +player_0_button_home="button:8,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_home\default=false +player_0_button_l="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_l\default=false +player_0_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_lstick\default=false +player_0_button_minus="button:6,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_minus\default=false +player_0_button_plus="button:7,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_plus\default=false +player_0_button_r="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_r\default=false +player_0_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_rstick\default=false +player_0_button_screenshot=[empty] +player_0_button_screenshot\default=false +player_0_button_sl="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_sl\default=false +player_0_button_sr="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_sr\default=false +player_0_button_x="button:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_x\default=false +player_0_button_y="button:2,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_y\default=false +player_0_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl" +player_0_button_zl\default=false +player_0_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl" +player_0_button_zr\default=false player_0_connected=true player_0_connected\default=true -player_0_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" -player_0_lstick\default=true -player_0_motionleft="toggle:0,code:55,engine:keyboard" -player_0_motionleft\default=true -player_0_motionright="toggle:0,code:56,engine:keyboard" -player_0_motionright\default=true -player_0_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" -player_0_rstick\default=true +player_0_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_lstick\default=false +player_0_motionleft="motion:0,pad:0,port:26760,guid:0000000000000000000000007f000001,engine:cemuhookudp" +player_0_motionleft\default=false +player_0_motionright=[empty] +player_0_motionright\default=false +player_0_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_rstick\default=false player_0_type=0 player_0_type\default=true player_0_vibration_enabled=true @@ -153,60 +153,60 @@ player_1_body_color_left=4278893030 player_1_body_color_left\default=false player_1_body_color_right=4294917160 player_1_body_color_right\default=false -player_1_button_a="toggle:0,code:67,engine:keyboard" -player_1_button_a\default=true -player_1_button_b="toggle:0,code:88,engine:keyboard" -player_1_button_b\default=true +player_1_button_a="button:1,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_a\default=false +player_1_button_b="button:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_b\default=false player_1_button_color_left=4278197790 player_1_button_color_left\default=false player_1_button_color_right=4280158730 player_1_button_color_right\default=false -player_1_button_ddown="toggle:0,code:16777237,engine:keyboard" -player_1_button_ddown\default=true -player_1_button_dleft="toggle:0,code:16777234,engine:keyboard" -player_1_button_dleft\default=true -player_1_button_dright="toggle:0,code:16777236,engine:keyboard" -player_1_button_dright\default=true -player_1_button_dup="toggle:0,code:16777235,engine:keyboard" -player_1_button_dup\default=true -player_1_button_home="toggle:0,code:0,engine:keyboard" -player_1_button_home\default=true -player_1_button_l="toggle:0,code:81,engine:keyboard" -player_1_button_l\default=true -player_1_button_lstick="toggle:0,code:70,engine:keyboard" -player_1_button_lstick\default=true -player_1_button_minus="toggle:0,code:78,engine:keyboard" -player_1_button_minus\default=true -player_1_button_plus="toggle:0,code:77,engine:keyboard" -player_1_button_plus\default=true -player_1_button_r="toggle:0,code:69,engine:keyboard" -player_1_button_r\default=true -player_1_button_rstick="toggle:0,code:71,engine:keyboard" -player_1_button_rstick\default=true -player_1_button_screenshot="toggle:0,code:0,engine:keyboard" -player_1_button_screenshot\default=true -player_1_button_sl="toggle:0,code:81,engine:keyboard" -player_1_button_sl\default=true -player_1_button_sr="toggle:0,code:69,engine:keyboard" -player_1_button_sr\default=true -player_1_button_x="toggle:0,code:86,engine:keyboard" -player_1_button_x\default=true -player_1_button_y="toggle:0,code:90,engine:keyboard" -player_1_button_y\default=true -player_1_button_zl="toggle:0,code:82,engine:keyboard" -player_1_button_zl\default=true -player_1_button_zr="toggle:0,code:84,engine:keyboard" -player_1_button_zr\default=true -player_1_connected=false -player_1_connected\default=true -player_1_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" -player_1_lstick\default=true -player_1_motionleft="toggle:0,code:55,engine:keyboard" -player_1_motionleft\default=true -player_1_motionright="toggle:0,code:56,engine:keyboard" -player_1_motionright\default=true -player_1_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" -player_1_rstick\default=true +player_1_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_ddown\default=false +player_1_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_dleft\default=false +player_1_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_dright\default=false +player_1_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_dup\default=false +player_1_button_home="button:8,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_home\default=false +player_1_button_l="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_l\default=false +player_1_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_lstick\default=false +player_1_button_minus="button:6,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_minus\default=false +player_1_button_plus="button:7,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_plus\default=false +player_1_button_r="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_r\default=false +player_1_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_rstick\default=false +player_1_button_screenshot=[empty] +player_1_button_screenshot\default=false +player_1_button_sl="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_sl\default=false +player_1_button_sr="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_sr\default=false +player_1_button_x="button:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_x\default=false +player_1_button_y="button:2,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_y\default=false +player_1_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl" +player_1_button_zl\default=false +player_1_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl" +player_1_button_zr\default=false +player_1_connected=true +player_1_connected\default=false +player_1_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_lstick\default=false +player_1_motionleft=[empty] +player_1_motionleft\default=false +player_1_motionright=[empty] +player_1_motionright\default=false +player_1_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_rstick\default=false player_1_type=0 player_1_type\default=true player_1_vibration_enabled=true @@ -217,60 +217,60 @@ player_2_body_color_left=4278893030 player_2_body_color_left\default=false player_2_body_color_right=4294917160 player_2_body_color_right\default=false -player_2_button_a="toggle:0,code:67,engine:keyboard" -player_2_button_a\default=true -player_2_button_b="toggle:0,code:88,engine:keyboard" -player_2_button_b\default=true +player_2_button_a="button:1,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_a\default=false +player_2_button_b="button:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_b\default=false player_2_button_color_left=4278197790 player_2_button_color_left\default=false player_2_button_color_right=4280158730 player_2_button_color_right\default=false -player_2_button_ddown="toggle:0,code:16777237,engine:keyboard" -player_2_button_ddown\default=true -player_2_button_dleft="toggle:0,code:16777234,engine:keyboard" -player_2_button_dleft\default=true -player_2_button_dright="toggle:0,code:16777236,engine:keyboard" -player_2_button_dright\default=true -player_2_button_dup="toggle:0,code:16777235,engine:keyboard" -player_2_button_dup\default=true -player_2_button_home="toggle:0,code:0,engine:keyboard" -player_2_button_home\default=true -player_2_button_l="toggle:0,code:81,engine:keyboard" -player_2_button_l\default=true -player_2_button_lstick="toggle:0,code:70,engine:keyboard" -player_2_button_lstick\default=true -player_2_button_minus="toggle:0,code:78,engine:keyboard" -player_2_button_minus\default=true -player_2_button_plus="toggle:0,code:77,engine:keyboard" -player_2_button_plus\default=true -player_2_button_r="toggle:0,code:69,engine:keyboard" -player_2_button_r\default=true -player_2_button_rstick="toggle:0,code:71,engine:keyboard" -player_2_button_rstick\default=true -player_2_button_screenshot="toggle:0,code:0,engine:keyboard" -player_2_button_screenshot\default=true -player_2_button_sl="toggle:0,code:81,engine:keyboard" -player_2_button_sl\default=true -player_2_button_sr="toggle:0,code:69,engine:keyboard" -player_2_button_sr\default=true -player_2_button_x="toggle:0,code:86,engine:keyboard" -player_2_button_x\default=true -player_2_button_y="toggle:0,code:90,engine:keyboard" -player_2_button_y\default=true -player_2_button_zl="toggle:0,code:82,engine:keyboard" -player_2_button_zl\default=true -player_2_button_zr="toggle:0,code:84,engine:keyboard" -player_2_button_zr\default=true -player_2_connected=false -player_2_connected\default=true -player_2_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" -player_2_lstick\default=true -player_2_motionleft="toggle:0,code:55,engine:keyboard" -player_2_motionleft\default=true -player_2_motionright="toggle:0,code:56,engine:keyboard" -player_2_motionright\default=true -player_2_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" -player_2_rstick\default=true +player_2_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_ddown\default=false +player_2_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_dleft\default=false +player_2_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_dright\default=false +player_2_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_dup\default=false +player_2_button_home="button:8,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_home\default=false +player_2_button_l="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_l\default=false +player_2_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_lstick\default=false +player_2_button_minus="button:6,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_minus\default=false +player_2_button_plus="button:7,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_plus\default=false +player_2_button_r="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_r\default=false +player_2_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_rstick\default=false +player_2_button_screenshot=[empty] +player_2_button_screenshot\default=false +player_2_button_sl="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_sl\default=false +player_2_button_sr="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_sr\default=false +player_2_button_x="button:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_x\default=false +player_2_button_y="button:2,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_y\default=false +player_2_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl" +player_2_button_zl\default=false +player_2_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl" +player_2_button_zr\default=false +player_2_connected=true +player_2_connected\default=false +player_2_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_lstick\default=false +player_2_motionleft=[empty] +player_2_motionleft\default=false +player_2_motionright=[empty] +player_2_motionright\default=false +player_2_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_rstick\default=false player_2_type=0 player_2_type\default=true player_2_vibration_enabled=true @@ -281,60 +281,60 @@ player_3_body_color_left=4278893030 player_3_body_color_left\default=false player_3_body_color_right=4294917160 player_3_body_color_right\default=false -player_3_button_a="toggle:0,code:67,engine:keyboard" -player_3_button_a\default=true -player_3_button_b="toggle:0,code:88,engine:keyboard" -player_3_button_b\default=true +player_3_button_a="button:1,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_a\default=false +player_3_button_b="button:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_b\default=false player_3_button_color_left=4278197790 player_3_button_color_left\default=false player_3_button_color_right=4280158730 player_3_button_color_right\default=false -player_3_button_ddown="toggle:0,code:16777237,engine:keyboard" -player_3_button_ddown\default=true -player_3_button_dleft="toggle:0,code:16777234,engine:keyboard" -player_3_button_dleft\default=true -player_3_button_dright="toggle:0,code:16777236,engine:keyboard" -player_3_button_dright\default=true -player_3_button_dup="toggle:0,code:16777235,engine:keyboard" -player_3_button_dup\default=true -player_3_button_home="toggle:0,code:0,engine:keyboard" -player_3_button_home\default=true -player_3_button_l="toggle:0,code:81,engine:keyboard" -player_3_button_l\default=true -player_3_button_lstick="toggle:0,code:70,engine:keyboard" -player_3_button_lstick\default=true -player_3_button_minus="toggle:0,code:78,engine:keyboard" -player_3_button_minus\default=true -player_3_button_plus="toggle:0,code:77,engine:keyboard" -player_3_button_plus\default=true -player_3_button_r="toggle:0,code:69,engine:keyboard" -player_3_button_r\default=true -player_3_button_rstick="toggle:0,code:71,engine:keyboard" -player_3_button_rstick\default=true -player_3_button_screenshot="toggle:0,code:0,engine:keyboard" -player_3_button_screenshot\default=true -player_3_button_sl="toggle:0,code:81,engine:keyboard" -player_3_button_sl\default=true -player_3_button_sr="toggle:0,code:69,engine:keyboard" -player_3_button_sr\default=true -player_3_button_x="toggle:0,code:86,engine:keyboard" -player_3_button_x\default=true -player_3_button_y="toggle:0,code:90,engine:keyboard" -player_3_button_y\default=true -player_3_button_zl="toggle:0,code:82,engine:keyboard" -player_3_button_zl\default=true -player_3_button_zr="toggle:0,code:84,engine:keyboard" -player_3_button_zr\default=true -player_3_connected=false -player_3_connected\default=true -player_3_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" -player_3_lstick\default=true -player_3_motionleft="toggle:0,code:55,engine:keyboard" -player_3_motionleft\default=true -player_3_motionright="toggle:0,code:56,engine:keyboard" -player_3_motionright\default=true -player_3_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" -player_3_rstick\default=true +player_3_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_ddown\default=false +player_3_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_dleft\default=false +player_3_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_dright\default=false +player_3_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_dup\default=false +player_3_button_home="button:8,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_home\default=false +player_3_button_l="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_l\default=false +player_3_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_lstick\default=false +player_3_button_minus="button:6,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_minus\default=false +player_3_button_plus="button:7,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_plus\default=false +player_3_button_r="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_r\default=false +player_3_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_rstick\default=false +player_3_button_screenshot=[empty] +player_3_button_screenshot\default=false +player_3_button_sl="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_sl\default=false +player_3_button_sr="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_sr\default=false +player_3_button_x="button:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_x\default=false +player_3_button_y="button:2,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_y\default=false +player_3_button_zl="threshold:0.5,axis:2,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl" +player_3_button_zl\default=false +player_3_button_zr="threshold:0.5,axis:5,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl" +player_3_button_zr\default=false +player_3_connected=true +player_3_connected\default=false +player_3_lstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_lstick\default=false +player_3_motionleft=[empty] +player_3_motionleft\default=false +player_3_motionright=[empty] +player_3_motionright\default=false +player_3_rstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_rstick\default=false player_3_type=0 player_3_type\default=true player_3_vibration_enabled=true @@ -601,60 +601,60 @@ player_8_body_color_left=702950 player_8_body_color_left\default=true player_8_body_color_right=16727080 player_8_body_color_right\default=true -player_8_button_a="engine:keyboard,code:67,toggle:0" -player_8_button_a\default=false -player_8_button_b="engine:keyboard,code:88,toggle:0" -player_8_button_b\default=false +player_8_button_a="toggle:0,code:67,engine:keyboard" +player_8_button_a\default=true +player_8_button_b="toggle:0,code:88,engine:keyboard" +player_8_button_b\default=true player_8_button_color_left=7710 player_8_button_color_left\default=true player_8_button_color_right=1968650 player_8_button_color_right\default=true -player_8_button_ddown="engine:keyboard,code:16777237,toggle:0" -player_8_button_ddown\default=false -player_8_button_dleft="engine:keyboard,code:16777234,toggle:0" -player_8_button_dleft\default=false -player_8_button_dright="engine:keyboard,code:16777236,toggle:0" -player_8_button_dright\default=false -player_8_button_dup="engine:keyboard,code:16777235,toggle:0" -player_8_button_dup\default=false -player_8_button_home="engine:keyboard,code:0,toggle:0" -player_8_button_home\default=false -player_8_button_l="engine:keyboard,code:81,toggle:0" -player_8_button_l\default=false -player_8_button_lstick="engine:keyboard,code:70,toggle:0" -player_8_button_lstick\default=false -player_8_button_minus="engine:keyboard,code:78,toggle:0" -player_8_button_minus\default=false -player_8_button_plus="engine:keyboard,code:77,toggle:0" -player_8_button_plus\default=false -player_8_button_r="engine:keyboard,code:69,toggle:0" -player_8_button_r\default=false -player_8_button_rstick="engine:keyboard,code:71,toggle:0" -player_8_button_rstick\default=false -player_8_button_screenshot="engine:keyboard,code:0,toggle:0" -player_8_button_screenshot\default=false -player_8_button_sl="engine:keyboard,code:81,toggle:0" -player_8_button_sl\default=false -player_8_button_sr="engine:keyboard,code:69,toggle:0" -player_8_button_sr\default=false -player_8_button_x="engine:keyboard,code:86,toggle:0" -player_8_button_x\default=false -player_8_button_y="engine:keyboard,code:90,toggle:0" -player_8_button_y\default=false -player_8_button_zl="engine:keyboard,code:82,toggle:0" -player_8_button_zl\default=false -player_8_button_zr="engine:keyboard,code:84,toggle:0" -player_8_button_zr\default=false +player_8_button_ddown="toggle:0,code:16777237,engine:keyboard" +player_8_button_ddown\default=true +player_8_button_dleft="toggle:0,code:16777234,engine:keyboard" +player_8_button_dleft\default=true +player_8_button_dright="toggle:0,code:16777236,engine:keyboard" +player_8_button_dright\default=true +player_8_button_dup="toggle:0,code:16777235,engine:keyboard" +player_8_button_dup\default=true +player_8_button_home="toggle:0,code:0,engine:keyboard" +player_8_button_home\default=true +player_8_button_l="toggle:0,code:81,engine:keyboard" +player_8_button_l\default=true +player_8_button_lstick="toggle:0,code:70,engine:keyboard" +player_8_button_lstick\default=true +player_8_button_minus="toggle:0,code:78,engine:keyboard" +player_8_button_minus\default=true +player_8_button_plus="toggle:0,code:77,engine:keyboard" +player_8_button_plus\default=true +player_8_button_r="toggle:0,code:69,engine:keyboard" +player_8_button_r\default=true +player_8_button_rstick="toggle:0,code:71,engine:keyboard" +player_8_button_rstick\default=true +player_8_button_screenshot="toggle:0,code:0,engine:keyboard" +player_8_button_screenshot\default=true +player_8_button_sl="toggle:0,code:81,engine:keyboard" +player_8_button_sl\default=true +player_8_button_sr="toggle:0,code:69,engine:keyboard" +player_8_button_sr\default=true +player_8_button_x="toggle:0,code:86,engine:keyboard" +player_8_button_x\default=true +player_8_button_y="toggle:0,code:90,engine:keyboard" +player_8_button_y\default=true +player_8_button_zl="toggle:0,code:82,engine:keyboard" +player_8_button_zl\default=true +player_8_button_zr="toggle:0,code:84,engine:keyboard" +player_8_button_zr\default=true player_8_connected=false player_8_connected\default=true -player_8_lstick="engine:analog_from_button,up:toggle$00$1code$087$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,modifier:toggle$00$1code$016777248$1engine$0keyboard,modifier_scale:0.500000" -player_8_lstick\default=false -player_8_motionleft="engine:keyboard,code:55,toggle:0" -player_8_motionleft\default=false -player_8_motionright="engine:keyboard,code:56,toggle:0" -player_8_motionright\default=false -player_8_rstick="engine:analog_from_button,up:toggle$00$1code$073$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,modifier:toggle$00$1code$00$1engine$0keyboard,modifier_scale:0.500000" -player_8_rstick\default=false +player_8_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" +player_8_lstick\default=true +player_8_motionleft="toggle:0,code:55,engine:keyboard" +player_8_motionleft\default=true +player_8_motionright="toggle:0,code:56,engine:keyboard" +player_8_motionright\default=true +player_8_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" +player_8_rstick\default=true player_8_type=0 player_8_type\default=true player_8_vibration_enabled=true @@ -725,8 +725,6 @@ player_9_vibration_enabled=true player_9_vibration_enabled\default=true player_9_vibration_strength=100 player_9_vibration_strength\default=true -random_amiibo_id=false -random_amiibo_id\default=true ring_controller="modifier_scale:0.050000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$00$1engine$0keyboard,up:toggle$00$1code$00$1engine$0keyboard,engine:analog_from_button" ring_controller\default=true tas_enable=false @@ -751,8 +749,8 @@ touchscreen_enabled=true touchscreen_enabled\default=true udp_input_servers=127.0.0.1:26760 udp_input_servers\default=true -use_docked_mode=true -use_docked_mode\default=true +use_docked_mode=false +use_docked_mode\default=false vibration_enabled=true vibration_enabled\default=true @@ -761,8 +759,6 @@ use_extended_memory_layout=false use_extended_memory_layout\default=true use_multi_core=true use_multi_core\default=true -use_unsafe_extended_memory_layout=false -use_unsafe_extended_memory_layout\default=true [Cpu] cpu_accuracy=0 @@ -809,7 +805,7 @@ cpuopt_unsafe_unfuse_fma=true cpuopt_unsafe_unfuse_fma\default=true [Data%20Storage] -dump_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/dump +dump_directory=/var/data/yuzu/dump dump_directory\default=true gamecard_current_game=false gamecard_current_game\default=true @@ -817,13 +813,13 @@ gamecard_inserted=false gamecard_inserted\default=true gamecard_path= gamecard_path\default=true -load_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/load +load_directory=/var/data/yuzu/load load_directory\default=true -nand_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/nand +nand_directory=RETRODECKHOMEDIR/saves/switch/nand nand_directory\default=true -sdmc_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/sdmc +sdmc_directory=RETRODECKHOMEDIR/saves/switch/sdmc sdmc_directory\default=true -tas_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/tas +tas_directory=/var/data/yuzu/tas tas_directory\default=true use_virtual_sd=true use_virtual_sd\default=true @@ -858,7 +854,10 @@ use_gdbstub=false use_gdbstub\default=true [DisabledAddOns] -size=0 +1\disabled\size=0 +1\title_id=@Variant(\0\0\0\x84\x1\0\xa3\xd0\b\xc5\xc0\0) +1\title_id\default=false +size=1 [Miscellaneous] log_filter=*:Info @@ -876,7 +875,7 @@ ip\default=true ip_ban_list\size=0 max_player=8 max_player\default=true -nickname=RetroDECK +nickname= nickname\default=true port=24872 port\default=true @@ -884,7 +883,7 @@ room_description= room_description\default=true room_name= room_name\default=true -room_nickname= +room_nickname=RetroDECK room_nickname\default=true room_port=24872 room_port\default=true @@ -897,12 +896,8 @@ anti_aliasing=0 anti_aliasing\default=true aspect_ratio=0 aspect_ratio\default=true -astc_recompression=0 -astc_recompression\default=true async_astc=false async_astc\default=true -async_presentation=false -async_presentation\default=true backend=1 backend\default=true bg_blue=0 @@ -915,27 +910,25 @@ debug=false debug\default=true disable_shader_loop_safety_checks=false disable_shader_loop_safety_checks\default=true -enable_compute_pipelines=false -enable_compute_pipelines\default=true force_max_clock=false force_max_clock\default=true fsr_sharpening_slider=25 fsr_sharpening_slider\default=true fullscreen_mode=1 fullscreen_mode\default=true -gpu_accuracy=1 -gpu_accuracy\default=true -max_anisotropy=0 -max_anisotropy\default=true +gpu_accuracy=0 +gpu_accuracy\default=false +max_anisotropy=1 +max_anisotropy\default=false nsight_aftermath=false nsight_aftermath\default=true nvdec_emulation=2 nvdec_emulation\default=true resolution_setup=2 resolution_setup\default=true -scaling_filter=1 -scaling_filter\default=true -shader_backend=1 +scaling_filter=5 +scaling_filter\default=false +shader_backend=0 shader_backend\default=true shader_feedback=false shader_feedback\default=true @@ -943,19 +936,15 @@ speed_limit=100 speed_limit\default=true use_asynchronous_gpu_emulation=true use_asynchronous_gpu_emulation\default=true -use_asynchronous_shaders=false -use_asynchronous_shaders\default=true +use_asynchronous_shaders=true +use_asynchronous_shaders\default=false use_disk_shader_cache=true use_disk_shader_cache\default=true use_fast_gpu_time=true use_fast_gpu_time\default=true use_pessimistic_flushes=false use_pessimistic_flushes\default=true -use_reactive_flushing=true -use_reactive_flushing\default=true -use_video_framerate=false -use_video_framerate\default=true -use_vsync=2 +use_vsync=true use_vsync\default=true use_vulkan_driver_pipeline_cache=true use_vulkan_driver_pipeline_cache\default=true @@ -974,10 +963,11 @@ custom_rtc\default=true custom_rtc_enabled=false custom_rtc_enabled\default=true device_name=RetroDECK -language_index=1 -language_index\default=true -region_index=1 -region_index\default=true +device_name\default=false +language_index=12 +language_index\default=false +region_index=2 +region_index\default=false rng_seed=0 rng_seed\default=true rng_seed_enabled=false @@ -1029,190 +1019,190 @@ Paths\gamedirs\4\deep_scan=false Paths\gamedirs\4\deep_scan\default=true Paths\gamedirs\4\expanded=true Paths\gamedirs\4\expanded\default=true -Paths\gamedirs\4\path= +Paths\gamedirs\4\path=RETRODECKHOMEDIR/roms/switch Paths\gamedirs\size=4 -Paths\language= -Paths\language\default=true +Paths\language=en +Paths\language\default=false Paths\recentFiles=@Invalid() Paths\romsPath= Paths\symbolsPath= Screenshots\enable_screenshot_save_as=true Screenshots\enable_screenshot_save_as\default=true -Screenshots\screenshot_path=RETRODECKHOMEDIR/screenshots +Screenshots\screenshot_path=RETRODECKHOMEDIR/screenshots/ Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context=1 Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context\default=true -Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq=Home+Dpad_Right -Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq=Ctrl+M -Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq= +Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq= +Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=false Shortcuts\Main%20Window\Audio%20Mute\Unmute\Repeat=false Shortcuts\Main%20Window\Audio%20Mute\Unmute\Repeat\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=2 -Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq=Home+Dpad_Down -Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq=- -Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=1 +Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=false +Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=false Shortcuts\Main%20Window\Audio%20Volume%20Down\Repeat=true Shortcuts\Main%20Window\Audio%20Volume%20Down\Repeat\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=2 -Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq=Home+Dpad_Up -Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq="=" -Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=1 +Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=false +Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=false Shortcuts\Main%20Window\Audio%20Volume%20Up\Repeat=true Shortcuts\Main%20Window\Audio%20Volume%20Up\Repeat\default=true Shortcuts\Main%20Window\Capture%20Screenshot\Context=3 Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true -Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq=Screenshot -Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+P -Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\default=true +Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq= +Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+X +Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\default=false Shortcuts\Main%20Window\Capture%20Screenshot\Repeat=false Shortcuts\Main%20Window\Capture%20Screenshot\Repeat\default=true -Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context=2 -Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context\default=true -Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq=Home+L -Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq=F8 -Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq\default=true +Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context=1 +Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context\default=false +Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq= +Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq= +Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq\default=false Shortcuts\Main%20Window\Change%20Adapting%20Filter\Repeat=false Shortcuts\Main%20Window\Change%20Adapting%20Filter\Repeat\default=true Shortcuts\Main%20Window\Change%20Docked%20Mode\Context=2 Shortcuts\Main%20Window\Change%20Docked%20Mode\Context\default=true -Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq=Home+X -Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq=F10 -Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq\default=true +Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq= +Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq=Alt+D +Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq\default=false Shortcuts\Main%20Window\Change%20Docked%20Mode\Repeat=false Shortcuts\Main%20Window\Change%20Docked%20Mode\Repeat\default=true Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Context=2 Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Context\default=true -Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq=Home+R -Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq=F9 -Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq\default=true +Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq= +Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq=Alt+G +Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq\default=false Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Repeat=false Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Repeat\default=true Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context=1 Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context\default=true -Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq=Home+Plus -Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq=F4 -Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq= +Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq=Ctrl+P +Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=false Shortcuts\Main%20Window\Continue\Pause%20Emulation\Repeat=false Shortcuts\Main%20Window\Continue\Pause%20Emulation\Repeat\default=true Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1 Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true Shortcuts\Main%20Window\Exit%20Fullscreen\Controller_KeySeq= Shortcuts\Main%20Window\Exit%20Fullscreen\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq= +Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Ctrl+O Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq\default=false Shortcuts\Main%20Window\Exit%20Fullscreen\Repeat=false Shortcuts\Main%20Window\Exit%20Fullscreen\Repeat\default=true Shortcuts\Main%20Window\Exit%20yuzu\Context=1 Shortcuts\Main%20Window\Exit%20yuzu\Context\default=true -Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq=Home+Minus -Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq\default=true +Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq= +Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq\default=false Shortcuts\Main%20Window\Exit%20yuzu\KeySeq=Ctrl+Q -Shortcuts\Main%20Window\Exit%20yuzu\KeySeq\default=true +Shortcuts\Main%20Window\Exit%20yuzu\KeySeq\default=false Shortcuts\Main%20Window\Exit%20yuzu\Repeat=false Shortcuts\Main%20Window\Exit%20yuzu\Repeat\default=true Shortcuts\Main%20Window\Fullscreen\Context=1 Shortcuts\Main%20Window\Fullscreen\Context\default=true -Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq=Home+B -Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Fullscreen\KeySeq=F11 -Shortcuts\Main%20Window\Fullscreen\KeySeq\default=true +Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq= +Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Fullscreen\KeySeq=Ctrl+Return +Shortcuts\Main%20Window\Fullscreen\KeySeq\default=false Shortcuts\Main%20Window\Fullscreen\Repeat=false Shortcuts\Main%20Window\Fullscreen\Repeat\default=true -Shortcuts\Main%20Window\Load%20File\Context=3 -Shortcuts\Main%20Window\Load%20File\Context\default=true +Shortcuts\Main%20Window\Load%20File\Context=1 +Shortcuts\Main%20Window\Load%20File\Context\default=false Shortcuts\Main%20Window\Load%20File\Controller_KeySeq= Shortcuts\Main%20Window\Load%20File\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Load%20File\KeySeq=Ctrl+O -Shortcuts\Main%20Window\Load%20File\KeySeq\default=true +Shortcuts\Main%20Window\Load%20File\KeySeq= +Shortcuts\Main%20Window\Load%20File\KeySeq\default=false Shortcuts\Main%20Window\Load%20File\Repeat=false Shortcuts\Main%20Window\Load%20File\Repeat\default=true Shortcuts\Main%20Window\Load\Remove%20Amiibo\Context=3 Shortcuts\Main%20Window\Load\Remove%20Amiibo\Context\default=true -Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq=Home+A -Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq=F2 -Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq\default=true +Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq= +Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq=Alt+M +Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq\default=false Shortcuts\Main%20Window\Load\Remove%20Amiibo\Repeat=false Shortcuts\Main%20Window\Load\Remove%20Amiibo\Repeat\default=true Shortcuts\Main%20Window\Restart%20Emulation\Context=1 Shortcuts\Main%20Window\Restart%20Emulation\Context\default=true Shortcuts\Main%20Window\Restart%20Emulation\Controller_KeySeq= Shortcuts\Main%20Window\Restart%20Emulation\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=F6 -Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=Ctrl+R +Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=false Shortcuts\Main%20Window\Restart%20Emulation\Repeat=false Shortcuts\Main%20Window\Restart%20Emulation\Repeat\default=true Shortcuts\Main%20Window\Stop%20Emulation\Context=1 Shortcuts\Main%20Window\Stop%20Emulation\Context\default=true Shortcuts\Main%20Window\Stop%20Emulation\Controller_KeySeq= Shortcuts\Main%20Window\Stop%20Emulation\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Stop%20Emulation\KeySeq=F5 -Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Stop%20Emulation\KeySeq= +Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=false Shortcuts\Main%20Window\Stop%20Emulation\Repeat=false Shortcuts\Main%20Window\Stop%20Emulation\Repeat\default=true -Shortcuts\Main%20Window\TAS%20Record\Context=2 -Shortcuts\Main%20Window\TAS%20Record\Context\default=true +Shortcuts\Main%20Window\TAS%20Record\Context=1 +Shortcuts\Main%20Window\TAS%20Record\Context\default=false Shortcuts\Main%20Window\TAS%20Record\Controller_KeySeq= Shortcuts\Main%20Window\TAS%20Record\Controller_KeySeq\default=true -Shortcuts\Main%20Window\TAS%20Record\KeySeq=Ctrl+F7 -Shortcuts\Main%20Window\TAS%20Record\KeySeq\default=true +Shortcuts\Main%20Window\TAS%20Record\KeySeq= +Shortcuts\Main%20Window\TAS%20Record\KeySeq\default=false Shortcuts\Main%20Window\TAS%20Record\Repeat=false Shortcuts\Main%20Window\TAS%20Record\Repeat\default=true -Shortcuts\Main%20Window\TAS%20Reset\Context=2 -Shortcuts\Main%20Window\TAS%20Reset\Context\default=true +Shortcuts\Main%20Window\TAS%20Reset\Context=1 +Shortcuts\Main%20Window\TAS%20Reset\Context\default=false Shortcuts\Main%20Window\TAS%20Reset\Controller_KeySeq= Shortcuts\Main%20Window\TAS%20Reset\Controller_KeySeq\default=true -Shortcuts\Main%20Window\TAS%20Reset\KeySeq=Ctrl+F6 -Shortcuts\Main%20Window\TAS%20Reset\KeySeq\default=true +Shortcuts\Main%20Window\TAS%20Reset\KeySeq= +Shortcuts\Main%20Window\TAS%20Reset\KeySeq\default=false Shortcuts\Main%20Window\TAS%20Reset\Repeat=false Shortcuts\Main%20Window\TAS%20Reset\Repeat\default=true -Shortcuts\Main%20Window\TAS%20Start\Stop\Context=2 -Shortcuts\Main%20Window\TAS%20Start\Stop\Context\default=true +Shortcuts\Main%20Window\TAS%20Start\Stop\Context=1 +Shortcuts\Main%20Window\TAS%20Start\Stop\Context\default=false Shortcuts\Main%20Window\TAS%20Start\Stop\Controller_KeySeq= Shortcuts\Main%20Window\TAS%20Start\Stop\Controller_KeySeq\default=true -Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq=Ctrl+F5 -Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq\default=true +Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq= +Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq\default=false Shortcuts\Main%20Window\TAS%20Start\Stop\Repeat=false Shortcuts\Main%20Window\TAS%20Start\Stop\Repeat\default=true Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context=1 Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=true Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Controller_KeySeq= Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq=Ctrl+F -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq= +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Repeat=false Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Repeat\default=true Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Context=2 Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Context\default=true -Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq=Home+Y -Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq=Ctrl+U -Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq= +Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq\default=false +Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq=Ctrl+Z +Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Repeat=false Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Repeat\default=true -Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context=2 -Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context\default=true +Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context=1 +Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context\default=false Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Controller_KeySeq= Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq=Ctrl+F9 -Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq= +Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Repeat=false Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Repeat\default=true Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context=1 Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context\default=true Shortcuts\Main%20Window\Toggle%20Status%20Bar\Controller_KeySeq= Shortcuts\Main%20Window\Toggle%20Status%20Bar\Controller_KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=Ctrl+S -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq= +Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=false Shortcuts\Main%20Window\Toggle%20Status%20Bar\Repeat=false Shortcuts\Main%20Window\Toggle%20Status%20Bar\Repeat\default=true UIGameList\cache_game_list=true @@ -1230,19 +1220,25 @@ UIGameList\row_2_text_id=2 UIGameList\row_2_text_id\default=true UIGameList\show_add_ons=true UIGameList\show_add_ons\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4\x33\0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x87\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64) -UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1\r\0\0\0p\0\0\x5?\0\0\x3\n\0\0\x1\r\0\0\0\x8d\0\0\x5?\0\0\x3\n\0\0\0\0\0\0\0\0\x6M\0\0\x1\r\0\0\0\x8d\0\0\x5?\0\0\x3\n) -UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\x6M\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) -UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe7\0\0\x2W\0\0\0\0\0\0\0\0\0\0\x3\xe7\0\0\x2W\0\0\0\0\0\0\0\0\x6M\0\0\0\0\0\0\0\0\0\0\x3\xe7\0\0\x2W) +UIGameList\show_compat=false +UIGameList\show_compat\default=true +UIGameList\show_size=true +UIGameList\show_size\default=true +UIGameList\show_types=true +UIGameList\show_types\default=true +UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\x5\x2\0\0\0\x1\0\0\0\x1\0\0\0\x64\0\0\x4X\0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\x1\x10\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64) +UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4W\0\0\x2\x14\0\0\0\0\0\0\0\0\0\0\x4W\0\0\x2\x14\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\0\0\0\x4W\0\0\x2\x14) +UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) +UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0y\x1\0\0\x3\0\0\x4\x33\0\0\x2G\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\x4X\0\0\x1\xeb\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) calloutFlags=1 calloutFlags\default=false -confirmClose=true -confirmClose\default=true -disable_web_applet=true -disable_web_applet\default=true +confirmClose=false +confirmClose\default=false +disable_web_applet=false +disable_web_applet\default=false displayTitleBars=true displayTitleBars\default=true enable_discord_presence=true @@ -1267,8 +1263,8 @@ showStatusBar=true showStatusBar\default=true singleWindowMode=true singleWindowMode\default=true -theme=colorful -theme\default=true +theme=colorful_dark +theme\default=false [WebService] enable_telemetry=false @@ -1277,5 +1273,5 @@ web_api_url=https://api.yuzu-emu.org web_api_url\default=true yuzu_token= yuzu_token\default=true -yuzu_username= -yuzu_username\default=true \ No newline at end of file +yuzu_username=RetroDECK +yuzu_username\default=true diff --git a/emu-configs/dolphin/DSUClient.ini b/emu-configs/dolphin/DSUClient.ini new file mode 100644 index 00000000..48353009 --- /dev/null +++ b/emu-configs/dolphin/DSUClient.ini @@ -0,0 +1,3 @@ +[Server] +Enabled = True +Entries = steamdeckgyro:127.0.0.1:26760; diff --git a/emu-configs/dolphin/Dolphin.ini b/emu-configs/dolphin/Dolphin.ini index 07a56ad8..fb00bed7 100644 --- a/emu-configs/dolphin/Dolphin.ini +++ b/emu-configs/dolphin/Dolphin.ini @@ -3,6 +3,7 @@ ID = 09426e1e3e44d72728fb46a9e4a54663 PermissionAsked = True [Core] GFXBackend = Vulkan +AutoDiscChange = True SelectedLanguage = 0 SerialPort1 = 255 SkipIPL = True @@ -22,9 +23,13 @@ DPL2Quality = 2 DSPHLE = True WiiSDCardAllowWrites = True WiiSDCardEnableFolderSync = False +CPUThread = True +MMU = False +EnableCheats = False [Display] Fullscreen = True DisableScreenSaver = True +KeepWindowOnTop = False [GBA] BIOS = RETRODECKHOMEDIR/bios Rom1 = @@ -37,11 +42,12 @@ Threads = True [General] ISOPath0 = RETRODECKHOMEDIR/roms/wii ISOPath1 = RETRODECKHOMEDIR/roms/gc -ISOPaths = 2 +ISOPaths = 3 WiiSDCardPath = RETRODECKHOMEDIR/saves/wii/dolphin/sd.raw WirelessMac = 00:17:ab:83:9b:d4 HotkeysRequireFocus = True RecursiveISOPaths = True +ISOPath2 = RETRODECKHOMEDIR/roms/wii [NetPlay] TraversalChoice = direct [BluetoothPassthrough] @@ -58,3 +64,5 @@ PauseOnFocusLost = True ShowActiveTitle = True UseBuiltinTitleDatabase = True UsePanicHandlers = True +LanguageCode = en +ThemeName = Clean diff --git a/emu-configs/dolphin/GBA.ini b/emu-configs/dolphin/GBA.ini new file mode 100644 index 00000000..f8002127 --- /dev/null +++ b/emu-configs/dolphin/GBA.ini @@ -0,0 +1,44 @@ +[GBA1] +Device = evdev/0/Microsoft X-Box 360 pad 0 +Buttons/B = EAST +Buttons/A = SOUTH +Buttons/Z = TR +Buttons/SELECT = SELECT +Buttons/START = START +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +[GBA2] +Device = evdev/0/Microsoft X-Box 360 pad 1 +Buttons/B = EAST +Buttons/A = SOUTH +Buttons/Z = TR +Buttons/SELECT = SELECT +Buttons/START = START +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +[GBA3] +Device = evdev/0/Microsoft X-Box 360 pad 2 +Buttons/B = EAST +Buttons/A = SOUTH +Buttons/Z = TR +Buttons/SELECT = SELECT +Buttons/START = START +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +[GBA4] +Device = evdev/0/Microsoft X-Box 360 pad 3 +Buttons/B = EAST +Buttons/A = SOUTH +Buttons/Z = TR +Buttons/SELECT = SELECT +Buttons/START = START +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` diff --git a/emu-configs/dolphin/GCPadNew.ini b/emu-configs/dolphin/GCPadNew.ini index 7c2d8a7c..97dabd06 100644 --- a/emu-configs/dolphin/GCPadNew.ini +++ b/emu-configs/dolphin/GCPadNew.ini @@ -4,20 +4,20 @@ Buttons/A = SOUTH Buttons/B = EAST Buttons/X = NORTH Buttons/Y = WEST -Buttons/Z = `TR` | `TL` +Buttons/Z = TR | TL Buttons/Start = START Main Stick/Up = `Axis 1-` Main Stick/Down = `Axis 1+` Main Stick/Left = `Axis 0-` Main Stick/Right = `Axis 0+` -Main Stick/Modifier = `Shift` +Main Stick/Modifier = THUMBL Main Stick/Modifier/Range = 50.0 Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 C-Stick/Up = `Axis 4-` C-Stick/Down = `Axis 4+` C-Stick/Left = `Axis 3-` C-Stick/Right = `Axis 3+` -C-Stick/Modifier = `Ctrl` +C-Stick/Modifier = THUMBR C-Stick/Modifier/Range = 50.0 C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 Triggers/L = `Full Axis 2+` @@ -26,16 +26,99 @@ D-Pad/Up = `Axis 7-` D-Pad/Down = `Axis 7+` D-Pad/Left = `Axis 6-` D-Pad/Right = `Axis 6+` +Triggers/L-Analog = `Full Axis 2+` +Triggers/R-Analog = `Full Axis 5+` Rumble/Motor = Strong [GCPad2] -Device = XInput2/0/Virtual core pointer +Device = evdev/0/Microsoft X-Box 360 pad 1 +Buttons/A = SOUTH +Buttons/B = EAST +Buttons/X = NORTH +Buttons/Y = WEST +Buttons/Z = TR | TL +Buttons/Start = START +Main Stick/Up = `Axis 1-` +Main Stick/Down = `Axis 1+` +Main Stick/Left = `Axis 0-` +Main Stick/Right = `Axis 0+` +Main Stick/Modifier = THUMBL Main Stick/Modifier/Range = 50.0 +Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 +C-Stick/Up = `Axis 4-` +C-Stick/Down = `Axis 4+` +C-Stick/Left = `Axis 3-` +C-Stick/Right = `Axis 3+` +C-Stick/Modifier = THUMBR C-Stick/Modifier/Range = 50.0 +C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 +Triggers/L = `Full Axis 2+` +Triggers/R = `Full Axis 5+` +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +Triggers/L-Analog = `Full Axis 2+` +Triggers/R-Analog = `Full Axis 5+` +Rumble/Motor = Strong [GCPad3] -Device = XInput2/0/Virtual core pointer +Device = evdev/0/Microsoft X-Box 360 pad 2 +Buttons/A = SOUTH +Buttons/B = EAST +Buttons/X = NORTH +Buttons/Y = WEST +Buttons/Z = TR | TL +Buttons/Start = START +Main Stick/Up = `Axis 1-` +Main Stick/Down = `Axis 1+` +Main Stick/Left = `Axis 0-` +Main Stick/Right = `Axis 0+` +Main Stick/Modifier = THUMBL Main Stick/Modifier/Range = 50.0 +Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 +C-Stick/Up = `Axis 4-` +C-Stick/Down = `Axis 4+` +C-Stick/Left = `Axis 3-` +C-Stick/Right = `Axis 3+` +C-Stick/Modifier = THUMBR C-Stick/Modifier/Range = 50.0 +C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 +Triggers/L = `Full Axis 2+` +Triggers/R = `Full Axis 5+` +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +Triggers/L-Analog = `Full Axis 2+` +Triggers/R-Analog = `Full Axis 5+` +Rumble/Motor = Strong [GCPad4] -Device = XInput2/0/Virtual core pointer +Device = evdev/0/Microsoft X-Box 360 pad 3 +Buttons/A = SOUTH +Buttons/B = EAST +Buttons/X = NORTH +Buttons/Y = WEST +Buttons/Z = TR | TL +Buttons/Start = START +Main Stick/Up = `Axis 1-` +Main Stick/Down = `Axis 1+` +Main Stick/Left = `Axis 0-` +Main Stick/Right = `Axis 0+` +Main Stick/Modifier = THUMBL Main Stick/Modifier/Range = 50.0 -C-Stick/Modifier/Range = 50.0 \ No newline at end of file +Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 +C-Stick/Up = `Axis 4-` +C-Stick/Down = `Axis 4+` +C-Stick/Left = `Axis 3-` +C-Stick/Right = `Axis 3+` +C-Stick/Modifier = THUMBR +C-Stick/Modifier/Range = 50.0 +C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 +Triggers/L = `Full Axis 2+` +Triggers/R = `Full Axis 5+` +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +Triggers/L-Analog = `Full Axis 2+` +Triggers/R-Analog = `Full Axis 5+` +Rumble/Motor = Strong diff --git a/emu-configs/dolphin/GFX.ini b/emu-configs/dolphin/GFX.ini index 76065805..3b7d355a 100644 --- a/emu-configs/dolphin/GFX.ini +++ b/emu-configs/dolphin/GFX.ini @@ -8,12 +8,26 @@ DeferEFBCopies = True EFBEmulateFormatChanges = False EFBScaledCopy = True EFBToTextureEnable = True +ImmediateXFBEnable = True SkipDuplicateXFBs = True XFBToTextureEnable = True +EFBAccessEnable = False +[PrimeHack Misc] +AutoEFBMP = True +Lock Camera in Motion Puzzles = True +ReduceBloom = True +ToggleArmRePosition = True [Settings] +AspectRatio = 1 BackendMultithreading = True DumpBaseTextures = True DumpMipTextures = True FastDepthCalc = True -InternalResolution = 1 +InternalResolution = 2 SaveTextureCacheToState = True +WaitForShadersBeforeStarting = True +wideScreenHack = True +CacheHiresTextures = True +HiresTextures = True +[Hardware] +VSync = True diff --git a/emu-configs/dolphin/Hotkeys.ini b/emu-configs/dolphin/Hotkeys.ini index fdf30cae..b70a917e 100644 --- a/emu-configs/dolphin/Hotkeys.ini +++ b/emu-configs/dolphin/Hotkeys.ini @@ -6,7 +6,7 @@ General/Reset = @(Ctrl+R) General/Take Screenshot = @(Ctrl+X) General/Exit = @(Ctrl+Q) Emulation Speed/Decrease Emulation Speed = @(Ctrl+`2`) -Emulation Speed/Increase Emulation Speed = @(Ctrl+`1`) +Emulation Speed/Increase Emulation Speed = `Click 3` + `F3` + `F5` Emulation Speed/Disable Emulation Speed Limit = @(Ctrl+`0`) Movie/Start Recording = @(Ctrl+V) Graphics Toggles/Toggle Aspect Ratio = @(Ctrl+W) @@ -26,4 +26,4 @@ Wii/Connect Wii Remote 1 = @(Alt+W+`1`) Wii/Connect Wii Remote 2 = @(Alt+W+`2`) Wii/Connect Wii Remote 3 = @(Alt+W+`3`) Wii/Connect Wii Remote 4 = @(Alt+W+`4`) -Wii/Connect Balance Board = @(Alt+W+`5`) \ No newline at end of file +Wii/Connect Balance Board = @(Alt+W+`5`) diff --git a/emu-configs/primehack/Logger.ini b/emu-configs/dolphin/Logger.ini similarity index 100% rename from emu-configs/primehack/Logger.ini rename to emu-configs/dolphin/Logger.ini diff --git a/emu-configs/dolphin/Qt.ini b/emu-configs/dolphin/Qt.ini index d4d636e2..3188a9f0 100644 --- a/emu-configs/dolphin/Qt.ini +++ b/emu-configs/dolphin/Qt.ini @@ -1,28 +1,28 @@ [breakpointwidget] floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [cheatsmanager] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\x1\0\0\0\0\x5\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [codewidget] boxsplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x4\0\0\0\x85\0\0\0\x85\0\0\0\x85\0\0\0\x85\x1\xff\xff\xff\xff\x1\0\0\0\x2\0) codesplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0\x82\0\0\0W\x1\xff\xff\xff\xff\x1\0\0\0\x1\0) floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [gridview] -scale=@Variant(\0\0\0\x87?\x80\0\0) +scale=1 [jitwidget] asmsplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0W\0\0\0W\x1\xff\xff\xff\xff\x1\0\0\0\x1\0) floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) tablesplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0W\0\0\0W\x1\xff\xff\xff\xff\x1\0\0\0\x2\0) [logconfigwidget] floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [logging] font=0 @@ -30,11 +30,11 @@ wraplines=false [logwidget] floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [mainwindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\r\xb7\0\0\x1\x1\0\0\x10\xd6\0\0\x3\x32\0\0\r\xb7\0\0\x1\x1e\0\0\x10\xd6\0\0\x3\x32\0\0\0\0\0\0\0\0\xf\0\0\0\r\xb7\0\0\x1\x1e\0\0\x10\xd6\0\0\x3\x32) -state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfc\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\xff\xff\xff\xfa\xff\xff\xff\xff\x2\0\0\0\n\xfb\0\0\0\x6\0l\0o\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xb1\x1\0\0\x3\xfb\0\0\0\x12\0l\0o\0g\0\x63\0o\0n\0\x66\0i\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x1b\x1\0\0\x3\xfb\0\0\0\b\0\x63\0o\0\x64\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x61\x1\0\0\x3\xfb\0\0\0\x12\0r\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0}\x1\0\0\x3\xfb\0\0\0\xe\0t\0h\0r\0\x65\0\x61\0\x64\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x91\x1\0\0\x3\xfb\0\0\0\n\0w\0\x61\0t\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xab\x1\0\0\x3\xfb\0\0\0\x16\0\x62\0r\0\x65\0\x61\0k\0p\0o\0i\0n\0t\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xab\x1\0\0\x3\xfb\0\0\0\f\0m\0\x65\0m\0o\0r\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0}\x1\0\0\x3\xfb\0\0\0\xe\0n\0\x65\0t\0w\0o\0r\0k\0\0\0\0\0\xff\xff\xff\xff\0\0\x2w\x1\0\0\x3\xfb\0\0\0\x12\0j\0i\0t\0w\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\x1\x1\0\0\x3\0\0\x3 \0\0\x1\xa1\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\xe\0t\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf) +state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfc\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\xff\xff\xff\xfa\xff\xff\xff\xff\x2\0\0\0\n\xfb\0\0\0\x6\0l\0o\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0\x12\0l\0o\0g\0\x63\0o\0n\0\x66\0i\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xb8\0\xff\xff\xff\xfb\0\0\0\b\0\x63\0o\0\x64\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xfd\0\xff\xff\xff\xfb\0\0\0\x12\0r\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0]\0\xff\xff\xff\xfb\0\0\0\xe\0t\0h\0r\0\x65\0\x61\0\x64\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\f\0\xff\xff\xff\xfb\0\0\0\n\0w\0\x61\0t\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0\x16\0\x62\0r\0\x65\0\x61\0k\0p\0o\0i\0n\0t\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0\f\0m\0\x65\0m\0o\0r\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0]\0\xff\xff\xff\xfb\0\0\0\xe\0n\0\x65\0t\0w\0o\0r\0k\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x11\0\xff\xff\xff\xfb\0\0\0\x12\0j\0i\0t\0w\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xc3\0\xff\xff\xff\0\0\x3 \0\0\x2\x4\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\xe\0t\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) [memorywidget] addrspace_auxiliary=false @@ -44,8 +44,10 @@ bplog=true bpread=false bpreadwrite=true bpwrite=false +display_type=1 floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) +inputcombo=1 searchascii=true searchhex=false splitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\xff\xff\xff\xff\xff\xff\xff\xff\x1\xff\xff\xff\xff\x1\0\0\0\x1\0) @@ -56,29 +58,29 @@ typeu32=false typeu8=true [netplaydialog] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3\0\0\0\x1\0\0\0\0\x5\0\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf) splitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0\xa5\0\0\0\xd7\x1\xff\xff\xff\xff\x1\0\0\0\x1\0) [networkwidget] floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [registerwidget] floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [renderwidget] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\x5\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf) [tableheader] -state=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x2\x1\0\0\0\0\0\0\0\0\0\0\0\xe(?\0\0\0\b\0\0\0\t\0\0\0\x64\0\0\0\b\0\0\0\x64\0\0\0\v\0\0\0\x64\0\0\0\n\0\0\0\x64\0\0\0\r\0\0\0\x64\0\0\0\f\0\0\0\x64\0\0\0\x3\0\0\0\x64\0\0\0\x5\0\0\0\x46\0\0\x3\v\0\0\0\xe\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0&\0\0\0\x84\0\0\0\0\0\0\0\xe\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0\x66\0\0\0\x1\0\0\0\x2\0\0\x1\x2\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x1\x2\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0U\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\0) +state=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x2\x1\0\0\0\0\0\0\0\0\0\0\0\xe(?\0\0\0\b\0\0\0\f\0\0\0\x64\0\0\0\r\0\0\0\x64\0\0\0\x3\0\0\0\x64\0\0\0\x5\0\0\0\x46\0\0\0\v\0\0\0\x64\0\0\0\t\0\0\0\x64\0\0\0\n\0\0\0\x64\0\0\0\b\0\0\0\x64\0\0\x3\x13\0\0\0\xe\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0&\0\0\0\x84\0\0\0\0\0\0\0\xe\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0\x66\0\0\0\x1\0\0\0\x2\0\0\x1\x6\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x1\x6\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0U\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\0\0\0\0\0) [threadwidget] floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) [toolbar] -visible=true +visible=false [userstyle] enabled=false @@ -86,4 +88,4 @@ name= [watchwidget] floating=false -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d) diff --git a/emu-configs/dolphin/WiimoteNew.ini b/emu-configs/dolphin/WiimoteNew.ini index 79183554..67ab3a89 100644 --- a/emu-configs/dolphin/WiimoteNew.ini +++ b/emu-configs/dolphin/WiimoteNew.ini @@ -1,15 +1,6 @@ [Wiimote1] Device = evdev/0/Microsoft X-Box 360 pad 0 -Tilt/Modifier/Range = 50.0 -Nunchuk/Stick/Modifier/Range = 50.0 -Nunchuk/Tilt/Modifier/Range = 50.0 -Classic/Left Stick/Modifier/Range = 50.0 -Classic/Right Stick/Modifier/Range = 50.0 -Guitar/Stick/Modifier/Range = 50.0 -Drums/Stick/Modifier/Range = 50.0 -Turntable/Stick/Modifier/Range = 50.0 -uDraw/Stylus/Modifier/Range = 50.0 -Drawsome/Stylus/Modifier/Range = 50.0 +Source = 1 Buttons/A = `SOUTH` | `Click 1` | `XInput2/0/Virtual core pointer:Click 1` Buttons/B = EAST Buttons/1 = WEST @@ -21,63 +12,347 @@ D-Pad/Up = `Axis 7-` D-Pad/Down = `Axis 7+` D-Pad/Left = `Axis 6-` D-Pad/Right = `Axis 6+` -Extension = Nunchuk Rumble/Motor = Strong +Shake/X = TL +Shake/Y = TL +Shake/Z = TL +Extension = Nunchuk Nunchuk/Stick/Up = `Axis 1-` Nunchuk/Stick/Down = `Axis 1+` Nunchuk/Stick/Left = `Axis 0-` Nunchuk/Stick/Right = `Axis 0+` -Nunchuk/Buttons/C = TL -Nunchuk/Buttons/Z = `Full Axis 2+` -IR/Auto-Hide = True +Nunchuk/Buttons/C = TR +Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+` +Nunchuk/Shake/X = `TL`&`Full Axis 2+` +Nunchuk/Shake/Y = `TL`&`Full Axis 2+` +Nunchuk/Shake/Z = `TL`&`Full Axis 2+` Hotkeys/Sideways Toggle = `XInput2/0/Virtual core pointer:Alt`&`XInput2/0/Virtual core pointer:X` Hotkeys/Upright Toggle = `XInput2/0/Virtual core pointer:Alt_L`&`XInput2/0/Virtual core pointer:Z` -Source = 1 +Classic/Buttons/A = EAST +Classic/Buttons/B = SOUTH +Classic/Buttons/X = WEST +Classic/Buttons/Y = NORTH +Classic/Buttons/ZL = TL +Classic/Buttons/ZR = TR +Classic/Buttons/- = SELECT +Classic/Buttons/+ = START +Classic/Left Stick/Up = `Axis 1-` +Classic/Left Stick/Down = `Axis 1+` +Classic/Left Stick/Left = `Axis 0-` +Classic/Left Stick/Right = `Axis 0+` +Classic/Left Stick/Modifier/Range = 50.0 +Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96 +Classic/Right Stick/Up = `Axis 4-` +Classic/Right Stick/Down = `Axis 4+` +Classic/Right Stick/Left = `Axis 3-` +Classic/Right Stick/Right = `Axis 3+` +Classic/Right Stick/Modifier/Range = 50.0 +Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96 +Classic/Triggers/L = `Full Axis 2+` +Classic/Triggers/R = `Full Axis 5+` +Classic/Triggers/L-Analog = `Full Axis 2+` +Classic/Triggers/R-Analog = `Full Axis 5+` +IR/Vertical Offset = 12.0 +IR/Total Yaw = 19.0 +IR/Total Pitch = 22.0 IR/Up = `XInput2/0/Virtual core pointer:Cursor Y-` IR/Down = `XInput2/0/Virtual core pointer:Cursor Y+` IR/Left = `XInput2/0/Virtual core pointer:Cursor X-` IR/Right = `XInput2/0/Virtual core pointer:Cursor X+` -Shake/X = `Full Axis 5+` -Shake/Y = `Full Axis 5+` -Shake/Z = `Full Axis 5+` +IR/Hide = THUMBL +IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96 +Tilt/Modifier/Range = 50.0 +IMUAccelerometer/Up = `Accel Up` +IMUAccelerometer/Down = `Accel Down` +IMUAccelerometer/Left = `Accel Left` +IMUAccelerometer/Right = `Accel Right` +IMUAccelerometer/Forward = `Accel Forward` +IMUAccelerometer/Backward = `Accel Backward` +IMUGyroscope/Pitch Up = `Gyro Pitch Up` +IMUGyroscope/Pitch Down = `Gyro Pitch Down` +IMUGyroscope/Roll Left = `Gyro Roll Left` +IMUGyroscope/Roll Right = `Gyro Roll Right` +IMUGyroscope/Yaw Left = `Gyro Yaw Left` +IMUGyroscope/Yaw Right = `Gyro Yaw Right` +IMUIR/Enabled = False +Nunchuk/Stick/Modifier/Range = 50.0 +Nunchuk/Tilt/Modifier/Range = 50.0 +Guitar/Stick/Modifier/Range = 50.0 +Drums/Stick/Modifier/Range = 50.0 +Turntable/Stick/Modifier/Range = 50.0 +uDraw/Stylus/Modifier/Range = 50.0 +Drawsome/Stylus/Modifier/Range = 50.0 +Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`) +Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`) +Tilt/Left = @(`Full Axis 2+`+`Axis 3-`) +Tilt/Right = @(`Full Axis 2+`+`Axis 3+`) [Wiimote2] -Device = XInput2/0/Virtual core pointer +Device = evdev/1/Valve Software Steam Deck Controller +Source = 0 +BButtons/A = `SOUTH` | `Click 1` | `XInput2/1/Virtual core pointer:Click 1` +Buttons/B = EAST +Buttons/1 = WEST +Buttons/2 = NORTH +Buttons/- = SELECT +Buttons/+ = START +Buttons/Home = THUMBR +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +Rumble/Motor = Strong +Shake/X = TL +Shake/Y = TL +Shake/Z = TL +Extension = Nunchuk +Nunchuk/Stick/Up = `Axis 1-` +Nunchuk/Stick/Down = `Axis 1+` +Nunchuk/Stick/Left = `Axis 0-` +Nunchuk/Stick/Right = `Axis 0+` +Nunchuk/Buttons/C = TR +Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+` +Nunchuk/Shake/X = `TL`&`Full Axis 2+` +Nunchuk/Shake/Y = `TL`&`Full Axis 2+` +Nunchuk/Shake/Z = `TL`&`Full Axis 2+` +Hotkeys/Sideways Toggle = `XInput2/1/Virtual core pointer:Alt`&`XInput2/1/Virtual core pointer:X` +Hotkeys/Upright Toggle = `XInput2/1/Virtual core pointer:Alt_L`&`XInput2/1/Virtual core pointer:Z` +Classic/Buttons/A = EAST +Classic/Buttons/B = SOUTH +Classic/Buttons/X = WEST +Classic/Buttons/Y = NORTH +Classic/Buttons/ZL = TL +Classic/Buttons/ZR = TR +Classic/Buttons/- = SELECT +Classic/Buttons/+ = START +Classic/Left Stick/Up = `Axis 1-` +Classic/Left Stick/Down = `Axis 1+` +Classic/Left Stick/Left = `Axis 0-` +Classic/Left Stick/Right = `Axis 0+` +Classic/Left Stick/Modifier/Range = 50.0 +Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96 +Classic/Right Stick/Up = `Axis 4-` +Classic/Right Stick/Down = `Axis 4+` +Classic/Right Stick/Left = `Axis 3-` +Classic/Right Stick/Right = `Axis 3+` +Classic/Right Stick/Modifier/Range = 50.0 +Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96 +Classic/Triggers/L = `Full Axis 2+` +Classic/Triggers/R = `Full Axis 5+` +Classic/Triggers/L-Analog = `Full Axis 2+` +Classic/Triggers/R-Analog = `Full Axis 5+` +IR/Vertical Offset = 12.0 +IR/Total Yaw = 19.0 +IR/Total Pitch = 22.0 +IR/Up = `XInput2/1/Virtual core pointer:Cursor Y-` +IR/Down = `XInput2/1/Virtual core pointer:Cursor Y+` +IR/Left = `XInput2/1/Virtual core pointer:Cursor X-` +IR/Right = `XInput2/1/Virtual core pointer:Cursor X+` +IR/Hide = THUMBL +IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96 Tilt/Modifier/Range = 50.0 +IMUAccelerometer/Up = `Accel Up` +IMUAccelerometer/Down = `Accel Down` +IMUAccelerometer/Left = `Accel Left` +IMUAccelerometer/Right = `Accel Right` +IMUAccelerometer/Forward = `Accel Forward` +IMUAccelerometer/Backward = `Accel Backward` +IMUGyroscope/Pitch Up = `Gyro Pitch Up` +IMUGyroscope/Pitch Down = `Gyro Pitch Down` +IMUGyroscope/Roll Left = `Gyro Roll Left` +IMUGyroscope/Roll Right = `Gyro Roll Right` +IMUGyroscope/Yaw Left = `Gyro Yaw Left` +IMUGyroscope/Yaw Right = `Gyro Yaw Right` +IMUIR/Enabled = False Nunchuk/Stick/Modifier/Range = 50.0 Nunchuk/Tilt/Modifier/Range = 50.0 -Classic/Left Stick/Modifier/Range = 50.0 -Classic/Right Stick/Modifier/Range = 50.0 Guitar/Stick/Modifier/Range = 50.0 Drums/Stick/Modifier/Range = 50.0 Turntable/Stick/Modifier/Range = 50.0 uDraw/Stylus/Modifier/Range = 50.0 Drawsome/Stylus/Modifier/Range = 50.0 +Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`) +Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`) +Tilt/Left = @(`Full Axis 2+`+`Axis 3-`) +Tilt/Right = @(`Full Axis 2+`+`Axis 3+`) [Wiimote3] -Device = XInput2/0/Virtual core pointer +Device = evdev/0/Microsoft X-Box 360 pad 2 +Source = 0 +Buttons/A = `SOUTH` | `Click 1` | `XInput2/2/Virtual core pointer:Click 1` +Buttons/B = EAST +Buttons/1 = WEST +Buttons/2 = NORTH +Buttons/- = SELECT +Buttons/+ = START +Buttons/Home = THUMBR +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +Rumble/Motor = Strong +Shake/X = TL +Shake/Y = TL +Shake/Z = TL +Extension = Nunchuk +Nunchuk/Stick/Up = `Axis 1-` +Nunchuk/Stick/Down = `Axis 1+` +Nunchuk/Stick/Left = `Axis 0-` +Nunchuk/Stick/Right = `Axis 0+` +Nunchuk/Buttons/C = TR +Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+` +Nunchuk/Shake/X = `TL`&`Full Axis 2+` +Nunchuk/Shake/Y = `TL`&`Full Axis 2+` +Nunchuk/Shake/Z = `TL`&`Full Axis 2+` +Hotkeys/Sideways Toggle = `XInput2/2/Virtual core pointer:Alt`&`XInput2/2/Virtual core pointer:X` +Hotkeys/Upright Toggle = `XInput2/2/Virtual core pointer:Alt_L`&`XInput2/2/Virtual core pointer:Z` +Classic/Buttons/A = EAST +Classic/Buttons/B = SOUTH +Classic/Buttons/X = WEST +Classic/Buttons/Y = NORTH +Classic/Buttons/ZL = TL +Classic/Buttons/ZR = TR +Classic/Buttons/- = SELECT +Classic/Buttons/+ = START +Classic/Left Stick/Up = `Axis 1-` +Classic/Left Stick/Down = `Axis 1+` +Classic/Left Stick/Left = `Axis 0-` +Classic/Left Stick/Right = `Axis 0+` +Classic/Left Stick/Modifier/Range = 50.0 +Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96 +Classic/Right Stick/Up = `Axis 4-` +Classic/Right Stick/Down = `Axis 4+` +Classic/Right Stick/Left = `Axis 3-` +Classic/Right Stick/Right = `Axis 3+` +Classic/Right Stick/Modifier/Range = 50.0 +Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96 +Classic/Triggers/L = `Full Axis 2+` +Classic/Triggers/R = `Full Axis 5+` +Classic/Triggers/L-Analog = `Full Axis 2+` +Classic/Triggers/R-Analog = `Full Axis 5+` +IR/Vertical Offset = 12.0 +IR/Total Yaw = 19.0 +IR/Total Pitch = 22.0 +IR/Up = `XInput2/2/Virtual core pointer:Cursor Y-` +IR/Down = `XInput2/2/Virtual core pointer:Cursor Y+` +IR/Left = `XInput2/2/Virtual core pointer:Cursor X-` +IR/Right = `XInput2/2/Virtual core pointer:Cursor X+` +IR/Hide = THUMBL +IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96 Tilt/Modifier/Range = 50.0 +IMUAccelerometer/Up = `Accel Up` +IMUAccelerometer/Down = `Accel Down` +IMUAccelerometer/Left = `Accel Left` +IMUAccelerometer/Right = `Accel Right` +IMUAccelerometer/Forward = `Accel Forward` +IMUAccelerometer/Backward = `Accel Backward` +IMUGyroscope/Pitch Up = `Gyro Pitch Up` +IMUGyroscope/Pitch Down = `Gyro Pitch Down` +IMUGyroscope/Roll Left = `Gyro Roll Left` +IMUGyroscope/Roll Right = `Gyro Roll Right` +IMUGyroscope/Yaw Left = `Gyro Yaw Left` +IMUGyroscope/Yaw Right = `Gyro Yaw Right` +IMUIR/Enabled = False Nunchuk/Stick/Modifier/Range = 50.0 Nunchuk/Tilt/Modifier/Range = 50.0 -Classic/Left Stick/Modifier/Range = 50.0 -Classic/Right Stick/Modifier/Range = 50.0 Guitar/Stick/Modifier/Range = 50.0 Drums/Stick/Modifier/Range = 50.0 Turntable/Stick/Modifier/Range = 50.0 uDraw/Stylus/Modifier/Range = 50.0 Drawsome/Stylus/Modifier/Range = 50.0 +Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`) +Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`) +Tilt/Left = @(`Full Axis 2+`+`Axis 3-`) +Tilt/Right = @(`Full Axis 2+`+`Axis 3+`) [Wiimote4] -Device = XInput2/0/Virtual core pointer +Device = evdev/0/Microsoft X-Box 360 pad 4 +Source = 0 +Buttons/A = `SOUTH` | `Click 1` | `XInput2/3/Virtual core pointer:Click 1` +Buttons/B = EAST +Buttons/1 = WEST +Buttons/2 = NORTH +Buttons/- = SELECT +Buttons/+ = START +Buttons/Home = THUMBR +D-Pad/Up = `Axis 7-` +D-Pad/Down = `Axis 7+` +D-Pad/Left = `Axis 6-` +D-Pad/Right = `Axis 6+` +Rumble/Motor = Strong +Shake/X = TL +Shake/Y = TL +Shake/Z = TL +Extension = Nunchuk +Nunchuk/Stick/Up = `Axis 1-` +Nunchuk/Stick/Down = `Axis 1+` +Nunchuk/Stick/Left = `Axis 0-` +Nunchuk/Stick/Right = `Axis 0+` +Nunchuk/Buttons/C = TR +Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+` +Nunchuk/Shake/X = `TL`&`Full Axis 2+` +Nunchuk/Shake/Y = `TL`&`Full Axis 2+` +Nunchuk/Shake/Z = `TL`&`Full Axis 2+` +Hotkeys/Sideways Toggle = `XInput2/3/Virtual core pointer:Alt`&`XInput2/2/Virtual core pointer:X` +Hotkeys/Upright Toggle = `XInput2/3/Virtual core pointer:Alt_L`&`XInput2/2/Virtual core pointer:Z` +Classic/Buttons/A = EAST +Classic/Buttons/B = SOUTH +Classic/Buttons/X = WEST +Classic/Buttons/Y = NORTH +Classic/Buttons/ZL = TL +Classic/Buttons/ZR = TR +Classic/Buttons/- = SELECT +Classic/Buttons/+ = START +Classic/Left Stick/Up = `Axis 1-` +Classic/Left Stick/Down = `Axis 1+` +Classic/Left Stick/Left = `Axis 0-` +Classic/Left Stick/Right = `Axis 0+` +Classic/Left Stick/Modifier/Range = 50.0 +Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96 +Classic/Right Stick/Up = `Axis 4-` +Classic/Right Stick/Down = `Axis 4+` +Classic/Right Stick/Left = `Axis 3-` +Classic/Right Stick/Right = `Axis 3+` +Classic/Right Stick/Modifier/Range = 50.0 +Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96 +Classic/Triggers/L = `Full Axis 2+` +Classic/Triggers/R = `Full Axis 5+` +Classic/Triggers/L-Analog = `Full Axis 2+` +Classic/Triggers/R-Analog = `Full Axis 5+` +IR/Vertical Offset = 12.0 +IR/Total Yaw = 19.0 +IR/Total Pitch = 22.0 +IR/Up = `XInput2/3/Virtual core pointer:Cursor Y-` +IR/Down = `XInput2/3/Virtual core pointer:Cursor Y+` +IR/Left = `XInput2/3/Virtual core pointer:Cursor X-` +IR/Right = `XInput2/3/Virtual core pointer:Cursor X+` +IR/Hide = THUMBL +IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96 Tilt/Modifier/Range = 50.0 +IMUAccelerometer/Up = `Accel Up` +IMUAccelerometer/Down = `Accel Down` +IMUAccelerometer/Left = `Accel Left` +IMUAccelerometer/Right = `Accel Right` +IMUAccelerometer/Forward = `Accel Forward` +IMUAccelerometer/Backward = `Accel Backward` +IMUGyroscope/Pitch Up = `Gyro Pitch Up` +IMUGyroscope/Pitch Down = `Gyro Pitch Down` +IMUGyroscope/Roll Left = `Gyro Roll Left` +IMUGyroscope/Roll Right = `Gyro Roll Right` +IMUGyroscope/Yaw Left = `Gyro Yaw Left` +IMUGyroscope/Yaw Right = `Gyro Yaw Right` +IMUIR/Enabled = False Nunchuk/Stick/Modifier/Range = 50.0 Nunchuk/Tilt/Modifier/Range = 50.0 -Classic/Left Stick/Modifier/Range = 50.0 -Classic/Right Stick/Modifier/Range = 50.0 Guitar/Stick/Modifier/Range = 50.0 Drums/Stick/Modifier/Range = 50.0 Turntable/Stick/Modifier/Range = 50.0 uDraw/Stylus/Modifier/Range = 50.0 Drawsome/Stylus/Modifier/Range = 50.0 +Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`) +Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`) +Tilt/Left = @(`Full Axis 2+`+`Axis 3-`) +Tilt/Right = @(`Full Axis 2+`+`Axis 3+`) [BalanceBoard] Device = XInput2/0/Virtual core pointer +Source = 0 Tilt/Modifier/Range = 50.0 Nunchuk/Stick/Modifier/Range = 50.0 Nunchuk/Tilt/Modifier/Range = 50.0 @@ -87,4 +362,4 @@ Guitar/Stick/Modifier/Range = 50.0 Drums/Stick/Modifier/Range = 50.0 Turntable/Stick/Modifier/Range = 50.0 uDraw/Stylus/Modifier/Range = 50.0 -Drawsome/Stylus/Modifier/Range = 50.0 \ No newline at end of file +Drawsome/Stylus/Modifier/Range = 50.0 diff --git a/emu-configs/duckstation/settings.ini b/emu-configs/duckstation/settings.ini index a3ab2d70..0936a2e7 100644 --- a/emu-configs/duckstation/settings.ini +++ b/emu-configs/duckstation/settings.ini @@ -43,14 +43,16 @@ FastmemMode = true [GPU] Renderer = Vulkan +Adapter = AMD RADV VANGOGH ResolutionScale = 3 Multisamples = 1 UseDebugDevice = false UseSoftwareRendererForReadbacks = false +UseSoftwareRendererForReadbacks = false PerSampleShading = false UseThread = true ThreadedPresentation = true -TrueColor = false +TrueColor = true ScaledDithering = true TextureFilter = Nearest DownsampleMode = Disabled @@ -87,12 +89,15 @@ ShowFPS = false ShowVPS = false ShowSpeed = false ShowResolution = false +ShowCPU = false +ShowGPU = false ShowStatusIndicators = true +ShowInputs = false ShowEnhancements = false Fullscreen = false -VSync = false +VSync = true DisplayAllFrames = false -PostProcessChain = +PostProcessChain = MaxFPS = 0.000000 InternalResolutionScreenshots = false @@ -101,6 +106,7 @@ InternalResolutionScreenshots = false ReadaheadSectors = 8 RegionCheck = false LoadImageToRAM = false +LoadImagePatches = false MuteCDAudio = false ReadSpeedup = 1 SeekSpeedup = 1 @@ -188,12 +194,17 @@ Directory = RETRODECKHOMEDIR/saves/psx/duckstation/memcards [ControllerPorts] +ControllerSettingsMigrated = true MultitapMode = Disabled +PointerXScale = 8 +PointerYScale = 8 +PointerXInvert = false +PointerYInvert = false [Logging] LogLevel = Info -LogFilter = +LogFilter = LogToConsole = true LogToDebug = false LogToWindow = false @@ -212,6 +223,15 @@ ShowMDECState = false ShowDMAState = false +[TextureReplacements] +EnableVRAMWriteReplacements = false +PreloadTextures = false +DumpVRAMWrites = false +DumpVRAMWriteForceAlphaChannel = true +DumpVRAMWriteWidthThreshold = 128 +DumpVRAMWriteHeightThreshold = 128 + + [Hacks] DMAMaxSliceTicks = 1000 DMAHaltTicks = 100 @@ -219,31 +239,6 @@ GPUFIFOSize = 16 GPUMaxRunAhead = 128 -[Hotkeys] -OpenQuickMenu = Keyboard/Control & Keyboard/M -FastForward = Keyboard/Control & Keyboard/Plus -ToggleTurbo = Keyboard/Control & Keyboard/T -ToggleFullscreen = Keyboard/Control & Keyboard/Return -TogglePause = Keyboard/Control & Keyboard/P -Screenshot = Keyboard/Control & Keyboard/X -Reset = Keyboard/Control & Keyboard/R -ChangeDisc = Keyboard/Control & Keyboard/D -Rewind = Keyboard/Control & Keyboard/Minus -ToggleCheats = Keyboard/Control & Keyboard/C -IncreaseEmulationSpeed = Keyboard/Control & Keyboard/1 -DecreaseEmulationSpeed = Keyboard/Control & Keyboard/2 -ResetEmulationSpeed = Keyboard/Control & Keyboard/3 -IncreaseResolutionScale = Keyboard/Control & Keyboard/U -DecreaseResolutionScale = Keyboard/Control & Keyboard/Y -ToggleWidescreen = Keyboard/Control & Keyboard/W -LoadSelectedSaveState = Keyboard/Control & Keyboard/A -SaveSelectedSaveState = Keyboard/Control & Keyboard/S -SelectPreviousSaveStateSlot = Keyboard/Control & Keyboard/J -SelectNextSaveStateSlot = Keyboard/Control & Keyboard/K -PowerOff = Keyboard/Control & Keyboard/Q -UndoLoadState = Keyboard/Control & Keyboard/9 - - [Cheevos] Enabled = false TestMode = false @@ -261,9 +256,168 @@ LoginTimestamp = [UI] -MainWindowGeometry = AdnQywADAAAAAAAlAAAAHAAAA0QAAAL0AAAAJQAAADkAAANEAAAC9AAAAAAAAAAAB4AAAAAlAAAAOQAAA0QAAAL0 +MainWindowGeometry = AdnQywADAAAAAAhwAAABXwAAC48AAAQKAAAIcAAAAXwAAAuPAAAECgAAAAAAAAAACgAAAAhwAAABfAAAC48AAAQK MainWindowState = AAAA/wAAAAD9AAAAAAAAAyAAAAI9AAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAAAAAAA== [GameList] RecursivePaths = RETRODECKHOMEDIR/roms/psx + + +[InputSources] +SDL = true +SDLControllerEnhancedMode = false +XInput = false +RawInput = false + + +[Pad1] +Type = AnalogController +Up = SDL-0/DPadUp +Right = SDL-0/DPadRight +Down = SDL-0/DPadDown +Left = SDL-0/DPadLeft +Triangle = SDL-0/Y +Circle = SDL-0/B +Cross = SDL-0/A +Square = SDL-0/X +Select = SDL-0/Back +Start = SDL-0/Start +L1 = SDL-0/LeftShoulder +R1 = SDL-0/RightShoulder +L2 = SDL-0/+LeftTrigger +R2 = SDL-0/+RightTrigger +Analog = Keyboard/F6 +L3 = SDL-0/LeftStick +R3 = SDL-0/RightStick +LLeft = SDL-0/-LeftX +LRight = SDL-0/+LeftX +LDown = SDL-0/+LeftY +LUp = SDL-0/-LeftY +RLeft = SDL-0/-RightX +RRight = SDL-0/+RightX +RDown = SDL-0/+RightY +RUp = SDL-0/-RightY +SmallMotor = SDL-0/SmallMotor +LargeMotor = SDL-0/LargeMotor + + +[Pad2] +Type = AnalogController +Up = SDL-1/DPadUp +Right = SDL-1/DPadRight +Down = SDL-1/DPadDown +Left = SDL-1/DPadLeft +Triangle = SDL-1/Y +Circle = SDL-1/B +Cross = SDL-1/A +Square = SDL-1/X +Select = SDL-1/Back +Start = SDL-1/Start +Analog = SDL-1/Guide +L1 = SDL-1/LeftShoulder +R1 = SDL-1/RightShoulder +L2 = SDL-1/+LeftTrigger +R2 = SDL-1/+RightTrigger +L3 = SDL-1/LeftStick +R3 = SDL-1/RightStick +LLeft = SDL-1/-LeftX +LRight = SDL-1/+LeftX +LDown = SDL-1/+LeftY +LUp = SDL-1/-LeftY +RLeft = SDL-1/-RightX +RRight = SDL-1/+RightX +RDown = SDL-1/+RightY +RUp = SDL-1/-RightY +SmallMotor = SDL-1/SmallMotor +LargeMotor = SDL-1/LargeMotor + + +[Pad3] +Type = AnalogController +Up = SDL-2/DPadUp +Right = SDL-2/DPadRight +Down = SDL-2/DPadDown +Left = SDL-2/DPadLeft +Triangle = SDL-2/Y +Circle = SDL-2/B +Cross = SDL-2/A +Square = SDL-2/X +Select = SDL-2/Back +Start = SDL-2/Start +Analog = SDL-2/Guide +L1 = SDL-2/LeftShoulder +R1 = SDL-2/RightShoulder +L2 = SDL-2/+LeftTrigger +R2 = SDL-2/+RightTrigger +L3 = SDL-2/LeftStick +R3 = SDL-2/RightStick +LLeft = SDL-2/-LeftX +LRight = SDL-2/+LeftX +LDown = SDL-2/+LeftY +LUp = SDL-2/-LeftY +RLeft = SDL-2/-RightX +RRight = SDL-2/+RightX +RDown = SDL-2/+RightY +RUp = SDL-2/-RightY +SmallMotor = SDL-2/SmallMotor +LargeMotor = SDL-2/LargeMotor + + +[Pad4] +Type = AnalogController +Up = SDL-3/DPadUp +Right = SDL-3/DPadRight +Down = SDL-3/DPadDown +Left = SDL-3/DPadLeft +Triangle = SDL-3/Y +Circle = SDL-3/B +Cross = SDL-3/A +Square = SDL-3/X +Select = SDL-3/Back +Start = SDL-3/Start +Analog = SDL-3/Guide +L1 = SDL-3/LeftShoulder +R1 = SDL-3/RightShoulder +L2 = SDL-3/+LeftTrigger +R2 = SDL-3/+RightTrigger +L3 = SDL-3/LeftStick +R3 = SDL-3/RightStick +LLeft = SDL-3/-LeftX +LRight = SDL-3/+LeftX +LDown = SDL-3/+LeftY +LUp = SDL-3/-LeftY +RLeft = SDL-3/-RightX +RRight = SDL-3/+RightX +RDown = SDL-3/+RightY +RUp = SDL-3/-RightY +SmallMotor = SDL-3/SmallMotor +LargeMotor = SDL-3/LargeMotor + + +[Pad5] +Type = None + + +[Pad6] +Type = None + + +[Pad7] +Type = None + + +[Pad8] +Type = None + + +[Hotkeys] +FastForward = Keyboard/Tab +TogglePause = Keyboard/Space +Screenshot = Keyboard/F10 +ToggleFullscreen = Keyboard/F11 +OpenPauseMenu = Keyboard/Escape +LoadSelectedSaveState = Keyboard/F1 +SaveSelectedSaveState = Keyboard/F2 +SelectPreviousSaveStateSlot = Keyboard/F3 +SelectNextSaveStateSlot = Keyboard/F4 diff --git a/emu-configs/gzdoom/gzdoom.ini b/emu-configs/gzdoom/gzdoom.ini index 8e6b317d..5508033a 100644 --- a/emu-configs/gzdoom/gzdoom.ini +++ b/emu-configs/gzdoom/gzdoom.ini @@ -1,4 +1,4 @@ -# This file was generated by GZDoom g4.11.3-m on 2023-11-25 14:33:14 +# This file was generated by GZDoom g4.11.3-m on 2024-03-10 09:34:01 # These are the directories to automatically search for IWADs. # Each directory should be on a separate line, preceded by Path= [IWADSearch.Directories] @@ -6,8 +6,6 @@ Path=. Path=$DOOMWADDIR Path=$HOME Path=$PROGDIR -Path=/var/config/gzdoom -Path=/var/data/gzdoom Path=RETRODECKROMSDIR/doom Path=/app/share/games/doom/ @@ -17,16 +15,22 @@ Path=/app/share/games/doom/ [FileSearch.Directories] Path=$PROGDIR Path=$DOOMWADDIR -Path=/var/config/gzdoom -Path=/var/data/gzdoom Path=RETRODECKROMSDIR/doom +Path=RETRODECKROMSDIR/bios/gzdoom Path=/app/share/games/doom/ +Path=/var/config/gzdoom # These are the directories to search for soundfonts that let listed in the menu. # Layout is the same as for IWADSearch.Directories [SoundfontSearch.Directories] Path=$PROGDIR/soundfonts Path=$PROGDIR/fm_banks +Path=RETRODECKROMSDIR/bios/gzdoom +Path=/var/data/gzdoom/audio/soundfonts +Path=/var/data/gzdoom/audio/fm_banks +Path=/var/data/gzdoom/audio +Path=/app/share/games/doom/soundfonts +Path=/app/share/games/doom/fm_banks Path=/var/data/gzdoom # Files to automatically execute when running the corresponding game. @@ -169,7 +173,7 @@ adl_volume_model=0 autoloadbrightmaps=false autoloadlights=false autoloadwidescreen=true -autosavecount=4 +autosavecount=1 autosavenum=0 chase_dist=90 chase_height=-8 @@ -203,7 +207,7 @@ fluid_chorus_voices=3 fluid_gain=0.5 fluid_interp=1 fluid_lib= -fluid_patchset=/app/share/sounds/sf2/gzdoom.sf2 +fluid_patchset=/app/share/games/doom/soundfonts/gzdoom.sf2 fluid_reverb=false fluid_reverb_damping=0.23 fluid_reverb_level=0.57 @@ -253,7 +257,7 @@ gl_sprite_blend=false gl_ssao=0 gl_ssao_portals=1 gl_ssao_strength=0.7 -gl_texture_filter=4 +gl_texture_filter=0 gl_texture_filter_anisotropic=8 gl_texture_hqresize_maxinputsize=512 gl_texture_hqresize_mt_height=4 @@ -265,7 +269,7 @@ gl_texture_hqresizemult=1 gl_usecolorblending=true gme_stereodepth=0 gus_memsize=0 -gus_patchdir= +gus_patchdir=/data/gzdoom/midi i_discordrpc=false i_pauseinbackground=true i_soundinbackground=false @@ -284,7 +288,7 @@ m_sensitivity_y=2 m_show_backbutton=0 m_showinputgrid=0 m_side=2 -m_simpleoptions=true +m_simpleoptions=false m_use_mouse=2 m_yaw=1 map_point_coordinates=true @@ -313,7 +317,7 @@ opn_chips_count=8 opn_emulator_id=0 opn_fullpan=true opn_run_at_pcm_rate=false -os_isanyof=true +os_isanyof=false png_gamma=0 png_level=5 queryiwad=true @@ -343,7 +347,7 @@ r_skipmats=false r_sprite_distance_cull=0 r_spriteadjust=2 r_ticstability=true -save_dir=RETRODECKSAVESDIR/doom/gzdoom +save_dir=RETRODECKHOMEDIR/saves/doom/gzdoom save_formatted=false saveloadconfirmation=true savestatistics=0 @@ -374,7 +378,7 @@ strictdecorate=false telezoom=true timidity_channel_pressure=false timidity_chorus=0 -timidity_config=gzdoom +timidity_config=/app/share/games/doom/soundfonts/gzdoom.sf2 timidity_drum_effect=false timidity_drum_power=1 timidity_key_adjust=0 @@ -398,7 +402,7 @@ use_joystick=true use_mouse=true vid_activeinbackground=false vid_adapter=0 -vid_aspect=0 +vid_aspect=2 vid_brightness=0 vid_contrast=1 vid_cropaspect=false @@ -411,12 +415,12 @@ vid_maxfps=200 vid_preferbackend=1 vid_rendermode=4 vid_saturation=1 -vid_scale_customheight=200 +vid_scale_customheight=800 vid_scale_custompixelaspect=1 -vid_scale_customwidth=320 +vid_scale_customwidth=1280 vid_scale_linear=false vid_scalefactor=1 -vid_scalemode=0 +vid_scalemode=5 vid_sdl_render_driver= vid_vsync=false vk_debug=false @@ -430,14 +434,14 @@ vr_ipd=0.062 vr_mode=0 vr_screendist=0.8 vr_swap_eyes=false -wildmidi_config= +wildmidi_config=/app/share/games/doom/soundfonts/gzdoom.sf2 wildmidi_enhanced_resampling=true wildmidi_reverb=false -win_h=640 -win_maximized=false -win_w=1024 -win_x=-1 -win_y=-1 +win_h=800 +win_maximized=true +win_w=1280 +win_x=0 +win_y=0 xbrz_centerdirectionbias=4 xbrz_colorformat=0 xbrz_dominantdirectionthreshold=3.6 @@ -474,7 +478,7 @@ gender=other movebob=0.25 name=RetroDECK neverswitchonpickup=false -playerclass=Fighter +playerclass=Pistol Start skin=base stillbob=0 team=255 @@ -594,7 +598,7 @@ cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true classic_scaling_factor=1 -classic_scaling_pixelaspect=1.2 +classic_scaling_pixelaspect=1 compatmode=0 con_alpha=0.75 con_centernotify=false @@ -604,12 +608,12 @@ con_notifytime=3 con_pulsetext=false con_scale=0 con_scaletext=0 -crosshair=0 +crosshair=1 crosshaircolor=ff 00 00 crosshairforce=false crosshairgrow=false crosshairhealth=2 -crosshairon=true +crosshairon=false crosshairscale=0.5 dehload=0 dimamount=-1 @@ -729,12 +733,12 @@ ui_screenborder_classic_scaling=true uiscale=0 underwater_fade_scalar=1 vid_allowtrueultrawide=1 -vid_cursor=None +vid_cursor=doomcurs vid_nopalsubstitutions=false wi_cleantextscale=false wi_percents=true wi_showtotaltime=true -wipetype=1 +wipetype=0 [Doom.LocalServerInfo] compatflags=0 @@ -770,8 +774,6 @@ Tab=togglemap W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back @@ -806,31 +808,15 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump W=+forward E=+use A=+moveleft S=+back D=+moveright -Q=di_taunttoggle I=di_toggleinfrared P=di_showupgrades_bind F=di_useitem_bind M=di_modscreen -R=+reload C=+crouch ,=di_prevSong .=di_skipSong @@ -839,13 +825,29 @@ LeftArrow=+moveleft RightArrow=+moveright DownArrow=+back Joy1=+use -Joy3=+reload -Joy4=+jump -Joy5=weapprev -Joy6=weapnext +Joy3=+crouch +Joy4=+reload +Joy6=+altattack Joy8=menu_main Joy10=toggle cl_run -Joy11=crouch +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack +Axis3Plus=di_modscreen +Joy5=di_useitem_bind [Doom.DoubleBindings] @@ -870,13 +872,13 @@ MWheelDown=am_zoom -1.2 [Heretic.Player] autoaim=35 classicflight=false -color=3f 60 40 +color=40 cf 00 colorset=0 fov=90 fviewbob=true gender=other movebob=0.25 -name=PortaDOOM +name=RetroDECK neverswitchonpickup=false playerclass=Fighter skin=base @@ -1170,13 +1172,10 @@ sv_smartaim=0 0=slot 0 -=sizedown Equals=sizeup -Backspace=use ArtiTomeOfPower Tab=togglemap W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back @@ -1184,9 +1183,8 @@ D=+moveright `=toggleconsole Shift=+speed \=+showscores -C=crouch -Space=+jump CapsLock=toggle cl_run +Space=+jump F1=menu_help F2=menu_save F3=menu_load @@ -1197,8 +1195,9 @@ F7=menu_endgame F8=togglemessages F9=quickload F10=menu_quit +Scroll=+showscores F11=bumpgamma -F12=screenshot +F12=spynext SysRq=screenshot Pause=pause Home=land @@ -1211,35 +1210,39 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump -Q=+zoom -R=+reload +W=+forward +E=+use +A=+moveleft +S=+back +D=+moveright C=+crouch UpArrow=+forward LeftArrow=+moveleft RightArrow=+moveright DownArrow=+back Joy1=+use -Joy3=+reload -Joy4=+jump -Joy5=weapprev -Joy6=weapnext +Joy3=+crouch +Joy4=+reload +Joy5=+zoom +Joy6=+altattack Joy8=menu_main Joy10=toggle cl_run -Joy11=crouch +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack [Heretic.DoubleBindings] @@ -1272,7 +1275,7 @@ gender=other movebob=0.25 name=PortaDOOM neverswitchonpickup=false -playerclass=Cleric +playerclass=Mage skin=base stillbob=0 team=255 @@ -1556,27 +1559,26 @@ sv_smartaim=0 2=slot 2 3=slot 3 4=slot 4 -5=use ArtiInvulnerability2 -6=use ArtiPork -7=use ArtiTeleportOther -8=use ArtiTeleport -9=use ArtiBlastRadius -0=useflechette +5=slot 5 +6=slot 6 +7=slot 7 +8=slot 8 +9=slot 9 +0=slot 0 -=sizedown Equals=sizeup Tab=togglemap W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back D=+moveright `=toggleconsole Shift=+speed -\=use ArtiHealth +\=+showscores +CapsLock=toggle cl_run Space=+jump F1=menu_help F2=menu_save @@ -1590,7 +1592,7 @@ F9=quickload F10=menu_quit Scroll=+showscores F11=bumpgamma -F12=screenshot +F12=spynext SysRq=screenshot Pause=pause Home=land @@ -1603,46 +1605,39 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump W=+forward E=+use A=+moveleft S=+back D=+moveright -Q=di_taunttoggle -I=di_toggleinfrared -P=di_showupgrades_bind -F=di_useitem_bind -M=di_modscreen -R=+reload C=+crouch -,=di_prevSong -.=di_skipSong UpArrow=+forward LeftArrow=+moveleft RightArrow=+moveright DownArrow=+back Joy1=+use -Joy3=+reload -Joy4=+jump -Joy5=weapprev -Joy6=weapnext +Joy3=+crouch +Joy4=+reload +Joy5=+zoom +Joy6=+altattack Joy8=menu_main Joy10=toggle cl_run -Joy11=crouch +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack [Hexen.DoubleBindings] @@ -1670,9 +1665,10 @@ classicflight=false color=40 cf 00 colorset=0 fov=90 +fviewbob=true gender=other movebob=0.25 -name=PortaDOOM +name=RetroDECK neverswitchonpickup=false playerclass=Fighter skin=base @@ -1702,6 +1698,7 @@ am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_linealpha=1 +am_lineantialiasing=0 am_linethickness=1 am_lockedcolor=00 78 00 am_map_secrets=1 @@ -1793,7 +1790,7 @@ cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true classic_scaling_factor=1 -classic_scaling_pixelaspect=1.2000000476837158 +classic_scaling_pixelaspect=1.2 compatmode=0 con_alpha=0.75 con_centernotify=false @@ -1819,14 +1816,14 @@ dlg_vgafont=false gl_aalines=false gl_bandedswlight=false gl_bloom=false -gl_bloom_amount=1.399999976158142 +gl_bloom_amount=1.4 gl_brightfog=false gl_coronas=true gl_enhanced_nightvision=true -gl_exposure_base=0.3499999940395355 -gl_exposure_min=0.3499999940395355 -gl_exposure_scale=1.2999999523162842 -gl_exposure_speed=0.05000000074505806 +gl_exposure_base=0.35 +gl_exposure_min=0.35 +gl_exposure_scale=1.3 +gl_exposure_speed=0.05 gl_fogmode=2 gl_fuzztype=0 gl_interpolate_model_frames=true @@ -1838,7 +1835,7 @@ gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true -gl_sclipfactor=1.7999999523162842 +gl_sclipfactor=1.8 gl_sclipthreshold=10 gl_spriteclip=1 gl_tonemap=0 @@ -1919,7 +1916,7 @@ sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true -snd_menuvolume=0.6000000238418579 +snd_menuvolume=0.6 snd_pitched=false st_oldouch=false st_scale=-1 @@ -1965,27 +1962,19 @@ sv_smartaim=0 0=slot 0 -=sizedown Equals=sizeup -Backspace=invdrop Tab=togglemap -Q=+zoom W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back D=+moveright -K=showpop 2 `=toggleconsole Shift=+speed \=+showscores -Z=showpop 3 -X=crouch -C=+crouch -Space=+jump CapsLock=toggle cl_run +Space=+jump F1=menu_help F2=menu_save F3=menu_load @@ -1996,8 +1985,9 @@ F7=menu_endgame F8=togglemessages F9=quickload F10=menu_quit +Scroll=+showscores F11=bumpgamma -F12=screenshot +F12=spynext SysRq=screenshot Pause=pause Home=land @@ -2010,33 +2000,39 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump -R=+reload +W=+forward +E=+use +A=+moveleft +S=+back +D=+moveright +C=+crouch UpArrow=+forward LeftArrow=+moveleft RightArrow=+moveright DownArrow=+back Joy1=+use -Joy3=+reload -Joy4=+jump -Joy5=weapprev -Joy6=weapnext +Joy3=+crouch +Joy4=+reload +Joy5=+zoom +Joy6=+altattack Joy8=menu_main Joy10=toggle cl_run -Joy11=crouch +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack [Strife.DoubleBindings] @@ -2064,9 +2060,10 @@ classicflight=false color=40 cf 00 colorset=0 fov=90 +fviewbob=true gender=other movebob=0.25 -name=PortaDOOM +name=RetroDECK neverswitchonpickup=false playerclass=Fighter skin=base @@ -2096,6 +2093,7 @@ am_gridcolor=8b 5a 2b am_interlevelcolor=ff 00 00 am_intralevelcolor=00 00 ff am_linealpha=1 +am_lineantialiasing=0 am_linethickness=1 am_lockedcolor=00 78 00 am_map_secrets=1 @@ -2187,7 +2185,7 @@ cl_showsecretmessage=true cl_showsprees=true cl_spreaddecals=true classic_scaling_factor=1 -classic_scaling_pixelaspect=1.2000000476837158 +classic_scaling_pixelaspect=1.2 compatmode=0 con_alpha=0.75 con_centernotify=false @@ -2213,14 +2211,14 @@ dlg_vgafont=false gl_aalines=false gl_bandedswlight=false gl_bloom=false -gl_bloom_amount=1.399999976158142 +gl_bloom_amount=1.4 gl_brightfog=false gl_coronas=true gl_enhanced_nightvision=true -gl_exposure_base=0.3499999940395355 -gl_exposure_min=0.3499999940395355 -gl_exposure_scale=1.2999999523162842 -gl_exposure_speed=0.05000000074505806 +gl_exposure_base=0.35 +gl_exposure_min=0.35 +gl_exposure_scale=1.3 +gl_exposure_speed=0.05 gl_fogmode=2 gl_fuzztype=0 gl_interpolate_model_frames=true @@ -2232,7 +2230,7 @@ gl_paltonemap_powtable=2 gl_paltonemap_reverselookup=true gl_precache=false gl_scale_viewport=true -gl_sclipfactor=1.7999999523162842 +gl_sclipfactor=1.8 gl_sclipthreshold=10 gl_spriteclip=1 gl_tonemap=0 @@ -2313,7 +2311,7 @@ sb_teamdeathmatch_headingcolor=6 screenblocks=11 setslotstrict=true show_obituaries=true -snd_menuvolume=0.6000000238418579 +snd_menuvolume=0.6 snd_pitched=false st_oldouch=false st_scale=-1 @@ -2363,8 +2361,6 @@ Tab=togglemap W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back @@ -2372,9 +2368,8 @@ D=+moveright `=toggleconsole Shift=+speed \=+showscores -X=crouch -Space=+jump CapsLock=toggle cl_run +Space=+jump F1=menu_help F2=menu_save F3=menu_load @@ -2385,8 +2380,9 @@ F7=menu_endgame F8=togglemessages F9=quickload F10=menu_quit +Scroll=+showscores F11=bumpgamma -F12=screenshot +F12=spynext SysRq=screenshot Pause=pause Home=land @@ -2399,24 +2395,39 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -LThumb=crouch -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump -Q=+zoom -R=+reload +W=+forward +E=+use +A=+moveleft +S=+back +D=+moveright C=+crouch +UpArrow=+forward +LeftArrow=+moveleft +RightArrow=+moveright +DownArrow=+back +Joy1=+use +Joy3=+crouch +Joy4=+reload +Joy5=+zoom +Joy6=+altattack +Joy8=menu_main +Joy10=toggle cl_run +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack [Chex.DoubleBindings] @@ -2447,9 +2458,10 @@ classicflight=false color=40 cf 00 colorset=0 fov=90 +fviewbob=true gender=other movebob=0.25 -name=PortaDOOM +name=RetroDECK neverswitchonpickup=false playerclass=Fighter skin=base @@ -2746,8 +2758,6 @@ Tab=togglemap W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back @@ -2755,9 +2765,8 @@ D=+moveright `=toggleconsole Shift=+speed \=+showscores -X=crouch -Space=+jump CapsLock=toggle cl_run +Space=+jump F1=menu_help F2=menu_save F3=menu_load @@ -2768,8 +2777,9 @@ F7=menu_endgame F8=togglemessages F9=quickload F10=menu_quit +Scroll=+showscores F11=bumpgamma -F12=screenshot +F12=spynext SysRq=screenshot Pause=pause Home=land @@ -2782,36 +2792,39 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -C=+crouch -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump -Q=+zoom -R=+reload +W=+forward +E=+use +A=+moveleft +S=+back +D=+moveright C=+crouch UpArrow=+forward LeftArrow=+moveleft RightArrow=+moveright DownArrow=+back Joy1=+use -Joy3=+reload -Joy4=+jump -Joy5=weapprev -Joy6=weapnext +Joy3=+crouch +Joy4=+reload +Joy5=+zoom +Joy6=+altattack Joy8=menu_main Joy10=toggle cl_run -Joy11=crouch +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack [Harmony.DoubleBindings] @@ -2842,9 +2855,10 @@ classicflight=false color=40 cf 00 colorset=0 fov=90 +fviewbob=true gender=other movebob=0.25 -name=PortaDOOM +name=RetroDECK neverswitchonpickup=false playerclass=Fighter skin=base @@ -3141,8 +3155,6 @@ Tab=togglemap W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back @@ -3150,9 +3162,8 @@ D=+moveright `=toggleconsole Shift=+speed \=+showscores -X=crouch -Space=+jump CapsLock=toggle cl_run +Space=+jump F1=menu_help F2=menu_save F3=menu_load @@ -3163,8 +3174,9 @@ F7=menu_endgame F8=togglemessages F9=quickload F10=menu_quit +Scroll=+showscores F11=bumpgamma -F12=screenshot +F12=spynext SysRq=screenshot Pause=pause Home=land @@ -3177,36 +3189,39 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -C=+crouch -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump -Q=+zoom -R=+reload +W=+forward +E=+use +A=+moveleft +S=+back +D=+moveright C=+crouch UpArrow=+forward LeftArrow=+moveleft RightArrow=+moveright DownArrow=+back Joy1=+use -Joy3=+reload -Joy4=+jump -Joy5=weapprev -Joy6=weapnext +Joy3=+crouch +Joy4=+reload +Joy5=+zoom +Joy6=+altattack Joy8=menu_main Joy10=toggle cl_run -Joy11=crouch +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack [WoolBall.DoubleBindings] @@ -3237,9 +3252,10 @@ classicflight=false color=40 cf 00 colorset=0 fov=90 +fviewbob=true gender=other movebob=0.25 -name=PortaDOOM +name=RetroDECK neverswitchonpickup=false playerclass=Fighter skin=base @@ -3545,8 +3561,6 @@ Tab=togglemap W=+forward E=+use T=messagemode -LeftBracket=invprev -RightBracket=invnext Enter=invuse A=+moveleft S=+back @@ -3554,9 +3568,8 @@ D=+moveright `=toggleconsole Shift=+speed \=+showscores -X=crouch -Space=+jump CapsLock=toggle cl_run +Space=+jump F1=menu_help F2=menu_save F3=menu_load @@ -3567,8 +3580,9 @@ F7=menu_endgame F8=togglemessages F9=quickload F10=menu_quit +Scroll=+showscores F11=bumpgamma -F12=screenshot +F12=spynext SysRq=screenshot Pause=pause Home=land @@ -3581,36 +3595,39 @@ Mouse1=+attack Mouse2=+altattack MWheelUp=weapprev MWheelDown=weapnext -MWheelRight=invnext -MWheelLeft=invprev -DPadUp=togglemap -DPadDown=invuse -DPadLeft=invprev -DPadRight=invnext -Pad_Start=pause -Pad_Back=menu_main -C=+crouch -LShoulder=weapprev -RShoulder=weapnext -LTrigger=+altattack -RTrigger=+attack -Pad_A=+use -Pad_Y=+jump -Q=+zoom -R=+reload +W=+forward +E=+use +A=+moveleft +S=+back +D=+moveright C=+crouch UpArrow=+forward LeftArrow=+moveleft RightArrow=+moveright DownArrow=+back Joy1=+use -Joy3=+reload -Joy4=+jump -Joy5=weapprev -Joy6=weapnext +Joy3=+crouch +Joy4=+reload +Joy5=+zoom +Joy6=+altattack Joy8=menu_main Joy10=toggle cl_run -Joy11=crouch +Joy11=turn180 +Axis1Plus=+moveright +Axis1Minus=+moveleft +Axis2Plus=+back +Axis2Minus=+forward +Joy2=+jump +Joy7=togglemap +POV1Up=invnext +POV1Right=weapnext +POV1Down=invuse +POV1Left=weapprev +Axis4Plus=+right +Axis4Minus=+left +Axis5Plus=+lookdown +Axis5Minus=+lookup +Axis6Plus=+attack [Square.DoubleBindings] @@ -3632,6 +3649,47 @@ DownArrow=+am_pandown MWheelUp=am_zoom 1.2 MWheelDown=am_zoom -1.2 +[Doom.FPPBind.Bindings] + +[Doom.FPPBind.DoubleBindings] + +[Doom.BrutalDoomActions.Bindings] +Joy5=+zoom +Joy4=+reload +Axis3Plus=grenadetoss + +[Doom.BrutalDoomActions.DoubleBindings] + +[Doom.BrutalDoomInteractions.Bindings] +H=brutaltaunt +V=wave1 +N=wave2 +J=advtaunt +K=oneliner +X=dual +O=selectammodrop + +[Doom.BrutalDoomInteractions.DoubleBindings] + +[Doom.BrutalDoomAdvMoves.Bindings] + +[Doom.BrutalDoomAdvMoves.DoubleBindings] + +[Doom.PBAdvMoves.Bindings] +U=unreloader +G=+User1 +Axis3Plus=+user1 +Joy5=+user2 +Alt=+User3 +Joy11=+user3 +L=netevent EV_ClearGore + +[Doom.PBAdvMoves.DoubleBindings] + +[Doom.modactions.Bindings] + +[Doom.modactions.DoubleBindings] + [Doom.Player.Mod] CHUD_DI_OffsetYActive=0 CHUD_DI_OffsetYMain=0 @@ -3814,20 +3872,20 @@ DIKILL_Archvile=0 DIKILL_Baron=0 DIKILL_Caco=0 DIKILL_Cyber=0 -DIKILL_Demon=2 +DIKILL_Demon=0 DIKILL_Hell=0 -DIKILL_Imp=5 +DIKILL_Imp=0 DIKILL_Knight=0 DIKILL_Lost=0 DIKILL_Mancubus=0 DIKILL_Pain=0 DIKILL_Revenant=0 DIKILL_Spider=0 -DIKILL_Total=7 +DIKILL_Total=0 DIKILL_Zombie=0 DIKILL_ZombieC=0 DIKILL_ZombieS=0 -DIKill_Gibbed=2 +DIKill_Gibbed=0 DIKill_Nightmare=0 DIMapTimer=0 DIMeleeCombo=0 @@ -3847,7 +3905,7 @@ DIUpgradesSet= DIUpgradesString= DIUpgradesSymbol= DIValidLoad=0 -DIValidStamp=36964 +DIValidStamp=0 DI_ActiveManualPickup=false DI_AddUpgradePerRow=0 DI_AdvMonsterAnim=true @@ -3910,7 +3968,7 @@ DI_DDMap=-1 DI_DDPassiveID=none DI_DDPassiveSET=none DI_DDS=0 -DI_DDW=-6 +DI_DDW=0 DI_DDWeaponID=none DI_DDX=0 DI_DDY=0 @@ -3930,14 +3988,14 @@ DI_EndRunCount=0 DI_FixLinuxCrash=false DI_GameMode=0 DI_GameState=0 -DI_HActUsed=2 -DI_HAttempts=6 -DI_HDeaths=2 -DI_HKills=5 +DI_HActUsed=0 +DI_HAttempts=0 +DI_HDeaths=0 +DI_HKills=0 DI_HLoops=0 DI_HMaps=0 DI_HShopped=0 -DI_HSouls=16 +DI_HSouls=0 DI_HTimeH=0 DI_HTimeM=0 DI_HTimeS=0 @@ -4018,6 +4076,69 @@ DI_WeaponsOverheatFX=true DI_karma=0 DI_skill=1 DImusMan_cmd=0 +PB_HatExtravaganza=0 +PB_alttracer=0 +PB_tracerlight=0 +PlayerCatchup=false +SingleDualFire=0 +bd_AimMode=0 +bd_Cross=0 +bd_CrossASG=0 +bd_CrossBFG10K=0 +bd_CrossBFG9K=0 +bd_CrossFlame=0 +bd_CrossGL=0 +bd_CrossMinigun=0 +bd_CrossPistol=0 +bd_CrossPlasma=0 +bd_CrossRL=0 +bd_CrossRailgun=0 +bd_CrossRev=0 +bd_CrossRifle=0 +bd_CrossSMG=0 +bd_CrossSSG=0 +bd_CrossShotgun=0 +bd_CrossUnmaker=0 +bd_SimpleSlide=0 +bd_autoreload=true +bd_bloodamount=2 +bd_centeredhud=false +bd_disablebloodyscreen=0 +bd_enablesprint=0 +bd_flashlight=0 +bd_lowgraphicsmode=0 +bd_morebloodmist=0 +bd_sbartype=1 +cheello_rotatingEvilEye=1 +cheello_smoothdemons=0 +cheello_smoothdemonsbite=1 +cheello_spinningpickups=1 +cheello_voxelIconAlign=false +cheello_voxelIconOfSin=true +cheello_voxelIconOffset=0 +cheello_voxelweaponsClose=0 +cheello_voxelweaponsOn=1 +cheello_voxelweaponsPhase=1 +cheello_voxelweaponsSide=0 +cl_MoveTilt=true +cl_flashlight_plus_color=7f 7f 7f +cl_flashlight_plus_color_2_mult=1 +cl_flashlight_plus_inner=25 +cl_flashlight_plus_inner_2=8 +cl_flashlight_plus_intensity=256 +cl_flashlight_plus_intensity_2=512 +cl_flashlight_plus_location=0 +cl_flashlight_plus_outer=50 +cl_flashlight_plus_outer_2=16 +cl_flashlight_plus_plus_alertmonsters=true +cl_flashlight_plus_plus_custpos_x=0 +cl_flashlight_plus_plus_custpos_y=0 +cl_flashlight_plus_plus_custpos_z=0 +cl_flashlight_plus_plus_playsound=true +cl_flashlight_plus_plus_sound=0 +cl_flashlight_plus_second_beam=true +cl_step_delaymul=1 +cl_step_volmul=7 debug_activateRoom=0 debug_add_souls=0 debug_boss=0 @@ -4055,8 +4176,393 @@ debug_spawner_monsters=true debug_spawner_obstacles=true debug_weather=-1 debug_zKill=true +disable_screentilt=0 +led_BFGFirFlsh=0.65 +led_PLRifFlsh=0.1 +led_RifleADS=1 +led_ShotADS=1 +led_TogArmBns=0.15 +led_TogBckPck=0.3 +led_TogBluArm=0.2 +led_TogBluKey=0.4 +led_TogBluSkl=0.4 +led_TogBrskBrght=0.25 +led_TogCmpMp=0.4 +led_TogGrnArm=0.2 +led_TogHlthBns=0.15 +led_TogInvln=0.5 +led_TogLghtAmp=0.4 +led_TogMgSph=0.4 +led_TogPartVis=0.4 +led_TogRadSuit=0.4 +led_TogRedKey=0.4 +led_TogRedSkl=0.4 +led_TogSolSph=0.4 +led_TogYlwKey=0.4 +led_TogYlwSkl=0.4 +mblur=false +mblur_autostop=true +mblur_blendmode=1 +mblur_recovery=64 +mblur_recovery2=90 +mblur_samples=5 +mblur_strength=64 +mblur_threshold=30 +pb_RLOverloadCell=0 +pb_SGAltAmmoSwap=0 +pb_SGPumpFromHip=0 +pb_UpgradeCarbine=0 +pb_UpgradeGL=0 +pb_UpgradeNailgun=0 +pb_UpgradePlasma=0 +pb_UpgradeRevolver=0 +pb_UpgradeShotgun=0 +pb_bloodamount=2 +pb_curmaxammolist=true +pb_dasheffect=true +pb_doubletap=false +pb_exaggeratedrecoil=true +pb_exaggeratedrecoilmul=0.5 +pb_execution_box=1 +pb_floorwallblooddrawdist=800 +pb_hideunusedtypes=true +pb_hudalpha=1 +pb_hudboxalpha=1 +pb_huddynamics=true +pb_hudxmargin=0 +pb_hudymargin=0 +pb_lowflashesmode=false +pb_lowgraphicsmode=0 +pb_maxtaptime=10 +pb_messagesize=1 +pb_showammolist=true +pb_showhudvisor=false +pb_showhudvisorglass=false +pb_showlevelstats=false +pb_toggle_aim_hold=false +pb_uselowreshudfont=false +pb_weapon_crosshairs=false +py_weaponwheel_freeze=true +py_weaponwheel_invert=0 +py_weaponwheel_musicfade=false +qtilt_strength=1 +sd_lasers_densityoffset=1 +ws_d1pois_texswap=true +ws_d2sky_compat=true +ws_finaldoom_texswap=true +zm_doubletap=true +zm_fullbobspeed=8 +zm_maxtaptime=10 +zm_offsetdirection=false +zm_offsetmaxrange=30 +zm_offsetspeed=75 +zm_pitchswaytype=0 +zm_stillbob=false +zm_yawsway=true +zm_yawswaydirection=false +zm_yawswayfriction=10 +zm_yawswayrange=2 +zm_yawswayspeed=2 [Doom.LocalServerInfo.Mod] +BD_AmmoPackCheck=3 +BD_DestructibleBodies=0 +BD_GIMMELESSAMMO=0 +BD_NOBOSSES=0 +BD_NODEMONBlur=0 +BD_NODEMONWEAPONS=0 +BD_NoHeadshots=0 +BD_NoMg42=0 +BD_ShotgunSpawner=1 +DisablePB_Autoshotgun=false +DisablePB_AutoshotgunUpgrade=false +DisablePB_Carbine=false +DisablePB_CryoRifle=false +DisablePB_Deagle=false +DisablePB_LMG=false +DisablePB_M2Plasma=false +DisablePB_M2Upgrade=false +DisablePB_MinigunUpgrade=false +DisablePB_Nailgun=false +DisablePB_QuadSG=false +DisablePB_Railgun=false +DisablePB_Revolver=false +DisablePB_SGMagazine=false +DisablePB_SMG=false +DisablePB_SuperGL=false +DisablePB_Unmaker=false +DisablePulseCannonUpgrade=false +DisableRifleUpgrade=false +DynamicSpawnMonsters=1 +DynamicWeaponSpawn=true +EAI_Debug=false +EAI_Stealth=true +EAI_StealthFactor=24 +NoDemonStrenght=0 +PB_NaziExclusiveSpawning=true +SpawnBalance=671 +V5_Cull=false +V5_MDist=900 +V5_MODELS=false +V5_Q3Bob=0.5 +V5_Q3Spin=5 +V5_Q3Zoff=16 +V5_Quake3=false +bd_AgileZombies=0 +bd_BloodTrail=0 +bd_LavaSplashes=0 +bd_NoPickupsAnimations=false +bd_NoZombieRifleDrop=0 +bd_ScreenFX=0 +bd_V21AR=false +bd_WadCheck=1 +bd_classicmonsters=0 +bd_disablebfgspawn=1 +bd_disablechaingunspawn=1 +bd_disablechainsawspawn=1 +bd_disablecrueltybonus=0 +bd_disabledecorations=0 +bd_disabledemonspheres=0 +bd_disablefriendlymarines=0 +bd_disablemapenhancements=0 +bd_disablenewenemies=1 +bd_disablenewguns=0 +bd_disableplasmaspawn=1 +bd_disablerocketlauncherspawn=1 +bd_disablescanner=0 +bd_disablessgspawn=1 +bd_disablewaterripples2=1 +bd_footstepsounds=1 +bd_infinitecasings=0 +bd_infinitesprint=false +bd_mantling=0 +bd_norandompickupsprites=0 +bd_reloading=false +bd_rocketbackblast=1 +bd_shootablerocketammo=0 +bd_voxeldec=1 +bdv22_Caco=0 +bloodsplash=0 +fs_delay_mul=1 +fs_volume_mul=1 +hs_factor=2 +hs_hitbox=true +isrunningzandronum=1 +led_AimPunch=1 +led_ArmorBonus=0 +led_ArmorSpark=1 +led_BFGReload=1 +led_Barrels=1 +led_CasingSmoke=1 +led_DeathAnim=0 +led_MagLife=1000 +led_MedSys=1 +led_MinigunReload=1 +led_PistolReload=1 +led_PlasmaReload=1 +led_RLReload=1 +led_ReloadToggle=1 +led_RifleReload=1 +led_SSGAltFire=0 +led_SSGReload=1 +led_ShellCasings=1 +led_ShellLife=1000 +led_ShellSys=1 +led_ShotPump=0 +led_ShotgunReload=1 +led_SmokeEffects=1 +led_SpentMags=1 +levelsToPlay=32 +nashgore_bloodamount=255 +nashgore_bloodspurt=true +nashgore_bloodtype=0 +nashgore_corpseblood=true +nashgore_deathflip=true +nashgore_footprints=true +nashgore_gibamount=255 +nashgore_gibtype=0 +nashgore_icedeath=true +nashgore_maxcasings=50 +nashgore_maxgore=1024 +nashgore_splat=true +nashgore_spriteblood=false +nashgore_squish=true +nodoomguytalk=0 +nopaineffect=0 +noscreensplash=0 +pb_NoAfrit=0 +pb_NoAnnihilator=0 +pb_NoArachnophyte=0 +pb_NoArachnotron2=0 +pb_NoAutoshotgunSergeant=0 +pb_NoBeamRevenant=0 +pb_NoBelphegor=0 +pb_NoBlackholeWeapon=0 +pb_NoBloodDemon=0 +pb_NoBrownImps=0 +pb_NoCSSGWeapon=1 +pb_NoCarbineZombie=0 +pb_NoClassicCommando=0 +pb_NoCyberBaron=0 +pb_NoCyberKnight=0 +pb_NoCyberPaladin=0 +pb_NoDaedabus=0 +pb_NoDarkImps=0 +pb_NoDemolisher=0 +pb_NoDemonTechSoldier=0 +pb_NoDraugr=0 +pb_NoFleshwizard=0 +pb_NoHeavyGLWeapon=0 +pb_NoHellion=0 +pb_NoHelmetAnimation=0 +pb_NoHelmetSergeant=0 +pb_NoHelmetZman=0 +pb_NoIceVile=0 +pb_NoInfernoArachnotron=0 +pb_NoInfernus=0 +pb_NoJuggernaut=0 +pb_NoMagCaco=0 +pb_NoMechDemon=0 +pb_NoNailgunMajor=0 +pb_NoOverlord=0 +pb_NoPhantasm=0 +pb_NoPistolZman=0 +pb_NoPlasmaZombie=0 +pb_NoPulseCannonUpgrade=0 +pb_NoPyroSergeant=0 +pb_NoQuadSergeant=0 +pb_NoRiotShieldGuy=0 +pb_NoRocketSergeant=0 +pb_NoSavageImps=0 +pb_NoSufferElemental=0 +pb_NoUpgrades=0 +pb_NoVolcabus=0 +pb_NoZSpecOps=0 +pb_NoZombieScientist=0 +pb_SSGRandomSpawn=false +pb_ScaleXWeapons=false +pb_VoidSpectre=0 +pb_adashboost=10 +pb_adashfriction=1 +pb_airdash=false +pb_autojump=true +pb_classicmonsters=0 +pb_crouchslide=true +pb_crouchspeed=0.5 +pb_cslideduration=10 +pb_cslidestrength=1.5 +pb_cslidetype=0 +pb_cyberdemondeath=false +pb_dash=true +pb_dashboost=15 +pb_dashheight=0.6 +pb_disable_sergeant_prone=false +pb_disabledecorations=1 +pb_disabledynamicavoid=false +pb_disablemapenhancements=1 +pb_disablenewenemies=0 +pb_disablenewguns=0 +pb_doublejump=2 +pb_doublejumpheight=1 +pb_dropprevention=false +pb_experimental=false +pb_fastcryowarmup=0 +pb_friction=1.6 +pb_grenadeimpact=0 +pb_hazardmovement=true +pb_jumpheight=8 +pb_knuckleanimationinstart=0 +pb_landing=true +pb_landingsens=6 +pb_landingspeed=0.25 +pb_ledgegrab=true +pb_maxgroundspeed=15.1 +pb_maxhopspeed=28 +pb_minlanding=0.5 +pb_movetype=0 +pb_multipledashes=0 +pb_nobulletpenetration=1 +pb_nocooldown=false +pb_performance_fire=false +pb_qslideaccel=6 +pb_qslideduration=8 +pb_setgravity=1 +pb_sglgrenadeimpact=0 +pb_spawner_autoshotgun=0 +pb_spawner_drum=0 +pb_spawner_shotgunupgrade=0 +pb_spawner_tiered=false +pb_strafemodifier=1.33 +pb_walkspeed=0.5 +pb_weapon_recoil_extra_weapons=false +pb_weapon_recoil_mod_horizontal=1 +pb_weapon_recoil_mod_vertical=1 +pb_wjdoublejumprenew=false +pb_wjump=false +pb_wjumpboost=1.5 +pb_wjumpheight=0.75 +pb_wslide=false +pb_wslidevelz=0.9 +pk_bhopjumpheight=0.85 +sv_deathtilt=true +sv_movetilt=false +sv_movetiltangle=0.015 +sv_movetiltscalar=0.2 +sv_movetiltspeed=15 +sv_strafetilt=true +sv_strafetiltangle=0.5 +sv_strafetiltinvert=false +sv_strafetiltspeed=1 +sv_turntilt=true +sv_turntiltinvert=false +sv_turntiltscalar=1.5 +sv_underwatertilt=true +sv_underwatertiltangle=0.05 +sv_underwatertiltscalar=1 +sv_underwatertiltspeed=0.5 +zdoombrutalblood=2 +zdoombrutaljanitor=0 +zdoombrutaljanitorcasings=0 +zm_adashboost=10 +zm_adashfriction=1 +zm_airdash=false +zm_autojump=true +zm_crouchslide=false +zm_crouchspeed=0.7 +zm_cslideduration=13 +zm_cslidestrength=1.5 +zm_cslidetype=0 +zm_dash=false +zm_dashboost=1.5 +zm_dashheight=0.75 +zm_doublejump=0 +zm_doublejumpheight=1.2 +zm_dropprevention=false +zm_friction=8 +zm_jumpheight=5.5 +zm_landing=false +zm_landingsens=6 +zm_landingspeed=0.25 +zm_ledgegrab=false +zm_maxgroundspeed=12 +zm_maxhopspeed=28 +zm_minlanding=0.5 +zm_movetype=0 +zm_multipledashes=0 +zm_qslideaccel=6 +zm_qslideduration=8 +zm_rampjump=false +zm_rjumpmulti=1 +zm_setgravity=0.56 +zm_speedometer=0 +zm_strafemodifier=1 +zm_walkspeed=0.7 +zm_wjdoublejumprenew=false +zm_wjump=false +zm_wjumpboost=1.5 +zm_wjumpheight=0.75 +zm_wslide=false +zm_wslidevelz=0.9 [Doom.ConfigOnlyVariables.Mod] DICache_ACV1= @@ -4065,13 +4571,60 @@ DICache_SGLines1= DICache_SGLines2= DICache_SGLines3= DICache_TK=0 +pb_newmugshot=true [Joy:JS:0] -Sensitivity=1.1 +Sensitivity=0.2 Axis0deadzone=0.0999998 +Axis0scale=0.7 Axis1deadzone=0.0999998 +Axis1scale=0.7 Axis2map=-1 Axis3deadzone=0.450001 +Axis3scale=0.7 Axis4deadzone=0.25 +Axis4scale=0.7 Axis4map=1 -Axis5deadzone=0.100001 \ No newline at end of file +Axis5deadzone=0.100001 + +[Joy:JS:1] +Sensitivity=0.2 +Axis0deadzone=0.0999998 +Axis0scale=0.7 +Axis1deadzone=0.0999998 +Axis1scale=0.7 +Axis2map=-1 +Axis3deadzone=0.450001 +Axis3scale=0.7 +Axis4deadzone=0.25 +Axis4scale=0.7 +Axis4map=1 +Axis5deadzone=0.100001 + +[Joy:JS:2] +Sensitivity=0.2 +Axis0deadzone=0.0999998 +Axis0scale=0.7 +Axis1deadzone=0.0999998 +Axis1scale=0.7 +Axis2map=-1 +Axis3deadzone=0.450001 +Axis3scale=0.7 +Axis4deadzone=0.25 +Axis4scale=0.7 +Axis4map=1 +Axis5deadzone=0.100001 + +[Joy:JS:3] +Sensitivity=0.2 +Axis0deadzone=0.0999998 +Axis0scale=0.7 +Axis1deadzone=0.0999998 +Axis1scale=0.7 +Axis2map=-1 +Axis3deadzone=0.450001 +Axis3scale=0.7 +Axis4deadzone=0.25 +Axis4scale=0.7 +Axis4map=1 +Axis5deadzone=0.100001 diff --git a/emu-configs/gzdoom/gzdoom.pk3 b/emu-configs/gzdoom/gzdoom.pk3 deleted file mode 100644 index c96467ab..00000000 Binary files a/emu-configs/gzdoom/gzdoom.pk3 and /dev/null differ diff --git a/emu-configs/gzdoom/gzdoom.sh b/emu-configs/gzdoom/gzdoom.sh index dda22916..620b809f 100644 --- a/emu-configs/gzdoom/gzdoom.sh +++ b/emu-configs/gzdoom/gzdoom.sh @@ -1,5 +1,7 @@ #!/bin/bash +source /app/libexec/logger.sh + # Define the IWAD files list IWAD_FILES=("DOOM1.WAD" "DOOM.WAD" "DOOM2.WAD" "DOOM2F.WAD" "DOOM64.WAD" "TNT.WAD" "PLUTONIA.WAD" "HERETIC1.WAD" "HERETIC.WAD" "HEXEN.WAD" "HEXDD.WAD" @@ -8,16 +10,6 @@ IWAD_FILES=("DOOM1.WAD" "DOOM.WAD" "DOOM2.WAD" "DOOM2F.WAD" "DOOM64.WAD" "TNT.WA "doom_complete.pk3" ) -# Function to log messages to terminal and a log file -log() { - local message="$1" - local logfile="$rdhome/logs/gzdoom.log" - local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S])" - - echo "$timestamp $message" | tee -a "$logfile" -} - - # Function to check if a file is an IWAD is_iwad() { local file="$1" @@ -62,8 +54,8 @@ if [[ "${1##*.}" != "doom" ]]; then fi # Log the command - log "[INFO] Loading: \"$1\"" - log "[INFO] Executing command \"$command\"" + log i "Loading: \"$1\"" + log i "Executing command \"$command\"" # Execute the command eval "$command" @@ -71,11 +63,11 @@ if [[ "${1##*.}" != "doom" ]]; then # Check if $1 is a .doom file else doom_file="$1" - log "[INFO] Found a doom file: \"$1\"" + log i "Found a doom file: \"$1\"" # Check if the .doom file exists if [[ ! -e "$doom_file" ]]; then - log "[Error] doom file not found in \"$doom_file\"" + log e "doom file not found in \"$doom_file\"" zenity --error --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK" \ @@ -103,15 +95,15 @@ else # Check if the file is an IWAD if [[ $(is_iwad "$found_file") == "true" ]]; then command+=" -iwad $found_file" - log "[INFO] Appending the param \"-iwad $found_file\"" + log i "Appending the param \"-iwad $found_file\"" else command+=" -file $found_file" - log "[INFO] Appending the param \"-file $found_file\"" + log i "Appending the param \"-file $found_file\"" fi done < "$doom_file" # Log the command - log "[INFO] Executing command \"$command\"" + log i "Executing command \"$command\"" # Execute the command eval "$command" diff --git a/emu-configs/mame/cfg/default.cfg b/emu-configs/mame/cfg/default.cfg deleted file mode 100644 index 7fbdab04..00000000 --- a/emu-configs/mame/cfg/default.cfg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - JOYCODE_1_HAT1UP - - - - - JOYCODE_1_SELECT - - - - - KEYCODE_LCONTROL KEYCODE_M - - - - - KEYCODE_LCONTROL KEYCODE_P - - - - - KEYCODE_LCONTROL KEYCODE_MINUSPAD - - - - - KEYCODE_LCONTROL KEYCODE_S - - - - - KEYCODE_LCONTROL KEYCODE_A - - - - - KEYCODE_LCONTROL KEYCODE_PLUSPAD - - - - - KEYCODE_LCONTROL KEYCODE_X - - - - - diff --git a/emu-configs/mame/cheat0264.zip b/emu-configs/mame/cheat0264.zip new file mode 100644 index 00000000..6f3f1a5d Binary files /dev/null and b/emu-configs/mame/cheat0264.zip differ diff --git a/emu-configs/mame/default.cfg b/emu-configs/mame/default.cfg new file mode 100644 index 00000000..8b2ca5a8 --- /dev/null +++ b/emu-configs/mame/default.cfg @@ -0,0 +1,293 @@ + + + + + + + + JOYCODE_1_BUTTON8 OR KEYCODE_1 + + + + + KEYCODE_5 OR JOYCODE_1_BUTTON7 + + + + + JOYCODE_2_BUTTON8 OR KEYCODE_2 + + + + + KEYCODE_6 OR JOYCODE_2_BUTTON7 + + + + + JOYCODE_3_BUTTON8 OR KEYCODE_3 + + + + + KEYCODE_7 OR JOYCODE_3_BUTTON7 + + + + + JOYCODE_4_BUTTON8 OR KEYCODE_4 + + + + + KEYCODE_8 OR JOYCODE_4_BUTTON7 + + + + + JOYCODE_1_BUTTON8 OR KEYCODE_S KEYCODE_1 + + + + + JOYCODE_2_BUTTON8 OR KEYCODE_S KEYCODE_2 + + + + + JOYCODE_3_BUTTON8 OR KEYCODE_S KEYCODE_3 + + + + + JOYCODE_4_BUTTON8 OR KEYCODE_S KEYCODE_4 + + + + + JOYCODE_1_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_1 + + + + + JOYCODE_2_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_2 + + + + + JOYCODE_3_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_3 + + + + + JOYCODE_4_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_4 + + + + + KEYCODE_LALT KEYCODE_B KEYCODE_1 + + + + + KEYCODE_LALT KEYCODE_S KEYCODE_1 + + + + + KEYCODE_LALT KEYCODE_S KEYCODE_2 + + + + + KEYCODE_LALT KEYCODE_S KEYCODE_3 + + + + + KEYCODE_LALT KEYCODE_S KEYCODE_4 + + + + + KEYCODE_LALT KEYCODE_T KEYCODE_1 + + + + + KEYCODE_LALT KEYCODE_T KEYCODE_2 + + + + + KEYCODE_LALT KEYCODE_T KEYCODE_3 + + + + + KEYCODE_LALT KEYCODE_T KEYCODE_4 + + + + + KEYCODE_LCONTROL KEYCODE_M + + + + + KEYCODE_LCONTROL KEYCODE_Q + + + + + JOYCODE_1_RYAXIS_NEG_SWITCH OR KEYCODE_PGUP + + + + + JOYCODE_1_RYAXIS_POS_SWITCH OR KEYCODE_PGDN + + + + + NONE + + + + + NONE + + + + + NONE + + + + + NONE + + + + + NONE + + + + + NONE + + + + + KEYCODE_LCONTROL KEYCODE_MINUSPAD + + + + + KEYCODE_LCONTROL KEYCODE_S KEYCODE_1 + + + + + KEYCODE_LCONTROL KEYCODE_S + + + + + KEYCODE_LCONTROL KEYCODE_A KEYCODE_1 + + + + + KEYCODE_LCONTROL KEYCODE_A + + + + + NONE + + + + + KEYCODE_LCONTROL KEYCODE_R + + + + + NONE + + + + + NONE + + + + + NONE + + + + + NONE + + + + + KEYCODE_LCONTROL KEYCODE_PLUSPAD + + + + + NONE + + + + + KEYCODE_LCONTROL KEYCODE_X + + + + + NONE + + + + + KEYCODE_LCONTROL KEYCODE_V + + + + + KEYCODE_LCONTROL KEYCODE_C + + + + + JOYCODE_1_RXAXIS_POS_SWITCH + + + + + JOYCODE_1_RXAXIS_NEG_SWITCH OR KEYCODE_TAB + + + + + KEYCODE_LCONTROL KEYCODE_ENTER + + + + + KEYCODE_LCONTROL KEYCODE_Y + + + + + KEYCODE_LCONTROL KEYCODE_U + + + + + diff --git a/emu-configs/mame/mame.ini b/emu-configs/mame/mame.ini index f47c2062..2fccb9a6 100644 --- a/emu-configs/mame/mame.ini +++ b/emu-configs/mame/mame.ini @@ -8,7 +8,7 @@ writeconfig 0 # CORE SEARCH PATH OPTIONS # homepath /var/data/mame/plugin-data -rompath RETRODECKROMSDIR/mame/;RETRODECKROMSDIR/arcade/;RETRODECKROMSDIR/bbcmicro/ +rompath RETRODECKROMSDIR/adam;RETRODECKROMSDIR/amstradcpc;RETRODECKROMSDIR/apple2;RETRODECKROMSDIR/apple2gs;RETRODECKROMSDIR/arcade;RETRODECKROMSDIR/arcadia;RETRODECKROMSDIR/archimedes;RETRODECKROMSDIR/astrocde;RETRODECKROMSDIR/atari7800;RETRODECKROMSDIR/atarijaguar;RETRODECKROMSDIR/bbcmicro;RETRODECKROMSDIR/cdimono1;RETRODECKROMSDIR/channelf;RETRODECKROMSDIR/consolearcade;RETRODECKROMSDIR/cps;RETRODECKROMSDIR/cps1;RETRODECKROMSDIR/cps2;RETRODECKROMSDIR/cps3;RETRODECKROMSDIR/crvision;RETRODECKROMSDIR/daphne;RETRODECKROMSDIR/electron;RETRODECKROMSDIR/fm7;RETRODECKROMSDIR/fmtowns;RETRODECKROMSDIR/gamate;RETRODECKROMSDIR/gameandwatch;RETRODECKROMSDIR/gamecom;RETRODECKROMSDIR/gmaster;RETRODECKROMSDIR/gx4000;RETRODECKROMSDIR/intellivision;RETRODECKROMSDIR/laserdisc;RETRODECKROMSDIR/lcdgames;RETRODECKROMSDIR/mame;RETRODECKROMSDIR/megaduck;RETRODECKROMSDIR/model2;RETRODECKROMSDIR/neogeo;RETRODECKROMSDIR/neogeocd;RETRODECKROMSDIR/neogeocdjp;RETRODECKROMSDIR/odyssey2;RETRODECKROMSDIR/pv1000;RETRODECKROMSDIR/scv;RETRODECKROMSDIR/stv;RETRODECKROMSDIR/supervision;RETRODECKROMSDIR/supracan;RETRODECKROMSDIR/ti99;RETRODECKROMSDIR/vectrex;RETRODECKROMSDIR/videopac;RETRODECKROMSDIR/vsmile;RETRODECKROMSDIR/x68000 hashpath /var/data/mame/hash samplepath /var/data/mame/assets/samples artpath /var/data/mame/assets/artwork @@ -127,14 +127,14 @@ speaker_report 0 # coin_lockout 1 ctrlr -mouse 0 +mouse 1 joystick 1 -lightgun 0 +lightgun 1 multikeyboard 0 -multimouse 0 +multimouse 1 steadykey 0 ui_active 0 -offscreen_reload 0 +offscreen_reload 1 joystick_map auto joystick_deadzone 0.15 joystick_saturation 0.85 diff --git a/emu-configs/primehack/Dolphin.ini b/emu-configs/primehack/config/Dolphin.ini similarity index 100% rename from emu-configs/primehack/Dolphin.ini rename to emu-configs/primehack/config/Dolphin.ini diff --git a/emu-configs/primehack/FreeLookController.ini b/emu-configs/primehack/config/FreeLookController.ini similarity index 100% rename from emu-configs/primehack/FreeLookController.ini rename to emu-configs/primehack/config/FreeLookController.ini diff --git a/emu-configs/primehack/GBA.ini b/emu-configs/primehack/config/GBA.ini similarity index 100% rename from emu-configs/primehack/GBA.ini rename to emu-configs/primehack/config/GBA.ini diff --git a/emu-configs/primehack/GCKeyNew.ini b/emu-configs/primehack/config/GCKeyNew.ini similarity index 100% rename from emu-configs/primehack/GCKeyNew.ini rename to emu-configs/primehack/config/GCKeyNew.ini diff --git a/emu-configs/primehack/GCPadNew.ini b/emu-configs/primehack/config/GCPadNew.ini similarity index 100% rename from emu-configs/primehack/GCPadNew.ini rename to emu-configs/primehack/config/GCPadNew.ini diff --git a/emu-configs/primehack/GFX.ini b/emu-configs/primehack/config/GFX.ini similarity index 100% rename from emu-configs/primehack/GFX.ini rename to emu-configs/primehack/config/GFX.ini diff --git a/emu-configs/primehack/Hotkeys.ini b/emu-configs/primehack/config/Hotkeys.ini similarity index 100% rename from emu-configs/primehack/Hotkeys.ini rename to emu-configs/primehack/config/Hotkeys.ini diff --git a/emu-configs/primehack/config/Logger.ini b/emu-configs/primehack/config/Logger.ini new file mode 100644 index 00000000..9021eeae --- /dev/null +++ b/emu-configs/primehack/config/Logger.ini @@ -0,0 +1,58 @@ +[Logs] +ActionReplay = False +AI = False +Audio = False +BOOT = False +CI = False +COMMON = False +CONSOLE = False +CORE = False +CP = False +DIO = False +DSP = False +DSPHLE = False +DSPLLE = False +DSPMails = False +DVD = False +EXI = False +FileMon = False +FRAMEDUMP = False +GDB_STUB = False +GP = False +HLE = False +Host GPU = False +HSP = False +IOS = False +IOS_DI = False +IOS_ES = False +IOS_FS = False +IOS_NET = False +IOS_SD = False +IOS_SSL = False +IOS_STM = False +IOS_USB = False +IOS_WC24 = False +IOS_WFS = False +IOS_WIIMOTE = False +JIT = False +MASTER = False +MemCard Manager = False +MI = False +NETPLAY = False +OSREPORT = False +OSREPORT_HLE = False +PE = False +PI = False +PowerPC = False +SI = False +SP1 = False +SYMBOLS = False +VI = False +Video = False +WII_IPC = False +Wiimote = False +[Options] +Verbosity = 1 +WriteToConsole = True +WriteToFile = False +WriteToWindow = True diff --git a/emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini b/emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini similarity index 100% rename from emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini rename to emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini diff --git a/emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini b/emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini similarity index 100% rename from emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini rename to emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini diff --git a/emu-configs/primehack/Profiles/Hotkeys/RetroDECK Defaults.ini b/emu-configs/primehack/config/Profiles/Hotkeys/RetroDECK Defaults.ini similarity index 100% rename from emu-configs/primehack/Profiles/Hotkeys/RetroDECK Defaults.ini rename to emu-configs/primehack/config/Profiles/Hotkeys/RetroDECK Defaults.ini diff --git a/emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini b/emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini similarity index 100% rename from emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini rename to emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini diff --git a/emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini b/emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini similarity index 100% rename from emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini rename to emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini diff --git a/emu-configs/primehack/Qt.ini b/emu-configs/primehack/config/Qt.ini similarity index 100% rename from emu-configs/primehack/Qt.ini rename to emu-configs/primehack/config/Qt.ini diff --git a/emu-configs/primehack/WiimoteNew.ini b/emu-configs/primehack/config/WiimoteNew.ini similarity index 100% rename from emu-configs/primehack/WiimoteNew.ini rename to emu-configs/primehack/config/WiimoteNew.ini diff --git a/emu-configs/primehack/data/GameSettings/R3ME01.ini b/emu-configs/primehack/data/GameSettings/R3ME01.ini new file mode 100644 index 00000000..67fa7cf4 --- /dev/null +++ b/emu-configs/primehack/data/GameSettings/R3ME01.ini @@ -0,0 +1,2 @@ +[Core] +SyncGPU = False diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_10ca6dca25531ce9_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_10ca6dca25531ce9_4.dds new file mode 100755 index 00000000..b2429513 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_10ca6dca25531ce9_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_173f3a24d9dd4a66_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_173f3a24d9dd4a66_6.dds new file mode 100755 index 00000000..dbfa4e45 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_173f3a24d9dd4a66_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_2a304e0fc49a883c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_2a304e0fc49a883c_5.dds new file mode 100755 index 00000000..370a56d5 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_2a304e0fc49a883c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_43be3d9c0c2e2dbd_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_43be3d9c0c2e2dbd_6.dds new file mode 100755 index 00000000..3fa8125d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_43be3d9c0c2e2dbd_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_47002754133e4ff5_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_47002754133e4ff5_6.dds new file mode 100755 index 00000000..01030e4e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_47002754133e4ff5_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_4eb90bb511d2b10e_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_4eb90bb511d2b10e_4.dds new file mode 100755 index 00000000..3e4bc408 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_4eb90bb511d2b10e_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_54e294522955b32e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_54e294522955b32e_5.dds new file mode 100755 index 00000000..10ba12a2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_54e294522955b32e_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_5945fd1a085a2aeb_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_5945fd1a085a2aeb_5.dds new file mode 100755 index 00000000..3fa8125d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_5945fd1a085a2aeb_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_70a90df632629730_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_70a90df632629730_4.dds new file mode 100755 index 00000000..543933e8 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_70a90df632629730_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_7e31a38b70ecbddd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_7e31a38b70ecbddd_5.dds new file mode 100755 index 00000000..61794a2e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_7e31a38b70ecbddd_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_86475f276fb14e06_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_86475f276fb14e06_5.dds new file mode 100755 index 00000000..69527151 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_86475f276fb14e06_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_889e80824c922249_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_889e80824c922249_6.dds new file mode 100755 index 00000000..32a58e85 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_889e80824c922249_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_96342171475066ab_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_96342171475066ab_6.dds new file mode 100755 index 00000000..fa710c85 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_96342171475066ab_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_9af2d52683113ecc_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_9af2d52683113ecc_6.dds new file mode 100755 index 00000000..ce226ea2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_9af2d52683113ecc_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_a28e2885c4fe7e1c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_a28e2885c4fe7e1c_5.dds new file mode 100755 index 00000000..4b48fc19 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_a28e2885c4fe7e1c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_b0c321687c7a410b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_b0c321687c7a410b_5.dds new file mode 100755 index 00000000..41cf4423 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_b0c321687c7a410b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_c3af34349deab463_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_c3af34349deab463_6.dds new file mode 100755 index 00000000..401437f9 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_c3af34349deab463_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_cb44bdce7a961a9d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_cb44bdce7a961a9d_5.dds new file mode 100755 index 00000000..1b860364 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_cb44bdce7a961a9d_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_ce9f9d8116478553_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_ce9f9d8116478553_6.dds new file mode 100755 index 00000000..5e21399a Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_ce9f9d8116478553_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_d3576576ea854c06_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_d3576576ea854c06_4.dds new file mode 100755 index 00000000..b3b46eec Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_d3576576ea854c06_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f0599000a4f68a36_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f0599000a4f68a36_5.dds new file mode 100755 index 00000000..ae978026 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f0599000a4f68a36_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f26190a488d42e7c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f26190a488d42e7c_5.dds new file mode 100755 index 00000000..a6e9c386 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f26190a488d42e7c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_40x32_4c3b4cc767632866_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_40x32_4c3b4cc767632866_6.dds new file mode 100755 index 00000000..49306f53 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_40x32_4c3b4cc767632866_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_1606dfde024ac097_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_1606dfde024ac097_5.dds new file mode 100755 index 00000000..1dc04bb2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_1606dfde024ac097_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_16a58a4eea792bbe_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_16a58a4eea792bbe_5.dds new file mode 100755 index 00000000..1dc04bb2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_16a58a4eea792bbe_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_175a89d65955dc3b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_175a89d65955dc3b_5.dds new file mode 100755 index 00000000..1e7a64bd Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_175a89d65955dc3b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_42ca5ae71fc5a4dd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_42ca5ae71fc5a4dd_5.dds new file mode 100755 index 00000000..70d3a118 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_42ca5ae71fc5a4dd_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_ffeb4d8af2d792d8_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_ffeb4d8af2d792d8_5.dds new file mode 100755 index 00000000..70d3a118 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_ffeb4d8af2d792d8_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_23cf53ad89c9fd1b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_23cf53ad89c9fd1b_5.dds new file mode 100755 index 00000000..a8080b98 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_23cf53ad89c9fd1b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_59808344c616ced7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_59808344c616ced7_5.dds new file mode 100755 index 00000000..ebfa5ce9 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_59808344c616ced7_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_6ac1c1da82026c89_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_6ac1c1da82026c89_5.dds new file mode 100755 index 00000000..e6576b7f Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_6ac1c1da82026c89_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_70ff98b99f564308_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_70ff98b99f564308_5.dds new file mode 100755 index 00000000..b52787ee Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_70ff98b99f564308_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_75914a5d05565cd7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_75914a5d05565cd7_5.dds new file mode 100755 index 00000000..372fef7d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_75914a5d05565cd7_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_7fbc4a84faef18ee_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_7fbc4a84faef18ee_5.dds new file mode 100755 index 00000000..a01f2c02 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_7fbc4a84faef18ee_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_86d6d4197093f397_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_86d6d4197093f397_5.dds new file mode 100755 index 00000000..5d3e66a2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_86d6d4197093f397_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_93dd5118ba11a908_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_93dd5118ba11a908_5.dds new file mode 100755 index 00000000..817084a3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_93dd5118ba11a908_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_a05f9156a9b8da71_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_a05f9156a9b8da71_5.dds new file mode 100755 index 00000000..4b63c499 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_a05f9156a9b8da71_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_2a304e0fc49a883c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_2a304e0fc49a883c_5.dds new file mode 100755 index 00000000..370a56d5 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_2a304e0fc49a883c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_54e294522955b32e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_54e294522955b32e_5.dds new file mode 100755 index 00000000..10ba12a2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_54e294522955b32e_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_5945fd1a085a2aeb_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_5945fd1a085a2aeb_5.dds new file mode 100755 index 00000000..3fa8125d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_5945fd1a085a2aeb_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_701e7c156583abfc_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_701e7c156583abfc_5.dds new file mode 100755 index 00000000..84fc5f3a Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_701e7c156583abfc_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_7e31a38b70ecbddd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_7e31a38b70ecbddd_5.dds new file mode 100755 index 00000000..61794a2e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_7e31a38b70ecbddd_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_86475f276fb14e06_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_86475f276fb14e06_5.dds new file mode 100755 index 00000000..69527151 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_86475f276fb14e06_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a28e2885c4fe7e1c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a28e2885c4fe7e1c_5.dds new file mode 100755 index 00000000..4b48fc19 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a28e2885c4fe7e1c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a7ef87b56d6b4bdf_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a7ef87b56d6b4bdf_5.dds new file mode 100755 index 00000000..3eeb3a14 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a7ef87b56d6b4bdf_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_b4f4fb242799c981_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_b4f4fb242799c981_5.dds new file mode 100755 index 00000000..61794a2e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_b4f4fb242799c981_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_bb3467a83b7dad05_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_bb3467a83b7dad05_5.dds new file mode 100755 index 00000000..03d55374 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_bb3467a83b7dad05_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_cb44bdce7a961a9d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_cb44bdce7a961a9d_5.dds new file mode 100755 index 00000000..1b860364 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_cb44bdce7a961a9d_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_e74dc87e7b4eef8d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_e74dc87e7b4eef8d_5.dds new file mode 100755 index 00000000..1f6a9b9b Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_e74dc87e7b4eef8d_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f0599000a4f68a36_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f0599000a4f68a36_5.dds new file mode 100755 index 00000000..ae978026 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f0599000a4f68a36_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f26190a488d42e7c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f26190a488d42e7c_5.dds new file mode 100755 index 00000000..a6e9c386 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f26190a488d42e7c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_1606dfde024ac097_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_1606dfde024ac097_5.dds new file mode 100755 index 00000000..1dc04bb2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_1606dfde024ac097_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_16a58a4eea792bbe_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_16a58a4eea792bbe_5.dds new file mode 100755 index 00000000..1dc04bb2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_16a58a4eea792bbe_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_175a89d65955dc3b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_175a89d65955dc3b_5.dds new file mode 100755 index 00000000..1e7a64bd Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_175a89d65955dc3b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_27dedcf777de34c0_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_27dedcf777de34c0_5.dds new file mode 100755 index 00000000..40f570c3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_27dedcf777de34c0_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_3ee19d4f14128a9b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_3ee19d4f14128a9b_5.dds new file mode 100755 index 00000000..a4832741 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_3ee19d4f14128a9b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_41703e382ee91ba1_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_41703e382ee91ba1_5.dds new file mode 100755 index 00000000..e760a4a4 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_41703e382ee91ba1_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_42ca5ae71fc5a4dd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_42ca5ae71fc5a4dd_5.dds new file mode 100755 index 00000000..70d3a118 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_42ca5ae71fc5a4dd_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_47dc2607b727f563_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_47dc2607b727f563_5.dds new file mode 100755 index 00000000..0b493f32 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_47dc2607b727f563_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_4f0ad2e2995bddb5_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_4f0ad2e2995bddb5_5.dds new file mode 100755 index 00000000..5f0f7953 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_4f0ad2e2995bddb5_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_569c97647cd0e0c9_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_569c97647cd0e0c9_5.dds new file mode 100755 index 00000000..f3157353 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_569c97647cd0e0c9_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_63eacd0666203c96_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_63eacd0666203c96_5.dds new file mode 100755 index 00000000..0b493f32 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_63eacd0666203c96_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_92a58bc7eb71f53d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_92a58bc7eb71f53d_5.dds new file mode 100755 index 00000000..d8858483 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_92a58bc7eb71f53d_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_9fb461fb5a0c4962_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_9fb461fb5a0c4962_5.dds new file mode 100755 index 00000000..24658ae3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_9fb461fb5a0c4962_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_af76096726fc1854_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_af76096726fc1854_14.dds new file mode 100755 index 00000000..dcc69f84 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_af76096726fc1854_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b0a79df2f424260e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b0a79df2f424260e_5.dds new file mode 100755 index 00000000..07291e4f Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b0a79df2f424260e_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b6ee0b617b179b2c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b6ee0b617b179b2c_5.dds new file mode 100755 index 00000000..07291e4f Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b6ee0b617b179b2c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_bf152ef2b7f5c2fd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_bf152ef2b7f5c2fd_5.dds new file mode 100755 index 00000000..a5a48a08 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_bf152ef2b7f5c2fd_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f09993aa62c3a11b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f09993aa62c3a11b_5.dds new file mode 100755 index 00000000..53136672 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f09993aa62c3a11b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f3f27c5e92f56472_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f3f27c5e92f56472_5.dds new file mode 100755 index 00000000..56ae6fb6 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f3f27c5e92f56472_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_ffeb4d8af2d792d8_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_ffeb4d8af2d792d8_5.dds new file mode 100755 index 00000000..70d3a118 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_ffeb4d8af2d792d8_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_23cf53ad89c9fd1b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_23cf53ad89c9fd1b_5.dds new file mode 100755 index 00000000..a8080b98 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_23cf53ad89c9fd1b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_59808344c616ced7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_59808344c616ced7_5.dds new file mode 100755 index 00000000..ebfa5ce9 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_59808344c616ced7_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_6ac1c1da82026c89_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_6ac1c1da82026c89_5.dds new file mode 100755 index 00000000..e6576b7f Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_6ac1c1da82026c89_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_70ff98b99f564308_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_70ff98b99f564308_5.dds new file mode 100755 index 00000000..b52787ee Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_70ff98b99f564308_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_75914a5d05565cd7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_75914a5d05565cd7_5.dds new file mode 100755 index 00000000..372fef7d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_75914a5d05565cd7_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_7fbc4a84faef18ee_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_7fbc4a84faef18ee_5.dds new file mode 100755 index 00000000..a01f2c02 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_7fbc4a84faef18ee_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_86d6d4197093f397_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_86d6d4197093f397_5.dds new file mode 100755 index 00000000..5d3e66a2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_86d6d4197093f397_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_93dd5118ba11a908_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_93dd5118ba11a908_5.dds new file mode 100755 index 00000000..817084a3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_93dd5118ba11a908_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_a05f9156a9b8da71_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_a05f9156a9b8da71_5.dds new file mode 100755 index 00000000..4b63c499 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_a05f9156a9b8da71_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_2a304e0fc49a883c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_2a304e0fc49a883c_5.dds new file mode 100755 index 00000000..370a56d5 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_2a304e0fc49a883c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_4eb90bb511d2b10e_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_4eb90bb511d2b10e_4.dds new file mode 100755 index 00000000..25a64ccd Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_4eb90bb511d2b10e_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_54e294522955b32e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_54e294522955b32e_5.dds new file mode 100755 index 00000000..10ba12a2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_54e294522955b32e_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5945fd1a085a2aeb_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5945fd1a085a2aeb_5.dds new file mode 100755 index 00000000..3fa8125d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5945fd1a085a2aeb_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5fa30f82f962b236_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5fa30f82f962b236_5.dds new file mode 100755 index 00000000..b356c86c Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5fa30f82f962b236_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_615ec0bfb80acb1d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_615ec0bfb80acb1d_5.dds new file mode 100755 index 00000000..ae25c147 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_615ec0bfb80acb1d_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_701e7c156583abfc_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_701e7c156583abfc_5.dds new file mode 100755 index 00000000..84fc5f3a Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_701e7c156583abfc_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_7e31a38b70ecbddd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_7e31a38b70ecbddd_5.dds new file mode 100755 index 00000000..61794a2e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_7e31a38b70ecbddd_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_86475f276fb14e06_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_86475f276fb14e06_5.dds new file mode 100755 index 00000000..69527151 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_86475f276fb14e06_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_a28e2885c4fe7e1c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_a28e2885c4fe7e1c_5.dds new file mode 100755 index 00000000..4b48fc19 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_a28e2885c4fe7e1c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_bb3467a83b7dad05_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_bb3467a83b7dad05_5.dds new file mode 100755 index 00000000..03d55374 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_bb3467a83b7dad05_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_cb44bdce7a961a9d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_cb44bdce7a961a9d_5.dds new file mode 100755 index 00000000..1b860364 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_cb44bdce7a961a9d_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dbcb14f0171b30d3_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dbcb14f0171b30d3_5.dds new file mode 100755 index 00000000..08a6563e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dbcb14f0171b30d3_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dfe44df2c8105710_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dfe44df2c8105710_5.dds new file mode 100755 index 00000000..e181d134 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dfe44df2c8105710_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f0599000a4f68a36_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f0599000a4f68a36_5.dds new file mode 100755 index 00000000..ae978026 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f0599000a4f68a36_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f26190a488d42e7c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f26190a488d42e7c_5.dds new file mode 100755 index 00000000..a6e9c386 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f26190a488d42e7c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f2e2eeb12e0e82c0_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f2e2eeb12e0e82c0_5.dds new file mode 100755 index 00000000..ae978026 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f2e2eeb12e0e82c0_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0064d1faaf79a1de_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0064d1faaf79a1de_5.dds new file mode 100755 index 00000000..a5a48a08 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0064d1faaf79a1de_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0749accc3ceb7f65_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0749accc3ceb7f65_5.dds new file mode 100755 index 00000000..24658ae3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0749accc3ceb7f65_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0d85d548a5776b9c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0d85d548a5776b9c_5.dds new file mode 100755 index 00000000..f3157353 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0d85d548a5776b9c_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1606dfde024ac097_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1606dfde024ac097_5.dds new file mode 100755 index 00000000..1dc04bb2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1606dfde024ac097_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_16a58a4eea792bbe_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_16a58a4eea792bbe_5.dds new file mode 100755 index 00000000..1dc04bb2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_16a58a4eea792bbe_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_175a89d65955dc3b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_175a89d65955dc3b_5.dds new file mode 100755 index 00000000..1e7a64bd Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_175a89d65955dc3b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1bf2957bffda8c54_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1bf2957bffda8c54_5.dds new file mode 100755 index 00000000..a5a48a08 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1bf2957bffda8c54_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_360b0a27d8d03e02_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_360b0a27d8d03e02_5.dds new file mode 100755 index 00000000..24658ae3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_360b0a27d8d03e02_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_42ca5ae71fc5a4dd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_42ca5ae71fc5a4dd_5.dds new file mode 100755 index 00000000..70d3a118 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_42ca5ae71fc5a4dd_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_4bb466582c2d7aff_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_4bb466582c2d7aff_5.dds new file mode 100755 index 00000000..3aa4e708 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_4bb466582c2d7aff_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cf2ab7d53aae895_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cf2ab7d53aae895_5.dds new file mode 100755 index 00000000..40f570c3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cf2ab7d53aae895_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cfc7cc23de5c69b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cfc7cc23de5c69b_5.dds new file mode 100755 index 00000000..56ae6fb6 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cfc7cc23de5c69b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_7a518177afff0bc2_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_7a518177afff0bc2_5.dds new file mode 100755 index 00000000..d8858483 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_7a518177afff0bc2_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_835ed629d0fed238_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_835ed629d0fed238_5.dds new file mode 100755 index 00000000..53136672 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_835ed629d0fed238_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_af76096726fc1854_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_af76096726fc1854_14.dds new file mode 100755 index 00000000..dcc69f84 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_af76096726fc1854_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_bfdffec3c8943aea_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_bfdffec3c8943aea_5.dds new file mode 100755 index 00000000..40f570c3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_bfdffec3c8943aea_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_c5fa21384e2e25f7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_c5fa21384e2e25f7_5.dds new file mode 100755 index 00000000..a5a48a08 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_c5fa21384e2e25f7_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ec8bc72a0c6b2b7d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ec8bc72a0c6b2b7d_5.dds new file mode 100755 index 00000000..26cdbaba Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ec8bc72a0c6b2b7d_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f5cdd86ad2b9b9c3_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f5cdd86ad2b9b9c3_5.dds new file mode 100755 index 00000000..a4832741 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f5cdd86ad2b9b9c3_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f86841b072527b52_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f86841b072527b52_5.dds new file mode 100755 index 00000000..e760a4a4 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f86841b072527b52_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ffeb4d8af2d792d8_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ffeb4d8af2d792d8_5.dds new file mode 100755 index 00000000..70d3a118 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ffeb4d8af2d792d8_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x64_db014c47357a98a2_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x64_db014c47357a98a2_5.dds new file mode 100755 index 00000000..cd6a6ac0 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x64_db014c47357a98a2_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_23cf53ad89c9fd1b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_23cf53ad89c9fd1b_5.dds new file mode 100755 index 00000000..a8080b98 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_23cf53ad89c9fd1b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_59808344c616ced7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_59808344c616ced7_5.dds new file mode 100755 index 00000000..ebfa5ce9 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_59808344c616ced7_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_6ac1c1da82026c89_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_6ac1c1da82026c89_5.dds new file mode 100755 index 00000000..e6576b7f Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_6ac1c1da82026c89_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_70ff98b99f564308_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_70ff98b99f564308_5.dds new file mode 100755 index 00000000..b52787ee Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_70ff98b99f564308_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_75914a5d05565cd7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_75914a5d05565cd7_5.dds new file mode 100755 index 00000000..372fef7d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_75914a5d05565cd7_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_7fbc4a84faef18ee_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_7fbc4a84faef18ee_5.dds new file mode 100755 index 00000000..a01f2c02 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_7fbc4a84faef18ee_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_86d6d4197093f397_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_86d6d4197093f397_5.dds new file mode 100755 index 00000000..5d3e66a2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_86d6d4197093f397_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_93dd5118ba11a908_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_93dd5118ba11a908_5.dds new file mode 100755 index 00000000..817084a3 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_93dd5118ba11a908_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_a05f9156a9b8da71_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_a05f9156a9b8da71_5.dds new file mode 100755 index 00000000..4b63c499 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_a05f9156a9b8da71_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_05ace719b52918bb_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_05ace719b52918bb_6.dds new file mode 100755 index 00000000..217903fa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_05ace719b52918bb_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_40ea01bf6f2aceae_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_40ea01bf6f2aceae_6.dds new file mode 100755 index 00000000..217903fa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_40ea01bf6f2aceae_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_10ca6dca25531ce9_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_10ca6dca25531ce9_4.dds new file mode 100755 index 00000000..b2429513 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_10ca6dca25531ce9_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_2d9b5d2d0a406a63_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_2d9b5d2d0a406a63_6.dds new file mode 100755 index 00000000..f1bc7e00 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_2d9b5d2d0a406a63_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_380a4ed102753a91_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_380a4ed102753a91_6.dds new file mode 100755 index 00000000..b2917cae Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_380a4ed102753a91_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_43be3d9c0c2e2dbd_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_43be3d9c0c2e2dbd_6.dds new file mode 100755 index 00000000..3fa8125d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_43be3d9c0c2e2dbd_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_4eb90bb511d2b10e_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_4eb90bb511d2b10e_4.dds new file mode 100755 index 00000000..dd7beb5e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_4eb90bb511d2b10e_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_52bc65cd8d4b0905_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_52bc65cd8d4b0905_6.dds new file mode 100755 index 00000000..08a6563e Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_52bc65cd8d4b0905_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_70a90df632629730_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_70a90df632629730_4.dds new file mode 100755 index 00000000..543933e8 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_70a90df632629730_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_877ac67dc3c23f97_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_877ac67dc3c23f97_6.dds new file mode 100755 index 00000000..ea207b1b Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_877ac67dc3c23f97_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_8a3e8ec9d97c84f7_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_8a3e8ec9d97c84f7_6.dds new file mode 100755 index 00000000..b356c86c Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_8a3e8ec9d97c84f7_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_96342171475066ab_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_96342171475066ab_6.dds new file mode 100755 index 00000000..fa710c85 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_96342171475066ab_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_975e1a31b02a2a68_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_975e1a31b02a2a68_6.dds new file mode 100755 index 00000000..09b425ed Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_975e1a31b02a2a68_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_9af2d52683113ecc_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_9af2d52683113ecc_6.dds new file mode 100755 index 00000000..ce226ea2 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_9af2d52683113ecc_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b0c321687c7a410b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b0c321687c7a410b_5.dds new file mode 100755 index 00000000..41cf4423 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b0c321687c7a410b_5.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b7bcef92f3f7378d_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b7bcef92f3f7378d_6.dds new file mode 100755 index 00000000..55033668 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b7bcef92f3f7378d_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_d3576576ea854c06_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_d3576576ea854c06_4.dds new file mode 100755 index 00000000..b3b46eec Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_d3576576ea854c06_4.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_e81f99c205eb24d0_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_e81f99c205eb24d0_6.dds new file mode 100755 index 00000000..072bbb0c Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_e81f99c205eb24d0_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_f00e0e837140250a_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_f00e0e837140250a_6.dds new file mode 100755 index 00000000..676ada0d Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_f00e0e837140250a_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_4c3b4cc767632866_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_4c3b4cc767632866_6.dds new file mode 100755 index 00000000..49306f53 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_4c3b4cc767632866_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_970859e57fe24761_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_970859e57fe24761_6.dds new file mode 100755 index 00000000..15b5fcc8 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_970859e57fe24761_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_a60e7e0eac9a75e7_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_a60e7e0eac9a75e7_6.dds new file mode 100755 index 00000000..a71750ff Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_a60e7e0eac9a75e7_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_bf0e66339a12f23a_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_bf0e66339a12f23a_6.dds new file mode 100755 index 00000000..10c1a002 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_bf0e66339a12f23a_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_e65a03d74465035d_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_e65a03d74465035d_6.dds new file mode 100755 index 00000000..9b7a4824 Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_e65a03d74465035d_6.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_19d4c177bfa5255a_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_19d4c177bfa5255a_14.dds new file mode 100755 index 00000000..7df18eaa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_19d4c177bfa5255a_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_344dcedb01a9a7ff_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_344dcedb01a9a7ff_14.dds new file mode 100755 index 00000000..7df18eaa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_344dcedb01a9a7ff_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_5767fae3e9c2ec7b_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_5767fae3e9c2ec7b_14.dds new file mode 100755 index 00000000..7df18eaa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_5767fae3e9c2ec7b_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_ad15d2f8f67a24d8_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_ad15d2f8f67a24d8_14.dds new file mode 100755 index 00000000..9234004c Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_ad15d2f8f67a24d8_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_d7651895d8b4b6e0_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_d7651895d8b4b6e0_14.dds new file mode 100755 index 00000000..7df18eaa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_d7651895d8b4b6e0_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_daf65c9d00a79c85_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_daf65c9d00a79c85_14.dds new file mode 100755 index 00000000..7df18eaa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_daf65c9d00a79c85_14.dds differ diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_f4681588babc937c_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_f4681588babc937c_14.dds new file mode 100755 index 00000000..7df18eaa Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_f4681588babc937c_14.dds differ diff --git a/emu-configs/retroarch/ScummVM.zip b/emu-configs/retroarch/ScummVM.zip new file mode 100644 index 00000000..33e351e3 Binary files /dev/null and b/emu-configs/retroarch/ScummVM.zip differ diff --git a/emu-configs/retroarch/retroarch-core-options.cfg b/emu-configs/retroarch/retroarch-core-options.cfg index 06420de7..be802a61 100644 --- a/emu-configs/retroarch/retroarch-core-options.cfg +++ b/emu-configs/retroarch/retroarch-core-options.cfg @@ -59,17 +59,19 @@ cap32_scr_intensity = "8" cap32_scr_tube = "color" cap32_statusbar = "onloading" citra_analog_function = "C-Stick and Touchscreen Pointer" +citra_cpu_scale = "100% (Default)" citra_custom_textures = "disabled" citra_deadzone = "15" citra_dump_textures = "disabled" -citra_is_new_3ds = "Old 3DS" +citra_is_new_3ds = "New 3DS" citra_language = "English" citra_layout_option = "Default Top-Bottom Screen" citra_mouse_touchscreen = "enabled" citra_region_value = "Auto" citra_render_touchscreen = "disabled" -citra_resolution_factor = "4x" +citra_resolution_factor = "2x" citra_swap_screen = "Top" +citra_swap_screen_mode = "Toggle" citra_texture_filter = "none" citra_touch_touchscreen = "enabled" citra_use_acc_geo_shaders = "enabled" @@ -419,6 +421,7 @@ mgba_sgb_borders = "ON" mgba_skip_bios = "OFF" mgba_solar_sensor_level = "0" mgba_use_bios = "ON" +mesen_fdsautoinsertdisk = "enabled" mupen64plus-169screensize = "960x540" mupen64plus-43screensize = "640x480" mupen64plus-alt-map = "False" diff --git a/emu-configs/retroarch/retroarch.cfg b/emu-configs/retroarch/retroarch.cfg index 2fc14c02..dc533f2e 100644 --- a/emu-configs/retroarch/retroarch.cfg +++ b/emu-configs/retroarch/retroarch.cfg @@ -3,10 +3,14 @@ accessibility_narrator_speech_speed = "5" ai_service_enable = "false" ai_service_mode = "1" ai_service_pause = "false" +ai_service_poll_delay = "0" ai_service_source_lang = "0" ai_service_target_lang = "0" +ai_service_text_padding = "5" +ai_service_text_position = "0" ai_service_url = "http://localhost:4404/" all_users_control_menu = "true" +app_icon = "default" apply_cheats_after_load = "false" apply_cheats_after_toggle = "false" aspect_ratio_index = "22" @@ -23,6 +27,7 @@ audio_enable_menu_notice = "false" audio_enable_menu_ok = "false" audio_enable_menu_scroll = "false" audio_fastforward_mute = "false" +audio_fastforward_speedup = "false" audio_filter_dir = "/app/lib/retroarch/filters/audio" audio_latency = "64" audio_max_timing_skew = "0.050000" @@ -43,8 +48,8 @@ auto_shaders_enable = "true" autosave_interval = "10" block_sram_overwrite = "false" bluetooth_driver = "null" -builtin_imageviewer_enable = "true" -builtin_mediaplayer_enable = "true" +builtin_imageviewer_enable = "false" +builtin_mediaplayer_enable = "false" bundle_assets_dst_path = "" bundle_assets_dst_path_subdir = "" bundle_assets_extract_enable = "false" @@ -77,9 +82,17 @@ cheevos_unlock_sound_enable = "true" cheevos_username = "" cheevos_verbose_enable = "true" cheevos_visibility_account = "true" +cheevos_visibility_lboard_cancel = "true" +cheevos_visibility_lboard_start = "true" +cheevos_visibility_lboard_submit = "true" +cheevos_visibility_lboard_trackers = "true" cheevos_visibility_mastery = "true" +cheevos_visibility_progress_tracker = "true" cheevos_visibility_summary = "1" cheevos_visibility_unlock = "true" +cloud_sync_destructive = "false" +cloud_sync_driver = "" +cloud_sync_enable = "false" config_save_on_exit = "true" content_database_path = "/app/share/libretro/database/rdb" content_favorites_directory = "default" @@ -159,10 +172,12 @@ gamemode_enable = "false" gamma_correction = "0" global_core_options = "true" history_list_enable = "true" +initial_disk_change_enable = "true" input_ai_service = "i" input_ai_service_axis = "nul" input_ai_service_btn = "nul" input_ai_service_mbtn = "nul" +input_allow_turbo_dpad = "false" input_analog_deadzone = "0.000000" input_analog_sensitivity = "1.000000" input_audio_mute = "nul" @@ -264,6 +279,7 @@ input_hold_slowmotion_axis = "nul" input_hold_slowmotion_btn = "nul" input_hold_slowmotion_mbtn = "nul" input_hotkey_block_delay = "5" +input_hotkey_device_merge = "false" input_joypad_driver = "sdl2" input_keyboard_layout = "" input_load_state = "a" @@ -301,6 +317,9 @@ input_netplay_player_chat_axis = "nul" input_netplay_player_chat_btn = "nul" input_netplay_player_chat_mbtn = "nul" input_nowinkey_enable = "false" +input_osk_overlay = "" +input_osk_overlay_auto_scale = "false" +input_osk_overlay_opacity = "0.700000" input_osk_toggle = "f12" input_osk_toggle_axis = "nul" input_osk_toggle_btn = "nul" @@ -317,11 +336,25 @@ input_overlay_enable = "true" input_overlay_enable_autopreferred = "true" input_overlay_hide_in_menu = "false" input_overlay_hide_when_gamepad_connected = "false" +input_overlay_lightgun_allow_offscreen = "true" +input_overlay_lightgun_four_touch_input = "0" +input_overlay_lightgun_port = "-1" +input_overlay_lightgun_three_touch_input = "0" +input_overlay_lightgun_trigger_delay = "1" +input_overlay_lightgun_trigger_on_touch = "true" +input_overlay_lightgun_two_touch_input = "0" +input_overlay_mouse_dtap_msec = "200" +input_overlay_mouse_dtap_to_drag = "false" +input_overlay_mouse_hold_msec = "200" +input_overlay_mouse_hold_to_drag = "true" +input_overlay_mouse_speed = "1.000000" +input_overlay_mouse_swipe_threshold = "1.000000" input_overlay_next = "nul" input_overlay_next_axis = "nul" input_overlay_next_btn = "nul" input_overlay_next_mbtn = "nul" input_overlay_opacity = "0.700000" +input_overlay_pointer_enable = "false" input_overlay_scale_landscape = "1.000000" input_overlay_scale_portrait = "1.000000" input_overlay_show_inputs = "2" @@ -347,7 +380,7 @@ input_player10_a = "nul" input_player10_a_axis = "nul" input_player10_a_btn = "nul" input_player10_a_mbtn = "nul" -input_player10_analog_dpad_mode = "0" +input_player10_analog_dpad_mode = "1" input_player10_b = "nul" input_player10_b_axis = "nul" input_player10_b_btn = "nul" @@ -494,7 +527,7 @@ input_player11_a = "nul" input_player11_a_axis = "nul" input_player11_a_btn = "nul" input_player11_a_mbtn = "nul" -input_player11_analog_dpad_mode = "0" +input_player11_analog_dpad_mode = "1" input_player11_b = "nul" input_player11_b_axis = "nul" input_player11_b_btn = "nul" @@ -641,7 +674,7 @@ input_player12_a = "nul" input_player12_a_axis = "nul" input_player12_a_btn = "nul" input_player12_a_mbtn = "nul" -input_player12_analog_dpad_mode = "0" +input_player12_analog_dpad_mode = "1" input_player12_b = "nul" input_player12_b_axis = "nul" input_player12_b_btn = "nul" @@ -788,7 +821,7 @@ input_player13_a = "nul" input_player13_a_axis = "nul" input_player13_a_btn = "nul" input_player13_a_mbtn = "nul" -input_player13_analog_dpad_mode = "0" +input_player13_analog_dpad_mode = "1" input_player13_b = "nul" input_player13_b_axis = "nul" input_player13_b_btn = "nul" @@ -935,7 +968,7 @@ input_player14_a = "nul" input_player14_a_axis = "nul" input_player14_a_btn = "nul" input_player14_a_mbtn = "nul" -input_player14_analog_dpad_mode = "0" +input_player14_analog_dpad_mode = "1" input_player14_b = "nul" input_player14_b_axis = "nul" input_player14_b_btn = "nul" @@ -1082,7 +1115,7 @@ input_player15_a = "nul" input_player15_a_axis = "nul" input_player15_a_btn = "nul" input_player15_a_mbtn = "nul" -input_player15_analog_dpad_mode = "0" +input_player15_analog_dpad_mode = "1" input_player15_b = "nul" input_player15_b_axis = "nul" input_player15_b_btn = "nul" @@ -1229,7 +1262,7 @@ input_player16_a = "nul" input_player16_a_axis = "nul" input_player16_a_btn = "nul" input_player16_a_mbtn = "nul" -input_player16_analog_dpad_mode = "0" +input_player16_analog_dpad_mode = "1" input_player16_b = "nul" input_player16_b_axis = "nul" input_player16_b_btn = "nul" @@ -1523,7 +1556,7 @@ input_player2_a = "nul" input_player2_a_axis = "nul" input_player2_a_btn = "nul" input_player2_a_mbtn = "nul" -input_player2_analog_dpad_mode = "0" +input_player2_analog_dpad_mode = "1" input_player2_b = "nul" input_player2_b_axis = "nul" input_player2_b_btn = "nul" @@ -1670,7 +1703,7 @@ input_player3_a = "nul" input_player3_a_axis = "nul" input_player3_a_btn = "nul" input_player3_a_mbtn = "nul" -input_player3_analog_dpad_mode = "0" +input_player3_analog_dpad_mode = "1" input_player3_b = "nul" input_player3_b_axis = "nul" input_player3_b_btn = "nul" @@ -1817,7 +1850,7 @@ input_player4_a = "nul" input_player4_a_axis = "nul" input_player4_a_btn = "nul" input_player4_a_mbtn = "nul" -input_player4_analog_dpad_mode = "0" +input_player4_analog_dpad_mode = "1" input_player4_b = "nul" input_player4_b_axis = "nul" input_player4_b_btn = "nul" @@ -1964,7 +1997,7 @@ input_player5_a = "nul" input_player5_a_axis = "nul" input_player5_a_btn = "nul" input_player5_a_mbtn = "nul" -input_player5_analog_dpad_mode = "0" +input_player5_analog_dpad_mode = "1" input_player5_b = "nul" input_player5_b_axis = "nul" input_player5_b_btn = "nul" @@ -2111,7 +2144,7 @@ input_player6_a = "nul" input_player6_a_axis = "nul" input_player6_a_btn = "nul" input_player6_a_mbtn = "nul" -input_player6_analog_dpad_mode = "0" +input_player6_analog_dpad_mode = "1" input_player6_b = "nul" input_player6_b_axis = "nul" input_player6_b_btn = "nul" @@ -2258,7 +2291,7 @@ input_player7_a = "nul" input_player7_a_axis = "nul" input_player7_a_btn = "nul" input_player7_a_mbtn = "nul" -input_player7_analog_dpad_mode = "0" +input_player7_analog_dpad_mode = "1" input_player7_b = "nul" input_player7_b_axis = "nul" input_player7_b_btn = "nul" @@ -2405,7 +2438,7 @@ input_player8_a = "nul" input_player8_a_axis = "nul" input_player8_a_btn = "nul" input_player8_a_mbtn = "nul" -input_player8_analog_dpad_mode = "0" +input_player8_analog_dpad_mode = "1" input_player8_b = "nul" input_player8_b_axis = "nul" input_player8_b_btn = "nul" @@ -2552,7 +2585,7 @@ input_player9_a = "nul" input_player9_a_axis = "nul" input_player9_a_btn = "nul" input_player9_a_mbtn = "nul" -input_player9_analog_dpad_mode = "0" +input_player9_analog_dpad_mode = "1" input_player9_b = "nul" input_player9_b_axis = "nul" input_player9_b_btn = "nul" @@ -2912,6 +2945,14 @@ menu_xmb_thumbnail_scale_factor = "100" menu_xmb_title_margin = "5" menu_xmb_title_margin_horizontal_offset = "0" menu_xmb_vertical_fade_factor = "100" +microphone_block_frames = "0" +microphone_device = "" +microphone_driver = "alsathread" +microphone_enable = "true" +microphone_latency = "64" +microphone_rate = "48000" +microphone_resampler = "sinc" +microphone_resampler_quality = "3" midi_driver = "alsa" midi_input = "OFF" midi_output = "OFF" @@ -2985,16 +3026,19 @@ network_remote_enable_user_p9 = "false" notification_show_autoconfig = "true" notification_show_cheats_applied = "true" notification_show_config_override_load = "true" +notification_show_disk_control = "true" notification_show_fast_forward = "true" notification_show_netplay_extra = "false" notification_show_patch_applied = "true" notification_show_refresh_rate = "true" notification_show_remap_load = "true" +notification_show_save_state = "true" notification_show_screenshot = "true" notification_show_screenshot_duration = "0" notification_show_screenshot_flash = "0" notification_show_set_initial_disk = "true" notification_show_when_menu_is_alive = "false" +osk_overlay_directory = "/var/config/retroarch/overlays/keyboards" overlay_directory = "/var/config/retroarch/overlays/borders" ozone_collapse_sidebar = "false" ozone_menu_color_theme = "1" @@ -3018,6 +3062,7 @@ playlist_show_sublabels = "true" playlist_sort_alphabetical = "true" playlist_sublabel_last_played_style = "0" playlist_sublabel_runtime_type = "0" +playlist_use_filename = "false" playlist_use_old_format = "false" preemptive_frames_enable = "false" preemptive_frames_hide_warnings = "false" @@ -3097,6 +3142,7 @@ savestate_file_compression = "true" savestate_max_keep = "0" savestate_thumbnail_enable = "false" savestates_in_content_dir = "false" +scan_serial_and_crc = "false" scan_without_core_match = "false" screen_brightness = "100" screen_orientation = "0" @@ -3141,6 +3187,7 @@ suspend_screensaver_enable = "true" sustained_performance_mode = "false" system_directory = "/var/config/retroarch/system" systemfiles_in_content_dir = "false" +test_input_file_joypad = "" threaded_data_runloop_enable = "true" thumbnails_directory = "/var/config/retroarch/thumbnails" twitch_stream_key = "" @@ -3155,7 +3202,9 @@ video_adaptive_vsync = "false" video_allow_rotate = "true" video_aspect_ratio = "1.333300" video_aspect_ratio_auto = "false" +video_autoswitch_pal_threshold = "54.500000" video_autoswitch_refresh_rate = "0" +video_bfi_dark_frames = "1" video_black_frame_insertion = "0" video_context_driver = "" video_crop_overscan = "true" @@ -3171,6 +3220,7 @@ video_force_aspect = "true" video_force_srgb_disable = "false" video_frame_delay = "0" video_frame_delay_auto = "false" +video_frame_rest = "false" video_fullscreen = "true" video_fullscreen_x = "0" video_fullscreen_y = "0" @@ -3209,11 +3259,13 @@ video_rotation = "0" video_scale = "3" video_scale_integer = "false" video_scale_integer_overscale = "false" +video_scan_subframes = "false" video_shader_delay = "0" video_shader_dir = "/var/config/retroarch/shaders" video_shader_enable = "true" video_shader_preset_save_reference_enable = "true" video_shader_remember_last_dir = "false" +video_shader_subframes = "1" video_shader_watch_files = "false" video_shared_context = "false" video_smooth = "false" @@ -3239,6 +3291,9 @@ video_windowed_position_x = "0" video_windowed_position_y = "0" vrr_runloop_enable = "false" vulkan_gpu_index = "0" +webdav_password = "" +webdav_url = "" +webdav_username = "" wifi_driver = "null" wifi_enabled = "true" xmb_alpha_factor = "75" diff --git a/emu-configs/retroarch/scummvm.ini b/emu-configs/retroarch/scummvm.ini new file mode 100644 index 00000000..e32bbf21 --- /dev/null +++ b/emu-configs/retroarch/scummvm.ini @@ -0,0 +1,30 @@ +[scummvm] +libretro_hooks_clear=false +iconspath= +mute=false +speech_volume=192 +native_mt32=false +mt32_device=null +libretro_playlist_version=0 +savepath= +confirm_exit=false +gui_use_game_language=false +extrapath= +gui_scale=100 +gui_return_to_launcher_at_exit=false +gui_disable_fixed_font_scaling=false +fullscreen=true +gui_browser_show_hidden=false +browser_lastpath= +libretro_playlist_path=/var/config/retroarch/playlists +themepath= +sfx_volume=192 +music_volume=192 +autosave_period=300 +gm_device=auto +music_driver=auto +opl_driver=auto +speech_mute=false +gui_language=en +libretro_hooks_location=0 + diff --git a/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini b/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini index b4dba439..0ef87f08 100644 --- a/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini +++ b/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini @@ -47,4 +47,5 @@ main_window_stop=Ctrl+Q main_window_toggle_fullscreen=Ctrl+Return [main_window] -infoBoxEnabledWelcome=false \ No newline at end of file +confirmationBoxExitGame=false +infoBoxEnabledWelcome=false diff --git a/emu-configs/rpcs3/input_configs/global/Default.yml b/emu-configs/rpcs3/input_configs/global/Default.yml index 58f42cdf..a001bfd0 100644 --- a/emu-configs/rpcs3/input_configs/global/Default.yml +++ b/emu-configs/rpcs3/input_configs/global/Default.yml @@ -40,7 +40,241 @@ Player 1 Input: Mirrored: false Shift: 0 Motion Sensor G: - Axis: RY + Axis: RX + Mirrored: false + Shift: 0 + Pressure Intensity Button: "" + Pressure Intensity Percent: 50 + Left Stick Multiplier: 100 + Right Stick Multiplier: 100 + Left Stick Deadzone: 30 + Right Stick Deadzone: 30 + Left Trigger Threshold: 0 + Right Trigger Threshold: 0 + Left Pad Squircling Factor: 5000 + Right Pad Squircling Factor: 5000 + Color Value R: 0 + Color Value G: 0 + Color Value B: 20 + Blink LED when battery is below 20%: true + Use LED as a battery indicator: false + LED battery indicator brightness: 10 + Player LED enabled: true + Enable Large Vibration Motor: true + Enable Small Vibration Motor: true + Switch Vibration Motors: false + Mouse Movement Mode: Relative + Mouse Deadzone X Axis: 60 + Mouse Deadzone Y Axis: 60 + Mouse Acceleration X Axis: 200 + Mouse Acceleration Y Axis: 250 + Left Stick Lerp Factor: 100 + Right Stick Lerp Factor: 100 + Analog Button Lerp Factor: 100 + Trigger Lerp Factor: 100 + Device Class Type: 0 + Vendor ID: 1356 + Product ID: 616 + Buddy Device: "" +Player 2 Input: + Handler: Evdev + Device: Microsoft X-Box 360 pad 1 + Config: + Left Stick Left: LX- + Left Stick Down: LY+ + Left Stick Right: LX+ + Left Stick Up: LY- + Right Stick Left: RX- + Right Stick Down: RY+ + Right Stick Right: RX+ + Right Stick Up: RY- + Start: Start + Select: Select + PS Button: Mode + Square: X + Cross: A + Circle: B + Triangle: Y + Left: Hat0 X- + Down: Hat0 Y+ + Right: Hat0 X+ + Up: Hat0 Y- + R1: TR + R2: RZ+ + R3: Thumb R + L1: TL + L2: LZ+ + L3: Thumb L + Motion Sensor X: + Axis: X + Mirrored: false + Shift: 0 + Motion Sensor Y: + Axis: Y + Mirrored: false + Shift: 0 + Motion Sensor Z: + Axis: Z + Mirrored: false + Shift: 0 + Motion Sensor G: + Axis: RX + Mirrored: false + Shift: 0 + Pressure Intensity Button: "" + Pressure Intensity Percent: 50 + Left Stick Multiplier: 100 + Right Stick Multiplier: 100 + Left Stick Deadzone: 30 + Right Stick Deadzone: 30 + Left Trigger Threshold: 0 + Right Trigger Threshold: 0 + Left Pad Squircling Factor: 5000 + Right Pad Squircling Factor: 5000 + Color Value R: 0 + Color Value G: 0 + Color Value B: 20 + Blink LED when battery is below 20%: true + Use LED as a battery indicator: false + LED battery indicator brightness: 10 + Player LED enabled: true + Enable Large Vibration Motor: true + Enable Small Vibration Motor: true + Switch Vibration Motors: false + Mouse Movement Mode: Relative + Mouse Deadzone X Axis: 60 + Mouse Deadzone Y Axis: 60 + Mouse Acceleration X Axis: 200 + Mouse Acceleration Y Axis: 250 + Left Stick Lerp Factor: 100 + Right Stick Lerp Factor: 100 + Analog Button Lerp Factor: 100 + Trigger Lerp Factor: 100 + Device Class Type: 0 + Vendor ID: 1356 + Product ID: 616 + Buddy Device: "" +Player 3 Input: + Handler: Evdev + Device: Microsoft X-Box 360 pad 2 + Config: + Left Stick Left: LX- + Left Stick Down: LY+ + Left Stick Right: LX+ + Left Stick Up: LY- + Right Stick Left: RX- + Right Stick Down: RY+ + Right Stick Right: RX+ + Right Stick Up: RY- + Start: Start + Select: Select + PS Button: Mode + Square: X + Cross: A + Circle: B + Triangle: Y + Left: Hat0 X- + Down: Hat0 Y+ + Right: Hat0 X+ + Up: Hat0 Y- + R1: TR + R2: RZ+ + R3: Thumb R + L1: TL + L2: LZ+ + L3: Thumb L + Motion Sensor X: + Axis: X + Mirrored: false + Shift: 0 + Motion Sensor Y: + Axis: Y + Mirrored: false + Shift: 0 + Motion Sensor Z: + Axis: Z + Mirrored: false + Shift: 0 + Motion Sensor G: + Axis: RX + Mirrored: false + Shift: 0 + Pressure Intensity Button: "" + Pressure Intensity Percent: 50 + Left Stick Multiplier: 100 + Right Stick Multiplier: 100 + Left Stick Deadzone: 30 + Right Stick Deadzone: 30 + Left Trigger Threshold: 0 + Right Trigger Threshold: 0 + Left Pad Squircling Factor: 5000 + Right Pad Squircling Factor: 5000 + Color Value R: 0 + Color Value G: 0 + Color Value B: 20 + Blink LED when battery is below 20%: true + Use LED as a battery indicator: false + LED battery indicator brightness: 10 + Player LED enabled: true + Enable Large Vibration Motor: true + Enable Small Vibration Motor: true + Switch Vibration Motors: false + Mouse Movement Mode: Relative + Mouse Deadzone X Axis: 60 + Mouse Deadzone Y Axis: 60 + Mouse Acceleration X Axis: 200 + Mouse Acceleration Y Axis: 250 + Left Stick Lerp Factor: 100 + Right Stick Lerp Factor: 100 + Analog Button Lerp Factor: 100 + Trigger Lerp Factor: 100 + Device Class Type: 0 + Vendor ID: 1356 + Product ID: 616 + Buddy Device: "" +Player 4 Input: + Handler: Evdev + Device: Microsoft X-Box 360 pad 3 + Config: + Left Stick Left: LX- + Left Stick Down: LY+ + Left Stick Right: LX+ + Left Stick Up: LY- + Right Stick Left: RX- + Right Stick Down: RY+ + Right Stick Right: RX+ + Right Stick Up: RY- + Start: Start + Select: Select + PS Button: Mode + Square: X + Cross: A + Circle: B + Triangle: Y + Left: Hat0 X- + Down: Hat0 Y+ + Right: Hat0 X+ + Up: Hat0 Y- + R1: TR + R2: RZ+ + R3: Thumb R + L1: TL + L2: LZ+ + L3: Thumb L + Motion Sensor X: + Axis: X + Mirrored: false + Shift: 0 + Motion Sensor Y: + Axis: Y + Mirrored: false + Shift: 0 + Motion Sensor Z: + Axis: Z + Mirrored: false + Shift: 0 + Motion Sensor G: + Axis: RX Mirrored: false Shift: 0 Pressure Intensity Button: "" @@ -76,240 +310,6 @@ Player 1 Input: Vendor ID: 1356 Product ID: 616 Buddy Device: "" -Player 2 Input: - Handler: "Null" - Device: "Null" - Config: - Left Stick Left: "" - Left Stick Down: "" - Left Stick Right: "" - Left Stick Up: "" - Right Stick Left: "" - Right Stick Down: "" - Right Stick Right: "" - Right Stick Up: "" - Start: "" - Select: "" - PS Button: "" - Square: "" - Cross: "" - Circle: "" - Triangle: "" - Left: "" - Down: "" - Right: "" - Up: "" - R1: "" - R2: "" - R3: "" - L1: "" - L2: "" - L3: "" - Motion Sensor X: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor Y: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor Z: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor G: - Axis: "" - Mirrored: false - Shift: 0 - Pressure Intensity Button: "" - Pressure Intensity Percent: 50 - Left Stick Multiplier: 100 - Right Stick Multiplier: 100 - Left Stick Deadzone: 0 - Right Stick Deadzone: 0 - Left Trigger Threshold: 0 - Right Trigger Threshold: 0 - Left Pad Squircling Factor: 0 - Right Pad Squircling Factor: 0 - Color Value R: 0 - Color Value G: 0 - Color Value B: 0 - Blink LED when battery is below 20%: true - Use LED as a battery indicator: false - LED battery indicator brightness: 50 - Player LED enabled: true - Enable Large Vibration Motor: true - Enable Small Vibration Motor: true - Switch Vibration Motors: false - Mouse Movement Mode: Relative - Mouse Deadzone X Axis: 60 - Mouse Deadzone Y Axis: 60 - Mouse Acceleration X Axis: 200 - Mouse Acceleration Y Axis: 250 - Left Stick Lerp Factor: 100 - Right Stick Lerp Factor: 100 - Analog Button Lerp Factor: 100 - Trigger Lerp Factor: 100 - Device Class Type: 0 - Vendor ID: 0 - Product ID: 0 - Buddy Device: "Null" -Player 3 Input: - Handler: "Null" - Device: "Null" - Config: - Left Stick Left: "" - Left Stick Down: "" - Left Stick Right: "" - Left Stick Up: "" - Right Stick Left: "" - Right Stick Down: "" - Right Stick Right: "" - Right Stick Up: "" - Start: "" - Select: "" - PS Button: "" - Square: "" - Cross: "" - Circle: "" - Triangle: "" - Left: "" - Down: "" - Right: "" - Up: "" - R1: "" - R2: "" - R3: "" - L1: "" - L2: "" - L3: "" - Motion Sensor X: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor Y: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor Z: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor G: - Axis: "" - Mirrored: false - Shift: 0 - Pressure Intensity Button: "" - Pressure Intensity Percent: 50 - Left Stick Multiplier: 100 - Right Stick Multiplier: 100 - Left Stick Deadzone: 0 - Right Stick Deadzone: 0 - Left Trigger Threshold: 0 - Right Trigger Threshold: 0 - Left Pad Squircling Factor: 0 - Right Pad Squircling Factor: 0 - Color Value R: 0 - Color Value G: 0 - Color Value B: 0 - Blink LED when battery is below 20%: true - Use LED as a battery indicator: false - LED battery indicator brightness: 50 - Player LED enabled: true - Enable Large Vibration Motor: true - Enable Small Vibration Motor: true - Switch Vibration Motors: false - Mouse Movement Mode: Relative - Mouse Deadzone X Axis: 60 - Mouse Deadzone Y Axis: 60 - Mouse Acceleration X Axis: 200 - Mouse Acceleration Y Axis: 250 - Left Stick Lerp Factor: 100 - Right Stick Lerp Factor: 100 - Analog Button Lerp Factor: 100 - Trigger Lerp Factor: 100 - Device Class Type: 0 - Vendor ID: 0 - Product ID: 0 - Buddy Device: "Null" -Player 4 Input: - Handler: "Null" - Device: "Null" - Config: - Left Stick Left: "" - Left Stick Down: "" - Left Stick Right: "" - Left Stick Up: "" - Right Stick Left: "" - Right Stick Down: "" - Right Stick Right: "" - Right Stick Up: "" - Start: "" - Select: "" - PS Button: "" - Square: "" - Cross: "" - Circle: "" - Triangle: "" - Left: "" - Down: "" - Right: "" - Up: "" - R1: "" - R2: "" - R3: "" - L1: "" - L2: "" - L3: "" - Motion Sensor X: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor Y: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor Z: - Axis: "" - Mirrored: false - Shift: 0 - Motion Sensor G: - Axis: "" - Mirrored: false - Shift: 0 - Pressure Intensity Button: "" - Pressure Intensity Percent: 50 - Left Stick Multiplier: 100 - Right Stick Multiplier: 100 - Left Stick Deadzone: 0 - Right Stick Deadzone: 0 - Left Trigger Threshold: 0 - Right Trigger Threshold: 0 - Left Pad Squircling Factor: 0 - Right Pad Squircling Factor: 0 - Color Value R: 0 - Color Value G: 0 - Color Value B: 0 - Blink LED when battery is below 20%: true - Use LED as a battery indicator: false - LED battery indicator brightness: 50 - Player LED enabled: true - Enable Large Vibration Motor: true - Enable Small Vibration Motor: true - Switch Vibration Motors: false - Mouse Movement Mode: Relative - Mouse Deadzone X Axis: 60 - Mouse Deadzone Y Axis: 60 - Mouse Acceleration X Axis: 200 - Mouse Acceleration Y Axis: 250 - Left Stick Lerp Factor: 100 - Right Stick Lerp Factor: 100 - Analog Button Lerp Factor: 100 - Trigger Lerp Factor: 100 - Device Class Type: 0 - Vendor ID: 0 - Product ID: 0 - Buddy Device: "Null" Player 5 Input: Handler: "Null" Device: "Null" @@ -385,9 +385,9 @@ Player 5 Input: Analog Button Lerp Factor: 100 Trigger Lerp Factor: 100 Device Class Type: 0 - Vendor ID: 0 - Product ID: 0 - Buddy Device: "Null" + Vendor ID: 1356 + Product ID: 616 + Buddy Device: "" Player 6 Input: Handler: "Null" Device: "Null" @@ -465,7 +465,7 @@ Player 6 Input: Device Class Type: 0 Vendor ID: 0 Product ID: 0 - Buddy Device: "Null" + Buddy Device: "" Player 7 Input: Handler: "Null" Device: "Null" @@ -543,4 +543,4 @@ Player 7 Input: Device Class Type: 0 Vendor ID: 0 Product ID: 0 - Buddy Device: "Null" \ No newline at end of file + Buddy Device: "" diff --git a/emu-configs/ryujinx/Config.json b/emu-configs/ryujinx/Config.json index e58b6ead..f08820fa 100644 --- a/emu-configs/ryujinx/Config.json +++ b/emu-configs/ryujinx/Config.json @@ -1,5 +1,5 @@ { - "version": 48, + "version": 49, "enable_file_log": true, "backend_threading": "Auto", "res_scale": 1, @@ -12,7 +12,7 @@ "graphics_shaders_dump_path": "", "logging_enable_debug": false, "logging_enable_stub": false, - "logging_enable_info": true, + "logging_enable_info": false, "logging_enable_warn": true, "logging_enable_error": true, "logging_enable_trace": false, @@ -28,7 +28,7 @@ "enable_discord_integration": true, "check_updates_on_start": false, "show_confirm_exit": false, - "hide_cursor": 2, + "hide_cursor": 1, "enable_vsync": true, "enable_shader_cache": true, "enable_texture_recompression": false, @@ -38,7 +38,7 @@ "enable_internet_access": false, "enable_fs_integrity_checks": true, "fs_global_access_log_mode": 0, - "audio_backend": "OpenAl", + "audio_backend": "SDL2", "audio_volume": 1, "memory_manager_mode": "HostMappedUnsafe", "expand_ram": false, @@ -72,10 +72,10 @@ }, "window_startup": { "window_size_width": 1280, - "window_size_height": 800, + "window_size_height": 760, "window_position_x": 0, "window_position_y": 0, - "window_maximized": true + "window_maximized": false }, "language_code": "en_US", "enable_custom_theme": false, @@ -91,7 +91,7 @@ "enable_keyboard": false, "enable_mouse": false, "hotkeys": { - "toggle_vsync": "F1", + "toggle_vsync": "Tab", "screenshot": "F8", "show_ui": "F4", "pause": "F5", @@ -119,13 +119,18 @@ "rotate90_cw": false, "stick_button": "RightStick" }, - "deadzone_left": 0, - "deadzone_right": 0, + "deadzone_left": 0.1, + "deadzone_right": 0.1, "range_left": 1, "range_right": 1, "trigger_threshold": 0.5, "motion": { - "motion_backend": "GamepadDriver", + "slot": 0, + "alt_slot": 0, + "mirror_input": false, + "dsu_server_host": "127.0.0.1", + "dsu_server_port": 26760, + "motion_backend": "CemuHook", "sensitivity": 100, "gyro_deadzone": 1, "enable_motion": true @@ -136,7 +141,7 @@ "enable_rumble": true }, "left_joycon": { - "button_minus": "Minus", + "button_minus": "Back", "button_l": "LeftShoulder", "button_zl": "LeftTrigger", "button_sl": "Unbound", @@ -147,7 +152,7 @@ "dpad_right": "DpadRight" }, "right_joycon": { - "button_plus": "Plus", + "button_plus": "Start", "button_r": "RightShoulder", "button_zr": "RightTrigger", "button_sl": "Unbound", @@ -160,12 +165,13 @@ "version": 1, "backend": "GamepadSDL2", "id": "0-f6790003-28de-0000-ff11-000001000000", - "controller_type": "Handheld", - "player_index": "Handheld" - } + "controller_type": "ProController", + "player_index": "Player1" + }, ], "graphics_backend": "Vulkan", "preferred_gpu": "0x1002_0x163F", + "multiplayer_mode": 0, "multiplayer_lan_interface_id": "0", "use_hypervisor": true } diff --git a/emu-configs/ryujinx/profiles/controller/Steam Deck - Neptune.json b/emu-configs/ryujinx/profiles/controller/Steam Deck - Neptune.json new file mode 100644 index 00000000..9e698271 --- /dev/null +++ b/emu-configs/ryujinx/profiles/controller/Steam Deck - Neptune.json @@ -0,0 +1,64 @@ +{ + "left_joycon_stick": { + "joystick": "Left", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "LeftStick" + }, + "right_joycon_stick": { + "joystick": "Right", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "RightStick" + }, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, + "range_right": 1, + "trigger_threshold": 0.5, + "motion": { + "slot": 0, + "alt_slot": 0, + "mirror_input": false, + "dsu_server_host": "172.0.0.1", + "dsu_server_port": 26760, + "motion_backend": "CemuHook", + "sensitivity": 100, + "gyro_deadzone": 1, + "enable_motion": true + }, + "rumble": { + "strong_rumble": 1, + "weak_rumble": 1, + "enable_rumble": true + }, + "left_joycon": { + "button_minus": "Back", + "button_l": "LeftShoulder", + "button_zl": "LeftTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "dpad_up": "DpadUp", + "dpad_down": "DpadDown", + "dpad_left": "DpadLeft", + "dpad_right": "DpadRight" + }, + "right_joycon": { + "button_plus": "Start", + "button_r": "RightShoulder", + "button_zr": "RightTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" + }, + "version": 1, + "backend": "GamepadSDL2", + "id": "0-f6790003-28de-0000-ff11-000001000000", + "controller_type": "ProController", + "player_index": "Player1" +} diff --git a/emu-configs/ryujinx/profiles/controller/Steam Virtual Controller.json b/emu-configs/ryujinx/profiles/controller/Steam Virtual Controller.json new file mode 100644 index 00000000..30326c5e --- /dev/null +++ b/emu-configs/ryujinx/profiles/controller/Steam Virtual Controller.json @@ -0,0 +1,64 @@ +{ + "left_joycon_stick": { + "joystick": "Left", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "LeftStick" + }, + "right_joycon_stick": { + "joystick": "Right", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "RightStick" + }, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, + "range_right": 1, + "trigger_threshold": 0.5, + "motion": { + "slot": 0, + "alt_slot": 0, + "mirror_input": false, + "dsu_server_host": "172.0.0.1", + "dsu_server_port": 26760, + "motion_backend": "CemuHook", + "sensitivity": 100, + "gyro_deadzone": 1, + "enable_motion": false + }, + "rumble": { + "strong_rumble": 1, + "weak_rumble": 1, + "enable_rumble": true + }, + "left_joycon": { + "button_minus": "Back", + "button_l": "LeftShoulder", + "button_zl": "LeftTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "dpad_up": "DpadUp", + "dpad_down": "DpadDown", + "dpad_left": "DpadLeft", + "dpad_right": "DpadRight" + }, + "right_joycon": { + "button_plus": "Start", + "button_r": "RightShoulder", + "button_zr": "RightTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" + }, + "version": 1, + "backend": "GamepadSDL2", + "id": "0-f7390003-28de-0000-ff11-000001000000", + "controller_type": "ProController", + "player_index": "Player1" +} diff --git a/emu-configs/yuzu/qt-config.ini b/emu-configs/yuzu/qt-config.ini index a1e63a4d..8fbb3621 100644 --- a/emu-configs/yuzu/qt-config.ini +++ b/emu-configs/yuzu/qt-config.ini @@ -81,7 +81,7 @@ motion_enabled=true motion_enabled\default=true mouse_enabled=false mouse_enabled\default=true -mouse_panning_sensitivity=50 +mouse_panning_sensitivity=10 mouse_panning_sensitivity\default=true pause_tas_on_load=true pause_tas_on_load\default=true @@ -89,59 +89,59 @@ player_0_body_color_left=4278893030 player_0_body_color_left\default=false player_0_body_color_right=4294917160 player_0_body_color_right\default=false -player_0_button_a="pad:0,button:1,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_a="button:1,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_a\default=false -player_0_button_b="pad:0,button:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_b="button:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_b\default=false player_0_button_color_left=4278197790 player_0_button_color_left\default=false player_0_button_color_right=4280158730 player_0_button_color_right\default=false -player_0_button_ddown="hat:0,pad:0,direction:down,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_ddown\default=false -player_0_button_dleft="hat:0,pad:0,direction:left,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_dleft\default=false -player_0_button_dright="hat:0,pad:0,direction:right,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_dright\default=false -player_0_button_dup="hat:0,pad:0,direction:up,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_dup\default=false -player_0_button_home="engine:keyboard,port:0,pad:0,code:76" +player_0_button_home="button:8,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_home\default=false -player_0_button_l="pad:0,button:4,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_l="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_l\default=false -player_0_button_lstick="pad:0,button:9,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_lstick\default=false -player_0_button_minus="pad:0,button:6,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_minus="button:6,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_minus\default=false -player_0_button_plus="pad:0,button:7,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_plus="button:7,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_plus\default=false -player_0_button_r="pad:0,button:5,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_r="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_r\default=false -player_0_button_rstick="pad:0,button:10,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_rstick\default=false -player_0_button_screenshot="engine:keyboard,port:0,pad:0,code:82" +player_0_button_screenshot=[empty] player_0_button_screenshot\default=false -player_0_button_sl="toggle:0,code:81,engine:keyboard" -player_0_button_sl\default=true -player_0_button_sr="toggle:0,code:69,engine:keyboard" -player_0_button_sr\default=true -player_0_button_x="pad:0,button:3,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_sl="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_sl\default=false +player_0_button_sr="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl" +player_0_button_sr\default=false +player_0_button_x="button:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_x\default=false -player_0_button_y="pad:0,button:2,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_y="button:2,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_button_y\default=false -player_0_button_zl="threshold:0.500000,axis:2,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl" player_0_button_zl\default=false -player_0_button_zr="threshold:0.500000,axis:5,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl" player_0_button_zr\default=false player_0_connected=true player_0_connected\default=true -player_0_lstick="range:0.950000,deadzone:0.150000,threshold:0.500000,axis_y:1,axis_x:0,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_lstick\default=false -player_0_motionleft="toggle:0,code:55,engine:keyboard" -player_0_motionleft\default=true -player_0_motionright="toggle:0,code:56,engine:keyboard" -player_0_motionright\default=true -player_0_rstick="range:0.950000,deadzone:0.150000,threshold:0.500000,axis_y:4,axis_x:3,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl" +player_0_motionleft="motion:0,pad:0,port:26760,guid:0000000000000000000000007f000001,engine:cemuhookudp" +player_0_motionleft\default=false +player_0_motionright=[empty] +player_0_motionright\default=false +player_0_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl" player_0_rstick\default=false player_0_type=0 player_0_type\default=true @@ -153,60 +153,60 @@ player_1_body_color_left=4278893030 player_1_body_color_left\default=false player_1_body_color_right=4294917160 player_1_body_color_right\default=false -player_1_button_a="toggle:0,code:67,engine:keyboard" -player_1_button_a\default=true -player_1_button_b="toggle:0,code:88,engine:keyboard" -player_1_button_b\default=true +player_1_button_a="button:1,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_a\default=false +player_1_button_b="button:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_b\default=false player_1_button_color_left=4278197790 player_1_button_color_left\default=false player_1_button_color_right=4280158730 player_1_button_color_right\default=false -player_1_button_ddown="toggle:0,code:16777237,engine:keyboard" -player_1_button_ddown\default=true -player_1_button_dleft="toggle:0,code:16777234,engine:keyboard" -player_1_button_dleft\default=true -player_1_button_dright="toggle:0,code:16777236,engine:keyboard" -player_1_button_dright\default=true -player_1_button_dup="toggle:0,code:16777235,engine:keyboard" -player_1_button_dup\default=true -player_1_button_home="toggle:0,code:0,engine:keyboard" -player_1_button_home\default=true -player_1_button_l="toggle:0,code:81,engine:keyboard" -player_1_button_l\default=true -player_1_button_lstick="toggle:0,code:70,engine:keyboard" -player_1_button_lstick\default=true -player_1_button_minus="toggle:0,code:78,engine:keyboard" -player_1_button_minus\default=true -player_1_button_plus="toggle:0,code:77,engine:keyboard" -player_1_button_plus\default=true -player_1_button_r="toggle:0,code:69,engine:keyboard" -player_1_button_r\default=true -player_1_button_rstick="toggle:0,code:71,engine:keyboard" -player_1_button_rstick\default=true -player_1_button_screenshot="toggle:0,code:0,engine:keyboard" -player_1_button_screenshot\default=true -player_1_button_sl="toggle:0,code:81,engine:keyboard" -player_1_button_sl\default=true -player_1_button_sr="toggle:0,code:69,engine:keyboard" -player_1_button_sr\default=true -player_1_button_x="toggle:0,code:86,engine:keyboard" -player_1_button_x\default=true -player_1_button_y="toggle:0,code:90,engine:keyboard" -player_1_button_y\default=true -player_1_button_zl="toggle:0,code:82,engine:keyboard" -player_1_button_zl\default=true -player_1_button_zr="toggle:0,code:84,engine:keyboard" -player_1_button_zr\default=true -player_1_connected=false -player_1_connected\default=true -player_1_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" -player_1_lstick\default=true -player_1_motionleft="toggle:0,code:55,engine:keyboard" -player_1_motionleft\default=true -player_1_motionright="toggle:0,code:56,engine:keyboard" -player_1_motionright\default=true -player_1_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" -player_1_rstick\default=true +player_1_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_ddown\default=false +player_1_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_dleft\default=false +player_1_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_dright\default=false +player_1_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_dup\default=false +player_1_button_home="button:8,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_home\default=false +player_1_button_l="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_l\default=false +player_1_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_lstick\default=false +player_1_button_minus="button:6,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_minus\default=false +player_1_button_plus="button:7,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_plus\default=false +player_1_button_r="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_r\default=false +player_1_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_rstick\default=false +player_1_button_screenshot=[empty] +player_1_button_screenshot\default=false +player_1_button_sl="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_sl\default=false +player_1_button_sr="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_sr\default=false +player_1_button_x="button:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_x\default=false +player_1_button_y="button:2,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_button_y\default=false +player_1_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl" +player_1_button_zl\default=false +player_1_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl" +player_1_button_zr\default=false +player_1_connected=true +player_1_connected\default=false +player_1_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_lstick\default=false +player_1_motionleft=[empty] +player_1_motionleft\default=false +player_1_motionright=[empty] +player_1_motionright\default=false +player_1_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl" +player_1_rstick\default=false player_1_type=0 player_1_type\default=true player_1_vibration_enabled=true @@ -217,60 +217,60 @@ player_2_body_color_left=4278893030 player_2_body_color_left\default=false player_2_body_color_right=4294917160 player_2_body_color_right\default=false -player_2_button_a="toggle:0,code:67,engine:keyboard" -player_2_button_a\default=true -player_2_button_b="toggle:0,code:88,engine:keyboard" -player_2_button_b\default=true +player_2_button_a="button:1,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_a\default=false +player_2_button_b="button:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_b\default=false player_2_button_color_left=4278197790 player_2_button_color_left\default=false player_2_button_color_right=4280158730 player_2_button_color_right\default=false -player_2_button_ddown="toggle:0,code:16777237,engine:keyboard" -player_2_button_ddown\default=true -player_2_button_dleft="toggle:0,code:16777234,engine:keyboard" -player_2_button_dleft\default=true -player_2_button_dright="toggle:0,code:16777236,engine:keyboard" -player_2_button_dright\default=true -player_2_button_dup="toggle:0,code:16777235,engine:keyboard" -player_2_button_dup\default=true -player_2_button_home="toggle:0,code:0,engine:keyboard" -player_2_button_home\default=true -player_2_button_l="toggle:0,code:81,engine:keyboard" -player_2_button_l\default=true -player_2_button_lstick="toggle:0,code:70,engine:keyboard" -player_2_button_lstick\default=true -player_2_button_minus="toggle:0,code:78,engine:keyboard" -player_2_button_minus\default=true -player_2_button_plus="toggle:0,code:77,engine:keyboard" -player_2_button_plus\default=true -player_2_button_r="toggle:0,code:69,engine:keyboard" -player_2_button_r\default=true -player_2_button_rstick="toggle:0,code:71,engine:keyboard" -player_2_button_rstick\default=true -player_2_button_screenshot="toggle:0,code:0,engine:keyboard" -player_2_button_screenshot\default=true -player_2_button_sl="toggle:0,code:81,engine:keyboard" -player_2_button_sl\default=true -player_2_button_sr="toggle:0,code:69,engine:keyboard" -player_2_button_sr\default=true -player_2_button_x="toggle:0,code:86,engine:keyboard" -player_2_button_x\default=true -player_2_button_y="toggle:0,code:90,engine:keyboard" -player_2_button_y\default=true -player_2_button_zl="toggle:0,code:82,engine:keyboard" -player_2_button_zl\default=true -player_2_button_zr="toggle:0,code:84,engine:keyboard" -player_2_button_zr\default=true -player_2_connected=false -player_2_connected\default=true -player_2_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" -player_2_lstick\default=true -player_2_motionleft="toggle:0,code:55,engine:keyboard" -player_2_motionleft\default=true -player_2_motionright="toggle:0,code:56,engine:keyboard" -player_2_motionright\default=true -player_2_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" -player_2_rstick\default=true +player_2_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_ddown\default=false +player_2_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_dleft\default=false +player_2_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_dright\default=false +player_2_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_dup\default=false +player_2_button_home="button:8,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_home\default=false +player_2_button_l="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_l\default=false +player_2_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_lstick\default=false +player_2_button_minus="button:6,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_minus\default=false +player_2_button_plus="button:7,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_plus\default=false +player_2_button_r="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_r\default=false +player_2_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_rstick\default=false +player_2_button_screenshot=[empty] +player_2_button_screenshot\default=false +player_2_button_sl="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_sl\default=false +player_2_button_sr="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_sr\default=false +player_2_button_x="button:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_x\default=false +player_2_button_y="button:2,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_button_y\default=false +player_2_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl" +player_2_button_zl\default=false +player_2_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl" +player_2_button_zr\default=false +player_2_connected=true +player_2_connected\default=false +player_2_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_lstick\default=false +player_2_motionleft=[empty] +player_2_motionleft\default=false +player_2_motionright=[empty] +player_2_motionright\default=false +player_2_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl" +player_2_rstick\default=false player_2_type=0 player_2_type\default=true player_2_vibration_enabled=true @@ -281,60 +281,60 @@ player_3_body_color_left=4278893030 player_3_body_color_left\default=false player_3_body_color_right=4294917160 player_3_body_color_right\default=false -player_3_button_a="toggle:0,code:67,engine:keyboard" -player_3_button_a\default=true -player_3_button_b="toggle:0,code:88,engine:keyboard" -player_3_button_b\default=true +player_3_button_a="button:1,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_a\default=false +player_3_button_b="button:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_b\default=false player_3_button_color_left=4278197790 player_3_button_color_left\default=false player_3_button_color_right=4280158730 player_3_button_color_right\default=false -player_3_button_ddown="toggle:0,code:16777237,engine:keyboard" -player_3_button_ddown\default=true -player_3_button_dleft="toggle:0,code:16777234,engine:keyboard" -player_3_button_dleft\default=true -player_3_button_dright="toggle:0,code:16777236,engine:keyboard" -player_3_button_dright\default=true -player_3_button_dup="toggle:0,code:16777235,engine:keyboard" -player_3_button_dup\default=true -player_3_button_home="toggle:0,code:0,engine:keyboard" -player_3_button_home\default=true -player_3_button_l="toggle:0,code:81,engine:keyboard" -player_3_button_l\default=true -player_3_button_lstick="toggle:0,code:70,engine:keyboard" -player_3_button_lstick\default=true -player_3_button_minus="toggle:0,code:78,engine:keyboard" -player_3_button_minus\default=true -player_3_button_plus="toggle:0,code:77,engine:keyboard" -player_3_button_plus\default=true -player_3_button_r="toggle:0,code:69,engine:keyboard" -player_3_button_r\default=true -player_3_button_rstick="toggle:0,code:71,engine:keyboard" -player_3_button_rstick\default=true -player_3_button_screenshot="toggle:0,code:0,engine:keyboard" -player_3_button_screenshot\default=true -player_3_button_sl="toggle:0,code:81,engine:keyboard" -player_3_button_sl\default=true -player_3_button_sr="toggle:0,code:69,engine:keyboard" -player_3_button_sr\default=true -player_3_button_x="toggle:0,code:86,engine:keyboard" -player_3_button_x\default=true -player_3_button_y="toggle:0,code:90,engine:keyboard" -player_3_button_y\default=true -player_3_button_zl="toggle:0,code:82,engine:keyboard" -player_3_button_zl\default=true -player_3_button_zr="toggle:0,code:84,engine:keyboard" -player_3_button_zr\default=true -player_3_connected=false -player_3_connected\default=true -player_3_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button" -player_3_lstick\default=true -player_3_motionleft="toggle:0,code:55,engine:keyboard" -player_3_motionleft\default=true -player_3_motionright="toggle:0,code:56,engine:keyboard" -player_3_motionright\default=true -player_3_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button" -player_3_rstick\default=true +player_3_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_ddown\default=false +player_3_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_dleft\default=false +player_3_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_dright\default=false +player_3_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_dup\default=false +player_3_button_home="button:8,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_home\default=false +player_3_button_l="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_l\default=false +player_3_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_lstick\default=false +player_3_button_minus="button:6,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_minus\default=false +player_3_button_plus="button:7,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_plus\default=false +player_3_button_r="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_r\default=false +player_3_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_rstick\default=false +player_3_button_screenshot=[empty] +player_3_button_screenshot\default=false +player_3_button_sl="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_sl\default=false +player_3_button_sr="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_sr\default=false +player_3_button_x="button:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_x\default=false +player_3_button_y="button:2,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_button_y\default=false +player_3_button_zl="threshold:0.5,axis:2,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl" +player_3_button_zl\default=false +player_3_button_zr="threshold:0.5,axis:5,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl" +player_3_button_zr\default=false +player_3_connected=true +player_3_connected\default=false +player_3_lstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_lstick\default=false +player_3_motionleft=[empty] +player_3_motionleft\default=false +player_3_motionright=[empty] +player_3_motionright\default=false +player_3_rstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl" +player_3_rstick\default=false player_3_type=0 player_3_type\default=true player_3_vibration_enabled=true @@ -749,8 +749,8 @@ touchscreen_enabled=true touchscreen_enabled\default=true udp_input_servers=127.0.0.1:26760 udp_input_servers\default=true -use_docked_mode=true -use_docked_mode\default=true +use_docked_mode=false +use_docked_mode\default=false vibration_enabled=true vibration_enabled\default=true @@ -815,9 +815,9 @@ gamecard_path= gamecard_path\default=true load_directory=/var/data/yuzu/load load_directory\default=true -nand_directory=RETRODECKHOMEDIR/saves/switch/yuzu/nand +nand_directory=RETRODECKHOMEDIR/saves/switch/nand nand_directory\default=true -sdmc_directory=RETRODECKHOMEDIR/saves/switch/yuzu/sdmc +sdmc_directory=RETRODECKHOMEDIR/saves/switch/sdmc sdmc_directory\default=true tas_directory=/var/data/yuzu/tas tas_directory\default=true @@ -865,6 +865,30 @@ log_filter\default=true use_dev_keys=false use_dev_keys\default=true +[Multiplayer] +game_id=0 +game_id\default=true +host_type=0 +host_type\default=true +ip= +ip\default=true +ip_ban_list\size=0 +max_player=8 +max_player\default=true +nickname= +nickname\default=true +port=24872 +port\default=true +room_description= +room_description\default=true +room_name= +room_name\default=true +room_nickname=RetroDECK +room_nickname\default=true +room_port=24872 +room_port\default=true +username_ban_list\size=0 + [Renderer] accelerate_astc=true accelerate_astc\default=true @@ -893,17 +917,17 @@ fsr_sharpening_slider\default=true fullscreen_mode=1 fullscreen_mode\default=true gpu_accuracy=0 -gpu_accuracy\default=true -max_anisotropy=0 -max_anisotropy\default=true +gpu_accuracy\default=false +max_anisotropy=1 +max_anisotropy\default=false nsight_aftermath=false nsight_aftermath\default=true nvdec_emulation=2 nvdec_emulation\default=true resolution_setup=2 resolution_setup\default=true -scaling_filter=1 -scaling_filter\default=true +scaling_filter=5 +scaling_filter\default=false shader_backend=0 shader_backend\default=true shader_feedback=false @@ -912,8 +936,8 @@ speed_limit=100 speed_limit\default=true use_asynchronous_gpu_emulation=true use_asynchronous_gpu_emulation\default=true -use_asynchronous_shaders=false -use_asynchronous_shaders\default=true +use_asynchronous_shaders=true +use_asynchronous_shaders\default=false use_disk_shader_cache=true use_disk_shader_cache\default=true use_fast_gpu_time=true @@ -1245,9 +1269,9 @@ theme\default=false [WebService] enable_telemetry=false enable_telemetry\default=false -web_api_url=https://api.yuzu-emu.org +web_api_url= web_api_url\default=true yuzu_token= yuzu_token\default=true yuzu_username=RetroDECK -yuzu_username\default=true \ No newline at end of file +yuzu_username\default=true diff --git a/es-configs/es_find_rules.xml b/es-configs/es_find_rules.xml deleted file mode 100644 index 112a4a40..00000000 --- a/es-configs/es_find_rules.xml +++ /dev/null @@ -1,1085 +0,0 @@ - - - - - - - bash - sh - - - - - retroarch - org.libretro.RetroArch - - - ~/Applications/RetroArch-Linux*.AppImage - ~/.local/share/applications/RetroArch-Linux*.AppImage - ~/.local/bin/RetroArch-Linux*.AppImage - ~/bin/RetroArch-Linux*.AppImage - /var/lib/flatpak/exports/bin/org.libretro.RetroArch - ~/.local/share/flatpak/exports/bin/org.libretro.RetroArch - - - - - /app/share/libretro/cores - - ~/.config/retroarch/cores - - ~/Applications/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores - ~/.local/share/applications/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores - ~/.local/bin/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores - ~/bin/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores - - ~/.var/app/org.libretro.RetroArch/config/retroarch/cores - - ~/snap/retroarch/current/.config/retroarch/cores - - /usr/lib/x86_64-linux-gnu/libretro - - /usr/lib64/libretro - - /usr/lib/libretro - - - - - - ~/Applications/3dSen/3dSen.exe - ~/.local/share/applications/3dSen/3dSen.exe - ~/.local/bin/3dSen/3dSen.exe - ~/bin/3dSen/3dSen.exe - - - - - - advmame - - - ~/Applications/advancemame/advmame - ~/.local/share/applications/advancemame/advmame - ~/.local/bin/advancemame/advmame - ~/bin/advancemame/advmame - - - - - - amiberry - - - ~/Applications/amiberry/amiberry - ~/.local/share/applications/amiberry/amiberry - ~/.local/bin/amiberry/amiberry - ~/bin/amiberry/amiberry - - - - - - ares - dev.ares.ares - - - /var/lib/flatpak/exports/bin/dev.ares.ares - ~/.local/share/flatpak/exports/bin/dev.ares.ares - - - - - - atari800 - atari800-jz.atari800 - - - - - - BasiliskII - net.cebix.basilisk - - - ~/Applications/BasiliskII*.AppImage - ~/.local/share/applications/BasiliskII*.AppImage - ~/.local/bin/BasiliskII*.AppImage - ~/bin/BasiliskII*.AppImage - /var/lib/flatpak/exports/bin/net.cebix.basilisk - ~/.local/share/flatpak/exports/bin/net.cebix.basilisk - - - - - - ~/Applications/BigPEmu/BigPEmu.exe - ~/.local/share/applications/BigPEmu/BigPEmu.exe - ~/.local/bin/BigPEmu/BigPEmu.exe - ~/bin/BigPEmu/BigPEmu.exe - - - - - - blastem - com.retrodev.blastem - - - /var/lib/flatpak/exports/bin/com.retrodev.blastem - ~/.local/share/flatpak/exports/bin/com.retrodev.blastem - - - - - - bsnes - dev.bsnes.bsnes - - - /var/lib/flatpak/exports/bin/dev.bsnes.bsnes - ~/.local/share/flatpak/exports/bin/dev.bsnes.bsnes - - - - - - Cemu-wrapper - cemu - Cemu - - - ~/Applications/Cemu*.AppImage - ~/.local/share/applications/Cemu*.AppImage - ~/.local/bin/Cemu*.AppImage - ~/bin/Cemu*.AppImage - ~/Applications/Cemu/Cemu - ~/.local/share/applications/Cemu/Cemu - ~/.local/bin/Cemu/Cemu - ~/bin/Cemu/Cemu - /var/lib/flatpak/exports/bin/info.cemu.Cemu - ~/.local/share/flatpak/exports/bin/info.cemu.Cemu - - - - - - citra-qt - citra - citra-emu.citra-nightly - org.citra_emu.citra - - - ~/Applications/citra-qt*.AppImage - ~/.local/share/applications/citra-qt*.AppImage - ~/.local/bin/citra-qt*.AppImage - ~/bin/citra-qt*.AppImage - ~/.citra/canary/citra-qt.AppImage - ~/.citra/nightly/citra-qt.AppImage - /var/lib/flatpak/exports/bin/org.citra_emu.citra - ~/.local/share/flatpak/exports/bin/org.citra_emu.citra - - - - - - cpcemu - - - ~/Applications/cpcemu/cpcemu - ~/.local/share/applications/cpcemu/cpcemu - ~/.local/bin/cpcemu/cpcemu - ~/bin/cpcemu/cpcemu - - - - - - ~/Applications/CSpect/CSpect.exe - ~/.local/share/applications/CSpect/CSpect.exe - ~/.local/bin/CSpect/CSpect.exe - ~/bin/CSpect/CSpect.exe - - - - - - desmume - org.desmume.DeSmuME - - - /var/lib/flatpak/exports/bin/org.desmume.DeSmuME - ~/.local/share/flatpak/exports/bin/org.desmume.DeSmuME - - - - - - dolphin-emu - dolphin-emulator.dolphin-emu - org.DolphinEmu.dolphin-emu - - - ~/Applications/Dolphin_Emulator*.AppImage - ~/.local/share/applications/Dolphin_Emulator*.AppImage - ~/.local/bin/Dolphin_Emulator*.AppImage - ~/bin/Dolphin_Emulator*.AppImage - /var/lib/flatpak/exports/bin/org.DolphinEmu.dolphin-emu - ~/.local/share/flatpak/exports/bin/org.DolphinEmu.dolphin-emu - - - - - - dosbox-staging - io.github.dosbox-staging - - - /var/lib/flatpak/exports/bin/io.github.dosbox-staging - ~/.local/share/flatpak/exports/bin/io.github.dosbox-staging - - - - - - dosbox-x - com.dosbox_x.DOSBox-X - - - /var/lib/flatpak/exports/bin/com.dosbox_x.DOSBox-X - ~/.local/share/flatpak/exports/bin/com.dosbox_x.DOSBox-X - - - - - - duckstation-nogui - duckstation-qt - org.duckstation.DuckStation - - - ~/Applications/DuckStation*.AppImage - ~/.local/share/applications/DuckStation*.AppImage - ~/.local/bin/DuckStation*.AppImage - ~/bin/DuckStation*.AppImage - ~/Applications/duckstation-nogui*.AppImage - ~/.local/share/applications/duckstation-nogui*.AppImage - ~/.local/bin/duckstation-nogui*.AppImage - ~/bin/duckstation-nogui*.AppImage - ~/Applications/duckstation-qt*.AppImage - ~/.local/share/applications/duckstation-qt*.AppImage - ~/.local/bin/duckstation-qt*.AppImage - ~/bin/duckstation-qt*.AppImage - /var/lib/flatpak/exports/bin/org.duckstation.DuckStation - ~/.local/share/flatpak/exports/bin/org.duckstation.DuckStation - - - - - - easyrpg-player - - - ~/Applications/easyrpg/easyrpg-player - ~/.local/share/applications/easyrpg/easyrpg-player - ~/.local/bin/easyrpg/easyrpg-player - ~/bin/easyrpg/easyrpg-player - - - - - - eka2l1_qt - - - ~/Applications/EKA2L1*.AppImage - ~/.local/share/applications/EKA2L1*.AppImage - ~/.local/bin/EKA2L1*.AppImage - ~/bin/EKA2L1*.AppImage - - - - - - ~/Applications/EKA2L1/eka2l1_qt.exe - ~/.local/share/applications/EKA2L1/eka2l1_qt.exe - ~/.local/bin/EKA2L1/eka2l1_qt.exe - ~/bin/EKA2L1/eka2l1_qt.exe - - - - - - fbneo - - - ~/Applications/fbneo/fbneo - ~/.local/share/applications/fbneo/fbneo - ~/.local/bin/fbneo/fbneo - ~/bin/fbneo/fbneo - - - - - - flycast - org.flycast.Flycast - - - ~/Applications/flycast-x86*.AppImage - ~/.local/share/applications/flycast-x86*.AppImage - ~/.local/bin/flycast-x86*.AppImage - ~/bin/flycast-x86*.AppImage - /var/lib/flatpak/exports/bin/org.flycast.Flycast - ~/.local/share/flatpak/exports/bin/org.flycast.Flycast - - - - - - flycast-dojo - - - ~/Applications/flycast-dojo*.AppImage - ~/.local/share/applications/flycast-dojo*.AppImage - ~/.local/bin/flycast-dojo*.AppImage - ~/bin/flycast-dojo*.AppImage - - - - - - fs-uae-launcher - fsuae.launcher - - - /var/lib/flatpak/exports/bin/net.fsuae.FS-UAE|flatpak run --command=fs-uae-launcher net.fsuae.FS-UAE - ~/.local/share/flatpak/exports/bin/net.fsuae.FS-UAE|flatpak run --command=fs-uae-launcher net.fsuae.FS-UAE - - - - - - fuse - net.sf.fuse_emulator - - - /var/lib/flatpak/exports/bin/net.sf.fuse_emulator - ~/.local/share/flatpak/exports/bin/net.sf.fuse_emulator - - - - - - gargoyle - io.github.garglk.Gargoyle - - - ~/Applications/Gargoyle*.AppImage - ~/.local/share/applications/Gargoyle*.AppImage - ~/.local/bin/Gargoyle*.AppImage - ~/bin/Gargoyle*.AppImage - /var/lib/flatpak/exports/bin/io.github.garglk.Gargoyle - ~/.local/share/flatpak/exports/bin/io.github.garglk.Gargoyle - - - - - - gearboy - - - ~/Applications/gearboy/gearboy - ~/.local/share/applications/gearboy/gearboy - ~/.local/bin/gearboy/gearboy - ~/bin/gearboy/gearboy - - - - - - ~/Applications/gopher2600/gopher2600_linux_amd64 - ~/.local/share/applications/gopher2600/gopher2600_linux_amd64 - ~/.local/bin/gopher2600/gopher2600_linux_amd64 - ~/bin/gopher2600/gopher2600_linux_amd64 - - - - - - hatari - org.tuxfamily.hatari - - - /var/lib/flatpak/exports/bin/org.tuxfamily.hatari - ~/.local/share/flatpak/exports/bin/org.tuxfamily.hatari - - - - - - hypseus.bin - - - ~/Applications/hypseus-singe/hypseus.bin - ~/.local/share/applications/hypseus-singe/hypseus.bin - ~/.local/bin/hypseus-singe/hypseus.bin - ~/bin/hypseus-singe/hypseus.bin - - - - - - lightspark - - - ~/Applications/lightspark/lightspark - ~/.local/share/applications/lightspark/lightspark - ~/.local/bin/lightspark/lightspark - ~/bin/lightspark/lightspark - - - - - - linapple - - - ~/Applications/linapple/linapple - ~/.local/share/applications/linapple/linapple - ~/.local/bin/linapple/linapple - ~/bin/linapple/linapple - - - - - - ~/Applications/m2emulator/EMULATOR.EXE - ~/.local/share/applications/m2emulator/EMULATOR.EXE - ~/.local/bin/m2emulator/EMULATOR.EXE - ~/bin/m2emulator/EMULATOR.EXE - - - - - - mame - org.mamedev.MAME - - - /var/lib/flatpak/exports/bin/org.mamedev.MAME - ~/.local/share/flatpak/exports/bin/org.mamedev.MAME - - - - - - mednafen - - - /var/lib/flatpak/exports/bin/com.github.AmatCoder.mednaffe|flatpak run --command=mednafen com.github.AmatCoder.mednaffe - ~/.local/share/flatpak/exports/bin/com.github.AmatCoder.mednaffe|flatpak run --command=mednafen com.github.AmatCoder.mednaffe - - - - - - melonds - melonDS - net.kuribo64.melonDS - - - /var/lib/flatpak/exports/bin/net.kuribo64.melonDS - ~/.local/share/flatpak/exports/bin/net.kuribo64.melonDS - - - - - - mesen2 - - - ~/Applications/Mesen*.AppImage - ~/.local/share/applications/Mesen*.AppImage - ~/.local/bin/Mesen*.AppImage - ~/bin/Mesen*.AppImage - - - - - - mgba - mgba-qt - io.mgba.mGBA - - - ~/Applications/mGBA*.AppImage - ~/.local/share/applications/mGBA*.AppImage - ~/.local/bin/mGBA*.AppImage - ~/bin/mGBA*.AppImage - /var/lib/flatpak/exports/bin/io.mgba.mGBA - ~/.local/share/flatpak/exports/bin/io.mgba.mGBA - - - - - - m64p - io.github.m64p.m64p - - - /var/lib/flatpak/exports/bin/io.github.m64p.m64p - ~/.local/share/flatpak/exports/bin/io.github.m64p.m64p - - - - - - nestopia - ca._0ldsk00l.Nestopia - - - /var/lib/flatpak/exports/bin/ca._0ldsk00l.Nestopia - ~/.local/share/flatpak/exports/bin/ca._0ldsk00l.Nestopia - - - - - - openmsx - org.openmsx.openMSX - - - /var/lib/flatpak/exports/bin/org.openmsx.openMSX - ~/.local/share/flatpak/exports/bin/org.openmsx.openMSX - - - - - - Oricutron - - - ~/Applications/oricutron/Oricutron - ~/.local/share/applications/oricutron/Oricutron - ~/.local/bin/oricutron/Oricutron - ~/bin/oricutron/Oricutron - - - - - - pcsx2-qt - net.pcsx2.PCSX2 - - - ~/Applications/pcsx2*.AppImage - ~/.local/share/applications/pcsx2*.AppImage - ~/.local/bin/pcsx2*.AppImage - ~/bin/pcsx2*.AppImage - /var/lib/flatpak/exports/bin/net.pcsx2.PCSX2 - ~/.local/share/flatpak/exports/bin/net.pcsx2.PCSX2 - - - - - - PCSX2 - pcsx2 - net.pcsx2.PCSX2 - - - /var/lib/flatpak/exports/bin/net.pcsx2.PCSX2 - ~/.local/share/flatpak/exports/bin/net.pcsx2.PCSX2 - - - - - - pico8 - - - ~/Applications/pico-8/pico8 - ~/.local/share/applications/pico-8/pico8 - ~/.local/bin/pico-8/pico8 - ~/bin/pico-8/pico8 - - - - - - org.purei.Play - - - ~/Applications/Play!*.AppImage - ~/.local/share/applications/Play!*.AppImage - ~/.local/bin/Play!*.AppImage - ~/bin/Play!*.AppImage - /var/lib/flatpak/exports/bin/org.purei.Play - ~/.local/share/flatpak/exports/bin/org.purei.Play - - - - - - ppsspp-emu.ppsspp-sdl - PPSSPPSDL - PPSSPPQt - org.ppsspp.PPSSPP - - - /var/lib/flatpak/exports/bin/org.ppsspp.PPSSPP - ~/.local/share/flatpak/exports/bin/org.ppsspp.PPSSPP - - - - - - prboom-plus - - - - - - primehack - io.github.shiiion.primehack - - - /var/lib/flatpak/exports/bin/io.github.shiiion.primehack - ~/.local/share/flatpak/exports/bin/io.github.shiiion.primehack - - - - - - ~/Applications/Proton/wine*.AppImage - ~/.local/share/applications/Proton/wine*.AppImage - ~/.local/bin/Proton/wine*.AppImage - ~/bin/Proton/wine*.AppImage - - - - - - punes - - - ~/Applications/punes/punes - ~/.local/share/applications/punes/punes - ~/.local/bin/punes/punes - ~/bin/punes/punes - /var/lib/flatpak/exports/bin/io.github.punesemu.puNES - ~/.local/share/flatpak/exports/bin/io.github.punesemu.puNES - - - - - - quasi88 - - - ~/Applications/quasi88/quasi88 - ~/.local/share/applications/quasi88/quasi88 - ~/.local/bin/quasi88/quasi88 - ~/bin/quasi88/quasi88 - - - - - - redream - - - ~/Applications/redream/redream - ~/.local/share/applications/redream/redream - ~/.local/bin/redream/redream - ~/bin/redream/redream - - - - - - RMG - com.github.Rosalie241.RMG - - - ~/Applications/RMG*.AppImage - ~/.local/share/applications/RMG*.AppImage - ~/.local/bin/RMG*.AppImage - ~/bin/RMG*.AppImage - /var/lib/flatpak/exports/bin/com.github.Rosalie241.RMG - ~/.local/share/flatpak/exports/bin/com.github.Rosalie241.RMG - - - - - - rpcs3 - rpcs3-emu.rpcs3 - net.rpcs3.RPCS3 - - - ~/Applications/rpcs3*.AppImage - ~/.local/share/applications/rpcs3*.AppImage - ~/.local/bin/rpcs3*.AppImage - ~/bin/rpcs3*.AppImage - /var/lib/flatpak/exports/bin/net.rpcs3.RPCS3 - ~/.local/share/flatpak/exports/bin/net.rpcs3.RPCS3 - - - - - - ruffle - - - ~/Applications/ruffle/ruffle - ~/.local/share/applications/ruffle/ruffle - ~/.local/bin/ruffle/ruffle - ~/bin/ruffle/ruffle - - - - - - Ryujinx.sh - Ryujinx - Ryujinx.Ava - org.ryujinx.Ryujinx - - - /var/lib/flatpak/exports/bin/org.ryujinx.Ryujinx - ~/.local/share/flatpak/exports/bin/org.ryujinx.Ryujinx - ~/Applications/publish/Ryujinx - ~/.local/share/applications/publish/Ryujinx - ~/.local/bin/publish/Ryujinx - ~/bin/publish/Ryujinx - ~/Applications/publish/Ryujinx.Ava - ~/.local/share/applications/publish/Ryujinx.Ava - ~/.local/bin/publish/Ryujinx.Ava - ~/bin/publish/Ryujinx.Ava - - - - - - sameboy - io.github.sameboy.SameBoy - - - /var/lib/flatpak/exports/bin/io.github.sameboy.SameBoy - ~/.local/share/flatpak/exports/bin/io.github.sameboy.SameBoy - - - - - - scummvm - org.scummvm.ScummVM - - - /var/lib/flatpak/exports/bin/org.scummvm.ScummVM - ~/.local/share/flatpak/exports/bin/org.scummvm.ScummVM - - - - - - sdl2trs - - - ~/Applications/sdl2trs/sdl2trs - ~/.local/share/applications/sdl2trs/sdl2trs - ~/.local/bin/sdl2trs/sdl2trs - ~/bin/sdl2trs/sdl2trs - - - - - - SheepShaver - - - ~/Applications/SheepShaver*.AppImage - ~/.local/share/applications/SheepShaver*.AppImage - ~/.local/bin/SheepShaver*.AppImage - ~/bin/SheepShaver*.AppImage - - - - - - simcoupe - - - ~/Applications/simcoupe/simcoupe - ~/.local/share/applications/simcoupe/simcoupe - ~/.local/bin/simcoupe/simcoupe - ~/bin/simcoupe/simcoupe - - - - - - simple64-gui - io.github.simple64.simple64 - - - /var/lib/flatpak/exports/bin/io.github.simple64.simple64 - ~/.local/share/flatpak/exports/bin/io.github.simple64.simple64 - - - - - - SkyEmu - - - ~/Applications/SkyEmu/SkyEmu - ~/.local/share/applications/SkyEmu/SkyEmu - ~/.local/bin/SkyEmu/SkyEmu - ~/bin/SkyEmu/SkyEmu - - - - - - snes9x - snes9x-gtk - com.snes9x.Snes9x - - - ~/Applications/Snes9x*.AppImage - ~/.local/share/applications/Snes9x*.AppImage - ~/.local/bin/Snes9x*.AppImage - ~/bin/Snes9x*.AppImage - /var/lib/flatpak/exports/bin/com.snes9x.Snes9x - ~/.local/share/flatpak/exports/bin/com.snes9x.Snes9x - - - - - - solarus-run - solarus.run - - - /var/lib/flatpak/exports/bin/org.solarus_games.solarus.Launcher|flatpak run --command=solarus-run org.solarus_games.solarus.Launcher - ~/.local/share/flatpak/exports/bin/org.solarus_games.solarus.Launcher|flatpak run --command=solarus-run org.solarus_games.solarus.Launcher - - - - - - steam - - - - - - stella - io.github.stella_emu.Stella - - - /var/lib/flatpak/exports/bin/io.github.stella_emu.Stella - ~/.local/share/flatpak/exports/bin/io.github.stella_emu.Stella - - - - - - supermodel - - - ~/Applications/Supermodel/supermodel - ~/.local/share/applications/Supermodel/supermodel - ~/.local/bin/Supermodel/supermodel - ~/bin/Supermodel/supermodel - /var/lib/flatpak/exports/bin/com.supermodel3.Supermodel - ~/.local/share/flatpak/exports/bin/com.supermodel3.Supermodel - - - - - - tic80 - com.tic80.TIC_80 - - - /var/lib/flatpak/exports/bin/com.tic80.TIC_80 - ~/.local/share/flatpak/exports/bin/com.tic80.TIC_80 - - - - - - dolphin-emu-triforce - - - ~/Applications/dolphin-emu-triforce*.AppImage - ~/.local/share/applications/dolphin-emu-triforce*.AppImage - ~/.local/bin/dolphin-emu-triforce*.AppImage - ~/bin/dolphin-emu-triforce*.AppImage - - - - - - ~/Applications/tsugaru/Tsugaru_CUI - ~/.local/share/applications/tsugaru/Tsugaru_CUI - ~/.local/bin/tsugaru/Tsugaru_CUI - ~/bin/tsugaru/Tsugaru_CUI - - - - - - visualboyadvance-m - - - - - - x64sc - vice-jz.x64sc - net.sf.VICE - - - /var/lib/flatpak/exports/bin/net.sf.VICE - ~/.local/share/flatpak/exports/bin/net.sf.VICE - - - - - - xplus4 - vice-jz.xplus4 - - - /var/lib/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xplus4 net.sf.VICE - ~/.local/share/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xplus4 net.sf.VICE - - - - - - xvic - vice-jz.xvic - - - /var/lib/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xvic net.sf.VICE - ~/.local/share/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xvic net.sf.VICE - - - - - - VPinballX_GL - - - ~/Applications/VPinballX/VPinballX_GL - ~/.local/share/applications/VPinballX/VPinballX_GL - ~/.local/bin/VPinballX/VPinballX_GL - ~/bin/VPinballX/VPinballX_GL - - - - - - vita3k - Vita3K - - - ~/Applications/Vita3K*.AppImage - ~/.local/share/applications/Vita3K*.AppImage - ~/.local/bin/Vita3K*.AppImage - ~/bin/Vita3K*.AppImage - ~/Applications/Vita3K/Vita3K - ~/.local/share/applications/Vita3K/Vita3K - ~/.local/bin/Vita3K/Vita3K - ~/bin/Vita3K/Vita3K - - - - - - xemu - app.xemu.xemu - - - ~/Applications/xemu*.AppImage - ~/.local/share/applications/xemu*.AppImage - ~/.local/bin/xemu*.AppImage - ~/bin/xemu*.AppImage - /var/lib/flatpak/exports/bin/app.xemu.xemu - ~/.local/share/flatpak/exports/bin/app.xemu.xemu - - - - - - ~/Applications/Wine/wine*.AppImage - ~/.local/share/applications/Wine/wine*.AppImage - ~/.local/bin/Wine/wine*.AppImage - ~/bin/Wine/wine*.AppImage - - - - - - ~/Applications/xenia/xenia.exe - ~/.local/share/applications/xenia/xenia.exe - ~/.local/bin/xenia/xenia.exe - ~/bin/xenia/xenia.exe - ~/Applications/xenia/xenia_canary.exe - ~/.local/share/applications/xenia/xenia_canary.exe - ~/.local/bin/xenia/xenia_canary.exe - ~/bin/xenia/xenia_canary.exe - - - - - - xroar - - - ~/Applications/xroar/xroar - ~/.local/share/applications/xroar/xroar - ~/.local/bin/xroar/xroar - ~/bin/xroar/xroar - - - - - - yuzu - org.yuzu_emu.yuzu - - - ~/Applications/yuzu*.AppImage - ~/.local/share/applications/yuzu*.AppImage - ~/.local/bin/yuzu*.AppImage - ~/bin/yuzu*.AppImage - /var/lib/flatpak/exports/bin/org.yuzu_emu.yuzu - ~/.local/share/flatpak/exports/bin/org.yuzu_emu.yuzu - - - - - - ~/retrodeck/customs/yuzu/yuzu*.AppImage - - - - - - zesarux - - - ~/Applications/ZEsarUX/zesarux - ~/.local/share/applications/ZEsarUX/zesarux - ~/.local/bin/ZEsarUX/zesarux - ~/bin/ZEsarUX/zesarux - - - diff --git a/es-configs/es_settings.xml b/es-configs/es_settings.xml index cad78b67..c1d69bd9 100644 --- a/es-configs/es_settings.xml +++ b/es-configs/es_settings.xml @@ -2,6 +2,7 @@ + @@ -21,6 +22,7 @@ + @@ -65,6 +67,7 @@ + @@ -145,13 +148,15 @@ - + + - + + diff --git a/es-configs/es_systems.xml b/es-configs/es_systems.xml deleted file mode 100644 index 9baca300..00000000 --- a/es-configs/es_systems.xml +++ /dev/null @@ -1,2248 +0,0 @@ - - - - - 3do - 3DO Interactive Multiplayer - %ROMPATH%/3do - .bin .BIN .chd .CHD .cue .CUE .iso .ISO .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/opera_libretro.so %ROM% - 3do - 3do - - - - adam - Coleco Adam - %ROMPATH%/adam - .1dd .1DD .bin .BIN .col .COL .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .ddp .DDP .dfi .DFI .dsk .DSK .hfe .HFE .imd .IMD .mfi .MFI .mfm .MFM .rom .ROM .td0 .TD0 .wav .WAV .7z .7Z .zip .ZIP - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam -flop1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cass1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cart1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam %BASENAME% - adam - adam - - - - - amiga - Commodore Amiga - %ROMPATH%/amiga - .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM% - %EMULATOR_FS-UAE% %ROM% - %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --autoload %ROM% - amiga - amiga - - - amiga1200 - Commodore Amiga 1200 - %ROMPATH%/amiga1200 - .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM% - %EMULATOR_FS-UAE% %ROM% - %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --autoload %ROM% - amiga - amiga1200 - - - amiga600 - Commodore Amiga 600 - %ROMPATH%/amiga600 - .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM% - %EMULATOR_FS-UAE% %ROM% - %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --autoload %ROM% - amiga - amiga600 - - - amigacd32 - Commodore Amiga CD32 - %ROMPATH%/amigacd32 - .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM% - %EMULATOR_FS-UAE% --config:amiga-model=CD32 %ROM% - %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --model CD32 --autoload %ROM% - amigacd32 - amigacd32 - - - amstradcpc - Amstrad CPC - %ROMPATH%/amstradcpc - .cdt .CDT .cpr .CPR .dsk .DSK .kcr .KCR .m3u .M3U .sna .SNA .tap .TAR .voc .VOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cap32_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/crocods_libretro.so %ROM% - %STARTDIR%=~/.CPCemu %EMULATOR_CPCEMU% %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/amstradcpc cpc6128 -flop1 %ROM% - amstradcpc - amstradcpc - - - android - Google Android - %ROMPATH%/android - .7z .7Z .zip .ZIP - PLACEHOLDER %ROM% - android - android - - - - apple2 - Apple II - %ROMPATH%/apple2 - .do .DO .dsk .DSK .nib .NIB .po .PO - - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -flop1 \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -flop1 %ROM% - apple2 - apple2 - - - - apple2gs - Apple IIGS - %ROMPATH%/apple2gs - .2mg .2MG .7z .7z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -flop3 \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -flop3 %ROM% - apple2gs - apple2gs - - - - arcade - Arcade - %ROMPATH%/arcade - .cmd .CMD .desktop .sh .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/arcade %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - %EMULATOR_FINALBURN-NEO% -fullscreen %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - %EMULATOR_FLYCAST% %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM% - - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - arcade - arcade - - - - arcadia - Emerson Arcadia 2001 - %ROMPATH%/arcadia - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "arcadia -rompath \"%GAMEDIRRAW%;%ROMPATH%/arcadia\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/arcadia arcadia -cart %ROM% - arcadia - arcadia - - - - archimedes - Acorn Archimedes - %ROMPATH%/archimedes - .1dd .1DD .360 .adf .ADF .adl .ADL .adm .ADM .ads .ADS .apd .APD .bbc .BBC .chd .CHD .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .dfi .DFI .dsd .DSD .dsk .DSK .hfe .HFE .ima .IMA .imd .IMD .img .IMG .ipf .IPF .jfd .JFD .mfi .MFI .mfm .MFM .msa .MSA .ssd .SSD .st .ST .td0 .TD0 .ufi .UFI .7z .7Z .zip .ZIP - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa4401 -flop1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa3000 -flop1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa310 -flop1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa540 -flop1 %ROM% - archimedes - archimedes - - - - arduboy - Arduboy Miniature Game System - %ROMPATH%/arduboy - .hex .HEX .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/arduous_libretro.so %ROM% - arduboy - arduboy - - - astrocde - Bally Astrocade - %ROMPATH%/astrocde - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "astrocde -rompath \"%GAMEDIRRAW%;%ROMPATH%/astrocde\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/astrocde astrocde -cart %BASENAME% - astrocde - astrocade - - - atari2600 - Atari 2600 - %ROMPATH%/atari2600 - .a26 .A26 .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/stella_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/stella2014_libretro.so %ROM% - - - - atari2600 - atari2600 - - - atari5200 - Atari 5200 - %ROMPATH%/atari5200 - .a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .rom .ROM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/a5200_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM% - - atari5200 - atari5200 - - - atari7800 - Atari 7800 ProSystem - %ROMPATH%/atari7800 - .a78 .A78 .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/prosystem_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "a7800 -rompath \"%GAMEDIRRAW%;%ROMPATH%/atari7800\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/atari7800 a7800 -cart %ROM% - atari7800 - atari7800 - - - atari800 - Atari 800 - %ROMPATH%/atari800 - .a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .rom .ROM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM% - %EMULATOR_ATARI800% %ROM% - atari800 - atari800 - - - atarijaguar - Atari Jaguar - %ROMPATH%/atarijaguar - .abs .ABS .bin .BIN .cdi .CDI .cof .COF .cue .CUE .j64 .J64 .jag .JAG .prg .PRG .rom .ROM .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/virtualjaguar_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/atarijaguar jaguar -cart %ROM% - - - atarijaguar - atarijaguar - - - - atarilynx - Atari Lynx - %ROMPATH%/atarilynx - .lnx .LNX .o .O .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/handy_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_lynx_libretro.so %ROM% - - atarilynx - atarilynx - - - atarist - Atari ST - %ROMPATH%/atarist - .st .ST .msa .MSA .stx .STX .dim .DIM .ipf .IPF .m3u .M3U .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/hatari_libretro.so %ROM% - - atarist - atarist - - - atarixe - Atari XE - %ROMPATH%/atarixe - .a52 .A52 .atr .ATR .atx .ATX .bin .BIN .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM% - - atarixe - atarixe - - - atomiswave - Sammy Corporation Atomiswave - %ROMPATH%/atomiswave - .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - - - arcade - atomiswave - - - - bbcmicro - Acorn Computers BBC Micro - %ROMPATH%/bbcmicro - .dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -flop1 %ROM% - bbcmicro - bbcmicro - - - - c64 - Commodore 64 - %ROMPATH%/c64 - .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_x64sc_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_x64_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xscpu64_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_x128_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/frodo_libretro.so %ROM% - c64 - c64 - - - cdimono1 - Philips CD-i - %ROMPATH%/cdimono1 - .chd .CHD .cue .CUE .iso .ISO - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/same_cdi_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cdi2015_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cdimono1 cdimono1 -cdrom %ROM% - cdimono1 - cdimono1 - - - cdtv - Commodore CDTV - %ROMPATH%/cdtv - .ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM% - - - cdtv - cdtv - - - chailove - ChaiLove Game Engine - %ROMPATH%/chailove - .chai .CHAI .chailove .CHAILOVE .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/chailove_libretro.so %ROM% - love - chailove - - - channelf - Fairchild Channel F - %ROMPATH%/channelf - .bin .BIN .chf .CHF .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/freechaf_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "channelf -rompath \"%GAMEDIRRAW%;%ROMPATH%/channelf\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/channelf channelf -cart %ROM% - channelf - channelf - - - - coco - Tandy Color Computer - %ROMPATH%/coco - .cas .CAS .ccc .CCC .dsk .DSK .rom .ROM - %EMULATOR_XROAR% -fs -default-machine coco2bus %ROM% - %EMULATOR_XROAR% -fs -default-machine coco2b %ROM% - coco - coco - - - - colecovision - Coleco ColecoVision - %ROMPATH%/colecovision - .bin .BIN .cas .CAS .col .COL .cv .CV .dsk .DSK .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ri .RI .rom .ROM .sc .SC .sg .SG .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearcoleco_libretro.so %ROM% - - - colecovision - colecovision - - - consolearcade - Console Arcade Systems - %ROMPATH%/consolearcade - .arcadedef .desktop .iso .ISO .sh .xbe .XBE .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/consolearcade %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM% - - - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - - %INJECT%=%BASENAME%.esprefix %EMULATOR_XEMU% -dvd_path %ROM% - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - arcade - consolearcade - - - cps - Capcom Play System - %ROMPATH%/cps - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps1_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps2_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps3_libretro.so %ROM% - arcade - cps - - - cps1 - Capcom Play System I - %ROMPATH%/cps1 - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps1 %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps1_libretro.so %ROM% - arcade - cps1 - - - cps2 - Capcom Play System II - %ROMPATH%/cps2 - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps2 %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps2_libretro.so %ROM% - arcade - cps2 - - - cps3 - Capcom Play System III - %ROMPATH%/cps3 - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps3 %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps3_libretro.so %ROM% - arcade - cps3 - - - - crvision - VTech CreatiVision - %ROMPATH%/crvision - .bin .BIN .rom .ROM .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "crvision -rompath %GAMEDIR%\;%ROMPATH%/crvision -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/crvision crvision -cart %ROM% - crvision - crvision - - - - - daphne - Daphne Arcade LaserDisc Emulator - %ROMPATH%/daphne - .daphne .dirksimple .ogv .OGV .singe .7z .7Z .zip .ZIP - - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/daphne %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dirksimple_libretro.so %ROM% - daphne, arcade - daphne - - - - doom - Doom - %ROMPATH%/doom - .doom .DOOM .desktop .ipk3 .IPK3 .iwad .IWAD .pk3 .PK3 .pk4 .PK4 .pwad .PWAD .sh .wad .WAD - gzdoom.sh %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/prboom_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/boom3_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/boom3_xp_libretro.so %ROM% - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - pc, pcwindows - doom - - - dos - DOS (PC) - %ROMPATH%/dos - .bat .BAT .com .COM .conf .CONF .cue .CUE .dosz .DOSZ .exe .EXE .iso .ISO .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_core_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_svn_libretro.so %ROM% - - - dos - dos - - - - dreamcast - Sega Dreamcast - %ROMPATH%/dreamcast - .cdi .CDI .chd .CHD .cue .CUE .dat .DAT .elf .ELF .gdi .GDI .iso .ISO .lst .LST .m3u .M3U .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - - - - dreamcast - dreamcast - - - easyrpg - EasyRPG Game Engine - %ROMPATH%/easyrpg - .easyrpg .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/easyrpg_libretro.so %ROM% - - easyrpg - easyrpg - - - - electron - Acorn Electron - %ROMPATH%/electron - .1dd .1DD .adf .ADF .adl .ADL .adm .ADM .ads .ADS .bbc .BBC .bin .BIN .cqi .CQI .cqm .CQM .csw .CSW .d77 .D77 .d88 .D88 .dfi .DFI .dsd .DSD .dsk .DSK .hfe .HFE .imd .IMD .img .IMG .mfi .MFI .mfm .MFM .rom .ROM .ssd .SSD .td0 .TD0 .uef .UEF .wav .WAV .7z .7Z .zip .ZIP - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/electron electron64 -autoboot_delay "2" -autoboot_command "*T.\nCH.\"\"\n" -cass1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/electron electron64 -exp plus1 -cart1 seds -autoboot_delay "2" -autoboot_command "*CAT\n\n\n\n\n\n*EXEC !BOOT\n" -flop1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/electron electron64 -exp plus3 -exp:plus3:fdc:1 35dd -autoboot_delay "2" -autoboot_command "*CAT\n\n\n\n\n\n*RUN !BOOT\n" -flop1 %ROM% - electron - electron - - - - - famicom - Nintendo Family Computer - %ROMPATH%/famicom - .3dsen .3DSEN .fds .FDS .nes .NES .unf .UNF .unif .UNIF .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nestopia_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fceumm_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/quicknes_libretro.so %ROM% - - - - - - - famicom - famicom - - - fba - FinalBurn Alpha - %ROMPATH%/fba - .iso .ISO .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_neogeo_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps1_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps2_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps3_libretro.so %ROM% - arcade - fba - - - fbneo - FinalBurn Neo - %ROMPATH%/fbneo - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - arcade - fbneo - - - fds - Nintendo Famicom Disk System - %ROMPATH%/fds - .nes .NES .fds .FDS .unf .UNF .UNIF .UNIF .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nestopia_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fceumm_libretro.so %ROM% - - - fds - fds - - - - - fm7 - Fujitsu FM-7 - %ROMPATH%/fm7 - .1dd .1DD .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .dfi .DFI .dsk .DSK .hfe .HFE .imd .IMD .mfi .MFI .mfm .MFM .t77 .T77 .td0 .TD0 .wav .WAV .7z .7Z .zip .ZIP - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm7 -flop1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm7 -autoboot_delay "5" -autoboot_command "load\n\n\nrun\n" -cass1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm7 %BASENAME% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm77av -flop1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm77av -autoboot_delay "5" -autoboot_command "load\n\n\nrun\n" -cass1 %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm77av %BASENAME% - fm7 - fm7 - - - - - fmtowns - Fujitsu FM Towns - %ROMPATH%/fmtowns - .cdr .CDR .chd .CHD .cue .CUE .gdi .GDI .iso .ISO - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "fmtownshr -rompath \"%GAMEDIRRAW%;%ROMPATH%/fmtowns\" -cdrom \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fmtowns fmtowns %BASENAME% - - fmtowns - fmtowns - - - - - - gamate - Bit Corporation Gamate - %ROMPATH%/gamate - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "gamate -rompath \"%GAMEDIRRAW%;%ROMPATH%/gamate\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gamate gamate -cart %ROM% - gamate - gamate - - - - gameandwatch - Nintendo Game and Watch - %ROMPATH%/gameandwatch - .mgw .MGW .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gameandwatch %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gw_libretro.so %ROM% - gameandwatch - gameandwatch - - - - gamecom - Tiger Electronics Game.com - %ROMPATH%/gamecom - .tgc .TGC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "gamecom -rompath \"%GAMEDIRRAW%;%ROMPATH%/gamecom\" -cartridge1 \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gamecom gamecom -cartridge1 %ROM% - gamecom - gamecom - - - - gamegear - Sega Game Gear - %ROMPATH%/gamegear - .68k .68K .bin .BIN .bms .BMS .chd .CHD .col .COL .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .rom .ROM .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/smsplus_libretro.so %ROM% - - - - - gamegear - gamegear - - - gb - Nintendo Game Boy - %ROMPATH%/gb - .bs .BS .cgb .CGB .dmg .DMG .gb .GB .gbc .GBC .sgb .SGB .sfc .SFC .smc .SMC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gambatte_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameboy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearboy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tgbdual_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/DoubleCherryGB_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vbam_libretro.so %ROM% - - - - - gb - gb - - - gba - Nintendo Game Boy Advance - %ROMPATH%/gba - .agb .AGB .bin .BIN .cgb .CGB .dmg .DMG .gb .GB .gba .GBA .gbc .GBC .sgb .SGB .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vbam_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vba_next_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gpsp_libretro.so %ROM% - - - - gba - gba - - - gbc - Nintendo Game Boy Color - %ROMPATH%/gbc - .bs .BS .cgb .CGB .dmg .DMG .gb .GB .gbc .GBC .sgb .SGB .sfc .SFC .smc .SMC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gambatte_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameboy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearboy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tgbdual_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/DoubleCherryGB_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vbam_libretro.so %ROM% - - - - - gbc - gbc - - - gc - Nintendo GameCube - %ROMPATH%/gc - .ciso .CISO .dff .DFF .dol .DOL .elf .ELF .gcm .GCM .gcz .GCZ .iso .ISO .json .JSON .m3u .M3U .rvz .RVZ .tgc .TGC .wad .WAD .wbfs .WBFS .wia .WIA .7z .7Z .zip .ZIP - %INJECT%=%BASENAME%.esprefix %EMULATOR_DOLPHIN% -b -e %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dolphin_libretro.so %ROM% - %INJECT%=%BASENAME%.esprefix %EMULATOR_PRIMEHACK% -b -e %ROM% - - gc - gc - - - genesis - Sega Genesis - %ROMPATH%/genesis - .32x .32X .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/blastem_libretro.so %ROM% - - - - genesis - genesis - - - - gmaster - Hartung Game Master - %ROMPATH%/gmaster - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "gmaster -rompath \"%GAMEDIRRAW%;%ROMPATH%/gmaster\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gmaster gmaster -cart %ROM% - gmaster - gmaster - - - - gx4000 - Amstrad GX4000 - %ROMPATH%/gx4000 - .bin .BIN .cdt .CDT .cpr .CPR .dsk .DSK .kcr .KCR .m3u .M3U .sna .SNA .tap .TAR .voc .VOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cap32_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/crocods_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gx4000 gx4000 -cart %ROM% - gx4000 - gx4000 - - - intellivision - Mattel Electronics Intellivision - %ROMPATH%/intellivision - .bin .BIN .int .INT .rom .ROM .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/freeintv_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "intv -rompath \"%GAMEDIRRAW%;%ROMPATH%/intellivision\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/intellivision intv -cart %ROM% - intellivision - intellivision - - - j2me - Java 2 Micro Edition (J2ME) - %ROMPATH%/j2me - .jar .JAR .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/squirreljme_libretro.so %ROM% - android - j2me - - - laserdisc - LaserDisc Games - %ROMPATH%/laserdisc - .daphne .dirksimple .ogv .OGV .singe .7z .7Z .zip .ZIP - - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/laserdisc %BASENAME% - daphne, arcade - laserdisc - - - lcdgames - LCD Handheld Games - %ROMPATH%/lcdgames - .mgw .MGW .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/lcdgames %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gw_libretro.so %ROM% - lcdgames, gameandwatch - lcdgames - - - - lutro - Lutro Game Engine - %ROMPATH%/lutro - .lua .LUA .lutro .LUTRO .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/lutro_libretro.so %ROM% - lutro - lutro - - - mame - Multiple Arcade Machine Emulator - %ROMPATH%/mame - .cmd .CMD .desktop .sh .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/mame %BASENAME% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM% - - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - arcade - mame - - - - mame-advmame - AdvanceMAME - %ROMPATH%/mame-advmame - .7z .7Z .zip .ZIP - %STARTDIR%=~/.advance %EMULATOR_ADVANCEMAME% %BASENAME% - arcade - mame-advmame - - - - mastersystem - Sega Master System - %ROMPATH%/mastersystem - .68k .68K .bin .BIN .bms .BMS .chd .CHD .col .COL .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .rom .ROM .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/smsplus_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - - - - mastersystem - mastersystem - - - megacd - Sega Mega-CD - %ROMPATH%/megacd - .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - - segacd - megacd - - - megacdjp - Sega Mega-CD - %ROMPATH%/megacdjp - .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - - segacd - megacdjp - - - megadrive - Sega Mega Drive - %ROMPATH%/megadrive - .32x .32X .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/blastem_libretro.so %ROM% - - - - megadrive - megadrive - - - megaduck - Creatronic Mega Duck - %ROMPATH%/megaduck - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameduck_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "megaduck -rompath \"%GAMEDIRRAW%;%ROMPATH%/megaduck\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/megaduck megaduck -cart %ROM% - megaduck - megaduck - - - mess - Multi Emulator Super System - %ROMPATH%/mess - .chd .CHD .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mess2015_libretro.so %ROM% - mess - mess - - - - model2 - Sega Model 2 - %ROMPATH%/model2 - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/model2 %BASENAME% - - - arcade - model2 - - - - moonlight - Moonlight Game Streaming - %ROMPATH%/moonlight - .moonlight .MOONLIGHT .7z .7Z .zip .ZIP - PLACEHOLDER %ROM% - moonlight - moonlight - - - moto - Thomson MO/TO Series - %ROMPATH%/moto - .fd .FD .k7 .K7 .m5 .M5 .m7 .M7 .rom .ROM .sap .SAP .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/theodore_libretro.so %ROM% - moto - moto - - - msx - MSX - %ROMPATH%/msx - .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fmsx_libretro.so %ROM% - - - - msx - msx - - - msx1 - MSX1 - %ROMPATH%/msx1 - .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fmsx_libretro.so %ROM% - - - - msx - msx1 - - - msx2 - MSX2 - %ROMPATH%/msx2 - .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fmsx_libretro.so %ROM% - - - - msx2 - msx2 - - - msxturbor - MSX Turbo R - %ROMPATH%/msxturbor - .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM% - - - msxturbor - msxturbor - - - - mugen - M.U.G.E.N Game Engine - %ROMPATH%/mugen - .mugen - %STARTDIR%=%GAMEDIR% %EMULATOR_OS-SHELL% -c "%ROM%" - mugen - mugen - - - - multivision - Othello Multivision - %ROMPATH%/multivision - .bin .BIN .gg .GG .rom .ROM .sg .SG .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM% - - sg-1000 - multivision - - - n3ds - Nintendo 3DS - %ROMPATH%/n3ds - .3ds .3DS .3dsx .3DSX .app .APP .axf .AXF .cci .CCI .cxi .CXI .elf .ELF .7z .7Z .zip .ZIP - %EMULATOR_CITRA% %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra2018_libretro.so %ROM% - n3ds - n3ds - - - n64 - Nintendo 64 - %ROMPATH%/n64 - .bin .BIN .d64 .D64 .n64 .N64 .ndd .NDD .u1 .U1 .v64 .V64 .z64 .Z64 .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mupen64plus_next_libretro.so %ROM% - - - - - - n64 - n64 - - - n64dd - Nintendo 64DD - %ROMPATH%/n64dd - .bin .BIN .d64 .D64 .n64 .N64 .ndd .NDD .u1 .U1 .v64 .V64 .z64 .Z64 .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/parallel_n64_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mupen64plus_next_libretro.so %ROM% - - - n64 - n64dd - - - naomi - Sega NAOMI - %ROMPATH%/naomi - .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - - - arcade - naomi - - - naomi2 - Sega NAOMI 2 - %ROMPATH%/naomi2 - .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - - - arcade - naomi2 - - - naomigd - Sega NAOMI GD-ROM - %ROMPATH%/naomigd - .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM% - - - arcade - naomigd - - - nds - Nintendo DS - %ROMPATH%/nds - .app .APP .bin .BIN .nds .NDS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume2015_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melonds_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melondsds_libretro.so %ROM% - %EMULATOR_MELONDS% %ROM% - - nds - nds - - - neogeo - SNK Neo Geo - %ROMPATH%/neogeo - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/neogeo %BASENAME% - neogeo - neogeo - - - neogeocd - SNK Neo Geo CD - %ROMPATH%/neogeocd - .chd .CHD .cue .CUE - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/neocd_libretro.so %ROM% - %EMULATOR_RETROARCH% --subsystem neocd -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/neogeocd neocdz -cdrm %ROM% - neogeocd - neogeocd - - - neogeocdjp - SNK Neo Geo CD - %ROMPATH%/neogeocdjp - .chd .CHD .cue .CUE - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/neocd_libretro.so %ROM% - %EMULATOR_RETROARCH% --subsystem neocd -L %CORE_RETROARCH%/fbneo_libretro.so %ROM% - - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/neogeocdjp neocdz -cdrm %ROM% - neogeocd - neogeocdjp - - - nes - Nintendo Entertainment System - %ROMPATH%/nes - .3dsen .3DSEN .fds .FDS .nes .NES .unf .UNF .unif .UNIF .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nestopia_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fceumm_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/quicknes_libretro.so %ROM% - - - - - nes - nes - - - - ngp - SNK Neo Geo Pocket - %ROMPATH%/ngp - .ngc .NGC .ngp .NGP .ngpc .NGPC .npc .NPC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_ngp_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/race_libretro.so %ROM% - - - ngp - ngp - - - ngpc - SNK Neo Geo Pocket Color - %ROMPATH%/ngpc - .ngc .NGC .ngp .NGP .ngpc .NGPC .npc .NPC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_ngp_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/race_libretro.so %ROM% - - - ngpc - ngpc - - - odyssey2 - Magnavox Odyssey 2 - %ROMPATH%/odyssey2 - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/o2em_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "odyssey2 -rompath \"%GAMEDIRRAW%;%ROMPATH%/odyssey2\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/odyssey2 odyssey2 -cart %ROM% - odyssey2 - odyssey2 - - - - openbor - OpenBOR Game Engine - %ROMPATH%/openbor - .AppImage - %STARTDIR%=%GAMEDIR% %EMULATOR_OS-SHELL% -c "%ROM%" - openbor - openbor - - - - - palm - Palm OS - %ROMPATH%/palm - .img .IMG .pqa .PQA .prc .PRC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mu_libretro.so %ROM% - palm - palm - - - pc88 - NEC PC-8800 Series - %ROMPATH%/pc88 - .88d .88D .cmt .CMT .d88 .D88 .m3u .M3U .t88 .T88 .u88 .U88 - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/quasi88_libretro.so %ROM% - - pc88 - pc88 - - - pc98 - NEC PC-9800 Series - %ROMPATH%/pc98 - .2hd .2HD .88d .88D .98d .98D .d88 .D88 .d98 .D98 .cmd .CMD .dup .DUP .fdd .FDD .fdi .FDI .hdd .HDD .hdi .HDI .hdm .HDM .hdn .HDN .m3u .M3U .nhd .NHD .tfd .TFD .thd .THD .xdf .XDF .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/np2kai_libretro.so %ROM% - %STARTDIR%=%GAMEDIR% %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nekop2_libretro.so %ROM% - pc98 - pc98 - - - pcengine - NEC PC Engine - %ROMPATH%/pcengine - .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM% - - - - pcengine - pcengine - - - pcenginecd - NEC PC Engine CD - %ROMPATH%/pcenginecd - .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM% - - - - pcenginecd - pcenginecd - - - pcfx - NEC PC-FX - %ROMPATH%/pcfx - .ccd .CCD .chd .CHD .cue CUE .m3u .M3U .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pcfx_libretro.so %ROM% - - pcfx - pcfx - - - pico8 - PICO-8 Fantasy Console - %ROMPATH%/pico8 - .p8 .P8 .png .PNG - %EMULATOR_PICO-8% -desktop_path ~/retrodeck/screenshots -root_path %GAMEDIR% -run %ROM% - %EMULATOR_PICO-8% -desktop_path ~/retrodeck/screenshots -root_path %GAMEDIR% -splore - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/retro8_libretro.so %ROM% - pico8 - pico8 - - - plus4 - Commodore Plus/4 - %ROMPATH%/plus4 - .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xplus4_libretro.so %ROM% - - plus4 - plus4 - - - pokemini - Nintendo Pokémon Mini - %ROMPATH%/pokemini - .min .MIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pokemini_libretro.so %ROM% - pokemini - pokemini - - - ports - Ports - %ROMPATH%/ports - .AppImage .desktop .exe .EXE .game .GAME .phd .PHD .psx .PSX .sh - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %EMULATOR_OS-SHELL% -c "%ROM%" - - - - - pc, pcwindows - ports - - - ps2 - Sony PlayStation 2 - %ROMPATH%/ps2 - .arcadedef .bin .BIN .chd .CHD .ciso .CISO .cso .CSO .dump .DUMP .elf .ELF .gz .GZ .m3u .M3U .mdf .MDF .img .IMG .iso .ISO .isz .ISZ .ngr .NRG .zso .ZSO - %EMULATOR_PCSX2% -batch %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pcsx2_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pcsx2_libretro.so %ROM% - - - ps2 - ps2 - - - ps3 - Sony PlayStation 3 - %ROMPATH%/ps3 - .desktop .ps3 .PS3 .ps3dir .PS3DIR - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %EMULATOR_RPCS3% --no-gui %ROM% - ps3 - ps3 - - - - psp - Sony PlayStation Portable - %ROMPATH%/psp - .chd .CHD .cso .CSO .elf .ELF .iso .ISO .pbp .PBP .prx .PRX .7z .7Z .zip .ZIP - %EMULATOR_PPSSPP% %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/ppsspp_libretro.so %ROM% - psp - psp - - - - psvita - Sony PlayStation Vita - %ROMPATH%/psvita - .psvita - %EMULATOR_VITA3K% -r %INJECT%=%BASENAME%.psvita - psvita - psvita - - - - psx - Sony PlayStation - %ROMPATH%/psx - .bin .BIN .cbn .CBN .ccd .CCD .chd .CHD .cue .CUE .ecm .ECM .exe .EXE .img .IMG .iso .ISO .m3u .M3U .mdf .MDF .mds .MDS .minipsf .MINIPSF .pbp .PBP .psexe .PSEXE .psf .PSF .toc .TOC .z .Z .znx .ZNX .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/swanstation_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_psx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_psx_hw_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pcsx_rearmed_libretro.so %ROM% - %EMULATOR_DUCKSTATION% -batch %ROM% - - - psx - psx - - - - pv1000 - Casio PV-1000 - %ROMPATH%/pv1000 - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "pv1000 -rompath \"%GAMEDIRRAW%;%ROMPATH%/pv1000\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/pv1000 pv1000 -cart %ROM% - pv1000 - pv1000 - - - - quake - Quake - %ROMPATH%/quake - .desktop .pak .PAK .pk3 .PK3 .sh - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tyrquake_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2-rogue_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2-xatrix_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2-zaero_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake3_libretro.so %ROM% - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - pc, pcwindows - quake - - - - satellaview - Nintendo Satellaview - %ROMPATH%/satellaview - .bml .BML .bs .BS .fig .FIG .sfc .SFC .smc .SMC .swc .SWC .st .ST .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - - satellaview - satellaview - - - saturn - Sega Saturn - %ROMPATH%/saturn - .bin .BIN .ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_saturn_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabasanshiro_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabause_libretro.so %ROM% - - saturn - saturn - - - saturnjp - Sega Saturn - %ROMPATH%/saturnjp - .bin .BIN .ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_saturn_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabasanshiro_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabause_libretro.so %ROM% - - saturn - saturnjp - - - scummvm - ScummVM Game Engine - %ROMPATH%/scummvm - .scummvm .SCUMMVM .svm .SVM - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/scummvm_libretro.so %ROM% - - scummvm - scummvm - - - - scv - Epoch Super Cassette Vision - %ROMPATH%/scv - .0 .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "scv -rompath \"%GAMEDIRRAW%;%ROMPATH%/scv\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/scv scv -cart %ROM% - scv - scv - - - - sega32x - Sega Mega Drive 32X - %ROMPATH%/sega32x - .32x .32X .68k .68K .bin .BIN .cue .CUE .gen .GEN .iso .ISO .md .MD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - - sega32x - sega32x - - - sega32xjp - Sega Super 32X - %ROMPATH%/sega32xjp - .32x .32X .68k .68K .bin .BIN .cue .CUE .gen .GEN .iso .ISO .md .MD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - - sega32x - sega32xjp - - - sega32xna - Sega Genesis 32X - %ROMPATH%/sega32xna - .32x .32X .68k .68K .bin .BIN .cue .CUE .gen .GEN .iso .ISO .md .MD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - - sega32x - sega32xna - - - segacd - Sega CD - %ROMPATH%/segacd - .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM% - - segacd - segacd - - - sfc - Nintendo SFC (Super Famicom) - %ROMPATH%/sfc - .bin .BIN .bml .BML .bs .BS .bsx .BSX .dx2 .DX2 .fig .FIG .gd3 .GD3 .gd7 .GD7 .mgd .MGD .sfc .SFC .smc .SMC .st .ST .swc .SWC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - - - snes - sfc - - - sg-1000 - Sega SG-1000 - %ROMPATH%/sg-1000 - .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .ri .RI .rom .ROM .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM% - - - sg-1000 - sg-1000 - - - sgb - Nintendo Super Game Boy - %ROMPATH%/sgb - .gb .GB .gbc .GBC .sgb .SGB .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameboy_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM% - - sgb - sgb - - - snes - Nintendo SNES (Super Nintendo) - %ROMPATH%/snes - .bin .BIN .bml .BML .bs .BS .bsx .BSX .dx2 .DX2 .fig .FIG .gd3 .GD3 .gd7 .GD7 .mgd .MGD .sfc .SFC .smc .SMC .st .ST .swc .SWC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - - - snes - snes - - - snesna - Nintendo SNES (Super Nintendo) - %ROMPATH%/snesna - .bin .BIN .bml .BML .bs .BS .bsx .BSX .dx2 .DX2 .fig .FIG .gd3 .GD3 .gd7 .GD7 .mgd .MGD .sfc .SFC .smc .SMC .st .ST .swc .SWC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - - - snes - snesna - - - - solarus - Solarus Game Engine - %ROMPATH%/solarus - .solarus - %EMULATOR_SOLARUS% %ROM% - solarus - solarus - - - - spectravideo - Spectravideo - %ROMPATH%/spectravideo - .cas .CAS .col .COL .dsk .DSK .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ri .RI .rom .ROM .sc .SC .sg .SG .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM% - spectravideo - spectravideo - - - stv - Sega Titan Video Game System - %ROMPATH%/stv - .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/stv %BASENAME% - - arcade - stv - - - sufami - Bandai SuFami Turbo - %ROMPATH%/sufami - .bml .BML .bs .BS .fig .FIG .sfc .SFC .smc .SMC .st .ST .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM% - - - sufami - sufami - - - supergrafx - NEC SuperGrafx - %ROMPATH%/supergrafx - .ccd .CCD .chd .CHD .cue .CUE .pce .PCE .sgx .SGX .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supergrafx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM% - - - - supergrafx - supergrafx - - - supervision - Watara Supervision - %ROMPATH%/supervision - .bin .BIN .sv .SV .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/potator_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "svision -rompath \"%GAMEDIRRAW%;%ROMPATH%/supervision\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/supervision svision -cart %ROM% - supervision - supervision - - - - supracan - Funtech Super A'Can - %ROMPATH%/supracan - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "supracan -rompath \"%GAMEDIRRAW%;%ROMPATH%/supracan\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/supracan supracan -cart %ROM% - supracan - supracan - - - - switch - Nintendo Switch - %ROMPATH%/switch - .nca .NCA .nro .NRO .nso .NSO .nsp .NSP .xci .XCI - %INJECT%=%BASENAME%.esprefix %EMULATOR_YUZU% -f -g %ROM% - %EMULATOR_RYUJINX% %ROM% - %INJECT%=%BASENAME%.esprefix %EMULATOR_YUZU-CUSTOM% -f -g %ROM% - switch - switch - - - symbian - Symbian - %ROMPATH%/symbian - .sis .SIS .sisx .SISX .symbian - %EMULATOR_EKA2L1% --fullscreen --device RH-29 --run "%BASENAME%" - %EMULATOR_EKA2L1% --fullscreen --device RM-84 --run "%BASENAME%" - %EMULATOR_EKA2L1% --fullscreen --device RM-507 --run "%BASENAME%" - %EMULATOR_EKA2L1% --fullscreen --device %INJECT%=%BASENAME%.device --run "%BASENAME%" - ngage - symbian - - - - tg16 - NEC TurboGrafx-16 - %ROMPATH%/tg16 - .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM% - - - - pcengine - tg16 - - - tg-cd - NEC TurboGrafx-CD - %ROMPATH%/tg-cd - .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM% - - - - pcenginecd - tg-cd - - - - ti99 - Texas Instruments TI-99 - %ROMPATH%/ti99 - .rpk .RPK .7z .7Z .zip .ZIP - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/ti99 ti99_4a -ioport peb -ioport:peb:slot3 speech -cart %BASENAME% - ti99 - ti99 - - - - tic80 - TIC-80 Fantasy Computer - %ROMPATH%/tic80 - .tic .TIC - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tic80_libretro.so %ROM% - - tic80 - tic80 - - - to8 - Thomson TO8 - %ROMPATH%/to8 - .fd .FD .k7 .K7 .m5 .M5 .m7 .M7 .rom .ROM .sap .SAP .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/theodore_libretro.so %ROM% - moto - to8 - - - - uzebox - Uzebox Open Source Console - %ROMPATH%/uzebox - .uze .UZE .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/uzem_libretro.so %ROM% - uzebox - uzebox - - - vectrex - GCE Vectrex - %ROMPATH%/vectrex - .bin .BIN .gam .GAM .vc .VC .vec .VEC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vecx_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "vectrex -rompath \"%GAMEDIRRAW%;%ROMPATH%/vectrex\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/vectrex vectrex -cart %ROM% - vectrex - vectrex - - - vic20 - Commodore VIC-20 - %ROMPATH%/vic20 - .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xvic_libretro.so %ROM% - - vic20 - vic20 - - - videopac - Philips Videopac G7000 - %ROMPATH%/videopac - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/o2em_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "videopac -rompath \"%GAMEDIRRAW%;%ROMPATH%/videopac\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/videopac videopac -cart %ROM% - odyssey2 - videopac - - - virtualboy - Nintendo Virtual Boy - %ROMPATH%/virtualboy - .bin .BIN .vb .VB .vboy .VBOY .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_vb_libretro.so %ROM% - - virtualboy - virtualboy - - - - - vsmile - VTech V.Smile - %ROMPATH%/vsmile - .bin .BIN .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "vsmile -rompath \"%GAMEDIRRAW%;%ROMPATH%/vsmile\" -cart \"%ROMRAW%\"" - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/vsmile vsmile -cart %ROM% - vsmile - vsmile - - - - wasm4 - WASM-4 Fantasy Console - %ROMPATH%/wasm4 - .wasm .WASM - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/wasm4_libretro.so %ROM% - wasm4 - wasm4 - - - wii - Nintendo Wii - %ROMPATH%/wii - .ciso .CISO .dff .DFF .dol .DOL .elf .ELF .gcm .GCM .gcz .GCZ .iso .ISO .json .JSON .m3u .M3U .rvz .RVZ .tgc .TGC .wad .WAD .wbfs .WBFS .wia .WIA .7z .7Z .zip .ZIP - %INJECT%=%BASENAME%.esprefix %EMULATOR_DOLPHIN% -b -e %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dolphin_libretro.so %ROM% - %INJECT%=%BASENAME%.esprefix %EMULATOR_PRIMEHACK% -b -e %ROM% - wii - wii - - - wiiu - Nintendo Wii U - %ROMPATH%/wiiu - .rpx .RPX .wua .WUA .wud .WUD .wux .WUX - %EMULATOR_CEMU% -g %ROM% - wiiu - wiiu - - - windows - Microsoft Windows - %ROMPATH%/windows - .AppImage .desktop .sh - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %EMULATOR_OS-SHELL% -c "%ROM%" - %RUNINBACKGROUND% %EMULATOR_OS-SHELL% -c "%ROM%" - pcwindows - windows - - - windows3x - Microsoft Windows 3.x - %ROMPATH%/windows3x - .AppImage .bat .BAT .desktop .dosz .DOSZ .sh .7z .7Z .zip .ZIP - %STARTDIR%=%GAMEDIR% %EMULATOR_DOSBOX-X% -defaultdir %GAMEDIR% %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM% - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %EMULATOR_OS-SHELL% -c "%ROM%" - %RUNINBACKGROUND% %EMULATOR_OS-SHELL% -c "%ROM%" - windows3x - windows3x - - - windows9x - Microsoft Windows 9x - %ROMPATH%/windows9x - .AppImage .bat .BAT .desktop .dosz .DOSZ .sh .7z .7Z .zip .ZIP - %STARTDIR%=%GAMEDIR% %EMULATOR_DOSBOX-X% -defaultdir %GAMEDIR% %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM% - %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - %EMULATOR_OS-SHELL% -c "%ROM%" - %RUNINBACKGROUND% %EMULATOR_OS-SHELL% -c "%ROM%" - pcwindows - windows9x - - - wonderswan - Bandai WonderSwan - %ROMPATH%/wonderswan - .pc2 .PC2 .ws .WS .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_wswan_libretro.so %ROM% - - - - wonderswan - wonderswan - - - wonderswancolor - Bandai WonderSwan Color - %ROMPATH%/wonderswancolor - .pc2 .PC2 .ws .WS .wsc .WSC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_wswan_libretro.so %ROM% - - - wonderswancolor - wonderswancolor - - - x1 - Sharp X1 - %ROMPATH%/x1 - .2d .2D .2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dup .DUP .dx1 .DX1 .hdm .HDM .tap .TAP .tfd .TFD .xdf .XDF .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/x1_libretro.so %ROM% - x1 - x1 - - - x68000 - Sharp X68000 - %ROMPATH%/x68000 - .2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dim .DIM .dup .DUP .hdf .HDF .hdm .HDM .img .IMG .m3u .M3U .xdf .XDF .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/px68k_libretro.so %ROM% - %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/x68000 x68000 -flop1 %ROM% - x68000 - x68000 - - - xbox - Microsoft Xbox - %ROMPATH%/xbox - .iso .ISO - %INJECT%=%BASENAME%.esprefix %EMULATOR_XEMU% -dvd_path %ROM% - xbox - xbox - - - - - zx81 - Sinclair ZX81 - %ROMPATH%/zx81 - .p .P .tzx .TZX .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/81_libretro.so %ROM% - zx81 - zx81 - - - - zxspectrum - Sinclair ZX Spectrum - %ROMPATH%/zxspectrum - .dsk .DSK .gz .GZ .img .IMG .mgt .MGT .rzx .RZX .scl .SCL .sh .SH .sna .SNA .szx .SZX .tap .TAP .trd .TRD .tzx .TZX .udi .UDI .z80 .Z80 .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fuse_libretro.so %ROM% - - zxspectrum - zxspectrum - - \ No newline at end of file diff --git a/functions/050_save_migration.sh b/functions/050_save_migration.sh index 41213705..b75672b4 100644 --- a/functions/050_save_migration.sh +++ b/functions/050_save_migration.sh @@ -13,7 +13,7 @@ save_migration() { # ROMs on Internal roms_folder="$HOME/retrodeck/roms" fi - echo "ROMs folder found at $roms_folder" + log i "ROMs folder found at $roms_folder" # Unhiding downloaded media from the previous versions if [ -d "$rdhome/.downloaded_media" ] @@ -28,12 +28,12 @@ save_migration() { fi # Doing the dir prep as we don't know from which version we came - dir_prep "$media_folder" "/var/config/emulationstation/ES-DE/downloaded_media" - dir_prep "$themes_folder" "/var/config/emulationstation/ES-DE/themes" - mkdir -pv $rdhome/logs #this was added later, maybe safe to remove in a few versions + dir_prep "$media_folder" "/var/config/ES-DE/downloaded_media" + dir_prep "$themes_folder" "/var/config/ES-DE/themes" + create_dir $rdhome/logs #this was added later, maybe safe to remove in a few versions # Resetting es_settings, now we need it but in the future I should think a better solution, maybe with sed - cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/ES-DE/es_settings.xml + cp -fv /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml # 0.4 -> 0.5 # Perform save and state migration if needed @@ -72,9 +72,9 @@ save_migration() { gamestoskip= tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety - echo "Saves backed up to" $save_backup_file >> $migration_logfile + log i "Saves backed up to" $save_backup_file $migration_logfile tar -C $rdhome -czf $state_backup_file states # Backup state directory for safety - echo "States backed up to" $state_backup_file >> $migration_logfile + log i "States backed up to" $state_backup_file $migration_logfile ( movefile() { # Take matching save and rom files and sort save into appropriate system folder @@ -92,21 +92,22 @@ save_migration() { gamestoskip+=("$1") return fi - echo "INFO: Examining ROM file:" "$game" >> $migration_logfile - echo "INFO: System detected as" $systemdir >> $migration_logfile + log i "Examining ROM file:" "$game" $migration_logfile + log i "System detected as" $systemdir $migration_logfile sosfile=$(sed -e "s/\^/ /g" <<< "$2") # Remove whitespace placeholder from s-ave o-r s-tate file sospurebasename="$(basename "$sosfile")" # Extract pure file name ie. /saves/game1.sav becomes game1 - echo "INFO: Current save or state being examined for match:" $sosfile >> $migration_logfile - echo "INFO: Matching save or state" $sosfile "and game" $game "found." >> $migration_logfile - echo "INFO: Moving save or state to" $current_dest_folder"/"$systemdir"/"$sosbasename >> $migration_logfile + log i "Current save or state being examined for match:" $sosfile $migration_logfile + log i "Matching save or state" $sosfile "and game" $game "found." $migration_logfile + log i "Moving save or state to $current_dest_folder/$systemdir/$sosbasename" $migration_logfile if [[ ! -d $current_dest_folder"/"$systemdir ]]; then # If system directory doesn't exist for save yet, create it - echo "WARNING: Creating missing system directory" $current_dest_folder"/"$systemdir + log w "Creating missing system directory $current_dest_folder/$systemdir" mkdir $current_dest_folder/$systemdir fi mv "$sosfile" -t $current_dest_folder/$systemdir # Move save to appropriate system directory return else - echo "WARNING: Game with name" "$(basename "$1" | sed -e "s/\^/ /g")" "already found. Skipping to next game..." >> $migration_logfile # Inform user of game being skipped due to duplicate ROM names + local name="$(basename "$1" | sed -e "s/\^/ /g")" + log w "Game with name \"$name\" already found. Skipping to next game..." $migration_logfile # Inform user of game being skipped due to duplicate ROM names fi } @@ -167,6 +168,6 @@ save_migration() { fi else - echo "Version" $version "is after the save and state organization was changed, no need to sort again" + log i "Version $version is after the save and state organization was changed, no need to sort again" fi } diff --git a/functions/checks.sh b/functions/checks.sh index 7b76d82f..2bd9af51 100644 --- a/functions/checks.sh +++ b/functions/checks.sh @@ -28,9 +28,22 @@ check_desktop_mode() { fi } +check_is_steam_deck() { + # This function will check the internal product ID for the Steam Deck codename and return "true" if RetroDECK is running on a real Deck + # USAGE: if [[ $(check_is_steam_deck) == "true" ]]; then + + if [[ $(cat /sys/devices/virtual/dmi/id/product_name) =~ ^(Jupiter|Galileo)$ ]]; then + echo "true" + else + echo "false" + fi +} + check_for_version_update() { # This function will perform a basic online version check and alert the user if there is a new version available. + log d "Entering funtcion check_for_version_update" + wget -q --spider "https://api.github.com/repos/XargonWan/$update_repo/releases/latest" if [ $? -eq 0 ]; then @@ -60,33 +73,73 @@ check_for_version_update() { # exit 1 # fi # TODO: add the logic to check and update the branch from the configuration file + log i "Showing new version found dialog" choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Ignore this version" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Update Available" \ - --text="There is a new version of RetroDECK on the stable release channel $online_version. Please update through the Discover app!\n\nIf you would like to ignore this version and recieve a notification at the NEXT version,\nclick the \"Ignore this version\" button.") + --title "RetroDECK - New Update Available" \ + --text="There is a new version of RetroDECK available: $online_version.\nYou can easily update from the app store you have installed, examples: KDE Discover or Gnome Software.\n\nIf you would like to ignore this notification, click the \"Ignore this version\" button.") rc=$? # Capture return code, as "OK" button has no text value if [[ $rc == "1" ]]; then # If any button other than "OK" was clicked + log i "Selected: \"OK\"" set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks fi elif [[ "$update_repo" == "RetroDECK-cooker" ]] && [[ ! $version == $online_version ]]; then + log i "Showing update request dialog as \"$online_version\" was found and is greater then \"$version\"" choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Yes" --extra-button="No" --extra-button="Ignore this version" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Update Available" \ - --text="There is a more recent build of the RetroDECK cooker branch.\nYou are running version $hard_version, the latest is $online_version.\n\nWould you like to update to it?\nIf you would like to skip reminders about this version, click \"Ignore this version\".\nYou will be reminded again at the next version update.\n\nIf you would like to disable these update notifications entirely, disable Online Update Checks in the Configurator.") + --title "RetroDECK - New Cooker Version Available" \ + --text="There is a more recent version of RetroDECK cooker.\nYou are running version $hard_version. The latest is $online_version.\n\nWould you like to update?\nIf you would like to ignore this notification, click the \"Ignore this version\" button.\n\nIf you would like to disable these notifications entirely: disable Online Update Checks in the Configurator.") rc=$? # Capture return code, as "Yes" button has no text value if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked if [[ $choice == "Ignore this version" ]]; then + log i "\"Ignore this version\" selected, updating \"$rd_conf\"" set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks. fi else # User clicked "Yes" + log i "Selected: \"Yes\"" configurator_generic_dialog "RetroDECK Online Update" "The update process may take several minutes.\n\nAfter the update is complete, RetroDECK will close. When you run it again you will be using the latest version." ( - local latest_cooker_download=$(curl --silent https://api.github.com/repos/XargonWan/$update_repo/releases/latest | grep '"browser_download_url":' | sed -E 's/.*"([^"]+)".*/\1/') - mkdir -p "$rdhome/RetroDECK_Updates" - wget -P "$rdhome/RetroDECK_Updates" $latest_cooker_download - flatpak-spawn --host flatpak remove --noninteractive -y net.retrodeck.retrodeck # Remove current version before installing new one, to avoid duplicates - flatpak-spawn --host flatpak install --user --bundle --noninteractive -y "$rdhome/RetroDECK_Updates/RetroDECK-cooker.flatpak" - rm -rf "$rdhome/RetroDECK_Updates" # Cleanup old bundles to save space + local latest_cooker_download=$(curl --silent https://api.github.com/repos/XargonWan/RetroDECK-cooker/releases/latest | grep '"browser_download_url":.*flatpak' | grep -v '\.sha' | sed -E 's/.*"([^"]+)".*/\1/') + local temp_folder="$rdhome/RetroDECK_Updates" + create_dir $temp_folder + log i "Downloading version \"$online_version\" in \"$temp_folder/RetroDECK-cooker.flatpak\" from url: \"$latest_cooker_download\"" + # Downloading the flatpak file + wget -P "$temp_folder" "$latest_cooker_download" + # And its sha + wget -P "$temp_folder" "$latest_cooker_download.sha" + + # Get the expected SHA checksum from the SHA file + local expected_sha=$(cat "$temp_folder/$(basename "$latest_cooker_download").sha" | awk '{print $1}') + + # Check if the file exists + if [ -f "$temp_folder/RetroDECK-cooker.flatpak" ]; then + # Calculate the actual SHA checksum of the file + actual_sha=$(sha256sum "$temp_folder/RetroDECK-cooker.flatpak" | awk '{print $1}') + + # Log the found and expected SHA checksums + log d "Found SHA: $actual_sha" + log d "Expected SHA: $expected_sha" + + # Check if the SHA checksum matches + if [ "$actual_sha" = "$expected_sha" ]; then + log d "Flatpak file \"$temp_folder/RetroDECK-cooker.flatpak\" found and SHA checksum matches, proceeding." + log d "Uninstalling old RetroDECK flatpak" + # Remove current version before installing new one, to avoid duplicates + flatpak-spawn --host flatpak remove --noninteractive -y net.retrodeck.retrodeck && log d "Uninstallation successful" + log d "Installing new flatpak file from: \"$temp_folder/RetroDECK-cooker.flatpak\"" + flatpak-spawn --host flatpak install --user --bundle --noninteractive -y "$temp_folder/RetroDECK-cooker.flatpak" && log d "Installation successful" + else + log e "Flatpak file \"$temp_folder/RetroDECK-cooker.flatpak\" found but SHA checksum does not match. Quitting." + configurator_generic_dialog "RetroDECK Online Update" "There was an error during the update: flatpak file found but SHA checksum does not match. Please check the log file." + exit 1 + fi + else + log e "Flatpak file \"$temp_folder/RetroDECK-cooker.flatpak\" NOT FOUND. Quitting." + configurator_generic_dialog "RetroDECK Online Update" "There was an error during the update: flatpak file not found. Please check the log file." + exit 1 + fi + + rm -rf "$temp_folder" # Cleanup old bundles to save space ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -111,3 +164,43 @@ validate_input() { fi done < $input_validation } + +check_version_is_older_than() { +# This function will determine if a given version number is newer than the one currently read from retrodeck.cfg (which will be the previous running version at update time) and will return "true" if it is +# The given version to check should be in normal RetroDECK version notation of N.N.Nb (eg. 0.8.0b) +# USAGE: check_version_is_older_than "version" + +local current_version="$version" +local new_version="$1" +local is_newer_version="false" + +current_version_major_rev=$(sed 's/^\([0-9]*\)\..*/\1/' <<< "$current_version") +new_version_major_rev=$(sed 's/^\([0-9]*\)\..*/\1/' <<< "$new_version") + +current_version_minor_rev=$(sed 's/^[0-9]*\.\([0-9]*\)\..*/\1/' <<< "$current_version") +new_version_minor_rev=$(sed 's/^[0-9]*\.\([0-9]*\)\..*/\1/' <<< "$new_version") + +current_version_point_rev=$(sed 's/^[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/' <<< "$current_version") +new_version_point_rev=$(sed 's/^[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/' <<< "$new_version") + +if [[ "$new_version_major_rev" -gt "$current_version_major_rev" ]]; then + is_newer_version="true" +elif [[ "$new_version_major_rev" -eq "$current_version_major_rev" ]]; then + if [[ "$new_version_minor_rev" -gt "$current_version_minor_rev" ]]; then + is_newer_version="true" + elif [[ "$new_version_minor_rev" -eq "$current_version_minor_rev" ]]; then + if [[ "$new_version_point_rev" -gt "$current_version_point_rev" ]]; then + is_newer_version="true" + fi + fi +fi + +# Perform post_update commands for current version if it is a cooker +if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build, always perform post_update commands for current version + if [[ "$(echo $hard_version | cut -d'-' -f2)" == "$new_version" ]]; then + is_newer_version="true" + fi +fi + +echo "$is_newer_version" +} diff --git a/functions/cloud_sync.sh b/functions/cloud_sync.sh new file mode 100644 index 00000000..05a7907c --- /dev/null +++ b/functions/cloud_sync.sh @@ -0,0 +1,2 @@ +#!/bin/bash + diff --git a/functions/compression.sh b/functions/compression.sh index 72876292..bb33cd2e 100644 --- a/functions/compression.sh +++ b/functions/compression.sh @@ -2,7 +2,7 @@ compress_game() { # Function for compressing one or more files to .chd format - # USAGE: compress_game $format $full_path_to_input_file + # USAGE: compress_game $format $full_path_to_input_file $system(optional) local file="$2" local filename_no_path=$(basename "$file") local filename_no_extension="${filename_no_path%.*}" @@ -10,7 +10,17 @@ compress_game() { local dest_file=$(dirname "$(realpath "$file")")"/""$filename_no_extension" if [[ "$1" == "chd" ]]; then - /app/bin/chdman createcd -i "$source_file" -o "$dest_file".chd + case "$3" in # Check platform-specific compression options + "psp" ) + /app/bin/chdman createdvd --hunksize 2048 -i "$source_file" -o "$dest_file".chd -c zstd + ;; + "ps2" ) + /app/bin/chdman createdvd -i "$source_file" -o "$dest_file".chd -c zstd + ;; + * ) + /app/bin/chdman createcd -i "$source_file" -o "$dest_file".chd + ;; + esac elif [[ "$1" == "zip" ]]; then zip -jq9 "$dest_file".zip "$source_file" elif [[ "$1" == "rvz" ]]; then @@ -30,6 +40,8 @@ find_compatible_compression_format() { echo "zip" elif echo "$normalized_filename" | grep -qE '\.iso|\.gcm' && [[ $(sed -n '/^\[/{h;d};/\b'"$system"'\b/{g;s/\[\(.*\)\]/\1/p;q};' $compression_targets) == "rvz" ]]; then echo "rvz" + elif echo "$normalized_filename" | grep -qE '\.iso' && [[ $(sed -n '/^\[/{h;d};/\b'"$system"'\b/{g;s/\[\(.*\)\]/\1/p;q};' $compression_targets) == "cso" ]]; then + echo "cso" else # If no compatible format can be found for the input file echo "none" @@ -43,36 +55,35 @@ validate_for_chd() { local file="$1" local normalized_filename=$(echo "$file" | tr '[:upper:]' '[:lower:]') local file_validated="false" - chd_validation_log_file="compression_$(basename "$file").log" - echo "Validating file:" "$file" > "$logs_folder/$chd_validation_log_file" + log i "Validating file: $file" if echo "$normalized_filename" | grep -qE '\.iso|\.cue|\.gdi'; then - echo ".cue/.iso/.gdi file detected" >> "$logs_folder/$chd_validation_log_file" + log i ".cue/.iso/.gdi file detected" local file_path=$(dirname "$(realpath "$file")") local file_base_name=$(basename "$file") local file_name=${file_base_name%.*} if [[ "$normalized_filename" == *".cue" ]]; then # Validate .cue file if [[ ! "$file_path" == *"dreamcast"* ]]; then # .bin/.cue compression may not work for Dreamcast, only GDI or ISO # TODO: verify - echo "Validating .cue associated .bin files" >> "$logs_folder/$chd_validation_log_file" + log i "Validating .cue associated .bin files" local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - echo "Associated bin files read:" >> "$logs_folder/$chd_validation_log_file" - printf '%s\n' "$cue_bin_files" >> "$logs_folder/$chd_validation_log_file" + log i "Associated bin files read:" + log i $(printf '%s\n' "$cue_bin_files") if [[ ! -z "$cue_bin_files" ]]; then while IFS= read -r line do - echo "looking for $file_path/$line" >> "$logs_folder/$chd_validation_log_file" + log i "Looking for $file_path/$line" if [[ -f "$file_path/$line" ]]; then - echo ".bin file found at $file_path/$line" >> "$logs_folder/$chd_validation_log_file" + log i ".bin file found at $file_path/$line" file_validated="true" else - echo ".bin file NOT found at $file_path/$line" >> "$logs_folder/$chd_validation_log_file" - echo ".cue file could not be validated. Please verify your .cue file contains the correct corresponding .bin file information and retry." >> "$logs_folder/$chd_validation_log_file" + log e ".bin file NOT found at $file_path/$line" + log e ".cue file could not be validated. Please verify your .cue file contains the correct corresponding .bin file information and retry." file_validated="false" break fi done < <(printf '%s\n' "$cue_bin_files") fi else - echo ".cue files not compatible with Dreamcast CHD compression" >> "$logs_folder/$chd_validation_log_file" + log w ".cue files not compatible with CHD compression" fi echo $file_validated else # If file is a .iso or .gdi @@ -80,7 +91,7 @@ validate_for_chd() { echo $file_validated fi else - echo "File type not recognized. Supported file types are .cue, .gdi and .iso" >> "$logs_folder/$chd_validation_log_file" + log w "File type not recognized. Supported file types are .cue, .gdi and .iso" echo $file_validated fi } @@ -93,35 +104,39 @@ cli_compress_single_game() { read -p "RetroDECK will now attempt to compress your selected game. Press Enter key to continue..." if [[ ! -z "$file" ]]; then if [[ -f "$file" ]]; then - check_system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") + local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") local compatible_compression_format=$(find_compatible_compression_format "$file") if [[ ! $compatible_compression_format == "none" ]]; then - echo "$(basename "$file") can be compressed to $compatible_compression_format" - compress_game "$compatible_compression_format" "$file" + log i "$(basename "$file") can be compressed to $compatible_compression_format" + compress_game "$compatible_compression_format" "$file" "$system" if [[ $post_compression_cleanup == [yY] ]]; then # Remove file(s) if requested - if [[ $(basename "$file") == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do # Remove associated .bin files - echo "Removing original file "$file_path/$line"" - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file - echo "Removing original file $(basename "$file")" - rm -f "$file" + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + if [[ $(basename "$file") == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do # Remove associated .bin files + log i "Removing original file "$file_path/$line"" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file + log i "Removing original file $(basename "$file")" + rm -f "$file" + else + log i "Removing original file $(basename "$file")" + rm -f "$file" + fi else - echo "Removing original file $(basename "$file")" - rm -f "$file" + log w "Compressed version of $(basename "$file") not found, skipping deletion." fi fi else - echo "$(basename "$file") does not have any compatible compression formats." + log w "$(basename "$file") does not have any compatible compression formats." fi else - echo "File not found, please specify the full path to the file to be compressed." + log w "File not found, please specify the full path to the file to be compressed." fi else - echo "Please use this command format \"--compress-one \"" + log i "Please use this command format \"--compress-one \"" fi } @@ -149,35 +164,39 @@ cli_compress_all_games() { do local compression_candidates=$(find "$roms_folder/$system" -type f -not -iname "*.txt") if [[ ! -z "$compression_candidates" ]]; then - echo "Checking files for $system" + log i "Checking files for $system" while IFS= read -r file do local compatible_compression_format=$(find_compatible_compression_format "$file") if [[ ! "$compatible_compression_format" == "none" ]]; then - echo "$(basename "$file") can be compressed to $compatible_compression_format" - compress_game "$compatible_compression_format" "$file" + log i "$(basename "$file") can be compressed to $compatible_compression_format" + compress_game "$compatible_compression_format" "$file" "$system" if [[ $post_compression_cleanup == [yY] ]]; then # Remove file(s) if requested - if [[ "$file" == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do # Remove associated .bin files - echo "Removing original file "$file_path/$line"" - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file - echo "Removing original file "$file"" - rm -f $(realpath "$file") + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + if [[ "$file" == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do # Remove associated .bin files + log i "Removing original file "$file_path/$line"" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file + log i "Removing original file "$file"" + rm -f $(realpath "$file") + else + log i "Removing original file "$file"" + rm -f $(realpath "$file") + fi else - echo "Removing original file "$file"" - rm -f $(realpath "$file") + log w "Compressed version of $(basename "$file") not found, skipping deletion." fi fi else - echo "No compatible compression format found for $(basename "$file")" + log w "No compatible compression format found for $(basename "$file")" fi done < <(printf '%s\n' "$compression_candidates") else - echo "No compatible files found for compression in $system" + log w "No compatible files found for compression in $system" fi done < <(printf '%s\n' "$compressable_systems_list") } diff --git a/functions/dialogs.sh b/functions/dialogs.sh index af005e63..3772c7e9 100644 --- a/functions/dialogs.sh +++ b/functions/dialogs.sh @@ -2,6 +2,10 @@ source /app/libexec/functions.sh +# Dialog colors +purple="#a864fc" +blue="#6fbfff" + debug_dialog() { # This function is for displaying commands run by the Configurator without actually running them # USAGE: debug_dialog "command" @@ -30,6 +34,7 @@ configurator_process_complete_dialog() { configurator_generic_dialog() { # This dialog is for showing temporary messages before another process happens. # USAGE: configurator_generic_dialog "title text" "info text" + log i "Showing a configurator_generic_dialog" zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "$1" \ @@ -162,6 +167,8 @@ changelog_dialog() { # The function also accepts "all" as a version, and will print the entire changelog # USAGE: changelog_dialog "version" + log d "Showing changelog dialog" + if [[ "$1" == "all" ]]; then xml sel -t -m "//release" -v "concat('RetroDECK version: ', @version)" -n -v "description" -n $rd_appdata | awk '{$1=$1;print}' | sed -e '/./b' -e :n -e 'N;s/\n$//;tn' > "/var/config/retrodeck/changelog.txt" @@ -172,8 +179,7 @@ changelog_dialog() { else local version_changelog=$(xml sel -t -m "//release[@version='$1']/description" -v . -n $rd_appdata | tr -s '\n' | sed 's/^\s*//') - echo -e "In RetroDECK version $1, the following changes were made:\n$version_changelog" > "/var/config/retrodeck/changelog-partial.txt" - "$version_changelog" >> "/var/config/retrodeck/changelog-partial.txt" + echo -e "In RetroDECK version $1, the following changes were made:\n$version_changelog" > "/var/config/retrodeck/changelog-partial.txt" 2>/dev/null zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -211,17 +217,23 @@ desktop_mode_warning() { # USAGE: desktop_mode_warning if [[ $(check_desktop_mode) == "true" && $desktop_mode_warning == "true" ]]; then + local message='You appear to be running RetroDECK in the Steam Deck'\''s Desktop mode!\n\nSome functions of RetroDECK may not work properly in Desktop mode, such as the Steam Deck'\''s normal controls.\n\nRetroDECK is best enjoyed in Game mode!\n\nDo you still want to proceed?' + log i "Showing message:\n$message" choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Yes" --extra-button="No" --extra-button="Never show this again" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Desktop Mode Warning" \ - --text="You appear to be running RetroDECK in the Steam Deck's Desktop mode!\n\nSome functions of RetroDECK may not work properly in Desktop mode, such as the Steam Deck's normal controls.\n\nRetroDECK is best enjoyed in Game mode!\n\nDo you still want to proceed?") + --text="$message") rc=$? # Capture return code, as "Yes" button has no text value if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked if [[ $choice == "No" ]]; then + log i "Selected: \"No\"" exit 1 elif [[ $choice == "Never show this again" ]]; then + log i "Selected: \"Never show this again\"" set_setting_value $rd_conf "desktop_mode_warning" "false" retrodeck "options" # Store desktop mode warning variable for future checks fi + else + log i "Selected: \"Yes\"" fi fi } @@ -233,13 +245,17 @@ low_space_warning() { if [[ $low_space_warning == "true" ]]; then local used_percent=$(df --output=pcent "$HOME" | tail -1 | tr -d " " | tr -d "%") if [[ "$used_percent" -ge 90 && -d "$HOME/retrodeck" ]]; then # If there is any RetroDECK data on the main drive to move + local message='Your main drive is over 90% full!\n\nIf your drive fills completely this can lead to data loss or system crash.\n\nPlease consider moving some RetroDECK folders to other storage locations using the Configurator.' + log i "Showing message:\n$message" choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Never show this again" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Low Space Warning" \ - --text="Your main drive is over 90% full!\n\nIf your drive fills completely this can lead to data loss or system crash.\n\nPlease consider moving some RetroDECK folders to other storage locations using the Configurator.") + --text="$message") if [[ $choice == "Never show this again" ]]; then - set_setting_value $rd_conf "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks + log i "Selected: \"Never show this again\"" + set_setting_value $rd_conf "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks fi fi + log i "Selected: \"OK\"" fi -} \ No newline at end of file +} diff --git a/functions/patching.sh b/functions/framework.sh similarity index 88% rename from functions/patching.sh rename to functions/framework.sh index 4af54660..92f3b32e 100644 --- a/functions/patching.sh +++ b/functions/framework.sh @@ -8,9 +8,11 @@ set_setting_value() { local setting_value_to_change=$(sed -e 's^\\^\\\\^g;s^`^\\`^g' <<< "$3") local current_section_name=$(sed -e 's/%/\\%/g' <<< "$5") + log d "Setting $setting_name_to_change=$setting_value_to_change in $1" + case $4 in - "retrodeck" | "citra" | "melonds" | "yuzu" ) + "retrodeck" | "melonds" | "yuzu" | "citra" | "libretro_scummvm" ) if [[ -z $current_section_name ]]; then sed -i 's^\^'"$setting_name_to_change"'=.*^'"$setting_name_to_change"'='"$setting_value_to_change"'^' "$1" else @@ -37,11 +39,21 @@ set_setting_value() { fi ;; - "rpcs3" | "vita3k" ) # This does not currently work for settings with a $ in them - if [[ -z $current_section_name ]]; then - sed -i 's^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1" - else - sed -i '\^\['"$current_section_name"'\]^,\^\^'"$setting_name_to_change"'.*^s^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1" + "rpcs3" | "vita3k" ) + # This does not currently work for settings with a $ in them + + if [[ "$1" =~ (.ini)$ ]]; then # If this is a RPCS3 .ini file + if [[ -z $current_section_name ]]; then + sed -i 's^\^'"$setting_name_to_change"'=.*^'"$setting_name_to_change"'='"$setting_value_to_change"'^' "$1" + else + sed -i '\^\['"$current_section_name"'\]^,\^\^'"$setting_name_to_change"'=^s^\^'"$setting_name_to_change"'=.*^'"$setting_name_to_change"'='"$setting_value_to_change"'^' "$1" + fi + elif [[ "$1" =~ (.yml)$ ]]; then # If this is an YML-based file + if [[ -z $current_section_name ]]; then + sed -i 's^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1" + else + sed -i '\^\['"$current_section_name"'\]^,\^\^'"$setting_name_to_change"'.*^s^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1" + fi fi ;; @@ -53,9 +65,15 @@ set_setting_value() { fi ;; - "mame" ) # This only works for mame .ini files, not the .cfg XML files - local mame_current_value=$(get_setting_value $1 "$setting_name_to_change" $4) - sed -i '\^\^'"$setting_name_to_change"'\s^s^'"$mame_current_value"'^'"$setting_value_to_change"'^' "$1" + "mame" ) + # In this option, $current_section_name is the in the .cfg file. + + local mame_current_value=$(get_setting_value "$1" "$setting_name_to_change" "$4" "$current_section_name") + if [[ "$1" =~ (.ini)$ ]]; then # If this is a MAME .ini file + sed -i '\^\^'"$setting_name_to_change"'\s^s^'"$mame_current_value"'^'"$setting_value_to_change"'^' "$1" + elif [[ "$1" =~ (.cfg)$ ]]; then # If this is an XML-based MAME .cfg file + sed -i '\^\^,\^<\/system>^s^'"$mame_current_value"'^'"$setting_value_to_change"'^' "$1" + fi ;; "es_settings" ) @@ -78,7 +96,11 @@ get_setting_name() { ;; "rpcs3" | "vita3k" ) - echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g' + if [[ "$1" =~ (.ini)$ ]]; then # If this is a RPCS3 .ini file + echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?=\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g;s^\\$^^' + elif [[ "$1" =~ (.yml)$ ]]; then # If this is an YML-based file + echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g' + fi ;; "mame" ) # This only works for mame .ini files, not the .cfg XML files @@ -101,7 +123,7 @@ get_setting_value() { case $3 in - "retrodeck" | "citra" | "melonds" | "yuzu" ) # For files with this syntax - setting_name=setting_value + "retrodeck" | "melonds" | "yuzu" ) # For files with this syntax - setting_name=setting_value if [[ -z $current_section_name ]]; then echo $(grep -o -P "(?<=^$current_setting_name=).*" "$1") else @@ -141,8 +163,12 @@ get_setting_value() { fi ;; - "mame" ) # This only works for mame .ini files, not the .cfg XML files - echo $(sed -n '\^\^'"$current_setting_name"'\s^p' "$1" | awk '{print $2}') + "mame" ) # In this option, $current_section_name is the in the .cfg file. + if [[ "$1" =~ (.ini)$ ]]; then # If this is a MAME .ini file + echo $(sed -n '\^\^'"$current_setting_name"'\s^p' "$1" | awk '{print $2}') + elif [[ "$1" =~ (.cfg)$ ]]; then # If this is an XML-based MAME .cfg file + echo $(xml sel -t -v "/mameconfig/system[@name='$current_section_name']//*[@type='$current_setting_name']//*" -v "text()" -n "$1") + fi ;; "es_settings" ) diff --git a/functions/functions.sh b/functions/functions.sh index ccbdcb91..b8ea9953 100644 --- a/functions/functions.sh +++ b/functions/functions.sh @@ -83,6 +83,8 @@ move() { source_dir="$(echo $1 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing dest_dir="$(echo $2 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing + log d "Moving \"$source_dir\" to \"$dest_dir\"" + ( rsync -a --remove-source-files --ignore-existing --mkpath "$source_dir" "$dest_dir" # Copy files but don't overwrite conflicts find "$source_dir" -type d -empty -delete # Cleanup empty folders that were left behind @@ -100,6 +102,27 @@ move() { fi } +create_dir() { + # A simple function that creates a directory checking if is still there while logging the activity + # If -d it will delete it prior the creation + + if [[ "$1" == "-d" ]]; then + # If "force" flag is provided, delete the directory first + shift # Remove the first argument (-f) + if [[ -e "$1" ]]; then + rm -rf "$1" # Forcefully delete the directory + log d "Found \"$1\", deleting it." + fi + fi + + if [[ ! -d "$1" ]]; then + mkdir -p "$1" # Create directory if it doesn't exist + log d "Created directory: $1" + else + log d "Directory \"$1\" already exists, skipping." + fi +} + download_file() { # Function to download file from the Internet, with Zenity progress bar # USAGE: download_file $source_url $file_dest $file_name @@ -107,34 +130,14 @@ download_file() { # file_dest is the destination the file should be in the filesystem, needs filename included! # file_name is a user-readable file name or description to be put in the Zenity dialog - # Run wget in the background and redirect the progress to a temporary file ( - wget "$1" -O "$2" -q --show-progress --progress=dot 2>&1 | sed -n -e 's/^.* \([0-9]*\)%.*$/\1/p' > "/var/cache/tmp/download_progress" & - wget_pid=$! - - progress="0" - echo "$progress" # Initial progress value. sent to Zenity - while true; do - progress=$(tail -n 2 "/var/cache/tmp/download_progress" | head -1) # Read the second-to-last value written to the pipe, to avoid reading data that is half written - echo "$progress" # Send value to Zenity - if [[ "$(tail -n 1 "/var/cache/tmp/download_progress")" == "100" ]]; then # Read last line every time to check for download completion - echo "100" - break - fi - sleep 0.5 - done - - # Wait for wget process to finish - wait "$wget_pid" + wget "$1" -O "$2" -q ) | zenity --progress \ --title="Downloading File" \ --text="Downloading $3..." \ - --percentage=0 \ + --pulsate \ --auto-close - - # Cleanup temp file - rm -f "/var/cache/tmp/download_progress" } update_rd_conf() { @@ -233,58 +236,60 @@ dir_prep() { # Call me with: # dir prep "real dir" "symlink location" - real="$1" - symlink="$2" + real="$(realpath -s $1)" + symlink="$(realpath -s $2)" - echo -e "\n[DIR PREP]\nMoving $symlink in $real" #DEBUG + log d "Preparing directory $symlink in $real" # if the symlink dir is already a symlink, unlink it first, to prevent recursion if [ -L "$symlink" ]; then - echo "$symlink is already a symlink, unlinking to prevent recursives" #DEBUG + log d "$symlink is already a symlink, unlinking to prevent recursives" unlink "$symlink" fi # if the dest dir exists we want to backup it if [ -d "$symlink" ]; then - echo "$symlink found" #DEBUG + log d "$symlink found" mv -f "$symlink" "$symlink.old" fi # if the real dir is already a symlink, unlink it first if [ -L "$real" ]; then - echo "$real is already a symlink, unlinking to prevent recursives" #DEBUG + log d "$real is already a symlink, unlinking to prevent recursives" #DEBUG unlink "$real" fi # if the real dir doesn't exist we create it if [ ! -d "$real" ]; then - echo "$real not found, creating it" #DEBUG - mkdir -pv "$real" + log d "$real not found, creating it" #DEBUG + create_dir "$real" fi # creating the symlink - echo "linking $real in $symlink" #DEBUG - mkdir -pv "$(dirname "$symlink")" # creating the full path except the last folder + log d "linking $real in $symlink" #DEBUG + create_dir "$(dirname "$symlink")" # creating the full path except the last folder ln -svf "$real" "$symlink" # moving everything from the old folder to the new one, delete the old one if [ -d "$symlink.old" ]; then - echo "Moving the data from $symlink.old to $real" #DEBUG + log d "Moving the data from $symlink.old to $real" #DEBUG mv -f "$symlink.old"/{.[!.],}* "$real" - echo "Removing $symlink.old" #DEBUG + log d "Removing $symlink.old" #DEBUG rm -rf "$symlink.old" fi - echo -e "$symlink is now $real\n" + log i "$symlink is now $real" } check_bios_files() { # This function validates all the BIOS files listed in the $bios_checklist and adds the results to an array called bios_checked_list which can be used elsewhere + # There is a "basic" and "expert" mode which outputs different levels of data + # USAGE: check_bios_files "mode" rm -f "$godot_bios_files_checked" # Godot data transfer temp files touch "$godot_bios_files_checked" @@ -301,21 +306,33 @@ check_bios_files() { bios_hash_matched="Yes" fi fi - bios_checked_list=("${bios_checked_list[@]}" "$bios_file" "$bios_system" "$bios_file_found" "$bios_hash_matched" "$bios_desc") - echo "$bios_file"^"$bios_system"^"$bios_file_found"^"$bios_hash_matched"^"$bios_desc" >> "$godot_bios_files_checked" # Godot data transfer temp file + if [[ "$1" == "basic" ]]; then + bios_checked_list=("${bios_checked_list[@]}" "$bios_file" "$bios_system" "$bios_file_found" "$bios_hash_matched" "$bios_desc") + echo "$bios_file"^"$bios_system"^"$bios_file_found"^"$bios_hash_matched"^"$bios_desc" >> "$godot_bios_files_checked" # Godot data transfer temp file + else + bios_checked_list=("${bios_checked_list[@]}" "$bios_file" "$bios_system" "$bios_file_found" "$bios_hash_matched" "$bios_desc" "$bios_subdir" "$bios_hash") + echo "$bios_file"^"$bios_system"^"$bios_file_found"^"$bios_hash_matched"^"$bios_desc"^"$bios_subdir"^"$bios_hash" >> "$godot_bios_files_checked" # Godot data transfer temp file + fi done < $bios_checklist } update_rpcs3_firmware() { - mkdir -p "$roms_folder/ps3/tmp" + create_dir "$roms_folder/ps3/tmp" chmod 777 "$roms_folder/ps3/tmp" download_file "$rpcs3_firmware" "$roms_folder/ps3/tmp/PS3UPDAT.PUP" "RPCS3 Firmware" rpcs3 --installfw "$roms_folder/ps3/tmp/PS3UPDAT.PUP" rm -rf "$roms_folder/ps3/tmp" } +update_vita3k_firmware() { + download_file "http://dus01.psv.update.playstation.net/update/psv/image/2022_0209/rel_f2c7b12fe85496ec88a0391b514d6e3b/PSVUPDAT.PUP" "/tmp/PSVUPDAT.PUP" "Vita3K Firmware file: PSVUPDAT.PUP" + download_file "http://dus01.psp2.update.playstation.net/update/psp2/image/2019_0924/sd_8b5f60b56c3da8365b973dba570c53a5/PSP2UPDAT.PUP?dest=us" "/tmp/PSP2UPDAT.PUP" "Vita3K Firmware file: PSP2UPDAT.PUP" + Vita3K --firmware /tmp/PSVUPDAT.PUP + Vita3K --firmware /tmp/PSP2UPDAT.PUP +} + backup_retrodeck_userdata() { - mkdir -p "$backups_folder" + create_dir "$backups_folder" zip -rq9 "$backups_folder/$(date +"%0m%0d")_retrodeck_userdata.zip" "$saves_folder" "$states_folder" "$bios_folder" "$media_folder" "$themes_folder" "$logs_folder" "$screenshots_folder" "$mods_folder" "$texture_packs_folder" "$borders_folder" > $logs_folder/$(date +"%0m%0d")_backup_log.log } @@ -323,7 +340,11 @@ make_name_pretty() { # This function will take an internal system name (like "gbc") and return a pretty version for user display ("Nintendo GameBoy Color") # USAGE: make_name_pretty "system name" local system=$(grep "$1^" "$pretty_system_names_reference_list") - IFS='^' read -r internal_name pretty_name < <(echo "$system") + if [[ ! -z "$system" ]]; then + IFS='^' read -r internal_name pretty_name < <(echo "$system") + else + pretty_name="$system" + fi echo "$pretty_name" } @@ -389,22 +410,22 @@ finit_user_options_dialog() { finit() { # Force/First init, depending on the situation - echo "Executing finit" + log i "Executing finit" # Internal or SD Card? - local finit_dest_choice=$(configurator_destination_choice_dialog "RetroDECK data" "Welcome to the first configuration of RetroDECK.\nThe setup will be quick but please READ CAREFULLY each message in order to avoid misconfigurations.\n\nWhere do you want your RetroDECK data folder to be located?\n\nThis folder will contain all ROMs, BIOSs and scraped data." ) - echo "Choice is $finit_dest_choice" + local finit_dest_choice=$(configurator_destination_choice_dialog "RetroDECK data" "Welcome to the first setup of RetroDECK.\nPlease carefully read each message prompted during the installation process to avoid any unwanted misconfigurations.\n\nWhere do you want your RetroDECK data folder to be located?\nIn this location a \"retrodeck\" folder will be created.\nThis is the folder that you will use to contain all your important files, such as your own ROMs, BIOSs, Saves and Scraped Data." ) + log i "Choice is $finit_dest_choice" case "$finit_dest_choice" in - "Back" | "" ) # Back or X button quits + "Quit" | "" ) # Back or X button quits rm -f "$rd_conf" # Cleanup unfinished retrodeck.cfg if first install is interrupted - echo "Now quitting" + log i "Now quitting" quit_retrodeck ;; "Internal Storage" ) # Internal - echo "Internal selected" + log i "Internal selected" rdhome="$HOME/retrodeck" if [[ -L "$rdhome" ]]; then #Remove old symlink from existing install, if it exists unlink "$rdhome" @@ -412,10 +433,10 @@ finit() { ;; "SD Card" ) - echo "SD Card selected" + log i "SD Card selected" if [ ! -d "$sdcard" ] # SD Card path is not existing then - echo "Error: SD card not found" + log e "SD card not found" zenity --error --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK" \ @@ -428,14 +449,14 @@ finit() { fi elif [ ! -w "$sdcard" ] #SD card found but not writable then - echo "Error: SD card found but not writable" + log e "SD card found but not writable" zenity --error --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK" \ --ok-label "Quit" \ --text="SD card was found but is not writable\nThis can happen with cards formatted on PC.\nPlease format the SD card through the Steam Deck's Game Mode and run RetroDECK again." rm -f "$rd_conf" # Cleanup unfinished retrodeck.cfg if first install is interrupted - echo "Now quitting" + log i "Now quitting" quit_retrodeck else rdhome="$sdcard/retrodeck" @@ -443,7 +464,7 @@ finit() { ;; "Custom Location" ) - echo "Custom Location selected" + log i "Custom Location selected" zenity --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK" \ @@ -469,6 +490,10 @@ finit() { configurator_generic_dialog "RPCS3 Firmware Install" "You have chosen to install the RPCS3 firmware during the RetroDECK first setup.\n\nThis process will take several minutes and requires network access.\n\nRPCS3 will be launched automatically at the end of the RetroDECK setup process.\nOnce the firmware is installed, please close the emulator to finish the process." fi + if [[ "$finit_options_choices" =~ (vita3k_firmware|Enable All) ]]; then # Additional information on the firmware install process, as the emulator needs to be manually closed + configurator_generic_dialog "Vita3K Firmware Install" "You have chosen to install the Vita3K firmware during the RetroDECK first setup.\n\nThis process will take several minutes and requires network access.\n\nVita3K will be launched automatically at the end of the RetroDECK setup process.\nOnce the firmware is installed, please close the emulator to finish the process." + fi + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ --text="RetroDECK will now install the needed files, which can take up to one minute.\nRetroDECK will start once the process is completed.\n\nPress OK to continue." @@ -484,6 +509,11 @@ finit() { update_rpcs3_firmware fi fi + if [[ "$finit_options_choices" =~ (vita3k_firmware|Enable All) ]]; then + if [[ $(check_network_connectivity) == "true" ]]; then + update_vita3k_firmware + fi + fi if [[ "$finit_options_choices" =~ (rd_controller_profile|Enable All) ]]; then install_retrodeck_controller_profile fi @@ -506,11 +536,11 @@ install_retrodeck_starterpack() { ## DOOM section ## cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it - mkdir -p "/var/config/emulationstation/ES-DE/gamelists/doom" - if [[ ! -f "/var/config/emulationstation/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist - cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/emulationstation/ES-DE/gamelists/doom/gamelist.xml" + create_dir "/var/config/ES-DE/gamelists/doom" + if [[ ! -f "/var/config/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist + cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/ES-DE/gamelists/doom/gamelist.xml" fi - mkdir -p "$media_folder/doom" + create_dir "$media_folder/doom" unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/" } @@ -519,10 +549,15 @@ install_retrodeck_controller_profile() { # NOTE: These files need to be stored in shared locations for Steam, outside of the normal RetroDECK folders and should always be an optional user choice # BIGGER NOTE: As part of this process, all emulators will need to have their configs hard-reset to match the controller mappings of the profile # USAGE: install_retrodeck_controller_profile - if [[ -d "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/" && -d "$HOME/.steam/steam/controller_base/templates/" ]]; then - rsync -rlD --mkpath "/app/retrodeck/binding_icons/" "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/" - rsync -rlD --mkpath "$emuconfigs/defaults/retrodeck/controller_configs/" "$HOME/.steam/steam/controller_base/templates/" - # TODO: delete older files Issue#672 + if [[ -d "$HOME/.steam/steam/controller_base/templates/" || -d "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" ]]; then + if [[ -d "$HOME/.steam/steam/controller_base/templates/" ]]; then # If a normal binary Steam install exists + rsync -rlD --mkpath "/app/retrodeck/binding_icons/" "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/" + rsync -rlD --mkpath "$emuconfigs/defaults/retrodeck/controller_configs/" "$HOME/.steam/steam/controller_base/templates/" + fi + if [[ -d "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" ]]; then # If a Flatpak Steam install exists + rsync -rlD --mkpath "/app/retrodeck/binding_icons/" "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/" + rsync -rlD --mkpath "$emuconfigs/defaults/retrodeck/controller_configs/" "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" + fi else configurator_generic_dialog "RetroDECK Controller Profile Install" "The target directories for the controller profile do not exist.\n\nThis may happen if you do not have Steam installed or the location is does not have permission to be read." fi @@ -539,8 +574,11 @@ update_splashscreens() { # This script will purge any existing ES graphics and reload them from RO space into somewhere ES will look for it # USAGE: update_splashscreens - rm -rf /var/config/emulationstation/ES-DE/resources/graphics - rsync -rlD --mkpath "/app/retrodeck/graphics/" "/var/config/emulationstation/ES-DE/resources/graphics/" + log i "Updating splash screen" + + rm -rf /var/config/ES-DE/resources/graphics + rsync -rlD --mkpath "/app/retrodeck/graphics/" "/var/config/ES-DE/resources/graphics/" + } deploy_helper_files() { @@ -582,11 +620,113 @@ easter_eggs() { cp -f "$new_splash_file" "$current_splash_file" # Deploy assigned splash screen } +ponzu() { + # This function is used to extract some specific appimages + # Check if any of the specified files exist + # If RetroDECK is reset Ponzu must re-cooked + + log d "Checking for Ponzu" + + local tmp_folder="/tmp/extracted" + local ponzu_files=("$rdhome"/ponzu/Citra*.AppImage "$rdhome"/ponzu/citra*.AppImage "$rdhome"/ponzu/Yuzu*.AppImage "$rdhome"/ponzu/yuzu*.AppImage) + local data_dir + local appimage + local executable + + # if the binaries are found, ponzu should be set as true into the retrodeck config + if [ -f "/var/data/ponzu/Citra/bin/citra-qt" ]; then + log d "Citra binaries has already been installed, checking for updates and forcing the setting as true." + set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options" + fi + if [ -f "/var/data/ponzu/Yuzu/bin/yuzu" ]; then + log d "Yuzu binaries has already been installed, checking for updates and forcing the setting as true." + set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options" + fi + + # Loop through all ponzu files + for ponzu_file in "${ponzu_files[@]}"; do + # Check if the current ponzu file exists + if [ -f "$ponzu_file" ]; then + if [[ "$ponzu_file" == *itra* ]]; then + log i "Found akai ponzu! Elaborating it" + data_dir="/var/data/ponzu/Citra" + local message="Akai ponzu is served, enjoy" + elif [[ "$ponzu_file" == *uzu* ]]; then + log i "Found kiroi ponzu! Elaborating it" + data_dir="/var/data/ponzu/Yuzu" + local message="Kiroi ponzu is served, enjoy" + else + log e "AppImage not recognized, not a ponzu ingredient!" + exit 1 + fi + appimage="$ponzu_file" + chmod +x "$ponzu_file" + create_dir "$data_dir" + log d "Moving AppImage in \"$data_dir\"" + mv "$appimage" "$data_dir" + cd "$data_dir" + local filename=$(basename "$ponzu_file") + log d "Setting appimage=$data_dir/$filename" + appimage="$data_dir/$filename" + log d "Extracting AppImage" + "$appimage" --appimage-extract + create_dir "$tmp_folder" + log d "Cleaning up" + cp -r squashfs-root/* "$tmp_folder" + rm -rf * + if [[ "$ponzu_file" == *itra* ]]; then + mv "$tmp_folder/usr/"** . + executable="$data_dir/bin/citra" + log d "Making $executable and $executable-qt executable" + chmod +x "$executable" + chmod +x "$executable-qt" + prepare_component "reset" "citra" + set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options" + elif [[ "$ponzu_file" == *uzu* ]]; then + mv "$tmp_folder/usr/"** . + executable="$data_dir/bin/yuzu" + log d "Making $executable executable" + chmod +x "$executable" + prepare_component "reset" "yuzu" + set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options" + fi + + cd - + log i "$message" + rm -rf "$tmp_folder" + fi + done + rm -rf "$rdhome/ponzu" +} + +ponzu_remove(){ + + # Call me with yuzu or citra and I will remove them + + if [[ "$1" == "citra" ]]; then + if [[ $(configurator_generic_question_dialog "Ponzu - Remove Citra" "Do you really want to remove Citra binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then + log i "Ponzu: removing Citra" + rm -rf "/var/data/ponzu/Citra" + set_setting_value $rd_conf "akai_ponzu" "false" retrodeck "options" + configurator_generic_dialog "Ponzu - Remove Citra" "Done, Citra is now removed from RetroDECK" + fi + elif [[ "$1" == "yuzu" ]]; then + if [[ $(configurator_generic_question_dialog "Ponzu - Remove Yuzu" "Do you really want to remove Yuzu binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then + log i "Ponzu: removing Yuzu" + rm -rf "/var/data/ponzu/Yuzu" + set_setting_value $rd_conf "kiroi_ponzu" "false" retrodeck "options" + configurator_generic_dialog "Ponzu - Remove Yuzu" "Done, Yuzu is now removed from RetroDECK" + fi + else + log e "Ponzu: \"$1\" is not a vaild choice for removal, quitting" + fi + configurator_retrodeck_tools_dialog +} + # TODO: this function is not yet used branch_selector() { - # Fetch branches from GitHub API excluding "main" + log d "Fetch branches from GitHub API excluding \"main\"" branches=$(curl -s https://api.github.com/repos/XargonWan/RetroDECK/branches | grep '"name":' | awk -F '"' '$4 != "main" {print $4}') - # TODO: logging - Fetching branches from GitHub API # Create an array to store branch names branch_array=() @@ -624,7 +764,7 @@ branch_selector() { configurator_generic_dialog "RetroDECK Online Update" "The update process may take several minutes.\n\nAfter the update is complete, RetroDECK will close. When you run it again you will be using the latest version." ( local desired_flatpak_file=$(curl --silent $flatpak_file_url | grep '"browser_download_url":' | sed -E 's/.*"([^"]+)".*/\1/') - mkdir -p "$rdhome/RetroDECK_Updates" + create_dir "$rdhome/RetroDECK_Updates" wget -P "$rdhome/RetroDECK_Updates" $desired_flatpak_file flatpak-spawn --host flatpak remove --noninteractive -y net.retrodeck.retrodeck # Remove current version before installing new one, to avoid duplicates flatpak-spawn --host flatpak install --user --bundle --noninteractive -y "$rdhome/RetroDECK_Updates/RetroDECK-cooker.flatpak" @@ -643,13 +783,16 @@ branch_selector() { } quit_retrodeck() { - pkill -f retrodeck - pkill -f emulationstation + log i "Quitting ES-DE" + pkill -f "es-de" + log i "Shutting down RetroDECK's framework" + pkill -f "retrodeck" + log i "See you next time" } start_retrodeck() { easter_eggs # Check if today has a surprise splashscreen and load it if so - # normal startup - echo "Starting RetroDECK v$version" - emulationstation --home /var/config/emulationstation + ponzu + log i "Starting RetroDECK v$version" + es-de } diff --git a/functions/global.sh b/functions/global.sh index d9d67121..cb332dd3 100644 --- a/functions/global.sh +++ b/functions/global.sh @@ -6,10 +6,11 @@ source /app/libexec/050_save_migration.sh source /app/libexec/checks.sh source /app/libexec/compression.sh source /app/libexec/dialogs.sh +source /app/libexec/logger.sh source /app/libexec/functions.sh source /app/libexec/game_downloader.sh source /app/libexec/multi_user.sh -source /app/libexec/patching.sh +source /app/libexec/framework.sh source /app/libexec/post_update.sh source /app/libexec/prepare_component.sh source /app/libexec/presets.sh @@ -17,6 +18,7 @@ source /app/libexec/presets.sh # Static variables rd_conf="/var/config/retrodeck/retrodeck.cfg" # RetroDECK config file path rd_conf_backup="/var/config/retrodeck/retrodeck.bak" # Backup of RetroDECK config file from update +rd_logs_folder="/var/config/retrodeck/logs" # Static location to write all RetroDECK-related logs emuconfigs="/app/retrodeck/emu-configs" # folder with all the default emulator configs rd_defaults="$emuconfigs/defaults/retrodeck/retrodeck.cfg" # A default RetroDECK config file rd_update_patch="/var/config/retrodeck/rd_update.patch" # A static location for the temporary patch file used during retrodeck.cfg updates @@ -26,13 +28,13 @@ zip_compressable_extensions="$emuconfigs/defaults/retrodeck/reference_lists/zip_ easter_egg_checklist="$emuconfigs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg" # A config file listing days and times when special splash screens should show up input_validation="$emuconfigs/defaults/retrodeck/reference_lists/input_validation.cfg" # A config file listing valid CLI inputs finit_options_list="$emuconfigs/defaults/retrodeck/reference_lists/finit_options_list.cfg" # A config file listing available optional installs during finit -splashscreen_dir="/var/config/emulationstation/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens -current_splash_file="/var/config/emulationstation/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot -default_splash_file="/var/config/emulationstation/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen +splashscreen_dir="/var/config/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens +current_splash_file="/var/config/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot +default_splash_file="/var/config/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen multi_user_emulator_config_dirs="$emuconfigs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg" # A list of emulator config folders that can be safely linked/unlinked entirely in multi-user mode -rd_es_themes="/app/share/emulationstation/themes" # The directory where themes packaged with RetroDECK are stored -lockfile="/var/config/retrodeck/.lock" # where the lockfile is located -default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path +rd_es_themes="/app/share/es-de/themes" # The directory where themes packaged with RetroDECK are stored +lockfile="/var/config/retrodeck/.lock" # Where the lockfile is located +default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path # A static location for RetroDECK logs to be written hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem) rd_repo="https://github.com/XargonWan/RetroDECK" # The URL of the main RetroDECK GitHub repo es_themes_list="https://gitlab.com/es-de/themes/themes-list/-/raw/master/themes.json" # The URL of the ES-DE 2.0 themes list @@ -50,25 +52,28 @@ pretty_system_names_reference_list="$emuconfigs/defaults/retrodeck/reference_lis # Godot data transfer temp files -godot_bios_files_checked="var/config/retrodeck/godot/godot_bios_files_checked.tmp" +godot_bios_files_checked="/var/config/retrodeck/godot/godot_bios_files_checked.tmp" # Config files for emulators with single config files -citraconf="/var/config/citra-emu/qt-config.ini" duckstationconf="/var/config/duckstation/settings.ini" melondsconf="/var/config/melonDS/melonDS.ini" ryujinxconf="/var/config/Ryujinx/Config.json" xemuconf="/var/config/xemu/xemu.toml" yuzuconf="/var/config/yuzu/qt-config.ini" +citraconf="/var/config/citra-emu/qt-config.ini" # ES-DE config files -es_settings="/var/config/emulationstation/ES-DE/es_settings.xml" +export ESDE_APPDATA_DIR="/var/config/ES-DE" +es_settings="/var/config/ES-DE/settings/es_settings.xml" +es_source_logs="/var/config/ES-DE/logs" # RetroArch config files raconf="/var/config/retroarch/retroarch.cfg" ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" +ra_scummvm_conf="/var/config/retroarch/system/scummvm.ini" # CEMU config files @@ -113,6 +118,20 @@ rpcs3vfsconf="/var/config/rpcs3/vfs.yml" vita3kconf="/var/data/Vita3K/config.yml" vita3kusrconfdir="$bios_folder/Vita3K/Vita3K" +# MAME-SA config files + +mameconf="/var/config/mame/ini/mame.ini" +mameuiconf="/var/config/mame/ini/ui.ini" +mamedefconf="/var/config/mame/cfg/default.cfg" + +# Initialize logging location if it doesn't exist, before anything else happens +if [ ! -d "$rd_logs_folder" ]; then + create_dir "$rd_logs_folder" +fi +if [[ ! -d "$rd_logs_folder/ES-DE" ]]; then + dir_prep "$rd_logs_folder/ES-DE" "$es_source_logs" +fi + # We moved the lockfile in /var/config/retrodeck in order to solve issue #53 - Remove in a few versions if [[ -f "$HOME/retrodeck/.lock" ]]; then mv "$HOME/retrodeck/.lock" $lockfile @@ -120,15 +139,14 @@ fi # If there is no config file I initalize the file with the the default values if [[ ! -f "$rd_conf" ]]; then - mkdir -p /var/config/retrodeck - echo "RetroDECK config file not found in $rd_conf" - echo "Initializing" + log w "RetroDECK config file not found in $rd_conf" + log i "Initializing" # if we are here means that the we are in a new installation, so the version is valorized with the hardcoded one # Initializing the variables if [[ -z "$version" ]]; then if [[ -f "$lockfile" ]]; then if [[ $(cat $lockfile) == *"0.4."* ]] || [[ $(cat $lockfile) == *"0.3."* ]] || [[ $(cat $lockfile) == *"0.2."* ]] || [[ $(cat $lockfile) == *"0.1."* ]]; then # If the previous version is very out of date, pre-rd_conf - echo "Running version workaround" + log d "Running version workaround" version=$(cat $lockfile) fi else @@ -138,8 +156,8 @@ if [[ ! -f "$rd_conf" ]]; then # Check if SD card path has changed from SteamOS update if [[ ! -d "$default_sd" && "$(ls -A /run/media/deck/)" ]]; then - if [[ $(find media/deck/* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default - default_sd="$(find media/deck/* -maxdepth 0 -type d -print)" + if [[ $(find /run/media/deck/* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default + default_sd="$(find /run/media/deck/* -maxdepth 0 -type d -print)" else # If the default legacy path cannot be found, and there are multiple entries in the new Steam OS 3.5 SD card path, let the user pick which one to use configurator_generic_dialog "RetroDECK Setup" "The SD card was not found in the default location, and multiple drives were detected.\nPlease browse to the location of the desired SD card.\n\nIf you are not using an SD card, please click \"Cancel\"." default_sd="$(directory_browse "SD Card Location")" @@ -150,23 +168,22 @@ if [[ ! -f "$rd_conf" ]]; then set_setting_value $rd_conf "version" "$version" retrodeck # Set current version for new installs set_setting_value $rd_conf "sdcard" "$default_sd" retrodeck "paths" # Set SD card location if default path has changed - if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build + if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR-" <<< "$hard_version"; then # If newly-installed version is a "cooker" or PR build set_setting_value $rd_conf "update_repo" "RetroDECK-cooker" retrodeck "options" set_setting_value $rd_conf "update_check" "true" retrodeck "options" set_setting_value $rd_conf "developer_options" "true" retrodeck "options" fi - echo "Setting config file permissions" + log i "Setting config file permissions" chmod +rw $rd_conf - echo "RetroDECK config file initialized. Contents:" - echo - cat $rd_conf + log i "RetroDECK config file initialized. Contents:\n\n$(cat $rd_conf)\n" conf_read # Load new variables into memory + #tmplog_merger # This function is tempry(?) removed # If the config file is existing i just read the variables else - echo "Found RetroDECK config file in $rd_conf" - echo "Loading it" + log i "Found RetroDECK config file in $rd_conf" + log i "Loading it" if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build set_setting_value $rd_conf "update_repo" "RetroDECK-cooker" retrodeck "options" @@ -175,6 +192,7 @@ else fi conf_read + #tmplog_merger # This function is tempry(?) removed # Verify rdhome is where it is supposed to be. if [[ ! -d "$rdhome" ]]; then @@ -183,6 +201,7 @@ else new_home_path=$(directory_browse "RetroDECK folder location") set_setting_value $rd_conf "rdhome" "$new_home_path" retrodeck "paths" conf_read + #tmplog_merger # This function is tempry(?) removed prepare_component "retrodeck" "postmove" prepare_component "all" "postmove" conf_write @@ -192,3 +211,5 @@ else backups_folder="$rdhome/backups" # A standard location for backup file storage multi_user_data_folder="$rdhome/multi-user-data" # The default location of multi-user environment profiles fi + +logs_folder="$rdhome/logs" # The path of the logs folder, here we collect all the logs diff --git a/functions/logger.sh b/functions/logger.sh new file mode 100755 index 00000000..d37dafb6 --- /dev/null +++ b/functions/logger.sh @@ -0,0 +1,98 @@ +# SORRY, I WILL CLEAN UP THIS +# -Xargon + +# This script provides a logging function 'log' that can be sourced in other scripts. +# It logs messages to both the terminal and a specified logfile, allowing different log levels. +# The log function takes three parameters: log level, log message, and optionally the logfile. If no logfile is specified, it writes to retrodeck/logs/retrodeck.log + +# Type of log messages: +# log d - debug message: maybe in the future we can decide to hide them in main builds or if an option is toggled +# log i - normal informational message +# log w - waring: something is not expected but it's not a big deal +# log e - error: something broke + +# Example usage: +# log w "foo" -> logs a warning with message foo in the default log file retrodeck/logs/retrodeck.log +# log e "bar" -> logs an error with message bar in the default log file retrodeck/logs/retrodeck.log +# log i "par" rekku.log -> logs an information with message in the specified log file inside the logs folder retrodeck/logs/rekku.log + +log() { + + local level="$1" + local message="$2" + local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])" + local colorize_terminal + + # Use specified logfile or default to retrodeck.log + local logfile + if [ -n "$3" ]; then + logfile="$3" + else + logfile="$rd_logs_folder/retrodeck.log" + fi + + # Check if the shell is sh (not bash or zsh) to avoid colorization + if [ "${SHELL##*/}" = "sh" ]; then + colorize_terminal=false + else + colorize_terminal=true + fi + + case "$level" in + w) + if [ "$colorize_terminal" = true ]; then + # Warning (yellow) for terminal + colored_message="\e[33m[WARN] $message\e[0m" + else + # Warning (no color for sh) for terminal + colored_message="$timestamp [WARN] $message" + fi + # Write to log file without colorization + log_message="$timestamp [WARN] $message" + ;; + e) + if [ "$colorize_terminal" = true ]; then + # Error (red) for terminal + colored_message="\e[31m[ERROR] $message\e[0m" + else + # Error (no color for sh) for terminal + colored_message="$timestamp [ERROR] $message" + fi + # Write to log file without colorization + log_message="$timestamp [ERROR] $message" + ;; + i) + # Write to log file without colorization for info message + log_message="$timestamp [INFO] $message" + colored_message=$log_message + ;; + d) + if [ "$colorize_terminal" = true ]; then + # Debug (green) for terminal + colored_message="\e[32m[DEBUG] $message\e[0m" + else + # Debug (no color for sh) for terminal + colored_message="$timestamp [DEBUG] $message" + fi + # Write to log file without colorization + log_message="$timestamp [DEBUG] $message" + ;; + *) + # Default (no color for other shells) for terminal + colored_message="$timestamp $message" + # Write to log file without colorization + log_message="$timestamp $message" + ;; + esac + + # Display the message in the terminal + echo -e "$colored_message" + + # Write the log message to the log file + if [ ! -f "$logfile" ]; then + echo "$timestamp [WARN] Log file not found in \"$logfile\", creating it" + touch "$logfile" + fi + echo "$log_message" >> "$logfile" + +} diff --git a/functions/multi_user.sh b/functions/multi_user.sh index 6a744814..10fced39 100644 --- a/functions/multi_user.sh +++ b/functions/multi_user.sh @@ -43,7 +43,7 @@ multi_user_enable_multi_user_mode() { if [[ -d "$multi_user_data_folder" && $(ls -1 "$multi_user_data_folder" | wc -l) -gt 0 ]]; then # If multi-user data folder exists from prior use and is not empty if [[ -d "$multi_user_data_folder/$SteamAppUser" ]]; then # Current user has an existing save folder configurator_generic_dialog "RetroDECK Multi-User Mode" "The current user $SteamAppUser has an existing folder in the multi-user data folder.\n\nThe saves here are likely older than the ones currently used by RetroDECK.\n\nThe old saves will be backed up to $backups_folder and the current saves will be loaded into the multi-user data folder." - mkdir -p "$backups_folder" + create_dir "$backups_folder" tar -C "$multi_user_data_folder" -cahf "$backups_folder/multi-user-backup_$SteamAppUser_$(date +"%Y_%m_%d").zip" "$SteamAppUser" rm -rf "$multi_user_data_folder/$SteamAppUser" # Remove stale data after backup fi @@ -162,18 +162,18 @@ multi_user_return_to_single_user() { # XEMU one-offs, because it stores its config in /var/data, not /var/config like everything else unlink "/var/config/xemu" unlink "/var/data/xemu/xemu" - mkdir -p "/var/config/xemu" + create_dir "/var/config/xemu" mv -f "$multi_user_data_folder/$single_user/config/xemu"/{.[!.],}* "/var/config/xemu" dir_prep "/var/config/xemu" "/var/data/xemu/xemu" - mkdir -p "$saves_folder" - mkdir -p "$states_folder" + create_dir "$saves_folder" + create_dir "$states_folder" mv -f "$multi_user_data_folder/$single_user/saves"/{.[!.],}* "$saves_folder" mv -f "$multi_user_data_folder/$single_user/states"/{.[!.],}* "$states_folder" for emu_conf in $(find "$multi_user_data_folder/$single_user/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') do if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then unlink "/var/config/$emu_conf" - mkdir -p "/var/config/$emu_conf" + create_dir "/var/config/$emu_conf" mv -f "$multi_user_data_folder/$single_user/config/$emu_conf"/{.[!.],}* "/var/config/$emu_conf" fi done @@ -187,11 +187,11 @@ multi_user_setup_new_user() { unlink "$states_folder" dir_prep "$multi_user_data_folder/$SteamAppUser/saves" "$saves_folder" dir_prep "$multi_user_data_folder/$SteamAppUser/states" "$states_folder" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/retrodeck" + create_dir "$multi_user_data_folder/$SteamAppUser/config/retrodeck" cp -L "$rd_conf" "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" # Copy existing rd_conf file for new user. rm -f "$rd_conf" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/retroarch" + create_dir "$multi_user_data_folder/$SteamAppUser/config/retroarch" if [[ ! -L "/var/config/retroarch/retroarch.cfg" ]]; then mv "/var/config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" mv "/var/config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" diff --git a/functions/post_update.sh b/functions/post_update.sh index ec9acee5..3dcc012b 100644 --- a/functions/post_update.sh +++ b/functions/post_update.sh @@ -3,18 +3,16 @@ post_update() { # post update script - echo "Executing post-update script" + log i "Executing post-update script" - local prev_version=$(sed -e 's/[\.a-z]//g' <<< $version) - - if [[ $prev_version -le "050" ]]; then # If updating from prior to save sorting change at 0.5.0b + if [[ $(check_version_is_older_than "0.5.0b") == "true" ]]; then # If updating from prior to save sorting change at 0.5.0b save_migration fi # Everything within the following ( ) will happen behind the Zenity dialog. The save migration was a long process so it has its own individual dialogs. ( - if [[ $prev_version -le "062" ]]; then + if [[ $(check_version_is_older_than "0.6.2b") == "true" ]]; then # In version 0.6.2b, the following changes were made that required config file updates/reset: # - Primehack preconfiguration completely redone. "Stop emulation" hotkey set to Start+Select, Xbox and Nintendo keymap profiles were created, Xbox set as default. # - Duckstation save and state locations were dir_prep'd to the rdhome/save and /state folders, which was not previously done. Much safer now! @@ -31,7 +29,7 @@ post_update() { dir_prep "$roms_folder/pico8" "$bios_folder/pico-8/carts" # Symlink default game location to RD roms for cleanliness (this location is overridden anyway by the --root_path launch argument anyway) dir_prep "$bios_folder/pico-8/cdata" "$saves_folder/pico-8" # PICO-8 saves folder fi - if [[ $prev_version -le "063" ]]; then + if [[ $(check_version_is_older_than "0.6.3b") == "true" ]]; then # In version 0.6.3b, the following changes were made that required config file updates/reset: # - Put Dolphin and Primehack save states in different folders inside $rd_home/states # - Fix symlink to hard-coded PICO-8 config folder (dir_prep doesn't like ~) @@ -53,7 +51,7 @@ post_update() { # Remove unneeded tools folder, as location has changed to RO space rm -rfv /var/config/retrodeck/tools/ fi - if [[ $prev_version -le "064" ]]; then + if [[ $(check_version_is_older_than "0.6.4b") == "true" ]]; then # In version 0.6.4b, the following changes were made: # Changed settings in Primehack: The audio output was not selected by default, default AR was also incorrect. # Changed settings in Duckstation and PCSX2: The "ask on exit" was disabled and "save on exit" was enabled. @@ -61,13 +59,13 @@ post_update() { deploy_multi_patch "emu-configs/patches/updates/064b_update.patch" fi - if [[ $prev_version -le "065" ]]; then + if [[ $(check_version_is_older_than "0.6.5b") == "true" ]]; then # In version 0.6.5b, the following changes were made: # Change Yuzu GPU accuracy to normal for better performance set_setting_value $yuzuconf "gpu_accuracy" "0" "yuzu" "Renderer" fi - if [[ $prev_version -le "070" ]]; then + if [[ $(check_version_is_older_than "0.7.0b") == "true" ]]; then # In version 0.7.0b, the following changes were made that required config file updates/reset or other changes to the filesystem: # - Update retrodeck.cfg and set new paths to $rdhome by default # - Update PCSX2 and Duckstation configs to latest templates (to accomadate RetroAchievements feature) and move Duckstation config folder from /var/data to /var/config @@ -106,9 +104,9 @@ post_update() { deploy_single_patch "$emuconfigs/duckstation/settings.ini" "/var/config/duckstation/duckstation-cheevos-upgrade.patch" "$duckstationconf" rm -f "/var/config/duckstation/duckstation-cheevos-upgrade.patch" - mkdir -p "$mods_folder" - mkdir -p "$texture_packs_folder" - mkdir -p "$borders_folder" + create_dir "$mods_folder" + create_dir "$texture_packs_folder" + create_dir "$borders_folder" dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" @@ -144,13 +142,13 @@ post_update() { rm "$roms_folder/ps3/emudir" configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update and due to a RPCS3 config upgrade, the files that used to exist at\n\n~/retrodeck/roms/ps3/emudir\n\nare now located at\n\n~/retrodeck/bios/rpcs3.\nYour existing files have been moved automatically." fi - mkdir -p "$bios_folder/rpcs3/dev_hdd0" - mkdir -p "$bios_folder/rpcs3/dev_hdd1" - mkdir -p "$bios_folder/rpcs3/dev_flash" - mkdir -p "$bios_folder/rpcs3/dev_flash2" - mkdir -p "$bios_folder/rpcs3/dev_flash3" - mkdir -p "$bios_folder/rpcs3/dev_bdvd" - mkdir -p "$bios_folder/rpcs3/dev_usb000" + create_dir "$bios_folder/rpcs3/dev_hdd0" + create_dir "$bios_folder/rpcs3/dev_hdd1" + create_dir "$bios_folder/rpcs3/dev_flash" + create_dir "$bios_folder/rpcs3/dev_flash2" + create_dir "$bios_folder/rpcs3/dev_flash3" + create_dir "$bios_folder/rpcs3/dev_bdvd" + create_dir "$bios_folder/rpcs3/dev_usb000" dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3" set_setting_value $es_settings "ApplicationUpdaterFrequency" "never" "es_settings" @@ -158,7 +156,7 @@ post_update() { if [[ -f "$saves_folder/duckstation/shared_card_1.mcd" || -f "$saves_folder/duckstation/shared_card_2.mcd" ]]; then configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update, the location of saves and states for Duckstation has been changed.\n\nYour files will be moved automatically, and can now be found at\n\n~.../saves/psx/duckstation/memcards/\nand\n~.../states/psx/duckstation/" fi - mkdir -p "$saves_folder/psx/duckstation/memcards" + create_dir "$saves_folder/psx/duckstation/memcards" mv "$saves_folder/duckstation/"* "$saves_folder/psx/duckstation/memcards/" rmdir "$saves_folder/duckstation" # File-safe folder cleanup unlink "/var/config/duckstation/memcards" @@ -166,7 +164,7 @@ post_update() { set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" - mkdir -p "$states_folder/psx" + create_dir "$states_folder/psx" mv -t "$states_folder/psx/" "$states_folder/duckstation" unlink "/var/config/duckstation/savestates" dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates" @@ -222,32 +220,139 @@ post_update() { prepare_component "reset" "all" fi fi - if [[ $prev_version -le "071" ]]; then + if [[ $(check_version_is_older_than "0.7.1b") == "true" ]]; then # In version 0.7.1b, the following changes were made that required config file updates/reset or other changes to the filesystem: # - Force update PPSSPP standalone keybinds for L/R. set_setting_value "$ppssppcontrolsconf" "L" "1-45,10-193" "ppsspp" "ControlMapping" set_setting_value "$ppssppcontrolsconf" "R" "1-51,10-192" "ppsspp" "ControlMapping" fi - if [[ $prev_version -le "073" ]]; then + if [[ $(check_version_is_older_than "0.7.3b") == "true" ]]; then # In version 0.7.3b, there was a bug that prevented the correct creations of the roms/system folders, so we force recreate them. emulationstation --home /var/config/emulationstation --create-system-dirs fi - if [[ $prev_version -le "080" ]]; then - # In version 0.8.0b, the following changes were made that required config file updates/reset or other changes to the filesystem: - # - Remove RetroDECK controller profile from existing template location TODO - # - Determine if Steam is installed via normal desktop application / Flatpak / SteamOS TODO - # - Install RetroDECK controller profile in desired location TODO - # - Change section name in retrodeck.cfg for ABXY button swap preset + if [[ $(check_version_is_older_than "0.8.0b") == "true" ]]; then + log i "In version 0.8.0b, the following changes were made that required config file updates/reset or other changes to the filesystem:" + log i "- Remove RetroDECK controller profile from existing template location" + log i "- Change section name in retrodeck.cfg for ABXY button swap preset" + log i "- Force disable global rewind in RA in prep for preset system" + log i "- The following components are been added and need to be initialized: es-de 3.0, MAME-SA, Vita3K, GZDoom" + + + # Removing old controller configs + local controller_configs_path="$HOME/.steam/steam/controller_base/templates" + local controller_configs=( + "$controller_configs_path/RetroDECK_controller_config.vdf" + "$controller_configs_path/RetroDECK_controller_generic_standard.vdf" + "$controller_configs_path/RetroDECK_controller_ps3_dualshock3.vdf" + "$controller_configs_path/RetroDECK_controller_ps4_dualshock4.vdf" + "$controller_configs_path/RetroDECK_controller_ps5_dualsense.vdf" + "$controller_configs_path/RetroDECK_controller_steam_controller_gordon.vdf" + "$controller_configs_path/RetroDECK_controller_neptune.vdf" + "$controller_configs_path/RetroDECK_controller_switch_pro.vdf" + "$controller_configs_path/RetroDECK_controller_xbox360.vdf" + "$controller_configs_path/RetroDECK_controller_xboxone.vdf" + ) + + for this_vdf in "${controller_configs[@]}"; do + if [[ -f "$this_vdf" ]]; then + log d "Found an old Steam Controller profile, removing it: \"$this_vdf\"" + rm -f "$this_vdf" + fi + done + + log d "Renaming \"nintendo_button_layout\" into \"abxy_button_swap\" in the retrodeck config file: \"$rd_conf\"" sed -i 's^nintendo_button_layout^abxy_button_swap^' "$rd_conf" # This is a one-off sed statement as there are no functions for replacing section names - mv -f /var/config/emulationstation/.emulationstation /var/config/emulationstation/ES-DE # in 3.0 .emulationstation was moved into ES-DE - ln -s /var/config/emulationstation/ES-DE /var/config/emulationstation/.emulationstation # symlinking it to mantain the compatibility # TODO: remove this symlink n 0.9.0b + log i "Force disabling rewind, you can re-enable it via the Configurator" + set_setting_value "$raconf" "rewind_enable" "false" "retroarch" + + # in 3.0 .emulationstation was moved into ES-DE + log i "Renaming old \"/var/config/emulationstation\" folder as \"/var/config/ES-DE\"" + mv -f /var/config/emulationstation /var/config/ES-DE + + prepare_component "reset" "es-de" + prepare_component "reset" "mame" + prepare_component "reset" "vita3k" + prepare_component "reset" "gzdoom" + + if [ -d "$rdhome/.logs" ]; then + mv "$rdhome/.logs" "$logs_folder" + log i "Old log folder \"$rdhome/.logs\" found. Renamed it as \"$logs_folder\"" + fi + + # The save folder of rpcs3 was inverted so we're moving the saves into the real one + log i "RPCS3 saves needs to be migrated, executing." + if [[ "$(ls -A $bios_folder/rpcs3/dev_hdd0/home/00000001/savedata)" ]]; then + log i "Existing RPCS3 savedata found, backing up..." + create_dir "$backups_folder" + zip -rq9 "$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" + fi + dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" + log i "RPCS3 saves migration completed, a backup was made here: \"$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip\"." + + log i "Switch firmware folder should be moved in \"$bios_folder/switch/firmware\" from \"$bios_folder/switch/registered\"" + mv "$bios_folder/switch/registered" "$bios_folder/switch/firmware" + + log i "New systems were added in this version, regenerating system folders." + #es-de --home "/var/config/" --create-system-dirs + es-de --create-system-dirs + fi - # if [[ $prev_version -le "090" ]]; then + if [[ $(check_version_is_older_than "0.8.1b") == "true" ]]; then + log i "In version 0.8.1b, the following changes were made that required config file updates/reset or other changes to the filesystem:" + log i "- ES-DE files were moved inside the retrodeck folder, migrating to the new structure" + log i "- Give the user the option to reset Ryujinx, which was not properly initialized in 0.8.0b" + + log d "ES-DE files were moved inside the retrodeck folder, migrating to the new structure" + dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections" + dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists" + log i "Moving ES-DE collections, downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\"" + set_setting_value "$es_settings" "MediaDirectory" "$rdhome/ES-DE/downloaded_media" "es_settings" + set_setting_value "$es_settings" "UserThemeDirectory" "$rdhome/ES-DE/themes" "es_settings" + mv -f "$rdhome/themes" "$rdhome/ES-DE/themes" && log d "Move of \"$rdhome/themes\" completed" + mv -f "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" completed" + mv -f "$rdhome/gamelists/"* "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" completed" + rm -rf "$rdhome/gamelists" + + log i "MAME-SA, migrating samples to the new exposed folder: from \"/var/data/mame/assets/samples\" to \"$bios_folder/mame-sa/samples\"" + create_dir "$bios_folder/mame-sa/samples" + mv -f "/var/data/mame/assets/samples/"* "$bios_folder/mame-sa/samples" + set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame" + + log i "Installing the missing ScummVM assets and renaming \"$mods_folder/RetroArch/ScummVM/themes\" into \"theme\"" + mv -f "$mods_folder/RetroArch/ScummVM/themes" "$mods_folder/RetroArch/ScummVM/theme" + unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp + unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp + mv -f /tmp/scummvm/extra "$mods_folder/RetroArch/ScummVM" + mv -f /tmp/scummvm/theme "$mods_folder/RetroArch/ScummVM" + rm -rf /tmp/extra /tmp/theme + + log i "Placing cheats in \"/var/data/mame/cheat\"" + unzip -j -o "$emuconfigs/mame/cheat0264.zip" 'cheat.7z' -d "/var/data/mame/cheat" + + log d "Verifying with user if they want to reset Ryujinx" + if [[ "$(configurator_generic_question_dialog "RetroDECK 0.8.1b Ryujinx Reset" "In RetroDECK 0.8.0b the Ryujinx emulator was not properly initialized for upgrading users.\nThis would cause Ryujinx to not work properly.\n\nWould you like to reset Ryujinx to default RetroDECK settings now?\n\nIf you have made your own changes to the Ryujinx config, you can decline this reset.")" == "true" ]]; then + log d "User agreed to Ryujinx reset" + prepare_component "reset" "ryujinx" + fi + fi + + # if [[ $(check_version_is_older_than "0.9.0b") == "true" ]]; then # # Placeholder for version 0.9.0b # rm /var/config/emulationstation/.emulationstation # remving the old symlink to .emulationstation as it might be not needed anymore + # TODO: change RETRODECKHOMEDIR/bios/cemu in emu-configs/cemu/settings.xml into RETRODECKHOMEDIR/bios/cemu/mlc + # if [ ! -d "$bios_folder/cemu/mlc" ]; then + # log i "Cemu MLC folder was moved from \"$bios_folder/cemu\" to \"$bios_folder/cemu/mlc\", migrating it" + # mv -f "$bios_folder/cemu" "$bios_folder/cemu/mlc" + # # TODO: set setting value mlc_path in settings.xml (check prepare script) + # fi + # if [ -f "/var/data/Cemu/keys.txt" ]; then + # log AND ZENITY "Found Cemu keys.txt" in "/var/data/Cemu/keys.txt", for a better compatibility is better to move it into "$bios_folder/cemu/mlc/keys.txt, do you want to continue? + # if yes: mv "/var/data/Cemu/keys.txt" "$bios_folder/cemu/mlc/keys.txt" + # ln -s "$bios_folder/cemu/mlc/keys.txt" "/var/data/Cemu/keys.txt" <--- AND THIS SHOULD BE EVEN PUT IN THE PREPARATION SCRIPT + # fi # fi # The following commands are run every time. @@ -259,7 +364,7 @@ post_update() { rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "/var/data/primehack/Load/DynamicInputTextures/" fi - if [[ -f "$HOME/.steam/steam/controller_base/templates/RetroDECK_controller_config.vdf" ]]; then # If RetroDECK controller profile has been previously installed + if [[ ! -z $(find "$HOME/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") || ! -z $(find "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") ]]; then # If RetroDECK controller profile has been previously installed install_retrodeck_controller_profile fi @@ -269,8 +374,9 @@ post_update() { ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Finishing Upgrade" \ - --text="RetroDECK is finishing the upgrade process, please wait." + --title "RetroDECK - Upgrade Process" \ + --width=400 --height=200 \ + --text="RetroDECK is finishing up the upgrading process, please be patient.\n\nNOTICE - If the process is taking too long:\n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n" version=$hard_version conf_write @@ -280,31 +386,4 @@ post_update() { else changelog_dialog "$version" fi - - if [[ $prev_version -le "075" ]]; then - # In version 0.7.5b, the following changes were made: - prepare_component "reset" "vita3k" - prepare_component "reset" "mame" - prepare_component "reset" "boilr" - if [ -d "$rdhome/.logs" ]; then - mv "$rdhome/.logs" "$logs_folder" - log i "Logs folder renamed successfully" - else - log i "The .logs folder does not exist, continuing." - fi - - - - # The save folder of rpcs3 was inverted so we're moving the saves into the real one - echo "RPCS3 saves needs to be migrated, executing." - mv "$saves_folder/ps3/rpcs3" "$saves_folder/ps3/rpcs3.bak" - mkdir -p "$saves_folder/ps3/rpcs3" - mv -v "$saves_folder/ps3/rpcs3.bak"/* "$saves_folder/ps3/rpcs3" - mv -v "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"/* "$saves_folder/ps3/rpcs3" - mv -v "$saves_folder/ps3/rpcs3.bak" "$rdhome/backups/saves/ps3/rpcs3" - echo "RPCS3 saves migration completed, a backup was made here: \"$rdhome/backups/saves/ps3/rpcs3\"." - source /app/libexec/functions.sh - dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" - - fi } diff --git a/functions/prepare_component.sh b/functions/prepare_component.sh index b367217b..adad0d90 100644 --- a/functions/prepare_component.sh +++ b/functions/prepare_component.sh @@ -10,9 +10,11 @@ prepare_component() { # USAGE: prepare_component "$action" "$component" "$call_source(optional)" action="$1" - component="$2" + component=$(echo "$2" | tr '[:upper:]' '[:lower:]') call_source="$3" + log d "Preparing component: \"$component\", action: \"$action\"" + if [[ "$component" == "retrodeck" ]]; then if [[ "$action" == "reset" ]]; then # Update the paths of all folders in retrodeck.cfg and create them while read -r config_line; do @@ -20,10 +22,17 @@ prepare_component() { if [[ ! $current_setting_name =~ (rdhome|sdcard) ]]; then # Ignore these locations local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths") declare -g "$current_setting_name=$rdhome/$(basename $current_setting_value)" - mkdir -p "$rdhome/$(basename $current_setting_value)" + if [[ ! $current_setting_name == "logs_folder" ]]; then # Don't create a logs folder normally, we want to maintain the current files exactly to not lose early-install logs. + create_dir "$rdhome/$(basename $current_setting_value)" + else # Log folder-specific actions + mv "$rd_logs_folder" "$logs_folder" # Move existing logs folder from internal to userland + ln -sf "$logs_folder" "$rd_logs_folder" # Link userland logs folder back to statically-written location + log d "Logs folder moved to $logs_folder and linked back to $rd_logs_folder" + fi fi done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') - mkdir -p "/var/config/retrodeck/godot" + create_dir "/var/config/retrodeck/godot" + fi if [[ "$action" == "postmove" ]]; then # Update the paths of any folders that came with the retrodeck folder during a move while read -r config_line; do @@ -35,42 +44,52 @@ prepare_component() { fi fi done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') + dir_prep "$logs_folder" "$rd_logs_folder" fi fi - if [[ "$component" =~ ^(es-de|ES-DE|all)$ ]]; then # For use after ESDE-related folders are moved or a reset + if [[ "$component" =~ ^(es-de|all)$ ]]; then # For use after ESDE-related folders are moved or a reset + log i "--------------------------------" + log i "Prepearing ES-DE" + log i "--------------------------------" if [[ "$action" == "reset" ]]; then - rm -rf /var/config/emulationstation/ - mkdir -p /var/config/emulationstation/ES-DE/ - cp -f /app/retrodeck/es_settings.xml /var/config/emulationstation/ES-DE/es_settings.xml + rm -rf /var/config/ES-DE + create_dir /var/config/ES-DE/settings + log d "Prepearing es_settings.xml" + cp -f /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" - dir_prep "$rdhome/gamelists" "/var/config/emulationstation/ES-DE/gamelists" - emulationstation --home /var/config/emulationstation --create-system-dirs + dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists" + dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections" + dir_prep "$rd_logs_folder/ES-DE" "$es_source_logs" + log d "Generating roms system folders" + #es-de --home /var/config/ES-DE --create-system-dirs + es-de --create-system-dirs update_splashscreens fi if [[ "$action" == "postmove" ]]; then set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" - dir_prep "$rdhome/gamelists" "/var/config/emulationstation/ES-DE/gamelists" + dir_prep "$rdhome/gamelists" "/var/config/ES-DE/gamelists" fi fi - if [[ "$component" =~ ^(retroarch|RetroArch|all)$ ]]; then + if [[ "$component" =~ ^(retroarch|all)$ ]]; then + log i "--------------------------------" + log i "Prepearing RetroArch" + log i "--------------------------------" if [[ "$action" == "reset" ]]; then # Run reset-only commands if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/retroarch" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/retroarch" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/retroarch" cp -fv $emuconfigs/retroarch/retroarch.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/" cp -fv $emuconfigs/retroarch/retroarch-core-options.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/" else # Single-user actions - rm -rf /var/config/retroarch - mkdir -p /var/config/retroarch + create_dir -d /var/config/retroarch dir_prep "$bios_folder" "/var/config/retroarch/system" - dir_prep "$logs_folder/retroarch" "/var/config/retroarch/logs" - mkdir -pv /var/config/retroarch/shaders/ + dir_prep "$rdhome/logs/retroarch" "/var/config/retroarch/logs" + create_dir /var/config/retroarch/shaders/ cp -rf /app/share/libretro/shaders /var/config/retroarch/ dir_prep "$rdhome/shaders/retroarch" "/var/config/retroarch/shaders" rsync -rlD --mkpath "/app/share/libretro/cores/" "/var/config/retroarch/cores/" @@ -84,13 +103,28 @@ prepare_component() { set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch" set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch" set_setting_value "$raconf" "log_dir" "$logs_folder" "retroarch" + set_setting_value "$raconf" "rgui_browser_directory" "$roms_folder" "retroarch" fi # Shared actions + create_dir "$bios_folder/np2kai" + create_dir "$bios_folder/dc" + create_dir "$bios_folder/Mupen64plus" + create_dir "$bios_folder/quasi88" + + # FBNEO + log i "--------------------------------" + log i "Prepearing FBNEO_LIBRETRO" + log i "--------------------------------" + create_dir "$bios_folder/fbneo/samples" + create_dir "$bios_folder/fbneo/cheats" + create_dir "$bios_folder/fbneo/blend" + dir_prep "$mods_folder/FBNeo" "$bios_folder/fbneo/patched" + # PPSSPP - echo "--------------------------------" - echo "Initializing PPSSPP_LIBRETRO" - echo "--------------------------------" + log i "--------------------------------" + log i "Prepearing PPSSPP_LIBRETRO" + log i "--------------------------------" if [ -d $bios_folder/PPSSPP/flash0/font ] then mv -fv $bios_folder/PPSSPP/flash0/font $bios_folder/PPSSPP/flash0/font.bak @@ -102,17 +136,38 @@ prepare_component() { fi # MSX / SVI / ColecoVision / SG-1000 - echo "-----------------------------------------------------------" - echo "Initializing MSX / SVI / ColecoVision / SG-1000 LIBRETRO" - echo "-----------------------------------------------------------" + log i "-----------------------------------------------------------" + log i "Prepearing MSX / SVI / ColecoVision / SG-1000 LIBRETRO" + log i "-----------------------------------------------------------" + log i "Copying \"/app/retrodeck/extras/MSX/Databases\" in \"$bios_folder/Databases\"" cp -rf "/app/retrodeck/extras/MSX/Databases" "$bios_folder/Databases" + log i "Copying \"/app/retrodeck/extras/MSX/Machines\" in \"$bios_folder/Machines\"" cp -rf "/app/retrodeck/extras/MSX/Machines" "$bios_folder/Machines" # AMIGA - echo "-----------------------------------------------------------" - echo "Initializing AMIGA LIBRETRO" - echo "-----------------------------------------------------------" + log i "-----------------------------------------------------------" + log i "Prepearing AMIGA LIBRETRO" + log i "-----------------------------------------------------------" + log i "Copying \"/app/retrodeck/extras/Amiga/capsimg.so\" in \"$bios_folder/capsimg.so\"" cp -f "/app/retrodeck/extras/Amiga/capsimg.so" "$bios_folder/capsimg.so" + + # ScummVM + log i "-----------------------------------------------------------" + log i "Prepearing ScummVM LIBRETRO" + log i "-----------------------------------------------------------" + cp -fv "$emuconfigs/retroarch/scummvm.ini" "$ra_scummvm_conf" + create_dir "$mods_folder/RetroArch/ScummVM/icons" + log i "Installing ScummVM assets" + unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp + unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp + mv -f /tmp/scummvm/extra "$mods_folder/RetroArch/ScummVM" + mv -f /tmp/scummvm/theme "$mods_folder/RetroArch/ScummVM" + rm -rf /tmp/extra /tmp/theme + set_setting_value "$ra_scummvm_conf" "iconspath" "$mods_folder/RetroArch/ScummVM/icons" "libretro_scummvm" "scummvm" + set_setting_value "$ra_scummvm_conf" "extrapath" "$mods_folder/RetroArch/ScummVM/extra" "libretro_scummvm" "scummvm" + set_setting_value "$ra_scummvm_conf" "themepath" "$mods_folder/RetroArch/ScummVM/theme" "libretro_scummvm" "scummvm" + set_setting_value "$ra_scummvm_conf" "savepath" "$saves_folder/scummvm" "libretro_scummvm" "scummvm" + set_setting_value "$ra_scummvm_conf" "browser_lastpath" "$roms_folder/scummvm" "libretro_scummvm" "scummvm" dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache" @@ -155,43 +210,13 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(cemu|Cemu|all)$ ]]; then + if [[ "$component" =~ ^(citra|citra-emu|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "----------------------" - echo "Initializing CEMU" - echo "----------------------" + log i "------------------------" + log i "Prepearing CITRA" + log i "------------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/Cemu" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/Cemu" - cp -fr "$emuconfigs/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/" - set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu" - set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" - dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "/var/config/Cemu" - else - rm -rf /var/config/Cemu - mkdir -pv /var/config/Cemu/ - cp -fr "$emuconfigs/cemu/"* /var/config/Cemu/ - set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu" - set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" - fi - # Shared actions - dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save" - fi - if [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves - set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu" - set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" - dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save" - fi - fi - - if [[ "$component" =~ ^(citra|citra-emu|Citra|all)$ ]]; then - if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "------------------------" - echo "Initializing CITRA" - echo "------------------------" - if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/citra-emu" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/citra-emu" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/citra-emu" cp -fv $emuconfigs/citra/qt-config.ini "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" @@ -199,8 +224,7 @@ prepare_component() { set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI" dir_prep "$multi_user_data_folder/$SteamAppUser/config/citra-emu" "/var/config/citra-emu" else # Single-user actions - rm -rf /var/config/citra-emu - mkdir -pv /var/config/citra-emu/ + create_dir -d /var/config/citra-emu/ cp -f $emuconfigs/citra/qt-config.ini /var/config/citra-emu/qt-config.ini set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" @@ -208,8 +232,8 @@ prepare_component() { set_setting_value "$citraconf" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI" fi # Shared actions - mkdir -pv "$saves_folder/n3ds/citra/nand/" - mkdir -pv "$saves_folder/n3ds/citra/sdmc/" + create_dir "$saves_folder/n3ds/citra/nand/" + create_dir "$saves_folder/n3ds/citra/sdmc/" dir_prep "$bios_folder/citra/sysdata" "/var/data/citra-emu/sysdata" dir_prep "$logs_folder/citra" "/var/data/citra-emu/log" dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods" @@ -231,14 +255,40 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(dolphin|dolphin-emu|Dolphin|all)$ ]]; then + if [[ "$component" =~ ^(cemu|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "----------------------" - echo "Initializing DOLPHIN" - echo "----------------------" + log i "----------------------" + log i "Prepearing CEMU" + log i "----------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/Cemu" + cp -fr "$emuconfigs/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/" + set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu" + set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" + dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "/var/config/Cemu" + else + create_dir -d /var/config/Cemu/ + cp -fr "$emuconfigs/cemu/"* /var/config/Cemu/ + set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu" + set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" + fi + # Shared actions + dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save" + fi + if [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves + set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu" + set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" + dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save" + fi + fi + + if [[ "$component" =~ ^(dolphin|dolphin-emu|all)$ ]]; then + if [[ "$action" == "reset" ]]; then # Run reset-only commands + log i "----------------------" + log i "Prepearing DOLPHIN" + log i "----------------------" + if [[ $multi_user_mode == "true" ]]; then # Multi-user actions + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" cp -fvr "$emuconfigs/dolphin/"* "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "BIOS" "$bios_folder" "dolphin" "GBA" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "SavesPath" "$saves_folder/gba" "dolphin" "GBA" @@ -247,8 +297,7 @@ prepare_component() { set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General" dir_prep "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" "/var/config/dolphin-emu" else # Single-user actions - rm -rf /var/config/dolphin-emu - mkdir -pv /var/config/dolphin-emu/ + create_dir -d /var/config/dolphin-emu/ cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/ set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA" set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA" @@ -286,14 +335,13 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(duckstation|Duckstation|all)$ ]]; then + if [[ "$component" =~ ^(duckstation|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "------------------------" - echo "Initializing DUCKSTATION" - echo "------------------------" + log i "------------------------" + log i "Prepearing DUCKSTATION" + log i "------------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/duckstation" - mkdir -p "$multi_user_data_folder/$SteamAppUser/data/duckstation/" + create_dir -d "$multi_user_data_folder/$SteamAppUser/data/duckstation/" cp -fv "$emuconfigs/duckstation/"* "$multi_user_data_folder/$SteamAppUser/data/duckstation" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "SearchDirectory" "$bios_folder" "duckstation" "BIOS" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards" @@ -302,9 +350,8 @@ prepare_component() { set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" dir_prep "$multi_user_data_folder/$SteamAppUser/config/duckstation" "/var/config/duckstation" else # Single-user actions - rm -rf "/var/config/duckstation" - mkdir -p "/var/config/duckstation/" - mkdir -p "$saves_folder/psx/duckstation/memcards" + create_dir -d "/var/config/duckstation/" + create_dir "$saves_folder/psx/duckstation/memcards" cp -fv "$emuconfigs/duckstation/"* /var/config/duckstation set_setting_value "$duckstationconf" "SearchDirectory" "$bios_folder" "duckstation" "BIOS" set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards" @@ -333,14 +380,13 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(melonds|melonDS|MelonDS|all)$ ]]; then + if [[ "$component" =~ ^(melonds|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "----------------------" - echo "Initializing MELONDS" - echo "----------------------" + log i "----------------------" + log i "Prepearing MELONDS" + log i "----------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/melonDS" - mkdir -pv "$multi_user_data_folder/$SteamAppUser/config/melonDS/" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/melonDS/" cp -fvr $emuconfigs/melonds/melonDS.ini "$multi_user_data_folder/$SteamAppUser/config/melonDS/" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" @@ -349,8 +395,7 @@ prepare_component() { set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SavestatePath" "$states_folder/nds/melonds" "melonds" dir_prep "$multi_user_data_folder/$SteamAppUser/config/melonDS" "/var/config/melonDS" else # Single-user actions - rm -rf /var/config/melonDS - mkdir -pv /var/config/melonDS/ + create_dir -d /var/config/melonDS/ cp -fvr $emuconfigs/melonds/melonDS.ini /var/config/melonDS/ set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" @@ -359,8 +404,8 @@ prepare_component() { set_setting_value "$melondsconf" "SavestatePath" "$states_folder/nds/melonds" "melonds" fi # Shared actions - mkdir -pv "$saves_folder/nds/melonds" - mkdir -pv "$states_folder/nds/melonds" + create_dir "$saves_folder/nds/melonds" + create_dir "$states_folder/nds/melonds" dir_prep "$bios_folder" "/var/config/melonDS/bios" fi if [[ "$action" == "postmove" ]]; then # Run only post-move commands @@ -373,14 +418,13 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(pcsx2|PCSX2|all)$ ]]; then + if [[ "$component" =~ ^(pcsx2|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "----------------------" - echo "Initializing PCSX2" - echo "----------------------" + log i "----------------------" + log i "Prepearing PCSX2" + log i "----------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/PCSX2" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis" cp -fvr "$emuconfigs/PCSX2/"* "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "Bios" "$bios_folder" "pcsx2" "Folders" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "Snapshots" "$screenshots_folder" "pcsx2" "Folders" @@ -389,8 +433,7 @@ prepare_component() { set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" dir_prep "$multi_user_data_folder/$SteamAppUser/config/PCSX2" "/var/config/PCSX2" else # Single-user actions - rm -rf /var/config/PCSX2 - mkdir -pv "/var/config/PCSX2/inis" + create_dir -d "/var/config/PCSX2/inis" cp -fvr "$emuconfigs/PCSX2/"* /var/config/PCSX2/inis/ set_setting_value "$pcsx2conf" "Bios" "$bios_folder" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "Snapshots" "$screenshots_folder" "pcsx2" "Folders" @@ -399,8 +442,8 @@ prepare_component() { set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" fi # Shared actions - mkdir -pv "$saves_folder/ps2/pcsx2/memcards" - mkdir -pv "$states_folder/ps2/pcsx2" + create_dir "$saves_folder/ps2/pcsx2/memcards" + create_dir "$states_folder/ps2/pcsx2" dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures" # Reset default preset settings @@ -429,20 +472,18 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(ppsspp|PPSSPP|all)$ ]]; then + if [[ "$component" =~ ^(ppsspp|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "------------------------" - echo "Initializing PPSSPPSDL" - echo "------------------------" + log i "------------------------" + log i "Prepearing PPSSPPSDL" + log i "------------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/ppsspp" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/" cp -fv "$emuconfigs/ppssppsdl/"* "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/ppsspp.ini" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" dir_prep "$multi_user_data_folder/$SteamAppUser/config/ppsspp" "/var/config/ppsspp" else # Single-user actions - rm -rf /var/config/ppsspp - mkdir -p /var/config/ppsspp/PSP/SYSTEM/ + create_dir -d /var/config/ppsspp/PSP/SYSTEM/ cp -fv "$emuconfigs/ppssppsdl/"* /var/config/ppsspp/PSP/SYSTEM/ set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" fi @@ -459,21 +500,19 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(primehack|Primehack|all)$ ]]; then + if [[ "$component" =~ ^(primehack|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "----------------------" - echo "Initializing Primehack" - echo "----------------------" + log i "----------------------" + log i "Prepearing Primehack" + log i "----------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/primehack" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/primehack" - cp -fvr "$emuconfigs/primehack/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/primehack" + cp -fvr "$emuconfigs/primehack/config/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/" set_setting_value ""$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini"" "ISOPath0" "$roms_folder/gc" "primehack" "General" dir_prep "$multi_user_data_folder/$SteamAppUser/config/primehack" "/var/config/primehack" else # Single-user actions - rm -rf /var/config/primehack - mkdir -pv /var/config/primehack/ - cp -fvr "$emuconfigs/primehack/"* /var/config/primehack/ + create_dir -d /var/config/primehack/ + cp -fvr "$emuconfigs/primehack/config/"* /var/config/primehack/ set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/gc" "primehack" "General" fi # Shared actions @@ -482,10 +521,11 @@ prepare_component() { dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP" dir_prep "$screenshots_folder" "/var/data/primehack/ScreenShots" dir_prep "$states_folder/primehack" "/var/data/primehack/StateSaves" - mkdir -pv /var/data/primehack/Wii/ + create_dir /var/data/primehack/Wii/ dir_prep "$saves_folder/wii/primehack" "/var/data/primehack/Wii" dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" + cp -fvr "$emuconfigs/primehack/data/"* "$multi_user_data_folder/$SteamAppUser/data/primehack/" # this must be done after the dirs are prepared as it copying some "mods" # Reset default preset settings set_setting_value "$rd_conf" "primehack" "$(get_setting_value "$rd_defaults" "primehack" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" @@ -503,22 +543,20 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(rpcs3|RPCS3|all)$ ]]; then + if [[ "$component" =~ ^(rpcs3|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "------------------------" - echo "Initializing RPCS3" - echo "------------------------" + log i "------------------------" + log i "Prepearing RPCS3" + log i "------------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/rpcs3" - mkdir -pv "$multi_user_data_folder/$SteamAppUser/config/rpcs3/" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/rpcs3/" cp -fr "$emuconfigs/rpcs3/"* "$multi_user_data_folder/$SteamAppUser/config/rpcs3/" # This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name. sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" "/games/" "$roms_folder/ps3/" "rpcs3" dir_prep "$multi_user_data_folder/$SteamAppUser/config/rpcs3" "/var/config/rpcs3" else # Single-user actions - rm -rf /var/config/rpcs3 - mkdir -pv /var/config/rpcs3/ + create_dir -d /var/config/rpcs3/ cp -fr "$emuconfigs/rpcs3/"* /var/config/rpcs3/ # This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name. sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf" @@ -526,13 +564,13 @@ prepare_component() { dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" fi # Shared actions - mkdir -p "$bios_folder/rpcs3/dev_hdd0" - mkdir -p "$bios_folder/rpcs3/dev_hdd1" - mkdir -p "$bios_folder/rpcs3/dev_flash" - mkdir -p "$bios_folder/rpcs3/dev_flash2" - mkdir -p "$bios_folder/rpcs3/dev_flash3" - mkdir -p "$bios_folder/rpcs3/dev_bdvd" - mkdir -p "$bios_folder/rpcs3/dev_usb000" + create_dir "$bios_folder/rpcs3/dev_hdd0" + create_dir "$bios_folder/rpcs3/dev_hdd1" + create_dir "$bios_folder/rpcs3/dev_flash" + create_dir "$bios_folder/rpcs3/dev_flash2" + create_dir "$bios_folder/rpcs3/dev_flash3" + create_dir "$bios_folder/rpcs3/dev_bdvd" + create_dir "$bios_folder/rpcs3/dev_usb000" fi if [[ "$action" == "postmove" ]]; then # Run only post-move commands # This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name. @@ -541,43 +579,112 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(ryujunx|Ryujinx|all)$ ]]; then + if [[ "$component" =~ ^(ryujinx|all)$ ]]; then + # NOTE: for techincal reasons the system folder of Ryujinx IS NOT a sumlink of the bios/switch/keys as not only the keys are located there + # When RetroDECK starts there is a "manage_ryujinx_keys" function that symlinks the keys only in Rryujinx/system. if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "------------------------" - echo "Initializing RYUJINX" - echo "------------------------" + log i "------------------------" + log i "Prepearing RYUJINX" + log i "------------------------" if [[ $multi_user_mode == "true" ]]; then rm -rf "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system" + #create_dir "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system" + # TODO: add /var/config/Ryujinx/system system folder management cp -fv $emuconfigs/ryujinx/* "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json" + sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json" dir_prep "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" "/var/config/Ryujinx" + # TODO: add nand (saves) folder management + # TODO: add nand (saves) folder management + # TODO: add "registered" folder management else # removing config directory to wipe legacy files + log d "Removing \"/var/config/Ryujinx\"" rm -rf /var/config/Ryujinx - mkdir -p /var/config/Ryujinx/system - cp -fv $emuconfigs/ryujinx/* /var/config/Ryujinx - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' "$ryujinxconf" + create_dir /var/config/Ryujinx/system + cp -fv $emuconfigs/ryujinx/Config.json $ryujinxconf + cp -fvr $emuconfigs/ryujinx/profiles /var/config/Ryujinx/ + log d "Replacing placeholders in \"$ryujinxconf\"" + sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf" + log i "Linking switch nand/saves folder" + log d "Removing \"/var/config/Ryujinx/bis\", it will become a symlink" + rm -rf /var/config/Ryujinx/bis + dir_prep "$saves_folder/switch/ryujinx/nand" "/var/config/Ryujinx/bis" + dir_prep "$saves_folder/switch/ryujinx/sdcard" "/var/config/Ryujinx/sdcard" + dir_prep "$bios_folder/switch/firmware" "/var/config/Ryujinx/bis/system/Contents/registered" + dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system" fi fi - if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves - dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system" - fi + # if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves + # dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system" + # fi if [[ "$action" == "postmove" ]]; then # Run only post-move commands + log d "Replacing placeholders in \"$ryujinxconf\"" sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf" # This is an unfortunate one-off because set_setting_value does not currently support JSON fi fi - if [[ "$component" =~ ^(xemu|XEMU|all)$ ]]; then + if [[ "$component" =~ ^(yuzu|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "------------------------" - echo "Initializing XEMU" - echo "------------------------" + log i "----------------------" + log i "Prepearing YUZU" + log i "----------------------" + if [[ $multi_user_mode == "true" ]]; then # Multi-user actions + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/yuzu" + cp -fvr "$emuconfigs/yuzu/"* "$multi_user_data_folder/$SteamAppUser/config/yuzu/" + set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" + set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" + set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" + set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" + dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "/var/config/yuzu" + else # Single-user actions + create_dir -d /var/config/yuzu/ + cp -fvr "$emuconfigs/yuzu/"* /var/config/yuzu/ + set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" + set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" + set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" + set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" + fi + # Shared actions + dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" + dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" + dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" + dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered" + dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" + dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" + dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" + # removing dead symlinks as they were present in a past version + if [ -d $bios_folder/switch ]; then + find $bios_folder/switch -xtype l -exec rm {} \; + fi + + # Reset default preset settings + set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap" + set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" + fi + if [[ "$action" == "postmove" ]]; then # Run only post-move commands + dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" + dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered" + dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" + dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" + dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" + dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" + dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" + set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" + set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" + set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" + set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" + fi + fi + + if [[ "$component" =~ ^(xemu|all)$ ]]; then + if [[ "$action" == "reset" ]]; then # Run reset-only commands + log i "------------------------" + log i "Prepearing XEMU" + log i "------------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions rm -rf /var/config/xemu rm -rf /var/data/xemu - rm -rf "$multi_user_data_folder/$SteamAppUser/config/xemu" - mkdir -pv "$multi_user_data_folder/$SteamAppUser/config/xemu/" + create_dir -d "$multi_user_data_folder/$SteamAppUser/config/xemu/" cp -fv $emuconfigs/xemu/xemu.toml "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "screenshot_dir" "'$screenshots_folder'" "xemu" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files" @@ -597,7 +704,7 @@ prepare_component() { set_setting_value "$xemuconf" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files" set_setting_value "$xemuconf" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files" fi # Shared actions - mkdir -pv $saves_folder/xbox/xemu/ + create_dir $saves_folder/xbox/xemu/ # Preparing HD dummy Image if the image is not found if [ ! -f $bios_folder/xbox_hdd.qcow2 ] then @@ -613,86 +720,23 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(yuzu|Yuzu|all)$ ]]; then + if [[ "$component" =~ ^(vita3k|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "----------------------" - echo "Initializing YUZU" - echo "----------------------" + log i "----------------------" + log i "Prepearing Vita3K" + log i "----------------------" if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - rm -rf "$multi_user_data_folder/$SteamAppUser/config/yuzu" - mkdir -p "$multi_user_data_folder/$SteamAppUser/config/yuzu" - cp -fvr "$emuconfigs/yuzu/"* "$multi_user_data_folder/$SteamAppUser/config/yuzu/" - set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" - set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" - set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" - set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" - dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "/var/config/yuzu" - else # Single-user actions - rm -rf /var/config/yuzu - mkdir -pv /var/config/yuzu/ - cp -fvr "$emuconfigs/yuzu/"* /var/config/yuzu/ - set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" - set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" - set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" - set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" - fi - # Shared actions - dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" - dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" - dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" - dir_prep "$bios_folder/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" - dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" - dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" - dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" - mkdir -pv "$rdhome/customs/yuzu" - # removing dead symlinks as they were present in a past version - if [ -d $bios_folder/switch ]; then - find $bios_folder/switch -xtype l -exec rm {} \; - fi - - # Reset default preset settings - set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap" - set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" - fi - if [[ "$action" == "postmove" ]]; then # Run only post-move commands - dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" - dir_prep "$bios_folder/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" - dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" - dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" - dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" - dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" - dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" - set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" - set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" - set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" - set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" - fi - fi - - if [[ "$component" =~ ^(vita3k|Vita3K|all)$ ]]; then - if [[ "$action" == "reset" ]]; then # Run reset-only commands - echo "----------------------" - echo "Initializing Vita3K" - echo "----------------------" - if [[ $multi_user_mode == "true" ]]; then # Multi-user actions - echo "Figure out what Vita3k needs for multi-user" + log d "Figure out what Vita3k needs for multi-user" else # Single-user actions # NOTE: the component is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K rm -rf "/var/data/Vita3K" - mkdir -p "/var/data/Vita3K/Vita3K" + create_dir "/var/data/Vita3K/Vita3K" cp -fvr "$emuconfigs/vita3k/config.yml" "/var/data/Vita3K" # component config cp -fvr "$emuconfigs/vita3k/ux0" "$bios_folder/Vita3K/Vita3K" # User config set_setting_value "$vita3kconf" "pref-path" "$rdhome/bios/Vita3K/Vita3K/" "vita3k" fi # Shared actions dir_prep "$saves_folder/psvita/vita3k" "$bios_folder/Vita3K/Vita3K/ux0/user/00/savedata" # Multi-user safe? - - # Installing firmware - # TODO: at the moment this is here instead of a tool because it seems like it cannot run without Firmware - curl "http://dus01.psv.update.playstation.net/update/psv/image/2022_0209/rel_f2c7b12fe85496ec88a0391b514d6e3b/PSVUPDAT.PUP" -po /tmp/PSVUPDAT.PUP - curl "http://dus01.psp2.update.playstation.net/update/psp2/image/2019_0924/sd_8b5f60b56c3da8365b973dba570c53a5/PSP2UPDAT.PUP?dest=us" -po /tmp/PSP2UPDAT.PUP - Vita3K --firmware /tmp/PSVUPDAT.PUP - Vita3K --firmware /tmp/PSP2UPDAT.PUP fi if [[ "$action" == "postmove" ]]; then # Run only post-move commands dir_prep "$saves_folder/psvita/vita3k" "$bios_folder/Vita3K/Vita3K/ux0/user/00/savedata" # Multi-user safe? @@ -700,47 +744,106 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(mame|MAME|all)$ ]]; then + if [[ "$component" =~ ^(mame|all)$ ]]; then # TODO: do a proper script - # This is just a placeholder script to test the component's flow - echo "----------------------" - echo "Initializing MAME" - echo "----------------------" + # This is just a placeholder script to test the emulator's flow + log i "----------------------" + log i "Prepearing MAME" + log i "----------------------" + + # TODO: probably some of these needs to be put elsewhere + create_dir "$saves_folder/mame-sa" + create_dir "$saves_folder/mame-sa/nvram" + create_dir "$states_folder/mame-sa" + create_dir "$rdhome/screenshots/mame-sa" + create_dir "$saves_folder/mame-sa/diff" + + create_dir "/var/config/ctrlr" + create_dir "/var/config/mame/ini" + create_dir "/var/config/mame/cfg" + create_dir "/var/config/mame/inp" + + create_dir "/var/data/mame/plugin-data" + create_dir "/var/data/mame/hash" + create_dir "$bios_folder/mame-sa/samples" + create_dir "/var/data/mame/assets/artwork" + create_dir "/var/data/mame/assets/fonts" + create_dir "/var/data/mame/cheat" + create_dir "/var/data/mame/assets/crosshair" + create_dir "/var/data/mame/plugins" + create_dir "/var/data/mame/assets/language" + create_dir "/var/data/mame/assets/software" + create_dir "/var/data/mame/assets/comments" + create_dir "/var/data/mame/assets/share" + create_dir "/var/data/mame/dats" + create_dir "/var/data/mame/folders" + create_dir "/var/data/mame/assets/cabinets" + create_dir "/var/data/mame/assets/cpanel" + create_dir "/var/data/mame/assets/pcb" + create_dir "/var/data/mame/assets/flyers" + create_dir "/var/data/mame/assets/titles" + create_dir "/var/data/mame/assets/ends" + create_dir "/var/data/mame/assets/marquees" + create_dir "/var/data/mame/assets/artwork-preview" + create_dir "/var/data/mame/assets/bosses" + create_dir "/var/data/mame/assets/logo" + create_dir "/var/data/mame/assets/scores" + create_dir "/var/data/mame/assets/versus" + create_dir "/var/data/mame/assets/gameover" + create_dir "/var/data/mame/assets/howto" + create_dir "/var/data/mame/assets/select" + create_dir "/var/data/mame/assets/icons" + create_dir "/var/data/mame/assets/covers" + create_dir "/var/data/mame/assets/ui" - mkdir -p $saves_folder/mame-sa - mkdir -p "/var/config/mame" dir_prep "$saves_folder/mame-sa/hiscore" "/var/config/mame/hiscore" - cp -fvr "$emuconfigs/mame/"** "/var/config/mame" - sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "/var/config/mame/*.ini" - sed -i 's#RETRODECKHOMESDIR#'$rdhome'#g' "/var/config/mame/*.ini" - sed -i 's#RETRODECKSAVESDIR#'$rdhome'#g' "/var/config/mame/*.ini" - sed -i 's#RETRODECKSTATESDIR#'$rdhome'#g' "/var/config/mame/*.ini" + cp -fvr "$emuconfigs/mame/mame.ini" "$mameconf" + cp -fvr "$emuconfigs/mame/ui.ini" "$mameuiconf" + cp -fvr "$emuconfigs/mame/default.cfg" "$mamedefconf" + + sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "$mameconf" # one-off as roms folders are a lot + set_setting_value "$mameconf" "nvram_directory" "$saves_folder/mame-sa/nvram" "mame" + set_setting_value "$mameconf" "state_directory" "$states_folder/mame-sa" "mame" + set_setting_value "$mameconf" "snapshot_directory" "$screenshots_folder/mame-sa" "mame" + set_setting_value "$mameconf" "diff_directory" "$saves_folder/mame-sa/diff" "mame" + set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame" + + log i "Placing cheats in \"/var/data/mame/cheat\"" + unzip -j -o "$emuconfigs/mame/cheat0264.zip" 'cheat.7z' -d "/var/data/mame/cheat" + fi - if [[ "$component" =~ ^(gzdoom|GZDOOM|all)$ ]]; then + if [[ "$component" =~ ^(gzdoom|all)$ ]]; then # TODO: do a proper script - # This is just a placeholder script to test the component's flow - echo "----------------------" - echo "Initializing GZDOOM" - echo "----------------------" + # This is just a placeholder script to test the emulator's flow + log i "----------------------" + log i "Prepearing GZDOOM" + log i "----------------------" + + create_dir "/var/config/gzdoom" + create_dir "/var/data/gzdoom/audio/midi" + create_dir "/var/data/gzdoom/audio/fm_banks" + create_dir "/var/data/gzdoom/audio/soundfonts" + create_dir "$rdhome/bios/gzdoom" - mkdir -p "/var/config/gzdoom" - mkdir -p "/var/data/gzdoom" cp -fvr "$emuconfigs/gzdoom/gzdoom.ini" "/var/config/gzdoom" - cp -fvr "$emuconfigs/gzdoom/gzdoom.pk3" "/var/data/gzdoom" + sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKSAVESDIR#'$saves_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON fi - if [[ "$component" =~ ^(boilr|BOILR|all)$ ]]; then - echo "----------------------" - echo "Initializing BOILR" - echo "----------------------" + if [[ "$component" =~ ^(boilr|all)$ ]]; then + log i "----------------------" + log i "Prepearing BOILR" + log i "----------------------" - mkdir -p "/var/config/boilr" + create_dir "/var/config/boilr" cp -fvr "/app/libexec/steam-sync/config.toml" "/var/config/boilr" - + fi + + if [[ ! "$component" =~ ^(retrodeck|es-de|retroarch|citra|citra-emu|cemu|dolphin|dolphin-emu|duckstation|melonds|melonDS|pcsx2|pico8|pico-8|ppsspp|primehack|rpcs3|ryujinx|yuzu|xemu|vita3k|mame|gzdoom|boilr|)$ ]]; then + log e "Supplied component $component not found, not resetting" fi # Update presets for all components after any reset or move diff --git a/functions/presets.sh b/functions/presets.sh index d214461a..19fcbcec 100644 --- a/functions/presets.sh +++ b/functions/presets.sh @@ -125,10 +125,10 @@ build_preset_config() { fi if [[ "$read_config_format" == "retroarch" && ! "$retroarch_all" == "true" ]]; then # If this is a RetroArch core, generate the override file if [[ ! -f "$read_target_file" ]]; then - mkdir -p "$(realpath "$(dirname "$read_target_file")")" + create_dir "$(realpath "$(dirname "$read_target_file")")" echo "$read_setting_name = \""$new_setting_value"\"" > "$read_target_file" else - if [[ -z $(grep "$read_setting_name" "$read_target_file") ]]; then + if [[ -z $(grep -o -P "^$read_setting_name\b" "$read_target_file") ]]; then add_setting "$read_target_file" "$read_setting_name" "$new_setting_value" "$read_config_format" "$section" else set_setting_value "$read_target_file" "$read_setting_name" "$new_setting_value" "$read_config_format" "$section" diff --git a/functions/steam-sync/steam-sync.py b/functions/steam-sync/steam-sync.py index c4ce90df..11b078b2 100644 --- a/functions/steam-sync/steam-sync.py +++ b/functions/steam-sync/steam-sync.py @@ -129,8 +129,8 @@ command_list_default={ "x68000": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/px68k_libretro.so", "zx81": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/81_libretro.so", "zxspectrum": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fuse_libretro.so", -"switch": "flatpak run --command=yuzu net.retrodeck.retrodeck -f -g", -"n3ds": "flatpak run --command=citra net.retrodeck.retrodeck", +"switch": "flatpak run --command=/var/data/ponzu/Yuzu/bin/yuzu net.retrodeck.retrodeck -f -g", +"n3ds": "flatpak run --command=/var/data/ponzu/Citra/bin/citra-qt net.retrodeck.retrodeck", "ps2": "flatpak run --command=pcsx2-qt net.retrodeck.retrodeck -batch", "wiiu": "flatpak run --command=Cemu-wrapper net.retrodeck.retrodeck -g", "gc": "flatpak run --command=dolphin-emu-wrapper net.retrodeck.retrodeck -b -e", diff --git a/net.retrodeck.retrodeck.Configurator.desktop b/net.retrodeck.retrodeck.Configurator.desktop index 1d45d4a4..466733c6 100644 --- a/net.retrodeck.retrodeck.Configurator.desktop +++ b/net.retrodeck.retrodeck.Configurator.desktop @@ -3,7 +3,7 @@ Name=RetroDECK Configurator GenericName=RetroDECK Configuration Utility Type=Application Comment=A handy tool to change common RetroDECK settings -Icon=net.retrodeck.retrodeck +Icon=net.retrodeck.retrodeck.configurator Exec=/bin/bash /app/tools/configurator.sh Terminal=false StartupNotify=false diff --git a/net.retrodeck.retrodeck.appdata.xml b/net.retrodeck.retrodeck.appdata.xml index 0f530fdd..ba2f06ca 100644 --- a/net.retrodeck.retrodeck.appdata.xml +++ b/net.retrodeck.retrodeck.appdata.xml @@ -46,12 +46,10 @@

NOTE: It can be run on Linux desktop right now but there will be some manual configurations needed for input, storage location and other tiny hickups.

INSTALLATION INSTRUCTIONS FOR THE STEAM DECK: -

    -
  • 1. Start RetroDECK from the Desktop mode (only needed for the initial first time configuration)
  • -
  • 2. Add RetroDECK to your Steam Library by pressing "Add a non-steam game to my library"
  • -
  • 3. Download the offical RetroDECK controller profile from Steam
  • -
  • 4. [OPTIONAL] Download Steam Grids graphics for RetroDECK with BoilR
  • -
+ 1. Start RetroDECK from the Desktop mode (only needed for the initial first time configuration) + 2. Add RetroDECK to your Steam Library by pressing "Add a non-steam game to my library" + 3. Download the offical RetroDECK controller profile from Steam + 4. [OPTIONAL] Download Steam Grids graphics for RetroDECK with BoilR

For more detailed information check our wiki: https://github.com/XargonWan/RetroDECK/wiki

@@ -59,56 +57,104 @@ https://www.patreon.com/RetroDECK

If you want to join the RetroDECK community check our:

Reddit: https://www.reddit.com/r/RetroDECK/

-

Discord: https://discord.gg/Dz3szYsP8g +

Discord: https://discord.gg/WDc5C9YWMx (If you want to help out with the project join the "i-want-to-help" channel)

+ + #94a6fb + #404b98 + GPL-3.0 CC0-1.0 - - https://github.com/XargonWan/RetroDECK/releases/tag/0.8.0b + + https://github.com/XargonWan/RetroDECK/releases/tag/0.8.1b -

CRITICAL:

-
    -
  • DEEP TEST: prepare_emulator function is now called prepare_component, eidted even in the cli and split it into the Configurator, so we need to test if the reset emulator works as supposed, if the cli and the Configurator is consistent.
  • -

Changes:

    +
  • All emulators updated
  • +
  • PREPARE_COMPONENT: now the choice is passed lowercased so the script don't have to check for the possible casings, this should fix the issue where GZDoom couldn't be reset as it was expecting both GZDOOM or gzdoom.
  • +
  • ES-DE: downloaded_media, gamelist, and themes are now moved to the new retrodeck/ES-DE (previously was retrodeck)
  • +
  • ES-DE: custom collections are now located in retrodeck/ES-DE/collections, this prevents to be destroyed by a reset
  • +
  • LOGGER: version notes are no more outputed in the terminal or in the logs
  • +
  • WORKFLOWS: added RetroDECK.flatpak.sha files
  • +
  • WORKFLOWS: disabled nightly builds (was broken)
  • +
  • FRAMEWORK: now the PR builds are recognized same as cooker builds
  • +
  • FRAMEWORK: now there is a warning to check background windows, useful when installing RCPS3 firmware as some users were stuck on that screen without noticing the windows in the backgrounds
  • +
  • COOKER_UPDATER: added the hash check before uninstalling the flatpak
  • +
  • HELPER_FILES: updated links pointing to the new wiki
  • +
  • MAME-SA: added cheats
  • +
  • RYUJINX: added an helper file to specify how to install the firmware (not copying it in the folder)
  • +
  • RPCS3: included the confirm on quit preset, that can be enabled or disabled trough configurator like the other emulators
  • +
  • RETROARCH: fixed an issue where if a zip contained more than the game files it failed to load the game
  • +
  • CITRA_LIBRETRO: upscaled to 2x (was 4x but was too much), set system as "New 3DS"
  • +
  • GW_LIBRETRO: Handheld Electronic (GW) Libretro is now the defaulted Game And Watch emulator (due to a bug)
  • +
  • MESEN_LIBRETRO: enabled FDS disk auto load
  • +
  • SCUMMVM_LIBRETRO: provided assets
  • +
  • BIOS_CHECKER: added bios support for 3DO, GB, GBC, GBA, Neo Geo CD
  • +
  • BIOS_CHECKER: added more missing hashes
  • +
+

Known issues:

+
    +
  • Please check the know issues in the Wiki under General Infomration.
  • +
+
+
+ + https://github.com/XargonWan/RetroDECK/releases/tag/0.8.0b + +

Changes:

+
    +
  • All the emulators and engines are updated to their latest version
  • +
  • ES-DE: updated to 3.0.1
  • +
  • RPCS3 is now running via shortcut (.desktop file) by default
  • +
  • CITRA-SA: removed, it will available trough Ponzu. The libretro core is now the default emulator
  • +
  • YUZU: removed, Ryujinx is now the default emulator, it will available trough Ponzu
  • +
  • PONZU: added, check the wiki if interested in this preservational function
  • +
  • Added new system: PSVita, trough Vita3K
  • Added new system: SOLARUS
  • -
  • Added new engine: GZDOOM
  • -
  • Added new emulator: Vita3K - Reset the emulator to grap the lates changes
  • -
  • Added new emulator: MAME (Standalone)
  • -
  • PPSSPP: added hotkeys
  • +
  • Added new engine: GZDOOM that is now the DOOM system default engine
  • +
  • Added new emulator: RYUJINX
  • +
  • Added new emulator: MAME (Standalone), v0.264
  • +
  • Added hotkeys for: PPSSPP, MAME, SCUMMVM
  • DOLPHIN: improved wiimote pointer emulation for controllers
  • -
  • Added Steam Sync (with BoilR)
  • -
  • Quit button after emulators reset should act as an actual full quit button
  • -
  • Created a quit_retrodeck function to ease the quit in the scripts.
  • -
  • Logs folder is now in retrodeck/logs (previously was .logs)
  • -
  • The post update script is initializing vita3k, mame and boilr when coming from a version ealrier that 0.8.0, this don't work in cokker and must be resetted manually (for boilr reset RetroDECK)
  • -
  • RPCS3 is now running via shortcut (.desktop file) by default - WARN THE USERS TO MIGRATE
  • -
  • Added controller config for PS4 and PS5
  • -
  • Controller config overhaul
  • -
  • Removed talk names in the manifest as they're not needed anymore as enabled by default
  • +
  • DOLPHIN: enabled Gyro
  • +
  • PRIMEHACK: config structure refactor + new configs
  • +
  • LOGGER: logging is completely refactored, logs folder is now in retrodeck/logs (previously was .logs)
  • +
  • Added Steam controller layouts for PS4 and PS5
  • +
  • Steam controller layouts overhaul
  • +
  • DUCKSTATION: config refactor. The old config didn't not work anymore for controllers.
  • +
  • MULTIPLAYER: enabled controller configs for player 2~4 for CEMU, DUCKSTATION, GZDOOM, RPCS3 and RYUJINX
  • +
  • Graphical tweaks for DOLPHIN, MELONDS and PCSX2
  • +
  • Added a new icon for RetroDECK Configurator
  • +
  • CONFIGURATOR: added more systems to valid compression targets in the compressor tool
  • +
  • CONFIGURATOR: simplified single-file-compression process
  • +
  • CONFIGURATOR: merged "save state on exit" and "load state on run" presets into a new "Quick Resume" function
  • +
  • CONFIGURATOR: added a tool to "Swap A/B X/Y button" for compatible systems
  • +
  • CONFIGURATOR: moved "Rewind" preset to "Global Presets" section and added more compatible systems
  • +
  • CONFIGURATOR: added "expert mode" on BIOS checker tool (shows all available info)
  • +
  • DESKTOP: added Steam Flatpak detection for controller profile install
  • +
  • DESKTOP: RetroDECK now knows if it is running on a real Deck or other Linux desktop
  • +
  • DESKTOP: disabled "Desktop Mode" warning when not running on Deck

Fixes:

    -
  • Fixed DUCKSTATION memory card folder
  • -
  • Fixed RPCS3 saves folder (wrong symlink) - WRN THE USERS TO BACKUP
  • -
  • Fixed issues that prevents Steam Sync to work correctly
  • +
  • CEMU: refactored input profiles to reflect the new version changes
  • +
  • DUCKSTATION: fixed memory card folder path
  • +
  • DUCKSTATION: all controlls now are configured via SDL
  • +
  • RPCS3: fixed saves folder (wrong symlink) - WARN THE USERS TO BACKUP
  • +
  • SCUMMVM: fixed a bug where some paths were not existing
  • +
  • RETROARCH: fixed a bug where the default folder was not the rom folder in the rgui
  • +
  • DOLPHIN: tweaked Wii, GC and GBA inputs
  • +
  • Removed talk names in the manifest as they're not needed anymore as enabled by default
  • +
  • Fixed an issue that prevented RetroDECK to work properly on some distributions on Wayland
  • +
  • Added the needed subfolders in retrodeck/bios
  • +
  • DEVELOPER TOOLS: fixed some issues that preventing RetroDECK to be built locally
  • +
  • DEVELOPER TOOLS: added a script to inject changes in the current RetroDECK installation in order to test script and config changes without a full manifest rebuild
-

Issues:

+

Known issues:

    -
  • !!! WARNING !!! Steam Sync is now REPLACING your Standalone BoilR links with RetroDECK's, use it at your own risk!
  • -
  • GZDOOM: the controller for player 2+ is not correctly configured
  • -
  • quit_retrodeck function seems to not working correctly
  • -
  • MAME (Standalone) paths should be fixed
  • -
-

Missing:

-
    -
  • GZDOOM: hotkeys
  • -
  • SOLARUS: hotkeys
  • -
  • MAME (Standalone): hotkeys
  • -
  • A proper reset script for the new emulators, now it's just a draft (only Vita3K is done)
  • +
  • Please check the know issues in the Wiki under General Infomration.
@@ -130,7 +176,7 @@
- + https://github.com/XargonWan/RetroDECK/releases/tag/0.7.5b

Bug fixes and other changes:

@@ -208,13 +254,13 @@

Information:

    -
  • Steam Deck users update RetroDECK from Discover in Desktop Mode.
  • -
  • Don't forget to reapply the latest controller layout: Go into the Templates tab and reapply the new profile ending with 0.7.1b (there is no need to reinstall the entire layout from the Configurator).
  • +
  • Steam Deck users update RetroDECK from Discover in Desktop Mode.
  • +
  • Don't forget to reapply the latest controller layout: Go into the Templates tab and reapply the new profile ending with 0.7.1b (there is no need to reinstall the entire layout from the Configurator).

Bug fixes and other changes:

  • Fixed an issue to make sure the RD controller layout file at update with each RD update.
  • -
  • Fixed an issue with PPSSPP that made L and R incorrectly bound.
  • +
  • Fixed an issue with PPSSPP that made L and R incorrectly bound.
  • Fixed an issue in the Configurator that prevented the Yuzu preset for swapping A/B X/Y from working.
  • Fixed a notification issue on the latest SteamOS Beta releases.
  • Fixed an rsync permissions issue in the RetroDECK Framework.
  • @@ -227,18 +273,18 @@

    Steam Deck - Global Controller Layout:

    We have done some changes based on community feedback

      -
    • Select is now a hotkey trigger while pressing it down, L4 and R4 are still triggers as well.
    • -
    • The RetroArch combo of Select + Start = Quit now works on many SA-Emulators.
    • -
    • Open Menu is removed from Select.
    • -
    • R5 = A button (this allows for great Wii controls on the right touchpad and pressing down the R5 for A).
    • -
    • L5 = B button.
    • +
    • Select is now a hotkey trigger while pressing it down, L4 and R4 are still triggers as well.
    • +
    • The RetroArch combo of Select + Start = Quit now works on many SA-Emulators.
    • +
    • Open Menu is removed from Select.
    • +
    • R5 = A button (this allows for great Wii controls on the right touchpad and pressing down the R5 for A).
    • +
    • L5 = B button.

    Global hotkey changes:

      -
    • Open Menu is on Y.
    • -
    • Increase Emulation Speed is on Dpad-UP.
    • -
    • Decrease Emulation Speed is on Dpad-Down.
    • -
    • Fullscreen OFF command is removed (as emulators have migrated to toggle).
    • +
    • Open Menu is on Y.
    • +
    • Increase Emulation Speed is on Dpad-UP.
    • +
    • Decrease Emulation Speed is on Dpad-Down.
    • +
    • Fullscreen OFF command is removed (as emulators have migrated to toggle).

    Known issues:

      @@ -549,26 +595,26 @@ https://github.com/XargonWan/RetroDECK/releases/tag/0.4.3b

      - Emulators: + Emulators:

      • Updated all the emulators at the latest available version.

      - Backend: + Backend:

      • Manifest code cleanup.

      - Known Issues: + Known Issues:

      • PCSX2: due to its limitation, the standalone PCSX2 doesn't have any way to set the hotkeys, so no save and load state, no quit button. In order to quit press: STEAM -> PCSX2 -> (X) CLOSE WINDOW, be aware that the state is not automatically saved
      • Due to a Steam limitation, external controllers and keyboard seems not to be working, expecially in the desktop mode

      - IMPORTANT NOTE: + IMPORTANT NOTE: At the moment the emulator configs are reset during every update, this was made because every version they may bring new configurations, please back them up if you did some manual configs.

      @@ -577,7 +623,7 @@ https://github.com/XargonWan/RetroDECK/releases/tag/0.4.2b

      - Emulators: + Emulators:

      • Updated all the emulators at the latest available version.
      • @@ -588,7 +634,7 @@
      • RETROARCH (LIBRETRO): Tweaked some configs and fixed some overlapping hotkeys (FPS was same as Show Menu action).

      - Backend: + Backend:

      • Removed some broken tools that will be reintroduced once fixed, including the roms moving tool.
      • @@ -596,14 +642,14 @@
      • Manifest trimmend and general code cleanup.

      - Known Issues: + Known Issues:

      • PCSX2: due to its limitation, the standalone PCSX2 doesn't have any way to set the hotkeys, so no save and load state, no quit button. In order to quit press: STEAM -> PCSX2 -> (X) CLOSE WINDOW, be aware that the state is not automatically saved
      • Due to a Steam limitation, external controllers and keyboard seems not to be working, expecially in the desktop mode

      - IMPORTANT NOTE: + IMPORTANT NOTE: At the moment the emulator configs are reset during every update, this was made because every version they may bring new configurations, please back them up if you did some manual configs.

      @@ -612,7 +658,7 @@ https://github.com/XargonWan/RetroDECK/releases/tag/0.4.1b

      - Emulators: + Emulators:

      • Tweaked various emulator configs
      • @@ -620,7 +666,7 @@
      • Fixed home path in MelonDS (SA)

      - Frontend: + Frontend:

      • Updated ES-DE to 1.2.4
      • @@ -628,13 +674,13 @@
      • Now a custom roms path can be selected if SD Card is selected and the SD Card is not found in the default path

      - Backend: + Backend:

      • Fixed a bug where the folders where not symlinked correclty

      - Known Issues: + Known Issues:

      • PCSX2: due to its limitation, the standalone PCSX2 doesn't have any way to set the hotkeys, so no save and load state, no quit button. In order to quit press: STEAM -> PCSX2 -> (X) CLOSE WINDOW, be aware that the state is not automatically saved
      • @@ -642,7 +688,7 @@
      • Yuzu makes RetroDECK freeze in some situations, like if the rom is a bad dump

      - IMPORTANT NOTE: + IMPORTANT NOTE: At the moment the emulator configs are reset during every update, this was made because every version they may bring new configurations, please back them up if you did some manual configs.

      diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 9d7a8236..ebca27e7 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -3,23 +3,18 @@ runtime: org.kde.Platform runtime-version: "6.5" sdk: org.kde.Sdk sdk-extensions: - - org.freedesktop.Sdk.Extension.llvm16 # Needed for rpcs3 (llvm15) but llvm16 for CITRA + - org.freedesktop.Sdk.Extension.llvm16 # Needed for RPCS3 (llvm17 actually) - org.freedesktop.Sdk.Extension.rust-stable # Needed for BoilR -# base: io.qt.qtwebengine.BaseApp # Needed for Yuzu - Disabled as we're using AppImage for Yuzu -# base-version: "6.5" # Needed for Yuzu - Disabled as we're using AppImage for Yuzu command: retrodeck.sh finish-args: - - --socket=fallback-x11 - --socket=wayland + - --socket=x11 - --socket=pulseaudio - --share=ipc - --share=network - --device=all - - --filesystem=home - - --filesystem=/run/media - - --filesystem=/media - - --filesystem=/mnt + - --filesystem=host - --filesystem=home/.var/app/com.valvesoftware.Steam - --allow=multiarch - --talk-name=org.freedesktop.ScreenSaver @@ -27,10 +22,9 @@ finish-args: - --talk-name=org.freedesktop.login1.Manager - --filesystem=xdg-run/app/com.discordapp.Discord:create - --filesystem=xdg-config/gtk-3.0:ro - - --env=QT_QPA_PLATFORM=wayland-egl;wayland;xcb + - --env=QT_QPA_PLATFORM=wayland;wayland-egl;xcb # Dolphin - --allow=bluetooth - # PPSSPP # It allows an SDL application to specify its window class, which can be useful for window managers and desktop environments to identify and group similar windows - --env=SDL_VIDEO_X11_WMCLASS=net.retrodeck.retrodeck - --env=SDL_VIDEO_WAYLAND_WMCLASS=net.retrodeck.retrodeck @@ -40,6 +34,8 @@ finish-args: - --filesystem=xdg-data/Steam:rw #Steam (flatpak) - --filesystem=~/.steam:rw # Steam (Non-flatpak) - --filesystem=~/.var/app/com.valvesoftware.Steam:rw # Steam (Flatpak) + # PPSSPP, DOLPHIN + - --filesystem=xdg-run/gamescope-0:ro cleanup: # ES-DE @@ -47,7 +43,6 @@ cleanup: - /share/ffmpeg - /lib/cmake - /lib/pkgconfig - # Yuzu - /include - /bin/glslangValidator - /bin/zip* @@ -61,14 +56,12 @@ cleanup: # XMLSTARLET - /lib/debug - /share/runtime -#cleanup-commands: - # Yuzu - #- /app/cleanup-BaseApp.sh modules: - # dependency of: CEMU, CITRA, DOLPHIN - - rd-submodules/shared-modules/libusb/libusb.json + # dependency of: CEMU (1.0.26), DOLPHIN (1.0.27) + #- rd-submodules/shared-modules/libusb/libusb.json # 1.0.26 + # we added the libusb 1.0.27 as Dolphin is breaking with 1.0.27, when bot will be aligned we can go back to the submodule # This module is used to define the RetroDECK version # If the version is set as cooker it will automatically generate the version tag based on the date @@ -77,14 +70,14 @@ modules: # # UPDATE STEPS FOR MAIN: # [ ] Update the VERSION variable on line containing "VERSION=THISBRANCH" - # [ ] Update the appdata.xml with the version number and notes + # [x] Update the appdata.xml with the version number and notes # - name: version-initialization buildsystem: simple build-commands: - | - # on main please update this with the version variable, eg: VERSION='0.7.4b' + # on main please update this with the version variable, eg: VERSION=0.8.0b # on cooker will be THISBRANCH VERSION=THISBRANCH @@ -169,17 +162,6 @@ modules: url: https://ftp.osuosl.org/pub/blfs/conglomeration/libgudev/libgudev-237.tar.xz sha256: 0d06b21170d20c93e4f0534dbb9b0a8b4f1119ffb00b4031aaeb5b9148b686aa - - name: chdman-tool - buildsystem: simple - build-commands: - - cmake -B . -G Ninja - - cmake --build . - - cp chdman /app/bin - sources: - - type: git - url: https://github.com/CharlesThobe/chdman.git - commit: f7cadf1720cbeba8a14f2685830ff424a0c7f6cd - - name: rclone buildsystem: simple build-commands: @@ -228,7 +210,7 @@ modules: url: https://github.com/mikefarah/yq/releases/download/v4.33.3/yq_linux_amd64 sha256: 4ee662847c588c3ef2fec8bfb304e8739e3dbaba87ccb9a608d691c88f5b64dc - # dependency of: CEMU (13.1.1), CITRA (13.0.0) + # dependency of: CEMU - name: glslang buildsystem: cmake-ninja config-opts: @@ -241,10 +223,8 @@ modules: - /lib/cmake sources: - type: archive - url: https://github.com/KhronosGroup/glslang/archive/13.1.1.tar.gz - sha256: 1c4d0a5a38c8aaf89a2d7e6093be734320599f5a6775b2726beeb05b0c054e66 - # url: https://github.com/KhronosGroup/glslang/archive/13.0.0.tar.gz - # sha256: bcda732434f829aa74414ea0e06d329ec8ac28637c38a0de45e17c8fd25a4715 + url: https://github.com/KhronosGroup/glslang/archive/14.1.0.tar.gz + sha256: b5e4c36d60eda7613f36cfee3489c6f507156829c707e1ecd7f48ca45b435322 x-checker-data: type: anitya stable-only: true @@ -277,7 +257,7 @@ modules: stable-only: true url-template: https://www.freedesktop.org/software/libevdev/libevdev-$version.tar.xz - # dependency of: CITRA, CEMU + # dependency of: CEMU - name: rapidjson buildsystem: cmake-ninja config-opts: @@ -343,10 +323,27 @@ modules: url: https://gitlab.freedesktop.org/slirp/libslirp.git tag: v4.7.0 + # dependency of: CEMU (1.0.26), DOLPHIN (1.0.27) + - name: libusb + config-opts: + - --disable-static + cleanup: + - /include + - /lib/*.la + - /lib/pkgconfig + sources: + - type: archive + url: https://github.com/libusb/libusb/releases/download/v1.0.27/libusb-1.0.27.tar.bz2 + sha256: ffaa41d741a8a3bee244ac8e54a72ea05bf2879663c098c82fc5757853441575 + x-checker-data: + type: anitya + project-id: 1749 + stable-only: true + url-template: https://github.com/libusb/libusb/releases/download/v$version/libusb-$version.tar.bz2 + # ES-DE - START # https://gitlab.com/es-de/emulationstation-de - #This is disabled because we added the extension (line 11), check if the videos are ok. - name: ffmpeg config-opts: - --disable-static @@ -406,9 +403,7 @@ modules: - '*.a' - '*.la' - # When updating this module remember to check those: - # https://gitlab.com/es-de/emulationstation-de/-/blob/[VERSION]/resources/systems/unix/es_find_rules.xml - # But we don't include them 1:1 as RetroDECK got some specific configs in some cases + # When updating this module remember to check those on the main repos: - name: ES-DE buildsystem: cmake-ninja config-opts: @@ -419,12 +414,8 @@ modules: sources: - type: git url: https://github.com/XargonWan/RetroDECK-ES-DE - branch: cebbeff3b5f834fd9adaeb1f5dc9e0da6b106599 + branch: retrodeck-main - type: shell - commands: - - sed -i 's#"EMULATIONSTATION-DE V" + Utils::String::toUpper(PROGRAM_VERSION_STRING)#"RetroDECK - v'$(cat ${FLATPAK_DEST}/retrodeck/version)', ES-DE v" + Utils::String::toUpper(PROGRAM_VERSION_STRING)#g' - es-app/src/guis/GuiMenu.cpp # ES-DE - END @@ -433,8 +424,8 @@ modules: - name: art-book-next-es-de buildsystem: simple build-commands: - - mkdir -p ${FLATPAK_DEST}/share/emulationstation/themes/art-book-next-es-de/ - - mv -f * ${FLATPAK_DEST}/share/emulationstation/themes/art-book-next-es-de/ + - mkdir -p ${FLATPAK_DEST}/share/es-de/themes/art-book-next-es-de/ + - mv -f * ${FLATPAK_DEST}/share/es-de/themes/art-book-next-es-de/ sources: - type: git url: https://github.com/anthonycaccese/art-book-next-es-de.git @@ -451,15 +442,17 @@ modules: config-opts: - '--enable-dbus' make-args: - - 'GLOBAL_CONFIG_DIR=${FLATPAK_DEST}/etc' + - GLOBAL_CONFIG_DIR=${FLATPAK_DEST}/etc - HAVE_TRANSLATE=1 - HAVE_ACCESSIBILITY=1 sources: - type: git - url: 'https://github.com/libretro/RetroArch.git' - commit: 712b9350a5c2b1b9129d939a2ae622093dfabd04 + url: https://github.com/libretro/RetroArch.git + commit: 06fa5325f8b3cd42e6fba3d57835d5924c9ea2e7 - type: file path: rd-submodules/retroarch/retroarch.cfg + - type: file + path: rd-submodules/retroarch/VkLayer_FROG_gamescope_wsi.x86_64.json post-install: - mkdir -p ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/ - >- @@ -470,8 +463,12 @@ modules: - >- sed s:@prefix@:${FLATPAK_DEST}:g retroarch.cfg > ${FLATPAK_DEST}/etc/retroarch.cfg + - mkdir -p ${FLATPAK_DEST}/share/vulkan/implicit_layer.d + - >- + install VkLayer_FROG_gamescope_wsi.x86_64.json + /app/share/vulkan/implicit_layer.d/VkLayer_FROG_gamescope_wsi.x86_64.json modules: - - rd-submodules/retroarch/modules/libpng/libpng-1.6.35.json + - rd-submodules/retroarch/modules/libpng/libpng-1.6.json - rd-submodules/retroarch/modules/nvidia-cg-toolkit/nvidia-cg-toolkit-3.1.0013.json - rd-submodules/shared-modules/SDL/SDL-1.2.15.json - rd-submodules/shared-modules/SDL/SDL_image-1.2.12.json @@ -482,55 +479,56 @@ modules: # certificate glu issue #- rd-submodules/shared-modules/gudev/gudev.json - rd-submodules/retroarch/modules/libbz2/libbz2-1.0.8.json - - rd-submodules/retroarch/modules/xrandr/xrandr-1.5.1.json + - rd-submodules/retroarch/modules/xrandr/xrandr-1.5.json - rd-submodules/retroarch/modules/libaio/libaio-0.3.112.json # certificate issue, check glu module for more info #- rd-submodules/shared-modules/glu/glu-9.json - - rd-submodules/shared-modules/libdecor/libdecor-0.1.1.json + - rd-submodules/shared-modules/libdecor/libdecor.json + - rd-submodules/retroarch/modules/gamemode/gamemode-1.8.json - name: retroarch-filers-video subdir: gfx/video_filters make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/RetroArch.git' - commit: 712b9350a5c2b1b9129d939a2ae622093dfabd04 + url: https://github.com/libretro/RetroArch.git + commit: 06fa5325f8b3cd42e6fba3d57835d5924c9ea2e7 - name: retroarch-filers-audio subdir: libretro-common/audio/dsp_filters make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/RetroArch.git' - commit: 712b9350a5c2b1b9129d939a2ae622093dfabd04 + url: https://github.com/libretro/RetroArch.git + commit: 06fa5325f8b3cd42e6fba3d57835d5924c9ea2e7 - name: retroarch-assets make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/retroarch-assets.git' - commit: 7b735ef18bcc6508b1c9a626eb237779ff787179 + url: https://github.com/libretro/retroarch-assets.git + commit: 923b711dc6772a168d83dc8915e9260730fcf3a1 - name: libretro-database make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/libretro-database.git' - commit: e3b5cb00da4f3ab99491bf67c19630ffa7ee19f2 + url: https://github.com/libretro/libretro-database.git + commit: 977612e2cd284f67fc0d121d9d94c5982a49f61e - name: libretro-core-info make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/libretro-core-info.git' - commit: dacae85b406131feb12395a415fdf57fc4745201 + url: https://github.com/libretro/libretro-core-info.git + commit: ad0f67e172dca9edb88a4eea1d541f407a9c2d12 - name: retroarch-joypad-autoconfig make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/retroarch-joypad-autoconfig.git' - commit: 5666e46bb89caf4e9af358fdb97a2b384cb62f36 + url: https://github.com/libretro/retroarch-joypad-autoconfig.git + commit: ec43cfef730f15d6b20bf277681250b2f4b99a8b - name: common-shaders make-install-args: - PREFIX=${FLATPAK_DEST} @@ -543,22 +541,22 @@ modules: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/slang-shaders.git' - commit: 9266fa24b64b274fd429b73469ded3561de7b8f4 + url: https://github.com/libretro/slang-shaders.git + commit: d367f6cf73e01a8e43028107ab1ded2d2f05fe6a - name: glsl-shaders make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/glsl-shaders.git' - commit: c26b9e1913eda8c25d6cd218818745a3b451f982 + url: https://github.com/libretro/glsl-shaders.git + commit: db974e4d6f6e3178198b7690095a107b3b509d4b - name: common-overlays make-install-args: - PREFIX=${FLATPAK_DEST} sources: - type: git - url: 'https://github.com/libretro/common-overlays.git' - commit: 115d8670c2e032e4a41ba45f766f5cfd9dae28b8 + url: https://github.com/libretro/common-overlays.git + commit: c266abf4d7f9286fb6fbcfb57647cd9c80c45530 # RetroArch - END @@ -567,7 +565,8 @@ modules: - name: retroarch-cores-nightly buildsystem: simple build-commands: - - mkdir -p /app/share/libretro/cores/ + - mkdir -p /app/share/libretro/cores/ + - mv -f ./RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores/* /app/share/libretro/cores/ sources: - type: archive @@ -577,12 +576,12 @@ modules: - name: retroarch-cores buildsystem: simple build-commands: - - mkdir -p /app/share/libretro/cores/ + - mkdir -p /app/share/libretro/cores/ - mv -f ./RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores/* /app/share/libretro/cores/ sources: - type: archive - url: https://buildbot.libretro.com/stable/1.16.0/linux/x86_64/RetroArch_cores.7z - sha256: a149d34662516d791e8f90507d1107949cb158196d6bbf75105c649fb26504b6 + url: https://buildbot.libretro.com/stable/1.17.0/linux/x86_64/RetroArch_cores.7z + sha256: 1c1d61f86b196e9f89c1a93d0756fba95b60ef3ba57a7cd1d1e86dfd419c766b - name: retroarch-sameduck-core buildsystem: simple @@ -652,8 +651,8 @@ modules: sources: - type: git url: &ppsspp-url https://github.com/hrydgard/ppsspp.git - tag: v1.17 - commit: 493122a2fcf9ff538e242fe2844f019b53afd483 + tag: v1.17.1 + commit: d479b74ed9c3e321bc3735da29bc125a2ac3b9b2 x-checker-data: type: json url: https://api.github.com/repos/hrydgard/ppsspp/releases/latest @@ -663,90 +662,6 @@ modules: # PPSSPP - END - # Yuzu - START - # https://github.com/yuzu-emu/yuzu-mainline/releases - - - name: Yuzu - buildsystem: simple - build-commands: - - chmod +x yuzu*.AppImage - - ./yuzu*.AppImage --appimage-extract - - mkdir -p "${FLATPAK_DEST}/yuzu" - - cp -r squashfs-root/* "${FLATPAK_DEST}/yuzu" - - ln -s "${FLATPAK_DEST}/yuzu/usr/bin/yuzu" "${FLATPAK_DEST}/bin/yuzu" - sources: - - type: file - url: https://github.com/yuzu-emu/yuzu-mainline/releases/download/mainline-0-1696/yuzu-mainline-20240128-1bd7a09e3.AppImage - sha256: d8ca508daa5ba929efda956488f4a9cbc38df9fd672fcb55cb2184625971706d - - # Yuzu - END - - # CITRA - START - # https://github.com/flathub/org.citra_emu.citra - - - rd-submodules/shared-modules/SDL2/SDL2-with-libdecor.json - - - rd-submodules/shared-modules/SDL2/SDL2-with-libdecor.json - - - name: citra - buildsystem: cmake-ninja - builddir: true - build-options: - env: - CI: '1' - GITHUB_ACTIONS: '1' - GITHUB_REPOSITORY: citra-emu/citra-nightly - GITHUB_REF_NAME: nightly-2025 - append-path: /usr/lib/sdk/llvm16/bin - prepend-ld-library-path: /usr/lib/sdk/llvm16/lib - cflags: '-Wno-unused-command-line-argument' - cxxflags: '-Wno-unused-command-line-argument' - config-opts: - - '-DCMAKE_BUILD_TYPE=Release' - - '-DCMAKE_C_COMPILER=clang' - - '-DCMAKE_CXX_COMPILER=clang++' - - '-DCMAKE_LINKER=lld' - - '-DENABLE_QT_TRANSLATION=ON' - - '-DCITRA_ENABLE_COMPATIBILITY_REPORTING=ON' - - '-DUSE_DISCORD_PRESENCE=ON' - - '-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF' - - '-DUSE_SYSTEM_SDL2=ON' - cleanup: - - /share/man - - /share/pixmaps - post-install: - - install -Dm755 ../citra-launcher.sh /app/bin/citra-launcher - - >- - install -Dm644 ../org.citra_emu.citra.svg - /app/share/icons/hicolor/scalable/apps/citra.svg - - >- - install -Dm644 ../dist/icon.png - /app/share/icons/hicolor/512x512/apps/citra.png - - >- - mv /app/share/mime/packages/citra.xml - /app/share/mime/packages/org.citra_emu.citra.xml - - >- - sed 's/citra/org.citra_emu.citra/g' -i - /app/share/mime/packages/org.citra_emu.citra.xml - sources: - - type: archive - url: >- - https://github.com/citra-emu/citra-nightly/releases/download/nightly-2025/citra-unified-source-20231105-998b9a9.tar.xz - sha256: ebf52af66c6ef729688a29d093d9139baa76973b698c0630a295f38d126cf118 - x-checker-data: - type: json - url: https://api.github.com/repos/citra-emu/citra-nightly/releases/latest - version-query: .tag_name - url-query: >- - .assets[] | .browser_download_url | - match("https://.+citra-unified-source-.+.xz$") | .string - is-main-source: true - - type: file - path: rd-submodules/citra/org.citra_emu.citra.svg - - type: file - path: rd-submodules/citra/citra-launcher.sh - - # CITRA - END # PCSX2 - START # Inspired by: @@ -763,8 +678,8 @@ modules: - ln -s "${FLATPAK_DEST}/pcsx2-qt/usr/bin/pcsx2-qt" "${FLATPAK_DEST}/bin/pcsx2-qt" sources: - type: file - url: https://github.com/PCSX2/pcsx2/releases/download/v1.7.5284/pcsx2-v1.7.5284-linux-appimage-x64-Qt.AppImage - sha256: b3cb23e07435f7efe7145cddd0cf4d473cc65eee8feae436b8a718fc3017721a + url: https://github.com/PCSX2/pcsx2/releases/download/v1.7.5769/pcsx2-v1.7.5769-linux-appimage-x64-Qt.AppImage + sha256: d819a339b9f3c43ee44fe9b6d975b9f76cff7716b5976a3b94f77e2cf4cab667 # PCSX2 - END @@ -894,8 +809,8 @@ modules: sources: - type: git url: https://github.com/xemu-project/xemu.git - tag: v0.7.116 - commit: b3fc80b3a83fa99aeb541a0c665cfb596cedd71c + tag: v0.7.120 + commit: 94d826a4f125d755d6d37069ad7084bfde33d650 x-checker-data: type: json url: https://api.github.com/repos/xemu-project/xemu/releases/latest @@ -922,13 +837,9 @@ modules: - name: melonds buildsystem: cmake-ninja builddir: true - config-opts: - - -DUSE_QT6=ON build-options: - arch: - aarch64: - config-opts: - - -DENABLE_LTO_RELEASE=OFF + config-opts: + - -DUSE_QT6=ON sources: - type: git url: https://github.com/melonDS-emu/melonDS.git @@ -945,6 +856,9 @@ modules: buildsystem: cmake-ninja builddir: true build-options: + # llvm17 is not available in framework 6.5 but in 6.6, so we're trying llvm16 and cross our fingers until Primehack is updated (as Primehack breaks on 6.6) + #append-ld-library-path: /usr/lib/sdk/llvm17/lib + #append-path: /usr/lib/sdk/llvm17/bin append-ld-library-path: /usr/lib/sdk/llvm16/lib append-path: /usr/lib/sdk/llvm16/bin cflags: &optflags -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong @@ -972,6 +886,7 @@ modules: - -DUSE_SYSTEM_ZLIB=ON - -Wno-dev post-install: + #- cp /usr/lib/sdk/llvm17/lib/libLLVM-17.so /app/lib/ - cp /usr/lib/sdk/llvm16/lib/libLLVM-16.so /app/lib/ - |- set -eux @@ -981,7 +896,7 @@ modules: sources: - type: git url: https://github.com/RPCS3/rpcs3.git - commit: f9d213650cfe4733937c43d93de91a17f8582820 + commit: 4ecf8ecd06c15f0557e1d9243f31e4c2d7baebe2 # RPCS3 - END @@ -1046,6 +961,7 @@ modules: # Duckstation-AppImage - END # Cemu - START + # needed libusb 1.0.26 but we provide 1.0.27, it could break # https://github.com/cemu-project/Cemu/releases # https://github.com/flathub/info.cemu.Cemu @@ -1072,8 +988,8 @@ modules: - /lib/cmake sources: - type: archive - url: https://boostorg.jfrog.io/artifactory/main/release/1.83.0/source/boost_1_83_0.tar.bz2 - sha256: 6478edfe2f3305127cffe8caf73ea0176c53769f4bf1585be237eb30798c3b8e + url: https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/boost_1_85_0.tar.bz2 + sha256: 7009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617 x-checker-data: type: anitya project-id: 6845 @@ -1143,9 +1059,6 @@ modules: config-opts: - -DPORTABLE=false - -DENABLE_VCPKG=false - build-options: - env: - - LC_ALL=C sources: - type: git url: https://github.com/cemu-project/Cemu @@ -1153,8 +1066,8 @@ modules: x-checker-data: type: git tag-pattern: ^v([\d.]+-\d+)$ - tag: v2.0-61 - commit: b6aaf6633063be47d89a8216e269e32aec5a4b49 + tag: v2.0-79 + commit: efbbb817fe1cbe09ee132344b44a0f61f8b8ac96 - type: shell commands: - sed "s/set(EXPERIMENTAL_VERSION.*/set(EXPERIMENTAL_VERSION \"$(git describe @@ -1275,9 +1188,12 @@ modules: tag: v1.6.5 commit: 3aec70b0556a8d7aed7903d1a3e4d9a18c5d1649 - - rd-submodules/shared-modules/gzdoom/gzdoom.json - # SOLARUS - END + + # GZDoom - Start + # When updating remember to update all the .pk3 files from the standalone linux download + - rd-submodules/shared-modules/gzdoom/gzdoom.json + # GZDoom - END # MAME - Start @@ -1292,6 +1208,23 @@ modules: # MAME - End + # Ryujinx Appimage - START + # https://ryujinx.org/download + + - name: Ryujinx + buildsystem: simple + build-commands: + - | + tar -zxvf *.tar.gz + mv -v publish ${FLATPAK_DEST}/ryujinx + ln -sv ${FLATPAK_DEST}/ryujinx/Ryujinx ${FLATPAK_DEST}/bin/Ryujinx.sh + sources: + - type: file + url: https://github.com/Ryujinx/release-channel-master/releases/download/1.1.1297/ryujinx-1.1.1297-linux_x64.tar.gz + sha256: 28b38754e7d2e92083b313b23278c180ae54ac025edbbd0276ec03baec0cec0f + + # Ryujinx Appimage - END + # External manifests end - name: retrodeck @@ -1301,21 +1234,17 @@ modules: # Initializing RO retrodeck config folder - mkdir -p ${FLATPAK_DEST}/retrodeck - # Prep the ES-DE and RetroArch config files - I will have to SED/XMLSTARLET them soon - - rm -rf /app/share/emulationstation/resources/systems/unix/es_find_rules.xml - - cp es-configs/es_find_rules.xml /app/share/emulationstation/resources/systems/unix/ - - rm -rf /app/share/emulationstation/resources/systems/unix/es_systems.xml - - cp es-configs/es_systems.xml /app/share/emulationstation/resources/systems/unix/ # These must be put in home folder, managed by retrodeck.sh - cp es-configs/es_settings.xml ${FLATPAK_DEST}/retrodeck/es_settings.xml - mv -f -t ${FLATPAK_DEST}/retrodeck es-configs/rd_prepacks # Logo, res, move graphics directory away from default location so splash can be changed after build - - mv -f -t ${FLATPAK_DEST}/retrodeck /app/share/emulationstation/resources/graphics + - mv -f -t ${FLATPAK_DEST}/retrodeck /app/share/es-de/resources/graphics - cp -f res/splash.svg ${FLATPAK_DEST}/retrodeck/graphics/splash.svg - cp -f res/splash.svg ${FLATPAK_DEST}/retrodeck/graphics/splash-orig.svg - cp -rf res/extra_splashes/ ${FLATPAK_DEST}/retrodeck/graphics - cp -f res/icon.svg /app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg + - cp -f res/icon-configurator.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.configurator.svg - mv -f -t ${FLATPAK_DEST}/retrodeck res/binding_icons # RetroDECK core script @@ -1325,7 +1254,7 @@ modules: # Tools - mkdir -p /app/tools - cp -r tools/** /app/tools - - find /app/tools -name '*.py|*.sh' -exec chmod +x {} \; + - find /app/tools -type f \( -name "*.sh" -o -name "*.py" \) -exec chmod +x {} \; # Function libraries - mkdir -p /app/libexec diff --git a/automation_tools/flatpak_build_bundle_persistent.sh b/old/automation_tools/flatpak_build_bundle_persistent.sh similarity index 100% rename from automation_tools/flatpak_build_bundle_persistent.sh rename to old/automation_tools/flatpak_build_bundle_persistent.sh diff --git a/automation_tools/flatpak_build_download_only_persistent.sh b/old/automation_tools/flatpak_build_download_only_persistent.sh similarity index 100% rename from automation_tools/flatpak_build_download_only_persistent.sh rename to old/automation_tools/flatpak_build_download_only_persistent.sh diff --git a/automation_tools/flatpak_build_only_persistent.sh b/old/automation_tools/flatpak_build_only_persistent.sh similarity index 93% rename from automation_tools/flatpak_build_only_persistent.sh rename to old/automation_tools/flatpak_build_only_persistent.sh index 4121cf9f..d9dc99ef 100755 --- a/automation_tools/flatpak_build_only_persistent.sh +++ b/old/automation_tools/flatpak_build_only_persistent.sh @@ -19,6 +19,8 @@ mkdir -vp ${$BUILD_DIR}/"$FOLDER" flatpak-builder --user --force-clean \ --install-deps-from=flathub \ --install-deps-from=flathub-beta \ +--keep-build-dirs \ +--rebuild-on-sdk-change \ --repo="${BUILD_DIR}/.local" \ --disable-download \ "${BUILD_DIR}/${FOLDER}" \ diff --git a/.github/workflows/removed/TEST_release_info.yml b/old/disabled-workflows/TEST_release_info.yml similarity index 100% rename from .github/workflows/removed/TEST_release_info.yml rename to old/disabled-workflows/TEST_release_info.yml diff --git a/old/disabled-workflows/cooker-selfhosted-persistent.yml b/old/disabled-workflows/cooker-selfhosted-persistent.yml new file mode 100644 index 00000000..711deb76 --- /dev/null +++ b/old/disabled-workflows/cooker-selfhosted-persistent.yml @@ -0,0 +1,210 @@ +name: "Build cooker (persistent)" + +env: + PERSISTENCE: true + +on: + push: + branches: + - cooker* + - feat* + paths: + - '.github/workflows/**' + - 'automation_tools/**' + - 'emu-configs/**' + - 'es-configs/**' + - 'functions/**' + - 'rd-submodules/**' + - '*.sh' + - 'net.retrodeck.retrodeck.yml' + - 'net.retrodeck.retrodeck.appdata.xml' + pull_request: + branches: + - cooker* + + workflow_dispatch: + +jobs: + + Building_RetroDECK: + runs-on: self-hosted + steps: + + # Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317 + - name: Remove stuck mounts + run: sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/* + continue-on-error: true + + - name: Clone RetroDECK repo + uses: actions/checkout@v3 + with: + submodules: 'true' + + - name: "Install dependencies" + run: "automation_tools/install_dependencies.sh" + + - name: Generate cooker build ID + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh" + + - name: Get branch name + id: branch_name + run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV + + # if it's a feature branch it will not marked as "latest" cooker version + - name: "Set makeLatest (cooker only)" + run: | + if [[ "$BRANCH_NAME" == 'feat/'* || "$BRANCH_NAME" == 'refs/'* ]]; then + echo "MAKE_LATEST=false" >> $GITHUB_ENV + else + echo "MAKE_LATEST=true" >> $GITHUB_ENV + fi + + # if the branch is coming from a PR the tag should be manually built + - name: "Generate version tag" + run: | + if [[ "$BRANCH_NAME" == 'refs/'* ]]; then + pr_number=$(echo ${{env.BRANCH_NAME}} | awk -F'/' '{print $3}') + source_branch=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/pulls/$pr_number" | jq -r '.head.ref') + source_branch=${source_branch//\//-} + echo "[DEBUG] source branch is: $source_branch" + echo "TAG=PR-$pr_number-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV + else + echo "TAG=${{env.BRANCH_NAME}}-${{ env.buildid }}" >> $GITHUB_ENV + fi + echo "Version TAG: ${{ env.TAG }}" + + # backing up manifest in case download fails and hashes must be recalculated + - name: Manifest backup + run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" + + - name: Run pre-build automation tasks + run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh" + + - name: "Adding flatpak portal for automated updates (cooker only)" + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_flatpak_portal_add.sh" + + - name: "Updating release notes in appdata" + run: "automation_tools/appdata_management.sh" + + - name: "[DEBUG] Outputting manifest" + run: cat net.retrodeck.retrodeck.yml + + - name: "Build flatpak: download only" + id: "flatpak-download" + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh" + continue-on-error: true + + # Sometimes flatpak download fails, in this case it tries a second time + - name: "Build flatpak: download only (retry)" + if: steps.flatpak-download.outcome == 'failure' + run: | + echo "Download failed, maybe some hash changed since the build start." + echo "Recalculating hashes and retrying download..." + rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml" + cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml" + "${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh" + "${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh" + + - name: Build flatpak + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only_persistent.sh" + + - name: Create Artifact for flathub + run: | + tar -czf ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz -C ${GITHUB_WORKSPACE}/retrodeck-flatpak-cooker . + hash=($(sha256sum ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz)) + echo $hash > ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.sha + mv -f RetroDECK-Artifact-cooker.* ${{ secrets.ARTIFACT_REPO }} + continue-on-error: true + + - name: Create Bundle + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle_persistent.sh" + + - name: Set environment variable with current branch name + run: echo "GITHUB_REF_SLUG=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV + + - name: Get commits since last release + run: | + # Get the latest release tag + LATEST_TAG=$(git describe --tags --abbrev=0) + # Get all commits since the latest release tag + COMMITS=$(git log $LATEST_TAG..HEAD --pretty=format:"- %s") + # Set the output variable + echo "::set-output name=commits::$COMMITS" + id: commits + continue-on-error: true + + - name: Publish the flatpak in a new cooker release + uses: ncipollo/release-action@v1 + with: + tag: "${{env.TAG}}" + body: | + # Release Notes (Cooker) + This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}. + On branch [${{env.BRANCH_NAME}}](https://github.com/XargonWan/RetroDECK/tree/${{env.BRANCH_NAME}}). + + ## Commits since last release + ${{ steps.commits.outputs.commits }} + + For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server. + + Cooker channel is provided for the community to test fixes and explore new functionality. + Please DO NOT open issues or ask support on this build. + + artifacts: "RetroDECK-cooker.flatpak,RetroDECK-Artifact.tar.gz" + allowUpdates: true + makeLatest: ${{env.MAKE_LATEST}} # if it's a feat branch is not considered the latest build + token: ${{ secrets.TRIGGER_BUILD_TOKEN }} + repo: RetroDECK-cooker + continue-on-error: true + + # In case it cannot publish the release at least it's providing the flatpak file for creating a manual release + - name: Upload RetroDECK-cooker.flatpak + uses: actions/upload-artifact@v3 + with: + name: retrodeck-flatpak + path: RetroDECK-cooker.flatpak + continue-on-error: true + + # - name: Upload RetroDECK-cooker.flatpak to Gitea Release + # run: | + # # Set variables for Gitea host, organization, repository, access token, and release details + # GITEA_HOST="repo.retrodeck.net" + # ORGANIZATION="RetroDECK" + # REPO="RetroDECK-cooker" + # GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}" + # RELEASE_NAME="RetroDECK ${{env.TAG}}" + # TAG="${{env.TAG}}" + # RELEASE_BODY="# Release Notes (Cooker) + # This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}. + # On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}}). + + # ## Commits since last release + # ${{ steps.commits.outputs.commits }} + + # For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server. + + # Cooker channel is provided for the community to test fixes and explore new functionality. + # Please DO NOT open issues or ask support on this build." + + # # Create a release using curl and capture the release ID + # release_response=$(curl -X POST \ + # -H "Authorization: token ${GITEA_TOKEN}" \ + # -H "Content-Type: application/json" \ + # -d "{\"tag_name\":\"$TAG\",\"name\":\"$RELEASE_NAME\",\"body\":\"$RELEASE_BODY\"}" \ + # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases") + + # # Extract the release ID from the response + # release_id=$(echo $release_response | jq -r '.id') + + # # Upload artifacts + # curl -X POST \ + # -H "Authorization: token ${GITEA_TOKEN}" \ + # -H "Content-Type: multipart/form-data" \ + # -F "attachment=@RetroDECK-cooker.flatpak" \ + # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak" + + # curl -X POST \ + # -H "Authorization: token ${GITEA_TOKEN}" \ + # -H "Content-Type: multipart/form-data" \ + # -F "attachment=@RetroDECK-Artifact.tar.gz" \ + # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz" diff --git a/.github/workflows/cooker-selfhosted-persistent.yml b/old/disabled-workflows/cooker-selfhosted.yml similarity index 78% rename from .github/workflows/cooker-selfhosted-persistent.yml rename to old/disabled-workflows/cooker-selfhosted.yml index 9cd619d7..2931fac4 100644 --- a/.github/workflows/cooker-selfhosted-persistent.yml +++ b/old/disabled-workflows/cooker-selfhosted.yml @@ -1,29 +1,32 @@ -name: "Build cooker (persistent)" - -env: - PERSISTENCE: true +name: "Build cooker" on: - push: - branches: - - cooker* - - feat* - paths: - - '.github/workflows/**' - - 'automation_tools/**' - - 'emu-configs/**' - - 'es-configs/**' - - 'functions/**' - - 'rd-submodules/**' - - '*.sh' - - 'net.retrodeck.retrodeck.yml' - - 'net.retrodeck.retrodeck.appdata.xml' - pull_request: - branches: - - cooker* + # push: + # branches: + # - cooker* + # - feat* + # paths: + # - '.github/workflows/**' + # - 'automation_tools/**' + # - 'emu-configs/**' + # - 'es-configs/**' + # - 'functions/**' + # - 'rd-submodules/**' + # - '*.sh' + # - 'net.retrodeck.retrodeck.yml' + # - 'net.retrodeck.retrodeck.appdata.xml' + # pull_request: + # branches: + # - cooker* + + # Italy (CET): 11:00 PM + # Japan (JST): 7:00 AM + schedule: + - cron: '0 22 * * *' workflow_dispatch: + jobs: Building_RetroDECK: @@ -46,33 +49,6 @@ jobs: - name: Generate cooker build ID run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh" - - name: Get branch name - id: branch_name - run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV - - # if it's a feature branch it will not marked as "latest" cooker version - - name: "Set makeLatest (cooker only)" - run: | - if [[ "$BRANCH_NAME" == 'feat/'* || "$BRANCH_NAME" == 'refs/'* ]]; then - echo "MAKE_LATEST=false" >> $GITHUB_ENV - else - echo "MAKE_LATEST=true" >> $GITHUB_ENV - fi - - # if the branch is coming from a PR the tag should be manually built - - name: "Generate version tag" - run: | - if [[ "$BRANCH_NAME" == 'refs/'* ]]; then - pr_number=$(echo ${{env.BRANCH_NAME}} | awk -F'/' '{print $3}') - source_branch=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/pulls/$pr_number" | jq -r '.head.ref') - source_branch=${source_branch//\//-} - echo "[DEBUG] source branch is: $source_branch" - echo "TAG=PR-$pr_number-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV - else - echo "TAG=${{env.BRANCH_NAME}}-${{ env.buildid }}" >> $GITHUB_ENV - fi - echo "Version TAG: ${{ env.TAG }}" - # backing up manifest in case download fails and hashes must be recalculated - name: Manifest backup run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" @@ -91,7 +67,7 @@ jobs: - name: "Build flatpak: download only" id: "flatpak-download" - run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh" + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh" continue-on-error: true # Sometimes flatpak download fails, in this case it tries a second time @@ -103,10 +79,10 @@ jobs: rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml" cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml" "${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh" - "${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh" + "${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh" - name: Build flatpak - run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only_persistent.sh" + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh" - name: Create Artifact for flathub run: | @@ -117,7 +93,7 @@ jobs: continue-on-error: true - name: Create Bundle - run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle_persistent.sh" + run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh" - name: Set environment variable with current branch name run: echo "GITHUB_REF_SLUG=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV @@ -133,10 +109,23 @@ jobs: id: commits continue-on-error: true + - name: Get branch name + id: branch_name + run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV + + # if it's a feature branch it will not marked as "latest" cooker version + - name: "Set makeLatest (cooker only)" + run: | + if [[ "$BRANCH_NAME" == 'feat/'* ]]; then + echo "MAKE_LATEST=false" >> $GITHUB_ENV + else + echo "MAKE_LATEST=true" >> $GITHUB_ENV + fi + - name: Publish the flatpak in a new cooker release uses: ncipollo/release-action@v1 with: - tag: "${{env.TAG}}" + tag: "${{env.BRANCH_NAME}}-${{ env.buildid }}" body: | # Release Notes (Cooker) This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}. @@ -145,7 +134,7 @@ jobs: ## Commits since last release ${{ steps.commits.outputs.commits }} - For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/qQcrFvaA2C) on our Discord server. + For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server. Cooker channel is provided for the community to test fixes and explore new functionality. Please DO NOT open issues or ask support on this build. @@ -164,3 +153,4 @@ jobs: name: retrodeck-flatpak path: RetroDECK-cooker.flatpak continue-on-error: true + diff --git a/.github/workflows/removed/cooker.yml b/old/disabled-workflows/cooker.yml similarity index 100% rename from .github/workflows/removed/cooker.yml rename to old/disabled-workflows/cooker.yml diff --git a/.github/workflows/removed/flathub_push_cooker.yml b/old/disabled-workflows/flathub_push_cooker.yml similarity index 100% rename from .github/workflows/removed/flathub_push_cooker.yml rename to old/disabled-workflows/flathub_push_cooker.yml diff --git a/.github/workflows/removed/main.yml b/old/disabled-workflows/main.yml similarity index 100% rename from .github/workflows/removed/main.yml rename to old/disabled-workflows/main.yml diff --git a/.github/workflows/submodule-update.yml b/old/disabled-workflows/submodule-update.yml similarity index 100% rename from .github/workflows/submodule-update.yml rename to old/disabled-workflows/submodule-update.yml diff --git a/.github/workflows/removed/update-readthedocs.yml b/old/disabled-workflows/update-readthedocs.yml similarity index 100% rename from .github/workflows/removed/update-readthedocs.yml rename to old/disabled-workflows/update-readthedocs.yml diff --git a/old/removed-modules.yml b/old/removed-modules.yml index 43d5cab3..04274441 100644 --- a/old/removed-modules.yml +++ b/old/removed-modules.yml @@ -112,24 +112,7 @@ # Duckstation-DontUpdate - END - # Ryujinx Appimage - START - # https://ryujinx.org/download - - # - name: Ryujinx - # buildsystem: simple - # build-commands: - # - | - # tar -zxvf ryujinx-1.1.685-linux_x64.tar.gz - # mv -v publish ${FLATPAK_DEST}/ryujinx - # ln -sv ${FLATPAK_DEST}/ryujinx/Ryujinx ${FLATPAK_DEST}/bin/Ryujinx - # sources: - # - type: file - # url: https://github.com/Ryujinx/release-channel-master/releases/download/1.1.685/ryujinx-1.1.685-linux_x64.tar.gz - # sha256: bc4d7076106d7aa59c3a3ea22b83c553e5fa1a897815831adcf18cc13d729e15 - - # Ryujinx Appimage - END - - # Ryujinx - START + # Ryujinx - START # https://github.com/flathub/org.ryujinx.Ryujinx - name: Ryujinx diff --git a/other_licenses.txt b/other_licenses.txt new file mode 100644 index 00000000..1b8073a9 --- /dev/null +++ b/other_licenses.txt @@ -0,0 +1,27 @@ +All Licenses of the projects we are using are listed on the wiki: +https://retrodeck.readthedocs.io/en/latest/wiki_about/donations-licenses/ + +If we have made some linkage errors or your license needs to be included in the projects github page please contact the RetroDECK Team on Discord or Matrix. + +--- + +Freedoom +https://github.com/freedoom/freedoom?tab=License-1-ov-file#readme + +Copyright © 2001-2024 Contributors to the Freedoom project. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + Neither the name of the Freedoom project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +For a list of contributors to the Freedoom project, see the file CREDITS. + +--- + + diff --git a/rd-submodules/citra/citra-launcher.sh b/rd-submodules/citra/citra-launcher.sh deleted file mode 100644 index 33b95cfb..00000000 --- a/rd-submodules/citra/citra-launcher.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -e - -report_error() { - read -r -d '|' MESSAGE <https://github.com/flathub/org.citra_emu.citra/issues. - -When submitting a bug report, please attach your system information and the Citra log file. -You seem to be using ${XDG_SESSION_DESKTOP} ${DESKTOP_SESSION} (${XDG_SESSION_TYPE}): -To obtain Citra log files, please see this guide. -To obtain your system information, please install inxi and run inxi -v3. | -EOF - zenity --warning --no-wrap --title "That's awkward ..." --text "$MESSAGE" -} - -unset VK_ICD_FILENAMES VK_DRIVER_FILES -# Discord RPC -for i in {0..9}; do - test -S "$XDG_RUNTIME_DIR"/"discord-ipc-$i" || ln -sf {app/com.discordapp.Discord,"$XDG_RUNTIME_DIR"}/"discord-ipc-$i"; -done - - -if ! prlimit --nofile=8192 citra-qt "$@"; then - report_error -fi \ No newline at end of file diff --git a/rd-submodules/citra/org.citra_emu.citra.svg b/rd-submodules/citra/org.citra_emu.citra.svg deleted file mode 100644 index 8fa09944..00000000 --- a/rd-submodules/citra/org.citra_emu.citra.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/rd-submodules/es-de/GuiMenu.cpp.patch b/rd-submodules/es-de/GuiMenu.cpp.patch deleted file mode 100644 index b0c035ea..00000000 --- a/rd-submodules/es-de/GuiMenu.cpp.patch +++ /dev/null @@ -1,38 +0,0 @@ -diff -au1r emulationstation-de/es-app/src/guis/GuiMenu.cpp emulationstation-de/es-app/src/guis/GuiMenu.cpp ---- emulationstation-de/es-app/src/guis/GuiMenu.cpp 2023-08-23 13:12:15.617292576 +0200 -+++ emulationstation-de/es-app/src/guis/GuiMenu.cpp 2023-08-23 13:44:10.736412006 +0200 -@@ -67,2 +67,4 @@ - -+ addEntry("RETRODECK CONFIGURATOR", mMenuColorPrimary, false, [this] { openRetroDeckConfigurator(); }); -+ - if (!Settings::getInstance()->getBool("ForceKiosk") && -@@ -70,3 +72,3 @@ - #if defined(__APPLE__) -- addEntry("QUIT EMULATIONSTATION", mMenuColorPrimary, false, [this] { openQuitMenu(); }); -+ addEntry("QUIT RETRODECK", mMenuColorPrimary, false, [this] { openQuitMenu(); }); - #else -@@ -75,3 +77,3 @@ - else -- addEntry("QUIT EMULATIONSTATION", mMenuColorPrimary, false, [this] { openQuitMenu(); }); -+ addEntry("QUIT RETRODECK", mMenuColorPrimary, false, [this] { openQuitMenu(); }); - #endif -@@ -1758,3 +1760,3 @@ - auto quitText = std::make_shared( -- "QUIT EMULATIONSTATION", Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary); -+ "QUIT RETRODECK", Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary); - quitText->setSelectable(true); -@@ -1910 +1912,14 @@ - } -+ -+void GuiMenu::openRetroDeckConfigurator() -+{ -+ // Launch the configurator.sh script -+ std::string command; -+ std::string startDirectory; -+ bool runInBackground; -+ command = "bash /app/tools/configurator.sh"; -+ startDirectory = "/app/tools"; -+ runInBackground = false; -+ int result = Utils::Platform::launchGameUnix(command, startDirectory, runInBackground); -+ // You can add any checks for the script's outcome here. -+} diff --git a/rd-submodules/es-de/GuiMenu.h.patch b/rd-submodules/es-de/GuiMenu.h.patch deleted file mode 100644 index 13a6b687..00000000 --- a/rd-submodules/es-de/GuiMenu.h.patch +++ /dev/null @@ -1,10 +0,0 @@ -diff -au1r emulationstation-de/es-app/src/guis/GuiMenu.h emulationstation-de/es-app/src/guis/GuiMenu.h ---- emulationstation-de/es-app/src/guis/GuiMenu.h 2023-08-23 13:12:15.617292576 +0200 -+++ emulationstation-de/es-app/src/guis/GuiMenu.h 2023-08-23 13:50:20.978700234 +0200 -@@ -46,2 +46,3 @@ - void openOtherOptions(); -+ void openRetroDeckConfigurator(); - void openQuitMenu(); -@@ -54 +55,2 @@ - #endif // ES_APP_GUIS_GUI_MENU_H -+ diff --git a/rd-submodules/es-de/GuiThemeDownloader.cpp.patch b/rd-submodules/es-de/GuiThemeDownloader.cpp.patch deleted file mode 100644 index 8dd35293..00000000 --- a/rd-submodules/es-de/GuiThemeDownloader.cpp.patch +++ /dev/null @@ -1,10 +0,0 @@ -diff -au1r emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp ---- emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp 2023-11-03 16:25:01.115126901 +0100 -+++ emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp 2023-11-03 16:26:18.882607724 +0100 -@@ -602,4 +602,4 @@ - getHelpStyle(), -- "IT SEEMS AS IF YOU'RE NOT RUNNING THE LATEST ES-DE RELEASE, PLEASE UPGRADE BEFORE " -- "PROCEEDING AS THESE THEMES MAY NOT BE COMPATIBLE WITH YOUR VERSION", -+ "ES-DE THEME ENGINE WAS UPDATED UPSTREAM. THESE THEMES MAY NOT BE COMPATIBLE WITH THE CURRENT RETRODECK VERSION." -+ "CHECK IF A NEW RETRODECK UPDATE IS AVAILABLE, ELSE PLEASE WAIT FOR IT OR PROCEED AT YOUR OWN RISK.", - "OK", [] { return; }, "", nullptr, "", nullptr, nullptr, true)); diff --git a/rd-submodules/es-de/ViewController.cpp.patch b/rd-submodules/es-de/ViewController.cpp.patch deleted file mode 100644 index 8d677c37..00000000 --- a/rd-submodules/es-de/ViewController.cpp.patch +++ /dev/null @@ -1,101 +0,0 @@ -diff -au1r emulationstation-de/es-app/src/views/ViewController.cpp emulationstation-de/es-app/src/views/ViewController.cpp ---- emulationstation-de/es-app/src/views/ViewController.cpp 2023-11-04 15:09:24.332178777 -0400 -+++ emulationstation-de/es-app/src/views/ViewController.cpp 2023-11-04 15:13:59.015780009 -0400 -@@ -195,91 +195,3 @@ - mNoGamesMessageBox = new GuiMsgBox( -- HelpStyle(), mNoGamesErrorMessage + mRomDirectory, "CHANGE ROM DIRECTORY", -- [this] { -- std::string currentROMDirectory; --#if defined(_WIN64) -- currentROMDirectory = Utils::String::replace(FileData::getROMDirectory(), "/", "\\"); --#else -- currentROMDirectory = FileData::getROMDirectory(); --#endif -- if (Settings::getInstance()->getBool("VirtualKeyboard")) { -- mWindow->pushGui(new GuiTextEditKeyboardPopup( -- HelpStyle(), 0.0f, "ENTER ROM DIRECTORY PATH", currentROMDirectory, -- [this, currentROMDirectory](const std::string& newROMDirectory) { -- if (currentROMDirectory != newROMDirectory) { -- Settings::getInstance()->setString( -- "ROMDirectory", Utils::String::trim(newROMDirectory)); -- Settings::getInstance()->saveFile(); --#if defined(_WIN64) -- mRomDirectory = -- Utils::String::replace(FileData::getROMDirectory(), "/", "\\"); --#else -- mRomDirectory = FileData::getROMDirectory(); --#endif -- mNoGamesMessageBox->changeText(mNoGamesErrorMessage + mRomDirectory); -- mWindow->pushGui(new GuiMsgBox(HelpStyle(), -- "ROM DIRECTORY SETTING SAVED, RESTART\n" -- "THE APPLICATION TO RESCAN THE SYSTEMS", -- "OK", nullptr, "", nullptr, "", nullptr, -- nullptr, true, true)); -- } -- }, -- false, "SAVE", "SAVE CHANGES?", "Currently configured path:", -- currentROMDirectory, "LOAD CURRENTLY CONFIGURED PATH", -- "CLEAR (LEAVE BLANK TO RESET TO DEFAULT PATH)")); -- } -- else { -- mWindow->pushGui(new GuiTextEditPopup( -- HelpStyle(), "ENTER ROM DIRECTORY PATH", currentROMDirectory, -- [this](const std::string& newROMDirectory) { -- Settings::getInstance()->setString("ROMDirectory", -- Utils::String::trim(newROMDirectory)); -- Settings::getInstance()->saveFile(); --#if defined(_WIN64) -- mRomDirectory = -- Utils::String::replace(FileData::getROMDirectory(), "/", "\\"); --#else -- mRomDirectory = FileData::getROMDirectory(); --#endif -- mNoGamesMessageBox->changeText(mNoGamesErrorMessage + mRomDirectory); -- mWindow->pushGui(new GuiMsgBox(HelpStyle(), -- "ROM DIRECTORY SETTING SAVED, RESTART\n" -- "THE APPLICATION TO RESCAN THE SYSTEMS", -- "OK", nullptr, "", nullptr, "", nullptr, -- nullptr, true)); -- }, -- false, "SAVE", "SAVE CHANGES?", "Currently configured path:", -- currentROMDirectory, "LOAD CURRENTLY CONFIGURED PATH", -- "CLEAR (LEAVE BLANK TO RESET TO DEFAULT PATH)")); -- } -- }, -- "CREATE DIRECTORIES", -- [this] { -- mWindow->pushGui(new GuiMsgBox( -- HelpStyle(), -- "THIS WILL CREATE DIRECTORIES FOR ALL THE\n" -- "GAME SYSTEMS DEFINED IN es_systems.xml\n\n" -- "THIS MAY CREATE A LOT OF FOLDERS SO IT'S\n" -- "ADVICED TO REMOVE THE ONES YOU DON'T NEED", -- "PROCEED", -- [this] { -- if (!SystemData::createSystemDirectories()) { -- mWindow->pushGui(new GuiMsgBox(HelpStyle(), -- "THE SYSTEM DIRECTORIES WERE SUCCESSFULLY\n" -- "GENERATED, EXIT THE APPLICATION AND PLACE\n" -- "YOUR GAMES IN THE NEWLY CREATED FOLDERS", -- "OK", nullptr, "", nullptr, "", nullptr, -- nullptr, true)); -- } -- else { -- mWindow->pushGui(new GuiMsgBox(HelpStyle(), -- "ERROR CREATING THE SYSTEM DIRECTORIES,\n" -- "PERMISSION PROBLEMS OR DISK FULL?\n\n" -- "SEE THE LOG FILE FOR MORE DETAILS", -- "OK", nullptr, "", nullptr, "", nullptr, -- nullptr, true)); -- } -- }, -- "CANCEL", nullptr, "", nullptr, nullptr, false)); -- }, -- "QUIT", -+ HelpStyle(), mNoGamesErrorMessage + mRomDirectory, "QUIT", - [] { -@@ -289,3 +201,3 @@ - }, -- nullptr, true, false, -+ "", nullptr, "", nullptr, nullptr, true, true, - (mRenderer->getIsVerticalOrientation() ? diff --git a/rd-submodules/es-de/Window.cpp.patch b/rd-submodules/es-de/Window.cpp.patch deleted file mode 100644 index c099d83b..00000000 --- a/rd-submodules/es-de/Window.cpp.patch +++ /dev/null @@ -1,9 +0,0 @@ -diff -au1r emulationstation-de/es-core/src/Window.cpp emulationstation-de/es-core/src/Window.cpp ---- emulationstation-de/es-core/src/Window.cpp 2023-08-29 14:14:17.208301836 +0200 -+++ emulationstation-de/es-core/src/Window.cpp 2023-08-29 14:12:37.307334069 +0200 - -@@ -181,3 +181,3 @@ - progressBarRect.barPosY += borderThickness; -- progressBarRect.color = 0x79010FFF; -+ progressBarRect.color = 0xC858E6FF; - mProgressBarRectangles.emplace_back(progressBarRect); diff --git a/rd-submodules/es-de/patch_helper.sh b/rd-submodules/es-de/patch_helper.sh deleted file mode 100755 index 27923b97..00000000 --- a/rd-submodules/es-de/patch_helper.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -mkdir /tmp - -branch="00a226062fff37209d98e0ab048ac89af50ecacc" -git clone "https://gitlab.com/es-de/emulationstation-de.git" /tmp/emulationstation-de - -pushd . -cd /tmp/emulationstation-de -git checkout $branch -popd - -mkdir patches-tmp - -cp /tmp/emulationstation-de/es-app/src/guis/GuiMenu.cpp ./patches-tmp -cp /tmp/emulationstation-de/es-app/src/guis/GuiMenu.h ./patches-tmp -cp /tmp/emulationstation-de/es-app/src/views/ViewController.cpp ./patches-tmp -cp /tmp/emulationstation-de/es-core/src/Window.cpp ./patches-tmp -cp /tmp/emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp ./patches-tmp - -read -p "Please edit the files in \"patches-tmp\" and press enter to continue." - -diff -au1r /tmp/emulationstation-de/es-app/src/guis/GuiMenu.cpp ./patches-tmp/GuiMenu.cpp > GuiMenu.cpp.patch -diff -au1r /tmp/emulationstation-de/es-app/src/guis/GuiMenu.h ./patches-tmp/GuiMenu.h > GuiMenu.h.patch -diff -au1r /tmp/emulationstation-de/es-app/src/views/ViewController.cpp ./patches-tmp/ViewController.cpp > ViewController.cpp.patch -diff -au1r /tmp/emulationstation-de/es-core/src/Window.cpp ./patches-tmp/Window.cpp > Window.cpp.patch -diff -au1r /tmp/emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp ./patches-tmp/GuiThemeDownloader.cpp > GuiThemeDownloader.cpp.patch - -rm -rf patches-tmp - -echo "Done, now please remeber to edit the headers of the patch files with the correct paths." \ No newline at end of file diff --git a/rd-submodules/retroarch b/rd-submodules/retroarch index 51d4821a..c2aad986 160000 --- a/rd-submodules/retroarch +++ b/rd-submodules/retroarch @@ -1 +1 @@ -Subproject commit 51d4821a45ac5fe13b2baa69aaaea864ead407ce +Subproject commit c2aad98600a47ab250f1b133328d0ccc1310f65e diff --git a/rd-submodules/ryujinx b/rd-submodules/ryujinx index ebcd7d1c..ea1dae93 160000 --- a/rd-submodules/ryujinx +++ b/rd-submodules/ryujinx @@ -1 +1 @@ -Subproject commit ebcd7d1c9bbb2d4857555238727a81e89f6600f1 +Subproject commit ea1dae930a6f61388c2b5e05f95bb6ed0120926e diff --git a/rd-submodules/shared-modules b/rd-submodules/shared-modules index 6ba63f38..f63cb3f5 160000 --- a/rd-submodules/shared-modules +++ b/rd-submodules/shared-modules @@ -1 +1 @@ -Subproject commit 6ba63f383ad54e7ebe2b0cda64c15602cf9a9153 +Subproject commit f63cb3f5fff835c141769d35cd54ce0ae042fcbf diff --git a/res/binding_icons/RD-alt-f4.png b/res/binding_icons/RD-alt-f4.png new file mode 100644 index 00000000..ed3924be Binary files /dev/null and b/res/binding_icons/RD-alt-f4.png differ diff --git a/res/binding_icons/RD-freedoom-git.png b/res/binding_icons/RD-freedoom-git.png new file mode 100644 index 00000000..ac56a7d1 Binary files /dev/null and b/res/binding_icons/RD-freedoom-git.png differ diff --git a/res/binding_icons/RD-freedoom-gud.png b/res/binding_icons/RD-freedoom-gud.png new file mode 100644 index 00000000..dc84ddfa Binary files /dev/null and b/res/binding_icons/RD-freedoom-gud.png differ diff --git a/res/binding_icons/RD-freedoom-lol.png b/res/binding_icons/RD-freedoom-lol.png new file mode 100644 index 00000000..b486e149 Binary files /dev/null and b/res/binding_icons/RD-freedoom-lol.png differ diff --git a/res/binding_icons/RD-freedoom-map.png b/res/binding_icons/RD-freedoom-map.png new file mode 100644 index 00000000..fbb8dcf5 Binary files /dev/null and b/res/binding_icons/RD-freedoom-map.png differ diff --git a/res/binding_icons/RD-freedoom-pack.png b/res/binding_icons/RD-freedoom-pack.png new file mode 100644 index 00000000..ef10c6ff Binary files /dev/null and b/res/binding_icons/RD-freedoom-pack.png differ diff --git a/res/binding_icons/RD-freedoom-pack2.png b/res/binding_icons/RD-freedoom-pack2.png new file mode 100644 index 00000000..36d90a78 Binary files /dev/null and b/res/binding_icons/RD-freedoom-pack2.png differ diff --git a/res/binding_icons/RD-freedoom-pack3.png b/res/binding_icons/RD-freedoom-pack3.png new file mode 100644 index 00000000..886a94f7 Binary files /dev/null and b/res/binding_icons/RD-freedoom-pack3.png differ diff --git a/res/binding_icons/RD-tilt-1.png b/res/binding_icons/RD-tilt-1.png new file mode 100644 index 00000000..5aa9429d Binary files /dev/null and b/res/binding_icons/RD-tilt-1.png differ diff --git a/res/binding_icons/RD-tilt-2.png b/res/binding_icons/RD-tilt-2.png new file mode 100644 index 00000000..c41608bc Binary files /dev/null and b/res/binding_icons/RD-tilt-2.png differ diff --git a/res/binding_icons/RD-tilt-3.png b/res/binding_icons/RD-tilt-3.png new file mode 100644 index 00000000..89ce3d99 Binary files /dev/null and b/res/binding_icons/RD-tilt-3.png differ diff --git a/res/binding_icons/RD-tilt-4.png b/res/binding_icons/RD-tilt-4.png new file mode 100644 index 00000000..15b38ec1 Binary files /dev/null and b/res/binding_icons/RD-tilt-4.png differ diff --git a/res/binding_icons/RD-wii-1.png b/res/binding_icons/RD-wii-1.png new file mode 100644 index 00000000..0373189c Binary files /dev/null and b/res/binding_icons/RD-wii-1.png differ diff --git a/res/binding_icons/RD-wii-2.png b/res/binding_icons/RD-wii-2.png new file mode 100644 index 00000000..ea772437 Binary files /dev/null and b/res/binding_icons/RD-wii-2.png differ diff --git a/res/binding_icons/RD-wii-3.png b/res/binding_icons/RD-wii-3.png new file mode 100644 index 00000000..3cff0e74 Binary files /dev/null and b/res/binding_icons/RD-wii-3.png differ diff --git a/res/binding_icons/RD-wii-4.png b/res/binding_icons/RD-wii-4.png new file mode 100644 index 00000000..73feea86 Binary files /dev/null and b/res/binding_icons/RD-wii-4.png differ diff --git a/res/binding_icons/RD-mote-side.png b/res/binding_icons/RD-wiimote-side.png similarity index 100% rename from res/binding_icons/RD-mote-side.png rename to res/binding_icons/RD-wiimote-side.png diff --git a/res/binding_icons/RD-mote-up.png b/res/binding_icons/RD-wiimote-up.png similarity index 100% rename from res/binding_icons/RD-mote-up.png rename to res/binding_icons/RD-wiimote-up.png diff --git a/res/binding_icons/rd-tilt.png b/res/binding_icons/rd-tilt.png new file mode 100644 index 00000000..c1d7ae27 Binary files /dev/null and b/res/binding_icons/rd-tilt.png differ diff --git a/res/extra_splashes/rd-gm-bday-splash.svg b/res/extra_splashes/rd-gm-bday-splash.svg new file mode 100644 index 00000000..ebfdf371 --- /dev/null +++ b/res/extra_splashes/rd-gm-bday-splash.svg @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/icon-configurator.svg b/res/icon-configurator.svg new file mode 100644 index 00000000..ee678f64 --- /dev/null +++ b/res/icon-configurator.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + diff --git a/retrodeck.sh b/retrodeck.sh index 1758eee8..52cd7697 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -18,7 +18,7 @@ Arguments: --info-msg Print paths and config informations --configurator Starts the RetroDECK Configurator --compress-one Compresses target file to a compatible format - --compress-all Compresses all supported games into compatible format. Available formats are \"chd\", \"zip\", \"rvz\" and \"all\". + --compress-all Compresses all supported games into a compatible format. Available formats are \"chd\", \"zip\", \"rvz\" and \"all\". --reset-component Reset one or more component or emulator configs to the default values --reset-retrodeck Starts the initial RetroDECK installer (backup your data first!) @@ -56,9 +56,10 @@ https://retrodeck.net ;; --reset-component*) echo "You are about to reset one or more RetroDECK components or emulators." - echo "Available options are: es-de, retroarch, cemu, citra, dolphin, duckstation, melonds, pcsx3, pico8, ppsspp, primehack, rpcs3, xemu, yuzu, vita3k, mame, gzdoom, boilr, all" + echo "Available options are: es-de, retroarch, cemu, dolphin, duckstation, gzdoom, melonds, pcsx3, pico8, ppsspp, primehack, rpcs3, ryujinx, xemu, vita3k, mame, boilr, all" read -p "Please enter the component you would like to reset: " component - if [[ "$component" =~ ^(es-de|retroarch|cemu|citra|dolphin|duckstation|mame|melonds|pcsx2|ppsspp|primehack|rpcs3|xemu|yuzu|all)$ ]]; then + component=$(echo "$component" | tr '[:upper:]' '[:lower:]') + if [[ "$component" =~ ^(es-de|retroarch|cemu|dolphin|duckstation|gzdoom|mame|melonds|pcsx2|ppsspp|primehack|ryujinx|rpcs3|xemu|all)$ ]]; then read -p "You are about to reset $component to default settings. Enter 'y' to continue, 'n' to stop: " response if [[ $response == [yY] ]]; then prepare_component "reset" "$component" "cli" @@ -79,8 +80,8 @@ https://retrodeck.net if [[ $response == [yY] ]]; then rm -f "$lockfile" rm -f "$rd_conf" - read -p "The process has been completed, press Enter key to start the initial RetroDECK setup process." - shift # Continue launch after previous command is finished + read -p "The process has been completed, press Enter key to exit. Please run RetroDECK again to start the initial setup process." + exit 1 else read -p "The process has been cancelled, press Enter key to exit." exit @@ -99,13 +100,14 @@ https://retrodeck.net esac done -# UPDATE TRIGGERED +log d "Update triggered" # if lockfile exists if [ -f "$lockfile" ]; then - # ...but the version doesn't match with the config file if [ "$hard_version" != "$version" ]; then - echo "Config file's version is $version but the actual version is $hard_version" + log d "Lockfile found but the version doesn't match with the config file" + log i "Config file's version is $version but the actual version is $hard_version" if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build + log d "Newly-installed version is a \"cooker\" build" configurator_generic_dialog "RetroDECK Cooker Warning" "RUNNING COOKER VERSIONS OF RETRODECK CAN BE EXTREMELY DANGEROUS AND ALL OF YOUR RETRODECK DATA\n(INCLUDING BIOS FILES, BORDERS, DOWNLOADED MEDIA, GAMELISTS, MODS, ROMS, SAVES, STATES, SCREENSHOTS, TEXTURE PACKS AND THEMES)\nARE AT RISK BY CONTINUING!" set_setting_value $rd_conf "update_repo" "RetroDECK-cooker" retrodeck "options" set_setting_value $rd_conf "update_check" "true" retrodeck "options" @@ -118,7 +120,7 @@ if [ -f "$lockfile" ]; then rc=$? # Capture return code, as "Yes" button has no text value if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked if [[ $choice == "Don't Upgrade" ]]; then # If user wants to bypass the post_update.sh process this time. - echo "Skipping upgrade process for cooker build, updating stored version in retrodeck.cfg" + log i "Skipping upgrade process for cooker build, updating stored version in retrodeck.cfg" set_setting_value $rd_conf "version" "$hard_version" retrodeck # Set version of currently running RetroDECK to updated retrodeck.cfg elif [[ $choice == "Full Wipe and Fresh Install" ]]; then # Remove all RetroDECK data and start a fresh install if [[ $(configurator_generic_question_dialog "RetroDECK Cooker Reset" "This is going to remove all of the data in all locations used by RetroDECK!\n\n(INCLUDING BIOS FILES, BORDERS, DOWNLOADED MEDIA, GAMELISTS, MODS, ROMS, SAVES, STATES, SCREENSHOTS, TEXTURE PACKS AND THEMES)\n\nAre you sure you want to contine?") == "true" ]]; then @@ -126,9 +128,10 @@ if [ -f "$lockfile" ]; then if [[ $(configurator_generic_question_dialog "RetroDECK Cooker Reset" "But are you super DUPER sure? We REAAAALLLLLYY want to make sure you know what is happening here.\n\nThe ~/retrodeck and ~/.var/app/net.retrodeck.retrodeck folders and ALL of their contents\nare about to be PERMANENTLY removed.\n\nStill sure you want to proceed?") == "true" ]]; then configurator_generic_dialog "RetroDECK Cooker Reset" "Ok, if you're that sure, here we go!" if [[ $(configurator_generic_question_dialog "RetroDECK Cooker Reset" "(Are you actually being serious here? Because we are...\n\nNo backsies.)") == "true" ]]; then - echo "Removing RetroDECK data and starting fresh" + log w "Removing RetroDECK data and starting fresh" rm -rf /var rm -rf "$HOME/retrodeck" + rm -rf "$rdhome" source /app/libexec/global.sh finit fi @@ -137,7 +140,7 @@ if [ -f "$lockfile" ]; then fi fi else - echo "Performing normal upgrade process for version" $cooker_base_version + log i "Performing normal upgrade process for version $cooker_base_version" version=$cooker_base_version # Temporarily assign cooker base version to $version so update script can read it properly. post_update fi @@ -156,7 +159,7 @@ if [ -f "$lockfile" ]; then # Else, LOCKFILE IS NOT EXISTING (WAS REMOVED) # if the lock file doesn't exist at all means that it's a fresh install or a triggered reset else - echo "Lockfile not found" + log w "Lockfile not found" finit # Executing First/Force init fi @@ -165,23 +168,21 @@ if [[ $multi_user_mode == "true" ]]; then fi # Run optional startup checks - -desktop_mode_warning +if [[ $(check_is_steam_deck) == "true" ]]; then # Only warn about Desktop Mode on Steam Deck, ignore for other platforms + desktop_mode_warning +fi low_space_warning # Check if there is a new version of RetroDECK available, if update_check=true in retrodeck.cfg and there is network connectivity available. +log i "Check if there is a new version of RetroDECK available" if [[ $update_check == "true" ]]; then if [[ $(check_network_connectivity) == "true" ]]; then + log d "Running function check_for_version_update" check_for_version_update fi + log i "You're running the latest version" fi -# THIS IS A ONE-OFF FORCED REFRESH OF RETRODECK CONTROLLER PROFILES IN A 0.7.6b VERSION REFRESH - REMOVE BEFORE NEXT VERSION RELEASE -if [[ -f "$HOME/.steam/steam/controller_base/templates/RetroDECK_controller_config.vdf" ]]; then # If RetroDECK controller profile has been previously installed - install_retrodeck_controller_profile -fi -# REMOVE BEFORE NEXT VERSION RELEASE - # Normal Startup if [[ $steam_sync == "true" ]]; then diff --git a/tools/configurator.sh b/tools/configurator.sh index 88918020..5749dcf5 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -13,13 +13,14 @@ source /app/libexec/global.sh # - Global: Presets & Settings # - Widescreen: Enable/Disable # - Ask-To-Exit: Enable/Disable +# - Quick Resume: Enable/Disable # - RetroAchievements: Login # - RetroAchievements: Logout # - RetroAchievements: Hardcore Mode -# - Swap A/B and X/Y Buttons +# - Rewind: Enable/Disable +# - Swap A/B and X/Y Buttons: Enable/Disable # - RetroArch: Presets & Settings # - Borders: Enable/Disable -# - Rewind: Enable/Disable # - Wii & GameCube: Presets & Settings # - Dolphin Textures: Universal Dynamic Input # - Primehack Textures: Universal Dynamic Input @@ -58,15 +59,17 @@ source /app/libexec/global.sh # - Compress Multiple Games - RVZ # - Compress Multiple Games - All Formats # - Compress All Games -# - Install: RetroDECK SD Controller Profile +# - Install: RetroDECK Controller Layouts # - Install: PS3 firmware +# - Install: PS Vita firmware # - RetroDECK: Change Update Setting # - Troubleshooting # - Backup: RetroDECK Userdata # - Check & Verify: BIOS +# - Check & Verify: BIOS - Expert Mode # - Check & Verify: Multi-file structure # - RetroDECK: Reset -# - Reset Specific Emulator +# - Reset Emulator or Engine # - Reset RetroArch # - Reset Cemu # - Reset Citra @@ -104,13 +107,14 @@ source /app/libexec/global.sh # DIALOG TREE FUNCTIONS configurator_welcome_dialog() { + log i "Configurator: opening welcome dialog" if [[ $developer_options == "true" ]]; then - welcome_menu_options=("Presets & Settings" "Here you find various presets, tweaks and settings to customize your RetroDECK experience" \ - "Open Emulator" "Launch and configure each emulators settings (for advanced users)" \ + welcome_menu_options=("Presets & Settings" "Here you will find various presets, tweaks and settings to customize your RetroDECK experience" \ + "Open Emulator" "Launch and configure each emulator's settings (for advanced users)" \ "RetroDECK: Tools" "Compress games, move RetroDECK and install optional features" \ - "RetroDECK: Troubleshooting" "Backup data, perform BIOS / multi-disc file checks checks and emulator resets" \ + "RetroDECK: Troubleshooting" "Backup data, perform BIOS / multi-disc file checks and emulator resets" \ "RetroDECK: About" "Show additional information about RetroDECK" \ - "Sync with Steam" "Sync with Steam all the favorites games" \ + "Sync with Steam" "Sync all favorited games with Steam" \ "ROM Hack Downloader" "Install ROM Hacks which are compatible with your ROMs" \ "Developer Options" "Welcome to the DANGER ZONE") else @@ -118,8 +122,7 @@ configurator_welcome_dialog() { "Open Emulator" "Launch and configure each emulators settings (for advanced users)" \ "RetroDECK: Tools" "Compress games, move RetroDECK and install optional features" \ "RetroDECK: Troubleshooting" "Backup data, perform BIOS / multi-disc file checks checks and emulator resets" \ - "RetroDECK: About" "Show additional information about RetroDECK" \ - "Sync with Steam" "Sync with Steam all the favorites games") + "RetroDECK: About" "Show additional information about RetroDECK") fi choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ @@ -130,26 +133,32 @@ configurator_welcome_dialog() { case $choice in "Presets & Settings" ) + log i "Configurator: opening \"$choice\" menu" configurator_presets_and_settings_dialog ;; "Open Emulator" ) + log i "Configurator: opening \"$choice\" menu" configurator_power_user_warning_dialog ;; "RetroDECK: Tools" ) + log i "Configurator: opening \"$choice\" menu" configurator_retrodeck_tools_dialog ;; "RetroDECK: Troubleshooting" ) + log i "Configurator: opening \"$choice\" menu" configurator_retrodeck_troubleshooting_dialog ;; "RetroDECK: About" ) + log i "Configurator: opening \"$choice\" menu" configurator_about_retrodeck_dialog ;; "Sync with Steam" ) + log i "Configurator: opening \"$choice\" menu" configurator_add_steam ;; @@ -159,11 +168,13 @@ configurator_welcome_dialog() { ;; "Developer Options" ) + log i "Configurator: opening \"$choice\" menu" configurator_generic_dialog "RetroDECK Configurator - Developer Options" "The following features and options are potentially VERY DANGEROUS for your RetroDECK install!\n\nThey should be considered the bleeding-edge of upcoming RetroDECK features, and never used when you have important saves/states/roms that are not backed up!\n\nYOU HAVE BEEN WARNED!" configurator_developer_dialog ;; "" ) + log i "Configurator: closing" exit 1 ;; @@ -181,18 +192,22 @@ configurator_presets_and_settings_dialog() { case $choice in "Global: Presets & Settings" ) + log i "Configurator: opening \"$choice\" menu" configurator_global_presets_and_settings_dialog ;; "RetroArch: Presets & Settings" ) + log i "Configurator: opening \"$choice\" menu" configurator_retroarch_presets_and_settings_dialog ;; "Wii & GameCube: Presets & Settings" ) + log i "Configurator: opening \"$choice\" menu" configurator_wii_and_gamecube_presets_and_settings_dialog ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_welcome_dialog ;; @@ -204,24 +219,33 @@ configurator_global_presets_and_settings_dialog() { --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --column="Choice" --column="Action" \ "Widescreen: Enable/Disable" "Enable or disable widescreen in supported systems" \ - "Ask-to-Exit: Enable/Disable" "Enable or disable emulators confirming when quitting in supported systems" \ + "Ask-to-Exit: Enable/Disable" "Enable or disable emulators confirming attempts to quit in supported systems" \ + "Quick Resume: Enable/Disable" "Enable or disable save state auto-save/load in supported systems" \ "RetroAchievements: Login" "Log into the RetroAchievements service in supported systems" \ "RetroAchievements: Logout" "Disable RetroAchievements service in ALL supported systems" \ - "RetroAchievements: Hardcore Mode" "Enable RetroAchievements hardcore mode (no cheats, rewind, save states etc.) in supported emulators" \ - "Swap A/B and X/Y Buttons" "Enable or disable a swapped A/B and X/Y button layout in supported systems" ) + "RetroAchievements: Hardcore Mode" "Enable RetroAchievements hardcore mode (no cheats, rewind, save states etc.) in supported systems" \ + "Rewind: Enable/Disable" "Enable or disable the rewind function in supported systems" \ + "Swap A/B and X/Y Buttons: Enable/Disable" "Enable or disable a swapped A/B and X/Y button layout in supported systems" ) case $choice in "Widescreen: Enable/Disable" ) + log i "Configurator: opening \"$choice\" menu" change_preset_dialog "widescreen" configurator_global_presets_and_settings_dialog ;; "Ask-to-Exit: Enable/Disable" ) + log i "Configurator: opening \"$choice\" menu" change_preset_dialog "ask_to_exit" configurator_global_presets_and_settings_dialog ;; + "Quick Resume: Enable/Disable" ) + change_preset_dialog "quick_resume" + configurator_global_presets_and_settings_dialog + ;; + "RetroAchievements: Login" ) local cheevos_creds=$(get_cheevos_token_dialog) if [[ ! "$cheevos_creds" == "failed" ]]; then @@ -246,16 +270,27 @@ configurator_global_presets_and_settings_dialog() { ;; "RetroAchievements: Hardcore Mode" ) + log i "Configurator: opening \"$choice\" menu" change_preset_dialog "cheevos_hardcore" configurator_global_presets_and_settings_dialog ;; - "Swap A/B and X/Y Buttons" ) + "Rewind: Enable/Disable" ) + log i "Configurator: opening \"$choice\" menu" + + change_preset_dialog "rewind" + configurator_global_presets_and_settings_dialog + ;; + + "Swap A/B and X/Y Buttons: Enable/Disable" ) + log i "Configurator: opening \"$choice\" menu" + change_preset_dialog "abxy_button_swap" configurator_global_presets_and_settings_dialog ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_presets_and_settings_dialog ;; @@ -266,57 +301,24 @@ configurator_retroarch_presets_and_settings_dialog() { choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch: Presets & Settings" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --column="Choice" --column="Action" \ - "Borders: Enable/Disable" "Enable or disable borders in supported systems" \ - "Rewind: Enable/Disable" "Enable or disable the Rewind function in RetroArch." ) + "Borders: Enable/Disable" "Enable or disable borders in supported systems" ) case $choice in "Borders: Enable/Disable" ) + log i "Configurator: opening \"$choice\" menu" change_preset_dialog "borders" configurator_retroarch_presets_and_settings_dialog ;; - "Rewind: Enable/Disable" ) - configurator_retroarch_rewind_dialog - ;; - "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_presets_and_settings_dialog ;; esac } -configurator_retroarch_rewind_dialog() { - if [[ $(get_setting_value "$raconf" rewind_enable retroarch) == "true" ]]; then - zenity --question \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator - RetroArch Rewind" \ - --text="Rewind is currently enabled. Do you want to disable it?." - - if [ $? == 0 ] - then - set_setting_value "$raconf" "rewind_enable" "false" retroarch - configurator_process_complete_dialog "disabling Rewind" - else - configurator_retroarch_presets_and_settings_dialog - fi - else - zenity --question \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator - RetroArch Rewind" \ - --text="Rewind is currently disabled, do you want to enable it?\n\nNOTE:\nThis may impact performance on some more demanding systems." - - if [ $? == 0 ] - then - set_setting_value "$raconf" "rewind_enable" "true" retroarch - configurator_process_complete_dialog "enabling Rewind" - else - configurator_retroarch_presets_and_settings_dialog - fi - fi -} - configurator_wii_and_gamecube_presets_and_settings_dialog() { choice=$(zenity --list --title="RetroDECK Configurator Utility - Wii & GameCube: Presets & Settings" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ @@ -327,14 +329,17 @@ configurator_wii_and_gamecube_presets_and_settings_dialog() { case $choice in "Dolphin Textures: Universal Dynamic Input" ) + log i "Configurator: opening \"$choice\" menu" configurator_dolphin_input_textures_dialog ;; "Primehack Textures: Universal Dynamic Input" ) + log i "Configurator: opening \"$choice\" menu" configurator_primehack_input_textures_dialog ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_presets_and_settings_dialog ;; @@ -346,7 +351,7 @@ configurator_dolphin_input_textures_dialog() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Dolphin Textures: Universal Dynamic Input" \ - --text="Custom input textures are currently enabled. Do you want to disable them?." + --text="Custom input textures are currently enabled. Do you want to disable them?" if [ $? == 0 ] then @@ -360,7 +365,7 @@ configurator_dolphin_input_textures_dialog() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Dolphin Textures: Universal Dynamic Input" \ - --text="Custom input textures are currently disabled. Do you want to enable them?.\n\nThis process may take several minutes to complete." + --text="Custom input textures are currently disabled. Do you want to enable them?\n\nThis process may take several minutes to complete." if [ $? == 0 ] then @@ -384,7 +389,7 @@ configurator_primehack_input_textures_dialog() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Dolphin Custom Input Textures" \ - --text="Custom input textures are currently enabled. Do you want to disable them?." + --text="Custom input textures are currently enabled. Do you want to disable them?" if [ $? == 0 ] then @@ -398,7 +403,7 @@ configurator_primehack_input_textures_dialog() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Primehack Custom Input Textures" \ - --text="Custom input textures are currently disabled. Do you want to enable them?.\n\nThis process may take several minutes to complete." + --text="Custom input textures are currently disabled. Do you want to enable them?\n\nThis process may take several minutes to complete." if [ $? == 0 ] then @@ -422,7 +427,7 @@ configurator_power_user_warning_dialog() { choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Yes" --extra-button="No" --extra-button="Never show this again" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Power User Warning" \ - --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates or when using presets.\n\nSome standalone emulator functions may not work properly outside of Desktop mode.\n\nPlease continue only if you know what you're doing.\n\nDo you want to continue?") + --text="Making manual changes to an emulator's configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates or when using presets.\n\nSome standalone emulator functions may not work properly outside of Desktop mode.\n\nPlease continue only if you know what you're doing.\n\nDo you want to continue?") fi rc=$? # Capture return code, as "Yes" button has no text value if [[ $rc == "0" ]]; then # If user clicked "Yes" @@ -438,91 +443,118 @@ configurator_power_user_warning_dialog() { } configurator_open_emulator_dialog() { + + local emulator_list=( + "RetroArch" "Open the multi-emulator frontend RetroArch" + "Cemu" "Open the Wii U emulator CEMU" + "Dolphin" "Open the Wii & GC emulator Dolphin" + "Duckstation" "Open the PSX emulator Duckstation" + "MAME" "Open the Multiple Arcade Machine Emulator emulator MAME" + "MelonDS" "Open the NDS emulator MelonDS" + "PCSX2" "Open the PS2 emulator PSXC2" + "PPSSPP" "Open the PSP emulator PPSSPP" + "Primehack" "Open the Metroid Prime emulator Primehack" + "RPCS3" "Open the PS3 emulator RPCS3" + "Ryujinx" "Open the Switch emulator Ryujinx" + "Vita3K" "Open the PSVita emulator Vita3K" + "XEMU" "Open the Xbox emulator XEMU" + ) + + # Check if any ponzu is true before adding Yuzu or Citra to the list + if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then + emulator_list+=("Yuzu" "Open the Switch emulator Yuzu") + fi + if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then + emulator_list+=("Citra" "Open the 3DS emulator Citra") + fi + emulator=$(zenity --list \ --title "RetroDECK Configurator Utility - Open Emulator" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --text="Which emulator do you want to launch?" \ --hide-header \ --column="Emulator" --column="Action" \ - "RetroArch" "Open the multi-emulator frontend RetroArch" \ - "Cemu" "Open the Wii U emulator CEMU" \ - "Citra" "Open the N3DS emulator Citra" \ - "Dolphin" "Open the Wii & GC emulator Dolphin" \ - "Duckstation" "Open the PSX emulator Duckstation" \ - "MAME" "Open the Multiple Arcade Machine Emulator emulator MAME" \ - "MelonDS" "Open the NDS emulator MelonDS" \ - "PCSX2" "Open the PS2 emulator PSXC2" \ - "PPSSPP" "Open the PSP emulator PPSSPP" \ - "Primehack" "Open the Metroid Prime emulator Primehack" \ - "RPCS3" "Open the PS3 emulator RPCS3" \ - "Ryujinx" "Open the Switch emulator Ryujinx" \ - "Vita3K" "Open the PSVita emulator Vita3K" \ - "XEMU" "Open the Xbox emulator XEMU" \ - "Yuzu" "Open the Switch emulator Yuzu") + "${emulator_list[@]}") case $emulator in "RetroArch" ) + log i "Configurator: \"$emulator\"" retroarch ;; "Cemu" ) + log i "Configurator: \"$emulator\"" Cemu-wrapper ;; "Citra" ) - citra-qt + log i "Configurator: \"$emulator\"" + /var/data/ponzu/Citra/bin/citra-qt ;; "Dolphin" ) + log i "Configurator: \"$emulator\"" dolphin-emu ;; "Duckstation" ) + log i "Configurator: \"$emulator\"" duckstation-qt ;; "MAME" ) - mame + log i "Configurator: \"$emulator\"" + mame -inipath /var/config/mame/ini ;; "MelonDS" ) + log i "Configurator: \"$emulator\"" melonDS ;; "PCSX2" ) + log i "Configurator: \"$emulator\"" pcsx2-qt ;; "PPSSPP" ) + log i "Configurator: \"$emulator\"" PPSSPPSDL ;; "Primehack" ) + log i "Configurator: \"$emulator\"" primehack-wrapper ;; "RPCS3" ) + log i "Configurator: \"$emulator\"" rpcs3 ;; "Ryujinx" ) - ryujinx-wrapper + log i "Configurator: \"$emulator\"" + Ryujinx.sh ;; "Vita3K" ) + log i "Configurator: \"$emulator\"" Vita3K ;; "XEMU" ) + log i "Configurator: \"$emulator\"" xemu ;; "Yuzu" ) - yuzu + log i "Configurator: \"$emulator\"" + /var/data/ponzu/Yuzu/bin/yuzu ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_welcome_dialog ;; @@ -532,27 +564,43 @@ configurator_open_emulator_dialog() { } configurator_retrodeck_tools_dialog() { + + local choices=( + "Tool: Move Folders" "Move RetroDECK folders between internal/SD card or to a custom location" + "Tool: Compress Games" "Compress games for systems that support it" + "Install: RetroDECK Controller Layouts" "Install the custom RetroDECK controller layouts on Steam" + "Install: PS3 Firmware" "Download and install PS3 firmware for use with the RPCS3 emulator" + "Install: PS Vita Firmware" "Download and install PS Vita firmware for use with the Vita3K emulator" + "RetroDECK: Change Update Setting" "Enable or disable online checks for new versions of RetroDECK" + ) + + if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then + choices+=("Ponzu - Remove Yuzu" "Run Ponzu to remove Yuzu from RetroDECK. Configurations and saves will be mantained.") + fi + if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then + choices+=("Ponzu - Remove Citra" "Run Ponzu to remove Citra from RetroDECK. Configurations and saves will be mantained.") + fi + choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroDECK: Tools" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --column="Choice" --column="Action" \ - "Tool: Move Folders" "Move RetroDECK folders between internal/SD card or to a custom location" \ - "Tool: Compress Games" "Compress games for systems that support it" \ - "Install: RetroDECK SD Controller Profile" "Install the custom RetroDECK controller layout for the Steam Deck" \ - "Install: PS3 Firmware" "Download and install PS3 firmware for use with the RPCS3 emulator" \ - "RetroDECK: Change Update Setting" "Enable or disable online checks for new versions of RetroDECK" ) + "${choices[@]}") case $choice in "Tool: Move Folders" ) + log i "Configurator: opening \"$choice\" menu" configurator_retrodeck_move_tool_dialog ;; "Tool: Compress Games" ) + log i "Configurator: opening \"$choice\" menu" configurator_generic_dialog "RetroDECK Configurator - Compression Tool" "Depending on your library and compression choices, the process can sometimes take a long time.\nPlease be patient once it is started!" configurator_compression_tool_dialog ;; - "Install: RetroDECK SD Controller Profile" ) + "Install: RetroDECK Controller Layouts" ) + log i "Configurator: opening \"$choice\" menu" configurator_generic_dialog "RetroDECK Configurator - Install: RetroDECK Controller Profile" "We are now offering a new official RetroDECK controller profile!\nIt is an optional component that helps you get the most out of RetroDECK with a new in-game radial menu for unified hotkeys across emulators.\n\nThe files need to be installed outside of the normal ~/retrodeck folder, so we wanted your permission before proceeding.\n\nThe files will be installed at the following shared Steam locations:\n\n$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/\n$HOME/.steam/steam/controller_base/templates" if [[ $(configurator_generic_question_dialog "Install: RetroDECK Controller Profile" "Would you like to install the official RetroDECK controller profile?") == "true" ]]; then install_retrodeck_controller_profile @@ -562,28 +610,58 @@ configurator_retrodeck_tools_dialog() { ;; "Install: PS3 Firmware" ) + log i "Configurator: opening \"$choice\" menu" if [[ $(check_network_connectivity) == "true" ]]; then configurator_generic_dialog "RetroDECK Configurator - Install: PS3 firmware" "This tool will download firmware required by RPCS3 to emulate PS3 games.\n\nThe process will take several minutes, and the emulator will launch to finish the installation.\nPlease close RPCS3 manually once the installation is complete." ( update_rpcs3_firmware ) | - zenity --progress --pulsate \ + zenity --progress --no-cancel --pulsate --auto-close \ --icon-name=net.retrodeck.retrodeck \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title="Downloading PS3 Firmware" \ - --no-cancel \ - --auto-close + --width=400 --height=200 \ + --text="Dowloading and installing PS3 Firmware, please be patient.\n\nNOTICE - If the process is taking too long:\n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n" + else configurator_generic_dialog "RetroDECK Configurator - Install: PS3 Firmware" "You do not appear to currently have Internet access, which is required by this tool. Please try again when network access has been restored." configurator_retrodeck_tools_dialog fi ;; + "Install: PS Vita Firmware" ) + if [[ $(check_network_connectivity) == "true" ]]; then + configurator_generic_dialog "RetroDECK Configurator - Install: PS Vita firmware" "This tool will download firmware required by Vita3K to emulate PS Vita games.\n\nThe process will take several minutes, and the emulator will launch to finish the installation.\nPlease close Vita3K manually once the installation is complete." + ( + update_vita3k_firmware + ) | + zenity --progress --pulsate \ + --icon-name=net.retrodeck.retrodeck \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title="Downloading PS Vita Firmware" \ + --no-cancel \ + --auto-close + else + configurator_generic_dialog "RetroDECK Configurator - Install: PS Vita Firmware" "You do not appear to currently have Internet access, which is required by this tool. Please try again when network access has been restored." + configurator_retrodeck_tools_dialog + fi + ;; + "RetroDECK: Change Update Setting" ) + log i "Configurator: opening \"$choice\" menu" configurator_online_update_setting_dialog ;; +"Ponzu - Remove Yuzu" ) + ponzu_remove "yuzu" +;; + +"Ponzu - Remove Citra" ) + ponzu_remove "citra" +;; + "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_welcome_dialog ;; @@ -608,42 +686,52 @@ configurator_retrodeck_move_tool_dialog() { case $choice in "Move all of RetroDECK" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "rdhome" ;; "Move ROMs folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "roms_folder" ;; "Move BIOS folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "bios_folder" ;; "Move Downloaded Media folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "media_folder" ;; "Move Saves folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "saves_folder" ;; "Move States folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "states_folder" ;; "Move Themes folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "themes_folder" ;; "Move Screenshots folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "screenshots_folder" ;; "Move Mods folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "mods_folder" ;; "Move Texture Packs folder" ) + log i "Configurator: opening \"$choice\" menu" configurator_move_folder_dialog "texture_packs_folder" ;; @@ -666,30 +754,37 @@ configurator_compression_tool_dialog() { case $choice in "Compress Single Game" ) + log i "Configurator: opening \"$choice\" menu" configurator_compress_single_game_dialog ;; "Compress Multiple Games - CHD" ) + log i "Configurator: opening \"$choice\" menu" configurator_compress_multiple_games_dialog "chd" ;; "Compress Multiple Games - ZIP" ) + log i "Configurator: opening \"$choice\" menu" configurator_compress_multiple_games_dialog "zip" ;; "Compress Multiple Games - RVZ" ) + log i "Configurator: opening \"$choice\" menu" configurator_compress_multiple_games_dialog "rvz" ;; "Compress Multiple Games - All Formats" ) + log i "Configurator: opening \"$choice\" menu" configurator_compress_multiple_games_dialog "all" ;; "Compress All Games" ) + log i "Configurator: opening \"$choice\" menu" configurator_compress_multiple_games_dialog "everything" ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_retrodeck_tools_dialog ;; @@ -699,44 +794,45 @@ configurator_compression_tool_dialog() { configurator_compress_single_game_dialog() { local file=$(file_browse "Game to compress") if [[ ! -z "$file" ]]; then + local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") local compatible_compression_format=$(find_compatible_compression_format "$file") if [[ ! $compatible_compression_format == "none" ]]; then local post_compression_cleanup=$(configurator_compression_cleanup_dialog) ( - if [[ $compatible_compression_format == "chd" ]]; then - if [[ $(validate_for_chd "$file") == "true" ]]; then - echo "# Compressing $(basename "$file") to $compatible_compression_format format" - compress_game "chd" "$file" - if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested - if [[ "$file" == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") - rm -f "$file" - else - rm -f "$file" - fi + echo "# Compressing $(basename "$file") to $compatible_compression_format format" # This updates the Zenity dialog + log i "Compressing $(basename "$file") to $compatible_compression_format format" + compress_game "$compatible_compression_format" "$file" "$system" + if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + log i "Performing post-compression file cleanup" + if [[ "$file" == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do + log i "Removing file $file_path/$line" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") + log i "Removing file $(realpath $file)" + rm -f $(realpath "$file") + else + log i "Removing file $(realpath $file)" + rm -f "$(realpath "$file")" fi - fi - else - echo "# Compressing $(basename "$file") to $compatible_compression_format format" - compress_game "$compatible_compression_format" "$file" - if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested - rm -f "$file" + else + log i "Compressed file ${file%.*}.$compatible_compression_format not found, skipping original file deletion" + configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "A compressed version of the file was not found, skipping deletion." fi fi ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Compression in Progress" - configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The compression process is complete!" + configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The compression process is complete." configurator_compression_tool_dialog else - configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The selected file does not have any compatible compressed format." + configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The selected file does not have any compatible compression formats." configurator_compression_tool_dialog fi else @@ -825,23 +921,34 @@ configurator_compress_multiple_games_dialog() { local post_compression_cleanup=$(configurator_compression_cleanup_dialog) ( for file in "${games_to_compress[@]}"; do + local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") local compression_format=$(find_compatible_compression_format "$file") echo "# Compressing $(basename "$file") into $compression_format format" # Update Zenity dialog text + log i "Compressing $(basename "$file") into $compression_format format" progress=$(( 100 - (( 100 / "$total_games_to_compress" ) * "$games_left_to_compress" ))) echo $progress games_left_to_compress=$((games_left_to_compress-1)) - compress_game "$compression_format" "$file" + log i "Games left to compress: $games_left_to_compress" + compress_game "$compression_format" "$file" "$system" if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested - if [[ "$file" == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") - rm -f $(realpath "$file") + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + if [[ "$file" == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do + log i "Removing file $file_path/$line" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") + log i "Removing file $(realpath $file)" + rm -f $(realpath "$file") + else + log i "Removing file $(realpath $file)" + rm -f "$(realpath "$file")" + fi else - rm -f "$(realpath "$file")" + log i "Compressed file ${file%.*}.$compatible_compression_format not found, skipping original file deletion" + configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "Compression of $(basename $file) failed, skipping deletion." fi fi done @@ -860,7 +967,7 @@ configurator_compression_cleanup_dialog() { zenity --icon-name=net.retrodeck.retrodeck --question --no-wrap --cancel-label="No" --ok-label="Yes" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - RetroDECK: Compression Tool" \ - --text="Do you want to remove old files after they are compressed?\n\nClicking \"No\" will leave all files behind which will need to be cleaned up manually and may result in game duplicates showing in the RetroDECK library." + --text="Do you want to remove old files after they are compressed?\n\nClicking \"No\" will leave all files behind which will need to be cleaned up manually and may result in game duplicates showing in the RetroDECK library.\n\nPlease make sure you have a backup of your ROMs before using automatic cleanup!" local rc=$? # Capture return code, as "Yes" button has no text value if [[ $rc == "0" ]]; then # If user clicked "Yes" echo "true" @@ -903,12 +1010,14 @@ configurator_retrodeck_troubleshooting_dialog() { --column="Choice" --column="Action" \ "Backup: RetroDECK Userdata" "Compress and backup important RetroDECK user data folders" \ "Check & Verify: BIOS Files" "Show information about common BIOS files" \ + "Check & Verify: BIOS Files - Expert Mode" "Show information about common BIOS files, with additional information useful for troubleshooting" \ "Check & Verify: Multi-file structure" "Verify the proper structure of multi-file or multi-disc games" \ "RetroDECK: Reset" "Reset specific parts or all of RetroDECK" ) case $choice in "Backup: RetroDECK Userdata" ) + log i "Configurator: opening \"$choice\" menu" configurator_generic_dialog "RetroDECK Configurator - Backup: RetroDECK Userdata" "This tool will compress important RetroDECK userdata (basically everything except the ROMs folder) into a zip file.\n\nThis process can take several minutes, and the resulting zip file can be found in the ~/retrodeck/backups folder." ( backup_retrodeck_userdata @@ -926,18 +1035,26 @@ configurator_retrodeck_troubleshooting_dialog() { ;; "Check & Verify: BIOS Files" ) + log i "Configurator: opening \"$choice\" menu" configurator_check_bios_files ;; + "Check & Verify: BIOS Files - Expert Mode" ) + configurator_check_bios_files_expert_mode + ;; + "Check & Verify: Multi-file structure" ) + log i "Configurator: opening \"$choice\" menu" configurator_check_multifile_game_structure ;; "RetroDECK: Reset" ) + log i "Configurator: opening \"$choice\" menu" configurator_reset_dialog ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_welcome_dialog ;; @@ -945,10 +1062,10 @@ configurator_retrodeck_troubleshooting_dialog() { } configurator_check_bios_files() { - configurator_generic_dialog "RetroDECK Configurator - Check & Verify: BIOS Files" "This check will look for BIOS files that RetroDECK has identified as working.\n\nNot all BIOS files are required for games to work, please check the BIOS description for more information on its purpose.\n\nThere may be additional BIOS files that will function with the emulators that are not checked.\n\nSome more advanced emulators such as Yuzu will have additional methods for verifiying the BIOS files are in working order." + configurator_generic_dialog "RetroDECK Configurator - Check & Verify: BIOS Files" "This check will look for BIOS files that RetroDECK has identified as working.\n\nNot all BIOS files are required for games to work, please check the BIOS description for more information on its purpose.\n\nBIOS files not known to this tool could still function.\n\nSome more advanced emulators such as Ryujinx will have additional methods to verify that the BIOS files are in working order." bios_checked_list=() - check_bios_files + check_bios_files "basic" zenity --list --title="RetroDECK Configurator Utility - Check & Verify: BIOS Files" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ @@ -962,6 +1079,26 @@ configurator_check_bios_files() { configurator_retrodeck_troubleshooting_dialog } +configurator_check_bios_files_expert_mode() { + configurator_generic_dialog "RetroDECK Configurator - Check & Verify: BIOS Files - Expert Mode" "This check will look for BIOS files that RetroDECK has identified as working.\n\nNot all BIOS files are required for games to work, please check the BIOS description for more information on its purpose.\n\nBIOS files not known to this tool could still function.\n\nSome more advanced emulators such as Ryujinx will have additional methods to verify that the BIOS files are in working order." + bios_checked_list=() + + check_bios_files "expert" + + zenity --list --title="RetroDECK Configurator Utility - Check & Verify: BIOS Files" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ + --column "BIOS File Name" \ + --column "System" \ + --column "BIOS File Found" \ + --column "BIOS Hash Match" \ + --column "BIOS File Description" \ + --column "BIOS File Subdirectory" \ + --column "BIOS File Hash" \ + "${bios_checked_list[@]}" + + configurator_retrodeck_troubleshooting_dialog +} + configurator_check_multifile_game_structure() { local folder_games=($(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")) if [[ ${#folder_games[@]} -gt 1 ]]; then @@ -977,39 +1114,54 @@ configurator_check_multifile_game_structure() { } configurator_reset_dialog() { + + local choices=( + "Reset Emulator or Engine" "Reset only one specific emulator or engine to default settings" + "Reset RetroDECK Component" "Reset a single component, components are parts of RetroDECK that are not emulators" + "Reset All Emulators and Components" "Reset all emulators and components to default settings" + "Reset RetroDECK" "Reset RetroDECK to default settings" + ) + choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroDECK: Reset" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --column="Choice" --column="Action" \ - "Reset Specific Emulator" "Reset only one specific emulator or engine to default settings" \ - "Reset RetroDECK Component" "Reset a single component, components are parts of RetroDECK that are not emulators" \ - "Reset All Emulators and Components" "Reset all emulators and components to default settings" \ - "Reset RetroDECK" "Reset RetroDECK to default settings" ) + "${choices[@]}") + + local emulator_list=( + "RetroArch" "Reset the multi-emulator frontend RetroArch to default settings" + "Cemu" "Reset the Wii U emulator Cemu to default settings" + "Dolphin" "Reset the Wii/GameCube emulator Dolphin to default settings" + "Duckstation" "Reset the PSX emulator Duckstation to default settings" + "GZDoom" "Reset the GZDoom Doom engine to default settings" + "MAME" "Reset the Multiple Arcade Machine Emulator (MAME) to default settings" + "MelonDS" "Reset the NDS emulator MelonDS to default settings" + "PCSX2" "Reset the PS2 emulator PCSX2 to default settings" + "PPSSPP" "Reset the PSP emulator PPSSPP to default settings" + "Primehack" "Reset the Metroid Prime emulator Primehack to default settings" + "RPCS3" "Reset the PS3 emulator RPCS3 to default settings" + "Ryujinx" "Reset the Switch emulator Ryujinx to default settings" + "Vita3k" "Reset the PS Vita emulator Vita3k to default settings" + "XEMU" "Reset the XBOX emulator XEMU to default settings" + ) + + # Check if any ponzu is true before adding Yuzu or Citra to the list + if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then + emulator_list+=("Yuzu" "Reset the Switch emulator Yuzu") + fi + if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then + emulator_list+=("Citra" "Reset the 3DS emulator Citra") + fi case $choice in - "Reset Specific Emulator" ) + "Reset Emulator or Engine" ) + log i "Configurator: opening \"$choice\" menu" component_to_reset=$(zenity --list \ --title "RetroDECK Configurator Utility - Reset Specific Standalone Emulator" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --text="Which emulator or engine do you want to reset to default?" \ --column="Emulator" --column="Action" \ - "RetroArch" "Reset the multi-emulator frontend RetroArch to default settings" \ - "Cemu" "Reset the Wii U emulator Cemu to default settings" \ - "Citra" "Reset the N3DS emulator Citra to default settings" \ - "Dolphin" "Reset the Wii/GameCube emulator Dolphin to default settings" \ - "Duckstation" "Reset the PSX emulator Duckstation to default settings" \ - "GZDoom" "Reset the GZDoom Doom engine to default settings" \ - "MAME" "Reset the Multiple Arcade Machine Emulator (MAME) to default settings" \ - "MelonDS" "Reset the NDS emulator MelonDS to default settings" \ - "PCSX2" "Reset the PS2 emulator PCSX2 to default settings" \ - "PPSSPP" "Reset the PSP emulator PPSSPP to default settings" \ - "Primehack" "Reset the Metroid Prime emulator Primehack to default settings" \ - "RPCS3" "Reset the PS3 emulator RPCS3 to default settings" \ - "Vita3k" "Reset the PS Vita emulator Vita3k to default settings" \ - "XEMU" "Reset the XBOX emulator XEMU to default settings" \ - "Yuzu" "Reset the Switch emulator Yuzu to default settings" ) - - # "Ryujinx" "Reset the Switch emulator Ryujinx to default settings" \ + "${emulator_list[@]}") case $component_to_reset in @@ -1028,7 +1180,7 @@ configurator_reset_dialog() { fi ;; - "Cemu" | "Citra" | "Dolphin" | "Duckstation" | "MelonDS" | "MAME" | "PCSX2" | "PPSSPP" | "Primehack" | "RPCS3" | "Ryujinx" | "Yuzu" ) + "Cemu" | "Citra" | "Dolphin" | "Duckstation" | "GZDoom" | "Yuzu" | "MelonDS" | "MAME" | "PCSX2" | "PPSSPP" | "Primehack" | "RPCS3" | "Ryujinx" ) if [[ $(configurator_reset_confirmation_dialog "$component_to_reset" "Are you sure you want to reset the $component_to_reset emulator to default settings?\n\nThis process cannot be undone.") == "true" ]]; then prepare_component "reset" "$component_to_reset" "configurator" configurator_process_complete_dialog "resetting $component_to_reset" @@ -1049,9 +1201,9 @@ configurator_reset_dialog() { component_to_reset=$(zenity --list \ --title "RetroDECK Configurator Utility - Reset Specific RetroDECK Component" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ - --text="Which component do you want to reset to default?" \ + --text="Which component do you want to reset to default settings?" \ --column="Component" --column="Action" \ - "BoilR" "Reset BoilR that manages the sync and scraping toward Steam library" \ + "BoilR" "Reset BoilR that manages the sync and scraping toward Steam library" \ "ES-DE" "Reset the ES-DE frontend" \ ) # TODO: "GyroDSU" "Reset the gyroscope manager GyroDSU" @@ -1074,7 +1226,8 @@ configurator_reset_dialog() { esac ;; -"Reset All Emulators" ) +"Reset All Emulators and Components" ) + log i "Configurator: opening \"$choice\" menu" if [[ $(check_network_connectivity) == "true" ]]; then if [[ $(configurator_reset_confirmation_dialog "all emulators" "Are you sure you want to reset all emulators to default settings?\n\nThis process cannot be undone.") == "true" ]]; then ( @@ -1096,6 +1249,7 @@ configurator_reset_dialog() { ;; "Reset RetroDECK" ) + log i "Configurator: opening \"$choice\" menu" if [[ $(configurator_reset_confirmation_dialog "RetroDECK" "Are you sure you want to reset RetroDECK entirely?\n\nThis process cannot be undone.") == "true" ]]; then zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -1127,10 +1281,12 @@ configurator_about_retrodeck_dialog() { case $choice in "Version History" ) + log i "Configurator: opening \"$choice\" menu" configurator_version_history_dialog ;; "Credits" ) + log i "Configurator: opening \"$choice\" menu" zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Credits" \ @@ -1139,6 +1295,7 @@ configurator_about_retrodeck_dialog() { ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_welcome_dialog ;; @@ -1150,7 +1307,7 @@ configurator_add_steam() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - RetroDECK Steam Syncronization" \ - --text="Steam syncronization is current enabled. Do you want to disable it?\n\nThe already added shortcut will not be removed.\n" + --text="Steam syncronization is currently enabled. Do you want to disable it?\n\nThe already added shortcut will not be removed.\n" if [ $? == 0 ] # User clicked "Yes" then @@ -1162,7 +1319,7 @@ configurator_add_steam() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - RetroDECK Steam Syncronization" \ - --text="Steam syncronization is current disabled. Do you want to enable it?\n\nAll the games marked as favorites will be syncronized with Steam thanks to BoilR.\nRemember to restart Steam each time to see the changes.\n" + --text="Steam syncronization is currently disabled. Do you want to enable it?\n\nAll the games marked as favorites will be syncronized with Steam thanks to BoilR.\nRemember to restart Steam each time to see the changes.\n" if [ $? == 0 ] then @@ -1205,10 +1362,12 @@ configurator_version_history_dialog() { case $choice in "Full RetroDECK Changelog" ) + log i "Configurator: opening \"$choice\" menu" changelog_dialog "all" ;; "RetroDECK"*"Changelog" ) + log i "Configurator: opening \"$choice\" menu" local version=$(echo "$choice" | sed 's/^RetroDECK \(.*\) Changelog$/\1/') changelog_dialog "$version" ;; @@ -1232,23 +1391,28 @@ configurator_developer_dialog() { case $choice in "Change Multi-user mode" ) + log i "Configurator: opening \"$choice\" menu" configurator_retrodeck_multiuser_dialog ;; "Change Update Channel" ) + log i "Configurator: opening \"$choice\" menu" configurator_online_update_channel_dialog ;; "Browse the Wiki" ) + log i "Configurator: opening \"$choice\" menu" xdg-open "https://github.com/XargonWan/RetroDECK/wiki" configurator_developer_dialog ;; "USB Import" ) + log i "Configurator: opening \"$choice\" menu" configurator_usb_import_dialog ;; "Install RetroDECK Starter Pack" ) + log i "Configurator: opening \"$choice\" menu" if [[ $(configurator_generic_question_dialog "Install: RetroDECK Starter Pack" "The RetroDECK creators have put together a collection of classic retro games you might enjoy!\n\nWould you like to have them automatically added to your library?") == "true" ]]; then install_retrodeck_starterpack fi @@ -1260,6 +1424,7 @@ configurator_developer_dialog() { ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_welcome_dialog ;; esac @@ -1270,7 +1435,7 @@ configurator_retrodeck_multiuser_dialog() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - RetroDECK Multi-user Support" \ - --text="Multi-user support is current enabled. Do you want to disable it?\n\nIf there are more than one user configured,\nyou will be given a choice of which to use as the single RetroDECK user.\n\nThis users files will be moved to the default locations.\n\nOther users files will remain in the mutli-user-data folder.\n" + --text="Multi-user support is currently enabled. Do you want to disable it?\n\nIf there is more than one user configured,\nyou will be given a choice of which to use as the single RetroDECK user.\n\nThis user's files will be moved to the default locations.\n\nOther users' files will remain in the mutli-user-data folder.\n" if [ $? == 0 ] # User clicked "Yes" then @@ -1282,7 +1447,7 @@ configurator_retrodeck_multiuser_dialog() { zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - RetroDECK Multi-user support" \ - --text="Multi-user support is current disabled. Do you want to enable it?\n\nThe current users saves and states will be backed up and then moved to the \"retrodeck/multi-user-data\" folder.\nAdditional users will automatically be stored in their own folder here as they are added." + --text="Multi-user support is currently disabled. Do you want to enable it?\n\nThe current user's saves and states will be backed up and then moved to the \"retrodeck/multi-user-data\" folder.\nAdditional users will automatically be stored in their own folder here as they are added." if [ $? == 0 ] then @@ -1331,6 +1496,7 @@ configurator_usb_import_dialog() { case $choice in "Prepare USB device" ) + log i "Configurator: opening \"$choice\" menu" external_devices=() while read -r size device_path; do @@ -1348,7 +1514,7 @@ configurator_usb_import_dialog() { "${external_devices[@]}") if [[ ! -z "$choice" ]]; then - emulationstation --home "$choice" --create-system-dirs + es-de --home "$choice" --create-system-dirs rm -rf "$choice/ES-DE" # Cleanup unnecessary folder fi else @@ -1358,6 +1524,7 @@ configurator_usb_import_dialog() { ;; "Import from USB" ) + log i "Configurator: opening \"$choice\" menu" external_devices=() while read -r size device_path; do @@ -1404,6 +1571,7 @@ configurator_usb_import_dialog() { ;; "" ) # No selection made or Back button clicked + log i "Configurator: going back" configurator_developer_dialog ;; esac diff --git a/tools/retrodeck_function_wrapper.sh b/tools/retrodeck_function_wrapper.sh index 98148ab8..03659d84 100644 --- a/tools/retrodeck_function_wrapper.sh +++ b/tools/retrodeck_function_wrapper.sh @@ -7,7 +7,7 @@ source /app/libexec/global.sh # Check if a function was specified if [[ $# -lt 1 ]]; then - echo "Usage: $0 function_name [args...]" + log e "Usage: $0 function_name [args...]" exit 1 fi @@ -17,7 +17,7 @@ shift # Check if the function exists if ! declare -f "$function_name" >/dev/null 2>&1; then - echo "Function '$function_name' not found" + log e "Function \'$function_name\' not found" exit 1 fi