From 377da5f30f37b0be28918d13da78d15ba359797c Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 4 Oct 2022 12:21:46 -0400 Subject: [PATCH 01/46] Create configurator.sh Start configurator skeleton --- tools/configurator.sh | 47 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 tools/configurator.sh diff --git a/tools/configurator.sh b/tools/configurator.sh new file mode 100644 index 00000000..b8f92caf --- /dev/null +++ b/tools/configurator.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +source /app/bin/global.sh # Store actual work code in globals (for use elsewhere if needed) and keep Configurator strictly dialogs + +# Configurator Option Tree + +# Welcome +# - Move Directories +# - Migrate ROM directory +# - Migrate downloaded_media +# - Migrate BIOS directory +# - Change Options +# - Change Rewind Setting +# - Upgrade Files +# - Grab all missing cores +# - Update all cores to nightly +# - RetroAchivement login +# - Login prompt +# - Reset RetroDECK +# - Reset RetroArch +# - Reset Standalone Emulators +# - Reset Tools +# - Reset All + +configurator_welcome_dialog() { + +} + +configurator_migration_dialog() { + +} + +configurator_options_dialog() { + +} + +configurator_update_dialog() { + +} + +configurator_retroachivement_dialog() { + +} + +configurator_reset_dialog() { + +} \ No newline at end of file From cdea3287a021a900b37e220ae14f3c2ac9193c80 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 7 Oct 2022 13:46:48 -0400 Subject: [PATCH 02/46] Expanding Configurator framework --- functions.sh | 607 ++++++++++++++++++ global.sh | 9 +- net.retrodeck.retrodeck.yml | 5 +- retrodeck.sh | 2 +- tools/configurator.sh | 396 +++++++++++- ...ors.sh => configure-emulators.sh.disabled} | 0 6 files changed, 996 insertions(+), 23 deletions(-) create mode 100644 functions.sh rename tools/{configure-emulators.sh => configure-emulators.sh.disabled} (100%) mode change 100755 => 100644 diff --git a/functions.sh b/functions.sh new file mode 100644 index 00000000..f724f80b --- /dev/null +++ b/functions.sh @@ -0,0 +1,607 @@ +#!/bin/bash + +# THIS IS A CENTRALIZED LOCATION FOR FUNCTIONS, WHICH CAN BE SOURCED WITHOUT RUNNING EXTRA CODE. EXISTING USE OF THESE FUNCTIONS CAN BE REFACTORED TO HERE. + +dir_prep() { + # This script is creating a symlink preserving old folder contents and moving them in the new one + + # Call me with: + # dir prep "real dir" "symlink location" + real="$1" + symlink="$2" + + echo -e "\n[DIR PREP]\nMoving $symlink in $real" #DEBUG + + # if the dest dir exists we want to backup it + if [ -d "$symlink" ]; + then + echo "$symlink found" #DEBUG + mv -fv "$symlink" "$symlink.old" + 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" + fi + + # creating the symlink + echo "linking $real in $symlink" #DEBUG + mkdir -pv "$(dirname "$symlink")" # creating the full path except the last folder + ln -sv "$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 + mv -fv "$symlink".old/* $real + echo "Removing $symlink.old" #DEBUG + rm -rf "$symlink.old" + fi + + echo -e "$symlink is now $real\n" +} + +tools_init() { + rm -rfv /var/config/retrodeck/tools/ + mkdir -pv /var/config/retrodeck/tools/ + cp -rfv /app/retrodeck/tools/* /var/config/retrodeck/tools/ + mkdir -pv /var/config/emulationstation/.emulationstation/custom_systems/tools/ + rm -rfv /var/config/retrodeck/tools/gamelist.xml + cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml +} + +standalones_init() { + # This script is configuring the standalone emulators with the default files present in emuconfigs folder + + echo "----------------------" + echo "Initializing standalone emulators" + echo "----------------------" + + # Yuzu + echo "----------------------" + echo "Initializing YUZU" + echo "----------------------" + # removing dead symlinks as they were present in a past version + if [ -d $rdhome/bios/switch ]; then + find $rdhome/bios/switch -xtype l -exec rm {} \; + fi + # initializing the keys folder + dir_prep "$rdhome/bios/switch/keys" "/var/data/yuzu/keys" + # initializing the firmware folder + dir_prep "$rdhome/bios/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" + # configuring Yuzu + dir_prep "$rdhome/.logs/yuzu" "/var/data/yuzu/log" + mkdir -pv /var/config/yuzu/ + cp -fvr $emuconfigs/yuzu/* /var/config/yuzu/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/yuzu/qt-config.ini + dir_prep "$rdhome/screenshots" "/var/data/yuzu/screenshots" + + # Dolphin + echo "----------------------" + echo "Initializing DOLPHIN" + echo "----------------------" + mkdir -pv /var/config/dolphin-emu/ + cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/dolphin-emu/Dolphin.ini + dir_prep "$rdhome/saves/gc/dolphin/EUR" "/var/data/dolphin-emu/GC/EUR" + dir_prep "$rdhome/saves/gc/dolphin/USA" "/var/data/dolphin-emu/GC/USA" + dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" + dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" + dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" + dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" + + # pcsx2 + echo "----------------------" + echo "Initializing PCSX2" + echo "----------------------" + mkdir -pv /var/config/PCSX2/inis/ + mkdir -pv "$rdhome/saves/ps2/pcsx2/memcards" + cp -fvr $emuconfigs/PCSX2/* /var/config/PCSX2/inis/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini + dir_prep "$rdhome/states/ps2/pcsx2" "/var/config/PCSX2/sstates" + dir_prep "$rdhome/screenshots" "/var/config/PCSX2/snaps" + dir_prep "$rdhome/.logs" "/var/config/PCSX2/logs" + dir_prep "$rdhome/bios" "$rdhome/bios/pcsx2" + + # MelonDS + echo "----------------------" + echo "Initializing MELONDS" + echo "----------------------" + mkdir -pv /var/config/melonDS/ + mkdir -pv "$rdhome/saves/nds/melonds" + mkdir -pv "$rdhome/states/nds/melonds" + dir_prep "$rdhome/bios" "/var/config/melonDS/bios" + cp -fvr $emuconfigs/melonDS.ini /var/config/melonDS/ + # Replace ~/retrodeck with $rdhome as ~ cannot be understood by MelonDS + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/melonDS/melonDS.ini + + # CITRA + echo "------------------------" + echo "Initializing CITRA" + echo "------------------------" + mkdir -pv /var/config/citra-emu/ + mkdir -pv "$rdhome/saves/n3ds/citra/nand/" + mkdir -pv "$rdhome/saves/n3ds/citra/sdmc/" + dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log" + cp -fv $emuconfigs/citra-qt-config.ini /var/config/citra-emu/qt-config.ini + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini + #TODO: do the same with roms folders after new variables is pushed (check even the others qt-emu) + #But actually everything is always symlinked to retrodeck/roms so it might be not needed + #sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini + + # RPCS3 + echo "------------------------" + echo "Initializing RPCS3" + echo "------------------------" + mkdir -pv /var/config/rpcs3/ + cp -fvr $emuconfigs/rpcs3/* /var/config/rpcs3/ + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/rpcs3/vfs.yml + + # XEMU + echo "------------------------" + echo "Initializing XEMU" + echo "------------------------" + mkdir -pv $rdhome/saves/xbox/xemu/ + cp -fv $emuconfigs/xemu.toml /var/data/xemu/xemu.toml + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml + # Preparing HD dummy Image if the image is not found + if [ ! -f $rdhome/bios/xbox_hdd.qcow2 ] + then + wget "https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip" -P $rdhome/bios/ + unzip $rdhome/bios/xbox_hdd.qcow2.zip $rdhome/bios/ + rm -rfv $rdhome/bios/xbox_hdd.qcow2.zip + fi + + # PPSSPPSDL + echo "------------------------" + echo "Initializing PPSSPPSDL" + echo "------------------------" + mkdir -p /var/config/ppsspp/PSP/SYSTEM/ + cp -fv $emuconfigs/ppssppsdl/* /var/config/ppsspp/PSP/SYSTEM/ + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/ppsspp/PSP/SYSTEM/ppsspp.ini + + # DUCKSTATION + echo "------------------------" + echo "Initializing DUCKSTATION" + echo "------------------------" + mkdir -p /var/config/duckstation/ + cp -fv $emuconfigs/duckstation/* /var/config/duckstation + sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/ppsspp/PSP/SYSTEM/settings.ini + + + # PICO-8 + # Moved PICO-8 stuff in the finit as only it knows here roms folders is + +} + +ra_init() { + dir_prep "$rdhome/bios" "/var/config/retroarch/system" + dir_prep "$rdhome/.logs/retroarch" "/var/config/retroarch/logs" + mkdir -pv /var/config/retroarch/cores/ + cp /app/share/libretro/cores/* /var/config/retroarch/cores/ + cp -fv $emuconfigs/retroarch.cfg /var/config/retroarch/ + cp -fv $emuconfigs/retroarch-core-options.cfg /var/config/retroarch/ + #rm -rf $rdhome/bios/bios # in some situations a double bios symlink is created + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/retroarch/retroarch.cfg + + # PPSSPP + echo "--------------------------------" + echo "Initializing PPSSPP_LIBRETRO" + echo "--------------------------------" + if [ -d $rdhome/bios/PPSSPP/flash0/font ] + then + mv -fv $rdhome/bios/PPSSPP/flash0/font $rdhome/bios/PPSSPP/flash0/font.bak + fi + mkdir -p $rdhome/bios/PPSSPP + #if [ ! -f "$rdhome/bios/PPSSPP/ppge_atlas.zim" ] + #then + wget "https://github.com/hrydgard/ppsspp/archive/refs/heads/master.zip" -P $rdhome/bios/PPSSPP + unzip "$rdhome/bios/PPSSPP/master.zip" -d $rdhome/bios/PPSSPP/ + mv "$rdhome/bios/PPSSPP/ppsspp-master/assets/"* "$rdhome/bios/PPSSPP/" + rm -rfv "$rdhome/bios/PPSSPP/master.zip" + rm -rfv "$rdhome/bios/PPSSPP/ppsspp-master" + #fi + if [ -d $rdhome/bios/PPSSPP/flash0/font.bak ] + then + mv -fv $rdhome/bios/PPSSPP/flash0/font.bak $rdhome/bios/PPSSPP/flash0/font + fi + + + # MSX / SVI / ColecoVision / SG-1000 + echo "-----------------------------------------------------------" + echo "Initializing MSX / SVI / ColecoVision / SG-1000 LIBRETRO" + echo "-----------------------------------------------------------" + wget "http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip" -P $rdhome/bios/MSX + unzip "$rdhome/bios/MSX/blueMSXv282full.zip" $rdhome/bios/MSX + mv -rfv $rdhome/bios/MSX/Databases $rdhome/bios/Databases + mv -rfv $rdhome/bios/MSX/Machines $rdhome/bios/Machines + rm -rfv $rdhome/bios/MSX + +} + +create_lock() { + # creating RetroDECK's lock file and writing the version in the config file + version=$hard_version + touch "$lockfile" + conf_write +} + +post_update() { + # post update script + echo "Executing post-update script" + + # Unhiding downloaded media from the previous versions + if [ -d "$rdhome/.downloaded_media" ] + then + mv -fv "$rdhome/.downloaded_media" "$media_folder" + fi + + # Unhiding themes folder from the previous versions + if [ -d "$rdhome/.themes" ] + then + mv -fv "$rdhome/.themes" "$themes_folder" + fi + + # Doing the dir prep as we don't know from which version we came + dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" + mkdir -pv $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/.emulationstation/es_settings.xml + + + # 0.4 -> 0.5 + # Perform save and state migration if needed + + versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves + + if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $hard_version) == $(sed -e "s/\.//g" <<< $version) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 + migration_logfile=$rdhome/.logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log" + save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" + state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" + + # NOTE: This Zenity command may need to be one line, it broke when I pasted it into a sandbox file + + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="You are updating to a version of RetroDECK where save and state file sorting has changed!\n\nYour existing saves will be backed up to $save_backup_file\n\nYour existing states will be backed up to $state_backup_file\n\nIf a save or state cannot be sorted automatically it will remain in its original directory so you can sort it manually.\n\nIf you encounter any issues, a log of the sorting process is stored at $migration_logfile\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." + + allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder + + allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder + + allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder + + totalsaves=${#allsaves[@]} + totalstates=${#allstates[@]} + filesleft= + current_dest_folder= + gamestoskip= + + tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety + echo "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 + + ( + movefile() { # Take matching save and rom files and sort save into appropriate system folder + echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar + progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) + echo $progress + filesleft=$((filesleft-1)) + if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually + game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder + gamebasename=$(basename "$game" | sed -e 's/\..*//') # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to + matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found + if [[ ${#matches[@]} -gt 1 ]]; then + echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile + gamestoskip+=("$1") + return + fi + echo "INFO: Examining ROM file:" "$game" >> $migration_logfile + echo "INFO: 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 + 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 + 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 + fi + } + + find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script + + totalfiles=$totalsaves #set variables for save file migration + filesleft=$totalsaves + currentlybeingmoved="saves" + current_dest_folder=$saves_folder + + for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match + found= + currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 + for j in "${allgames[@]}"; do + currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + [[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip + done + [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file + done + + totalfiles=$totalstates #set variables for state file migration + filesleft=$totalstates + currentlybeingmoved="states" + current_dest_folder=$states_folder + + for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match + found= + currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 + for j in "${allgames[@]}"; do + currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + [[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip + done + [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file + done + + ) | + zenity --progress \ + --icon-name=net.retrodeck.retrodeck \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title="Processing Files" \ + --text="# files remaining..." \ + --percentage=0 \ + --no-cancel \ + --auto-close + + # NOTE: This Zenity command may need to be one line, it broke when I pasted it into a sandbox file + + else + echo "Version" $version "is after the save and state organization was changed, no need to sort again" + fi + + ra_init + standalones_init + tools_init + + create_lock +} + +start_retrodeck() { + # normal startup + echo "Starting RetroDECK v$version" + emulationstation --home /var/config/emulationstation +} + +browse(){ + # Function for browsing the sd card + path_selected=false + while [ $path_selected == false ] + do + sdcard="$(zenity --file-selection --title="Choose retrodeck folder location" --directory)" + echo "Path choosed: $sdcard, answer=$?" + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ + --cancel-label="No" \ + --ok-label "Yes" \ + --text="Your rom folder will be:\n\n$sdcard/retrodeck/roms\n\nis that ok?" + if [ $? == 0 ] #yes + then + path_selected == true + roms_folder="$sdcard/retrodeck/roms" + break + else + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" + if [ $? == 0 ] # yes, quit + then + exit 0 + fi + fi + done +} + +#advanced(){ +# # function to give advanced install options +# echo "Advaced choosed" +# +# choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ +# --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ +# --ok-label "ROMs" \ +# --extra-button "Media" \ +# --extra-button "Themes" \ +# --extra-button "Back" \ +# --text="What do you want to change?\n\nROMS folder = $roms_folder\nMedia folder (scraped data) = $media_folder\nThemes folder=$themes_folder" ) +# echo "Choice is $choice" +# +# case $choice in +# +# "" ) # Internal (yes) +# echo "ROMs" +# ;; +# +# "Media" ) +# echo "Media" +# ;; +# +# "Themes" ) +# echo "Themes" +# ;; +# +# "Back" ) # Browse + not found fallback +# echo "Back" +# finit +# ;; +# +# esac +#} + +finit() { + # Force/First init, depending on the situation + + echo "Executing finit" + + # Internal or SD Card? + choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ + --ok-label "Cancel" \ + --extra-button "Internal" \ + --extra-button "SD Card" \ + #--extra-button "Advanced" \ + --text="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 roms folder to be located?" ) + echo "Choice is $choice" + + case $choice in + + "" ) # Cancel or X button quits + echo "Now quitting" + kill $$ + ;; + + "Internal" ) # Internal + echo "Internal selected" + roms_folder="$rdhome/roms" + ;; + + "SD Card" ) + echo "SD Card selected" + if [ ! -d "$sdcard" ] # SD Card path is not existing + then + echo "Error: SD card not found" + zenity --question --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" --cancel-label="Cancel" \ + --ok-label "Browse" \ + --text="SD Card was not find in the default location.\nPlease choose the SD Card root.\nA retrodeck/roms folder will be created starting from the directory that you selected." + browse # Calling the browse function + else + roms_folder="$sdcard/retrodeck/roms" # sdcard variable is correct as its given by browse function + echo "ROMs folder = $roms_folder" + fi + ;; + + #"Advanced" ) # Browse + not found fallback + # echo "Advanced" + # advanced + #;; + + esac + + mkdir -pv $roms_folder + + # TODO: after the next update of ES-DE this will not be needed + #zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --text="EmulationStation will now initialize the system.\nPlease DON'T EDIT THE ROMS LOCATION, just select:\n\nCREATE DIRECTORIES\nYES\nOK\nQUIT\n\nRetroDECK will manage the rest." + 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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." + + # Recreating the folder + rm -rfv /var/config/emulationstation/ + rm -rfv /var/config/retrodeck/tools/ + mkdir -pv /var/config/emulationstation/ + + # Initializing ES-DE + # TODO: after the next update of ES-DE this will not be needed - let's test it + emulationstation --home /var/config/emulationstation --create-system-dirs + + mkdir -pv /var/config/retrodeck/tools/ + + #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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." + + # Initializing ROMs folder - Original in retrodeck home (or SD Card) + dir_prep $roms_folder "/var/config/emulationstation/ROMs" + + mkdir -pv $rdhome/saves + mkdir -pv $rdhome/states + mkdir -pv $rdhome/screenshots + mkdir -pv $rdhome/bios/pico8 + mkdir -pv $rdhome/.logs + + # XMLSTARLET HERE + cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml + + # ES-DE preparing themes and scraped folders + dir_prep "$rdhome/downloaded_media" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$rdhome/themes" "/var/config/emulationstation/.emulationstation/themes" + + # PICO-8 + dir_prep "$roms_folder/pico8" "$rdhome/bios/pico8/bbs/carts" #this is the folder where pico-8 is saving the carts + + ra_init + standalones_init + tools_init + create_lock + + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="Installation completed.\nPlease put your roms in:\n\n$roms_folder\n\nand your bioses in\n\n$rdhome/bios\n\nThen start the program again.\nIf you wish to change the roms location, you may use the tool located the tools section of RetroDECK.\n\nIMPORTANT NOTES:\n- RetroDECK must be manually added and launched from your Steam Library in order to work correctly.\n- It's recommended to use the 'RetroDECK Offical Controller Config' from Steam (under community layouts).\n- It's suggested to use BoilR to automatically add the SteamGridDB images to Steam (this will be automated soon).\nhttps://github.com/PhilipK/BoilR" + # TODO: Replace the stuff above with BoilR code when ready +} + +conf_write() { + # writes the variables in the retrodeck config file + + echo "DEBUG: printing the config file content before writing it:" + cat "$rd_conf" + echo "" + + echo "Writing the config file: $rd_conf" + + # TODO: this can be optimized with a while and a list of variables to check + if [ ! -z "$version" ] #if the variable is not null then I update it + then + sed -i "s%version=.*%version=$version%" "$rd_conf" + fi + + if [ ! -z "$rdhome" ] + then + sed -i "s%rdhome=.*%rdhome=$rdhome%" "$rd_conf" + fi + + if [ ! -z "$roms_folder" ] + then + sed -i "s%roms_folder=.*%roms_folder=$roms_folder%" "$rd_conf" + fi + + if [ ! -z "$saves_folder" ] + then + sed -i "s%saves_folder=.*%saves_folder=$saves_folder%" "$rd_conf" + fi + + if [ ! -z "$states_folder" ] + then + sed -i "s%states_folder=.*%states_folder=$states_folder%" "$rd_conf" + fi + + if [ ! -z "$bios_folder" ] + then + sed -i "s%bios_folder=.*%bios_folder=$bios_folder%" "$rd_conf" + fi + + if [ ! -z "$media_folder" ] + then + sed -i "s%media_folder=.*%media_folder=$media_folder%" "$rd_conf" + fi + + if [ ! -z "$themes_folder" ] + then + sed -i "s%themes_folder=.*%themes_folder=$themes_folder%" "$rd_conf" + fi + + if [ ! -z "$sdcard" ] + then + sed -i "s%sdcard=.*%sdcard=$sdcard%" "$rd_conf" + fi + echo "DEBUG: New contents:" + cat "$rd_conf" + echo "" + +} \ No newline at end of file diff --git a/global.sh b/global.sh index 90a23ba6..32dfef6f 100755 --- a/global.sh +++ b/global.sh @@ -43,7 +43,12 @@ conf_write() { then sed -i "s%states_folder=.*%states_folder=$states_folder%" "$rd_conf" fi - + + if [ ! -z "$bios_folder" ] + then + sed -i "s%bios_folder=.*%bios_folder=$bios_folder%" "$rd_conf" + fi + if [ ! -z "$media_folder" ] then sed -i "s%media_folder=.*%media_folder=$media_folder%" "$rd_conf" @@ -80,6 +85,7 @@ then roms_folder="$rdhome/roms" # the default roms folder path saves_folder="$rdhome/saves" # the default saves folder path states_folder="$rdhome/states" # the default states folder path + bios_folder="$rdhome/bios" # the default bios folder media_folder="$rdhome/downloaded_media" # the media folder, where all the scraped data is downloaded into themes_folder="$rdhome/themes" # the themes folder sdcard="$default_sd" # Steam Deck SD default path @@ -91,6 +97,7 @@ then echo "roms_folder=$roms_folder" >> $rd_conf echo "saves_folder=$saves_folder" >> $rd_conf echo "states_folder=$states_folder" >> $rd_conf + echo "bios_folder=$bios_folder" >> $rd_conf echo "media_folder=$media_folder" >> $rd_conf echo "themes_folder=$themes_folder" >> $rd_conf echo "sdcard=$sdcard" >> $rd_conf diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 9c66373f..692697f8 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -1413,7 +1413,10 @@ modules: - cp global.sh /app/bin/global.sh - chmod +x /app/bin/global.sh - + + - cp functions.sh /app/libexec/functions.sh + - chmod +x /app/libexec/functions.sh + # Desktop entry - cp net.retrodeck.retrodeck.desktop /app/share/applications/net.retrodeck.retrodeck.desktop diff --git a/retrodeck.sh b/retrodeck.sh index 4f08889c..daa5827a 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -436,7 +436,7 @@ browse(){ --text="Your rom folder will be:\n\n$sdcard/retrodeck/roms\n\nis that ok?" if [ $? == 0 ] #yes then - sdselected == true + path_selected == true roms_folder="$sdcard/retrodeck/roms" break else diff --git a/tools/configurator.sh b/tools/configurator.sh index b8f92caf..9458fc08 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -1,47 +1,403 @@ #!/bin/bash -source /app/bin/global.sh # Store actual work code in globals (for use elsewhere if needed) and keep Configurator strictly dialogs +# VARIABLES SECTION + +source /app/bin/global.sh # Grab global variables +source /app/libexec/functions.sh # Source global functions + +# Config files for emulators with single config files + +raconf="/var/config/retroarch/retroarch.cfg" +ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" +citraconf="/var/config/citra-emu/qt-config.ini" +melondsconf="/var/config/melonDS/melonDS.ini" +rpcs3conf="/var/config/rpcs3/config.yml" +yuzuconf="/var/config/yuzu/qt-config.ini" + +# Dolphin config files + +dolphinconf="/var/config/dolphin-emu/Dolphin.ini" +dolphingcpadconf="/var/config/dolphin-emu/GCPadNew.ini" +dolphingfxconf="/var/config/dolphin-emu/GFX.ini" +dolphinhkconf="/var/config/dolphin-emu/Hotkeys.ini" +dolphinqtconf="/var/config/dolphin-emu/Qt.ini" + +# PCSX2 config files + +pcsx2conf="/var/config/PCSX2/inis/GS.ini" +pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" +pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" + + +# FUNCTION SECTION + +browse() { +# Function for browsing directories, sets directory selected to variable $target for use in other functions + +path_selected=false + +while [ $path_selected == false ] + do + target="$(zenity --file-selection --title="Choose target location to $action" --directory)" + echo "Path chosen: $target, answer=$?" + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ + --cancel-label="No" \ + --ok-label "Yes" \ + --text="Your new directory will be:\n\n$target\n\nis that ok?" + if [ $? == 0 ] #yes + then + path_selected == true + break + else + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" + if [ $? == 0 ] # yes, quit + then + target= + exit 0 + fi + fi + done +} + +move() { + +} + +edit_setting() { +# Function for editing settings +# USAGE: $(edit_setting $setting_name $new_setting_value $system) (needed as different systems use different config file syntaxes) + + +} + +get_setting_value() { +# Function for getting the current value of a setting from a config file +# USAGE: $(get_setting_value $setting_name $system) (needed as different systems use different config file syntaxes) + + + +case $2 in + + "retrodeck" ) + ;; + + "retroarch" ) + echo $(grep $2 $raconf | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "retroarch-core-configs" ) + ;; + + "dolphin" ) + ;; + + "duckstation" ) + ;; + + "pcsx2" ) + ;; + + "ppsspp" ) + ;; + + "rpcs3" ) + ;; + + "yuzu" ) + ;; + + "citra" ) + ;; + + "melonds" ) + ;; + + "xemu" ) + ;; + +esac + +} + +# DIALOG SECTION # Configurator Option Tree # Welcome # - Move Directories -# - Migrate ROM directory -# - Migrate downloaded_media -# - Migrate BIOS directory -# - Change Options -# - Change Rewind Setting -# - Upgrade Files -# - Grab all missing cores -# - Update all cores to nightly +# - Migrate ROM directory +# - Migrate downloaded_media +# - Migrate BIOS directory +# - Change Emulator Options +# - RetroArch +# - Change Rewind Setting +# - Add or Update Files +# - Add specific cores +# - Grab all missing cores +# - Update all cores to nightly # - RetroAchivement login -# - Login prompt +# - Login prompt # - Reset RetroDECK -# - Reset RetroArch -# - Reset Standalone Emulators -# - Reset Tools -# - Reset All +# - Reset RetroArch +# - Reset Standalone Emulators +# - Reset Tools +# - Reset All -configurator_welcome_dialog() { +# Code for the menus should be put in reverse order, so functions for sub-menus exists before it is called by the parent menu + +configurator_process_complete_dialog() { + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Process Complete" \ + --text="The process of $1 is now complete.\n\nClick OK to return to the Main Menu" + + configurator_welcome_dialog +} + +configurator_progress_bar_dialog() { } -configurator_migration_dialog() { +configurator_reset_dialog() { + choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Reset RetroArch" "Reset RetroArch to default settings" \ + "Reset Standalones" "Reset standalone emulators to default settings" \ + "Reset Tools" "Reset Tools menu entries" \ + "Reset All" "Reset RetroDECK to default settings" ) + case $choice in + + "Reset RetroArch" ) + ra_init + configurator_process_complete_dialog "resetting RetroArch" + ;; + + "Reset Standalones" ) + standalones_init + configurator_process_complete_dialog "resetting standalone emulators" + ;; + + "Reset Tools" ) + tools_init + configurator_process_complete_dialog "resetting the tools menu" + ;; + + "Reset All" ) + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Reset RetroDECK" \ + --text="You are resetting RetroDECK to its default state.\n\nAfter the process is complete you will need to exit RetroDECK and run it again." + rm -f "$lockfile" + configurator_process_complete_dialog "resetting RetroDECK" + ;; + + "" ) # No selection made or Back button clicked + configurator_welcome_dialog + ;; + + esac } -configurator_options_dialog() { +configurator_retroachivement_dialog() { + login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Enter your RetroAchievements Account details.\n\nBe aware that this tool cannot verify your login details.\nFor registration and more info visit\nhttps://retroachievements.org/\n" \ + --separator="=SEP=" \ + --add-entry="Username" \ + --add-password="Password") + if [ $? == 1 ] # Cancel button clicked + then + configurator_welcome_dialog + fi + + arrIN=(${login//=SEP=/ }) + user=${arrIN[0]} + pass=${arrIN[1]} + + sed -i "s%cheevos_enable =.*%cheevos_enable = \"true\"%" $raconf + sed -i "s%cheevos_username =.*%cheevos_username = \"$user\"%" $raconf + sed -i "s%cheevos_password =.*%cheevos_password = \"$pass\"%" $raconf } configurator_update_dialog() { } -configurator_retroachivement_dialog() { +configurator_power_user_changes_dialog() { + zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\n\nplease continue only if you know what you're doing.\n\nDo you want to continue?" + + if [ $? == 1 ] # Cancel button clicked + then + configurator_options_dialog + fi + + emulator="$(zenity --list \ + --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Which emulator do you want to configure?" \ + --hide-header \ + --column=emulator \ + "RetroArch" \ + "Citra" \ + "Dolphin" \ + "Duckstation" \ + "MelonDS" \ + "PCSX2-QT" \ + "PCSX2-Legacy" \ + "PPSSPP" \ + "RPCS3" \ + "XEMU" \ + "Yuzu")" + + case $emulator in + + "RetroArch" ) + retroarch + ;; + + "Citra" ) + citra-qt + ;; + + "Dolphin" ) + dolphin-emu + ;; + + "Duckstation" ) + duckstation-qt + ;; + + "MelonDS" ) + melonDS + ;; + + "PCSX2-QT" ) + pcsx2-qt + ;; + + "PCSX2-Legacy" ) + pcsx2 + ;; + + "PPSSPP" ) + PPSSPPSDL + ;; + + "RPCS3" ) + rpcs3 + ;; + + "XEMU" ) + xemu + ;; + + "Yuzu" ) + yuzu + ;; + + "" ) # No selection made or Back button clicked + configurator_options_dialog + ;; + + esac +} + +configurator_rewind_dialog() { + zenity --question \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="Do you want to enable the rewind function in RetroArch cores?\n\nNOTE:\nThis may impact on performances expecially on the latest systems." + + if [ $? == 0 ] #yes, enable + then + sed -i 's%rewind_enable = .*%rewind_enable = "true"' $raconf + zenity --info \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="Rewind enabled\!\nYou can check on Libretro docs to see which cores supports this function." + else # no, disable + sed -i 's%rewind_enable = .*%rewind_enable = "false"' $raconf + zenity --info \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="Rewind disabled." + fi +} + +configurator_options_dialog() { + choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Enable-Disable Rewind" "Enable or disable Rewind function in RetroArch" \ + "Power User Changes" "Make changes directly in an emulator" ) + + case $choice in + + "Enable-Disable Rewind" ) + configurator_rewind_dialog + ;; + + "Power User Changes" ) + configurator_power_user_changes_dialog + ;; + + "" ) # No selection made or Back button clicked + configurator_welcome_dialog + ;; + + esac +} + +configurator_migration_dialog() { } -configurator_reset_dialog() { +configurator_welcome_dialog() { + # Clear the variables + target= + setting= + action= + setting_value= -} \ No newline at end of file + choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Move Files" "Move files between internal/SD card or to custom locations" \ + "Change Options" "Adjust how RetroDECK behaves" \ + "Upgrade" "Upgrade parts of RetroDECK" \ + "RetroAchivements" "Log in to RetroAchievements" \ + "Reset" "Reset parts of RetroDECK" ) + + case $choice in + + "Move Files" ) + configurator_migration_dialog + ;; + + "Change Options" ) + configurator_options_dialog + ;; + + "Upgrade" ) + configurator_update_dialog + ;; + + "RetroAchivements" ) + configurator_retroachivement_dialog + ;; + + "Reset" ) + configurator_reset_dialog + ;; + + esac +} + +# START THE CONFIGURATOR + +configurator_welcome_dialog \ No newline at end of file diff --git a/tools/configure-emulators.sh b/tools/configure-emulators.sh.disabled old mode 100755 new mode 100644 similarity index 100% rename from tools/configure-emulators.sh rename to tools/configure-emulators.sh.disabled From 11c176c9c69a65f27ace3712b6e32423c7d68553 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 7 Oct 2022 16:28:36 -0400 Subject: [PATCH 03/46] Configurator expansion --- es-configs/tools-gamelist.xml | 97 +------------ tools/{cheevos.sh => cheevos.sh.disabled} | 0 tools/configurator.sh | 160 +++++++++++++++++----- tools/{rewind.sh => rewind.sh.disabled} | 0 4 files changed, 126 insertions(+), 131 deletions(-) rename tools/{cheevos.sh => cheevos.sh.disabled} (100%) mode change 100755 => 100644 rename tools/{rewind.sh => rewind.sh.disabled} (100%) mode change 100755 => 100644 diff --git a/es-configs/tools-gamelist.xml b/es-configs/tools-gamelist.xml index 68f116fa..23af3195 100644 --- a/es-configs/tools-gamelist.xml +++ b/es-configs/tools-gamelist.xml @@ -1,100 +1,9 @@ - ./cheevos.sh - RetroAchievements Login - Enter your RetroAchievements account details. - true - true - - - - ./start-splore.sh - Start Splore - Start PICO-8's splore - true - true - - - - ./configure-emulators.sh - Configure Emulators - Choose an emulator to configure. - true - true - - - ./rewind.sh - Rewind toggler - Enable or disable the rewind function for some RetroArch cores. + ./configurator.sh + RetroDECK Configurator + Change settings, move folders and more! true true diff --git a/tools/cheevos.sh b/tools/cheevos.sh.disabled old mode 100755 new mode 100644 similarity index 100% rename from tools/cheevos.sh rename to tools/cheevos.sh.disabled diff --git a/tools/configurator.sh b/tools/configurator.sh index 9458fc08..44dda06c 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -13,6 +13,7 @@ citraconf="/var/config/citra-emu/qt-config.ini" melondsconf="/var/config/melonDS/melonDS.ini" rpcs3conf="/var/config/rpcs3/config.yml" yuzuconf="/var/config/yuzu/qt-config.ini" +source $rd_conf # Dolphin config files @@ -63,56 +64,108 @@ move() { } -edit_setting() { +set_setting() { # Function for editing settings -# USAGE: $(edit_setting $setting_name $new_setting_value $system) (needed as different systems use different config file syntaxes) +# USAGE: $(set_setting $setting_file $setting_name $new_setting_value $system) (needed as different systems use different config file syntax) - -} - -get_setting_value() { -# Function for getting the current value of a setting from a config file -# USAGE: $(get_setting_value $setting_name $system) (needed as different systems use different config file syntaxes) - - - -case $2 in +case $4 in "retrodeck" ) + ;; "retroarch" ) - echo $(grep $2 $raconf | grep -o -P "(?<=$2 = \").*(?=\")") - ;; - - "retroarch-core-configs" ) + sed -i "s/$2 = \".*\"/$2 = \"$3\"/" $1 ;; "dolphin" ) + ;; "duckstation" ) + ;; "pcsx2" ) + ;; "ppsspp" ) + ;; "rpcs3" ) + ;; "yuzu" ) + ;; "citra" ) + ;; "melonds" ) + ;; "xemu" ) + + ;; + +esac + +} + +get_setting() { +# Function for getting the current value of a setting from a config file +# USAGE: $(get_setting $setting_file $setting_name $system) (needed as different systems use different config file syntax) + +case $3 in + + "retrodeck" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "retroarch" ) + echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "dolphin" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "duckstation" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "pcsx2" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "ppsspp" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "rpcs3" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "yuzu" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "citra" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "melonds" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "xemu" ) + #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") ;; esac @@ -307,39 +360,72 @@ configurator_power_user_changes_dialog() { esac } -configurator_rewind_dialog() { - zenity --question \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="Do you want to enable the rewind function in RetroArch cores?\n\nNOTE:\nThis may impact on performances expecially on the latest systems." +configurator_retroarch_rewind_dialog() { + if [[ $(get_setting $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 - Rewind" \ + --text="Rewind is currently enabled. Do you want to disable it?." - if [ $? == 0 ] #yes, enable - then - sed -i 's%rewind_enable = .*%rewind_enable = "true"' $raconf - zenity --info \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="Rewind enabled\!\nYou can check on Libretro docs to see which cores supports this function." - else # no, disable - sed -i 's%rewind_enable = .*%rewind_enable = "false"' $raconf - zenity --info \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="Rewind disabled." + if [ $? == 0 ] + then + set_setting $raconf rewind_enable true retroarch + zenity --info \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator - Rewind" \ + --text="Rewind enabled\!\nYou can check on Libretro docs to see which cores supports this function." + else + configurator_options_dialog + fi + else + zenity --question \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator - Rewind" \ + --text="Rewind is currently disabled, do you want to enable it?\n\nNOTE:\nThis may impact performance expecially on the latest systems." + + if [ $? == 0 ] + then + set_setting $raconf rewind_enable false retroarch + zenity --info \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator - Rewind" \ + --text="Rewind disabled." + else + configurator_options_dialog + fi fi } +configurator_retroarch_options_dialog() { + choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Change Rewind Setting" "Enable or disable the Rewind function in RetroArch" ) + + case $choice in + + "Change Rewind Setting" ) + configurator_retroarch_rewind_dialog + ;; + + "" ) # No selection made or Back button clicked + configurator_options_dialog + ;; + + esac +} + configurator_options_dialog() { choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ - "Enable-Disable Rewind" "Enable or disable Rewind function in RetroArch" \ + "Change RetroArch Settings" "Change settings specific to RetroArch" \ "Power User Changes" "Make changes directly in an emulator" ) case $choice in - "Enable-Disable Rewind" ) - configurator_rewind_dialog + "Change RetroArch Settings" ) + configurator_retroarch_options_dialog ;; "Power User Changes" ) diff --git a/tools/rewind.sh b/tools/rewind.sh.disabled old mode 100755 new mode 100644 similarity index 100% rename from tools/rewind.sh rename to tools/rewind.sh.disabled From d372bf172ce82aff631481105b3745b43b156997 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 10 Oct 2022 12:46:35 -0400 Subject: [PATCH 04/46] Finished and tested get_setting() --- tools/configurator.sh | 59 ++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/tools/configurator.sh b/tools/configurator.sh index 44dda06c..462146a4 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -7,14 +7,21 @@ source /app/libexec/functions.sh # Source global functions # Config files for emulators with single config files -raconf="/var/config/retroarch/retroarch.cfg" -ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" citraconf="/var/config/citra-emu/qt-config.ini" melondsconf="/var/config/melonDS/melonDS.ini" rpcs3conf="/var/config/rpcs3/config.yml" yuzuconf="/var/config/yuzu/qt-config.ini" source $rd_conf +# ES-DE config files + +es_settings="/var/config/emulationstation/.emulationstation/es_settings.xml" + +# RetroArch config files + +raconf="/var/config/retroarch/retroarch.cfg" +ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" + # Dolphin config files dolphinconf="/var/config/dolphin-emu/Dolphin.ini" @@ -113,6 +120,10 @@ case $4 in "xemu" ) ;; + + "emulationstation" ) + + ;; esac @@ -125,47 +136,53 @@ get_setting() { case $3 in "retrodeck" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") - ;; - - "retroarch" ) - echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") ;; - "dolphin" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + "retroarch" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") ;; "duckstation" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") ;; "pcsx2" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") ;; "ppsspp" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") ;; - "rpcs3" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces + echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") ;; - "yuzu" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters + yuzu_setting=$(sed -e 's/\\/\\\\/g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") ;; - - "citra" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + + "citra" ) # Use quotes when passing setting_name, as this config file contains special characters + citra_setting=$(sed -e 's/\\/\\\\/g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") ;; "melonds" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") ;; "xemu" ) - #echo $(grep $2 $1 | grep -o -P "(?<=$2 = \").*(?=\")") + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; + + "emulationstation" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") ;; esac From 9747618b9f9e826d1ba76ba4187b9bff24c546fd Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 10 Oct 2022 17:01:19 -0400 Subject: [PATCH 05/46] Futher configurator building --- tools/configurator.sh | 166 +++++++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 67 deletions(-) diff --git a/tools/configurator.sh b/tools/configurator.sh index 462146a4..1d87ad6e 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -78,52 +78,52 @@ set_setting() { case $4 in "retrodeck" ) - - ;; - + sed -i "s%$2=.*%$2=$3%" $1 + ;; + "retroarch" ) - sed -i "s/$2 = \".*\"/$2 = \"$3\"/" $1 - ;; + sed -i "s%$2 = \".*\"%$2 = \"$3\"%" $1 + ;; "dolphin" ) - - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "duckstation" ) - - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "pcsx2" ) - - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "ppsspp" ) + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; - ;; - - "rpcs3" ) - - ;; + "rpcs3" ) # This does not currently work for settings with a $ in them + sed -i "s%$2: .*%$2: $3%" $1 + ;; "yuzu" ) + #sed -i "s%$2=.*%$2=$3%" $1 + ;; - ;; - "citra" ) - - ;; + #sed -i "s%$2=.*%$2=$3%" $1 + ;; "melonds" ) - - ;; + sed -i "s%$2=.*%$2=$3%" $1 + ;; "xemu" ) + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; - ;; - "emulationstation" ) - - ;; + sed -i "s%$2\" \" value=\".*\"%$2\" \" value=\"$3\"" $1 + ;; esac @@ -136,54 +136,54 @@ get_setting() { case $3 in "retrodeck" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + ;; "retroarch" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; "duckstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; "pcsx2" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; - "ppsspp" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces - echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") + ;; "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters - yuzu_setting=$(sed -e 's/\\/\\\\/g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") - ;; + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") + ;; "citra" ) # Use quotes when passing setting_name, as this config file contains special characters - citra_setting=$(sed -e 's/\\/\\\\/g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") - ;; + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") + ;; "melonds" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + ;; "xemu" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; "emulationstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") - ;; + echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") + ;; esac @@ -219,9 +219,12 @@ configurator_process_complete_dialog() { zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Process Complete" \ - --text="The process of $1 is now complete.\n\nClick OK to return to the Main Menu" + --text="The process of $1 is now complete.\n\nYou may need to quit and restart RetroDECK for your changes to take effect\n\nClick OK to return to the Main Menu or Quit to return to RetroDECK." - configurator_welcome_dialog + if [ $? == 0 ] # OK button clicked + then + configurator_welcome_dialog + fi } configurator_progress_bar_dialog() { @@ -290,6 +293,8 @@ configurator_retroachivement_dialog() { sed -i "s%cheevos_enable =.*%cheevos_enable = \"true\"%" $raconf sed -i "s%cheevos_username =.*%cheevos_username = \"$user\"%" $raconf sed -i "s%cheevos_password =.*%cheevos_password = \"$pass\"%" $raconf + + configurator_process_complete_dialog "logging in to RetroAchievements" } configurator_update_dialog() { @@ -387,10 +392,7 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then set_setting $raconf rewind_enable true retroarch - zenity --info \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator - Rewind" \ - --text="Rewind enabled\!\nYou can check on Libretro docs to see which cores supports this function." + configurator_process_complete_dialog "enabling Rewind" else configurator_options_dialog fi @@ -403,10 +405,7 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then set_setting $raconf rewind_enable false retroarch - zenity --info \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator - Rewind" \ - --text="Rewind disabled." + configurator_process_complete_dialog "disabling Rewind" else configurator_options_dialog fi @@ -456,15 +455,44 @@ configurator_options_dialog() { esac } -configurator_migration_dialog() { +configurator_move_dialog() { + choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Move ROMs" "Move your ROMs directory to a new location" \ + "Move BIOS" "Move your BIOS directory to a new location" \ + "Move Downloaded Media" "Move your downloaded media directory to a new location" \ + "Move Saves and States" "Move your save and state directories to a new location" ) + + case $choice in + + "Move ROMs" ) + + ;; + + "Move BIOS" ) + ;; + + "Move Downloaded Media" ) + ;; + + "Move Saves and States" ) + ;; + + "" ) # No selection made or Back button clicked + configurator_welcome_dialog + ;; + + esac } configurator_welcome_dialog() { # Clear the variables - target= - setting= + source= + destination= action= + setting= setting_value= choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ @@ -479,7 +507,7 @@ configurator_welcome_dialog() { case $choice in "Move Files" ) - configurator_migration_dialog + configurator_move_dialog ;; "Change Options" ) @@ -498,6 +526,10 @@ configurator_welcome_dialog() { configurator_reset_dialog ;; + "" ) + + ;; + esac } From 42fa262f02a8d3fd30655607e2641d4547152a62 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 11 Oct 2022 16:19:35 -0400 Subject: [PATCH 06/46] More functions --- functions.sh | 60 +++++++++++++++++++++++------- tools/configurator.sh | 86 +++++++++++++++++++++++++++++++------------ 2 files changed, 110 insertions(+), 36 deletions(-) diff --git a/functions.sh b/functions.sh index f724f80b..d9a6c2f5 100644 --- a/functions.sh +++ b/functions.sh @@ -52,6 +52,15 @@ tools_init() { cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml } +tools_init() { + rm -rfv /var/config/retrodeck/tools/ + mkdir -pv /var/config/retrodeck/tools/ + cp -rfv /app/retrodeck/tools/* /var/config/retrodeck/tools/ + mkdir -pv /var/config/emulationstation/.emulationstation/custom_systems/tools/ + rm -rfv /var/config/retrodeck/tools/gamelist.xml + cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml +} + standalones_init() { # This script is configuring the standalone emulators with the default files present in emuconfigs folder @@ -96,15 +105,16 @@ standalones_init() { echo "----------------------" echo "Initializing PCSX2" echo "----------------------" - mkdir -pv /var/config/PCSX2/inis/ + mkdir -pv "/var/config/PCSX2/inis" mkdir -pv "$rdhome/saves/ps2/pcsx2/memcards" + mkdir -pv "$rdhome/states/ps2/pcsx2" cp -fvr $emuconfigs/PCSX2/* /var/config/PCSX2/inis/ sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini - dir_prep "$rdhome/states/ps2/pcsx2" "/var/config/PCSX2/sstates" - dir_prep "$rdhome/screenshots" "/var/config/PCSX2/snaps" - dir_prep "$rdhome/.logs" "/var/config/PCSX2/logs" - dir_prep "$rdhome/bios" "$rdhome/bios/pcsx2" + #dir_prep "$rdhome/states/ps2/pcsx2" "/var/config/PCSX2/sstates" + #dir_prep "$rdhome/screenshots" "/var/config/PCSX2/snaps" + #dir_prep "$rdhome/.logs" "/var/config/PCSX2/logs" + #dir_prep "$rdhome/bios" "$rdhome/bios/pcsx2" # MelonDS echo "----------------------" @@ -233,6 +243,17 @@ post_update() { # post update script echo "Executing post-update script" + # Finding existing ROMs folder + if [ -d "$default_sd/retrodeck" ] + then + # ROMs on SD card + roms_folder="$default_sd/retrodeck/roms" + else + # ROMs on Internal + roms_folder="$HOME/retrodeck/roms" + fi + echo "ROMs folder found at $roms_folder" + # Unhiding downloaded media from the previous versions if [ -d "$rdhome/.downloaded_media" ] then @@ -258,6 +279,10 @@ post_update() { # 0.4 -> 0.5 # Perform save and state migration if needed + # Moving PCSX2 Saves + mv -fv /var/config/PCSX2/sstates/* $rdhome/states/ps2/pcsx2 + mv -fv /var/config/PCSX2/memcards/* $rdhome/saves/ps2/memcards + versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $hard_version) == $(sed -e "s/\.//g" <<< $version) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 @@ -265,18 +290,16 @@ post_update() { save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" - # NOTE: This Zenity command may need to be one line, it broke when I pasted it into a sandbox file - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK" \ - --text="You are updating to a version of RetroDECK where save and state file sorting has changed!\n\nYour existing saves will be backed up to $save_backup_file\n\nYour existing states will be backed up to $state_backup_file\n\nIf a save or state cannot be sorted automatically it will remain in its original directory so you can sort it manually.\n\nIf you encounter any issues, a log of the sorting process is stored at $migration_logfile\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." + --text="You are updating to a version of RetroDECK where save file locations have changed!\n\nYour existing files will be backed up for safety and then sorted automatically.\n\nIf a file cannot be sorted automatically it will remain where it is for manual sorting.\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." - allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder + allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder - allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder + allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder - allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder + allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder totalsaves=${#allsaves[@]} totalstates=${#allstates[@]} @@ -365,7 +388,19 @@ post_update() { --no-cancel \ --auto-close - # NOTE: This Zenity command may need to be one line, it broke when I pasted it into a sandbox file + if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." + + else + cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" + fi else echo "Version" $version "is after the save and state organization was changed, no need to sort again" @@ -456,7 +491,6 @@ finit() { --ok-label "Cancel" \ --extra-button "Internal" \ --extra-button "SD Card" \ - #--extra-button "Advanced" \ --text="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 roms folder to be located?" ) echo "Choice is $choice" diff --git a/tools/configurator.sh b/tools/configurator.sh index 1d87ad6e..13d3958c 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -40,40 +40,81 @@ pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" # FUNCTION SECTION browse() { -# Function for browsing directories, sets directory selected to variable $target for use in other functions + # This function browses for a directory and returns the path chosen + # USAGE: path_to_be_browsed_for=$(browse $source/destination_text $action_text) -path_selected=false + path_selected=false -while [ $path_selected == false ] + while [ $path_selected == false ] do - target="$(zenity --file-selection --title="Choose target location to $action" --directory)" + target="$(zenity --file-selection --title="Choose $1 location to $2" --directory)" echo "Path chosen: $target, answer=$?" - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ - --cancel-label="No" \ - --ok-label "Yes" \ - --text="Your new directory will be:\n\n$target\n\nis that ok?" if [ $? == 0 ] #yes then - path_selected == true - break - else - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" - if [ $? == 0 ] # yes, quit + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ + --text="Directory $target chosen, is this correct?" + if [ $? == 0 ] then - target= - exit 0 + path_selected=true + echo $target + break + else + + fi + + else + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ + --text="No directory selected. Do you want to return to the main menu?" + if [ $? == 1 ] + then + configurator_welcome_dialog fi fi done } -move() { +verify_space() { + # Function used for verifying adequate space before moving directories around + # USAGE: verify_space $source_dir $dest_dir + # Function returns "true" if there is enough space, "false" if there is not + source_size=$(du -sk /home/deck/retrodeck | awk '{print $1}') + source_size=$((source_size+(source_size/10))) # Add 10% to source size for safety + dest_avail=$(df -k --output=avail $2 | tail -1) + + if [[ $source_size -ge $dest_avail ]]; then + echo "false" + else + echo "true" + fi +} + +move() { + # Function to move a directory from one parent to another + # USAGE: move $source_dir $dest_dir + + if [[ verify_space $1 $2 ]]; then + ( + echo "mv -v -t $2 $1" + ) | + 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 - Move in Progress" \ + --text="Moving directory $1 to new location of $2, please wait." + + else + zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move Directories" \ + --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." + + configurator_move_dialog + fi } set_setting() { # Function for editing settings -# USAGE: $(set_setting $setting_file $setting_name $new_setting_value $system) (needed as different systems use different config file syntax) +# USAGE: set_setting $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) case $4 in @@ -131,7 +172,7 @@ esac get_setting() { # Function for getting the current value of a setting from a config file -# USAGE: $(get_setting $setting_file $setting_name $system) (needed as different systems use different config file syntax) +# USAGE: get_setting $setting_file $setting_name $system (needed as different systems use different config file syntax) case $3 in @@ -216,21 +257,19 @@ esac # Code for the menus should be put in reverse order, so functions for sub-menus exists before it is called by the parent menu configurator_process_complete_dialog() { + # This dialog shows when a process is complete. + # USAGE: configurator_process_complete_dialog "process text" zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Process Complete" \ --text="The process of $1 is now complete.\n\nYou may need to quit and restart RetroDECK for your changes to take effect\n\nClick OK to return to the Main Menu or Quit to return to RetroDECK." - + if [ $? == 0 ] # OK button clicked then configurator_welcome_dialog fi } -configurator_progress_bar_dialog() { - -} - configurator_reset_dialog() { choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -471,6 +510,7 @@ configurator_move_dialog() { ;; "Move BIOS" ) + ;; "Move Downloaded Media" ) From a0ed88e2bb4400bbf4a1b6fca889d8b42423cfdf Mon Sep 17 00:00:00 2001 From: icenine451 Date: Wed, 12 Oct 2022 16:06:17 -0400 Subject: [PATCH 07/46] Lots of work --- functions.sh | 574 +++++++++++++++++++++++++++------------- retrodeck.sh | 2 +- tools/configurator.sh | 592 +++++++++++++++++++++++------------------- 3 files changed, 719 insertions(+), 449 deletions(-) diff --git a/functions.sh b/functions.sh index d9a6c2f5..158319fe 100644 --- a/functions.sh +++ b/functions.sh @@ -2,9 +2,397 @@ # THIS IS A CENTRALIZED LOCATION FOR FUNCTIONS, WHICH CAN BE SOURCED WITHOUT RUNNING EXTRA CODE. EXISTING USE OF THESE FUNCTIONS CAN BE REFACTORED TO HERE. +# These functions are original to this file + +#================= +# FUNCTION SECTION +#================= + +browse() { + # This function browses for a directory and returns the path chosen + # USAGE: path_to_be_browsed_for=$(browse $action_text) + + path_selected=false + + while [ $path_selected == false ] + do + target="$(zenity --file-selection --title="Choose $1" --directory)" + if [ $? == 0 ] #yes + then + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ + --text="Directory $target chosen, is this correct?" + if [ $? == 0 ] + then + path_selected=true + echo $target + break + fi + else + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ + --text="No directory selected. Do you want to return to the main menu?" + if [ $? == 1 ] + then + configurator_welcome_dialog + fi + fi + done +} + +verify_space() { + # Function used for verifying adequate space before moving directories around + # USAGE: verify_space $source_dir $dest_dir + # Function returns "true" if there is enough space, "false" if there is not + + source_size=$(du -sk /home/deck/retrodeck | awk '{print $1}') + source_size=$((source_size+(source_size/10))) # Add 10% to source size for safety + dest_avail=$(df -k --output=avail $2 | tail -1) + + if [[ $source_size -ge $dest_avail ]]; then + echo "false" + else + echo "true" + fi +} + +move() { + # Function to move a directory from one parent to another + # USAGE: move $source_dir $dest_dir + + if [[ $(verify_space $1 $2) ]]; then + ( + if [[ ! -d $2 ]]; then # Create destination directory if it doesn't already exist + debug_dialog "mkdir -pv $2" + fi + debug_dialog "mv -v -t $2 $1" + ) | + zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close --width=800 --height=600 \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move in Progress" \ + --text="Moving directory $1 to new location of $2, please wait." + + else + zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=800 --height=600 \ + --title "RetroDECK Configurator Utility - Move Directories" \ + --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." + + configurator_move_dialog + fi +} + +set_setting() { +# Function for editing settings +# USAGE: set_setting $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) +# NOTES: Citra, Yuzu and RPCS3 have special conditions, see comments below + +case $4 in + + "retrodeck" ) + sed -i "s%$2=.*%$2=$3%" $1 + ;; + + "retroarch" ) + sed -i "s%$2 = \".*\"%$2 = \"$3\"%" $1 + ;; + + "dolphin" ) + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; + + "duckstation" ) + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; + + "pcsx2" ) + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; + + "ppsspp" ) + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; + + "rpcs3" ) # This does not currently work for settings with a $ in them + sed -i "s%$2: .*%$2: $3%" $1 + ;; + + "yuzu" ) + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%$yuzu_setting=.*%$yuzu_setting=$3%" $1 + ;; + + "citra" ) + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%$citra_setting=.*%$citra_setting=$3%" $1 + ;; + + "melonds" ) + sed -i "s%$2=.*%$2=$3%" $1 + ;; + + "xemu" ) + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; + + "emulationstation" ) + sed -i "s%$2\" \" value=\".*\"%$2\" \" value=\"$3\"" $1 + ;; + +esac +} + +get_setting() { +# Function for getting the current value of a setting from a config file +# USAGE: get_setting $setting_file $setting_name $system (needed as different systems use different config file syntax) + +case $3 in + + "retrodeck" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + ;; + + "retroarch" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; + + "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; + + "duckstation" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; + + "pcsx2" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; + + "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; + + "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces + echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") + ;; + + "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") + ;; + + "citra" ) # Use quotes when passing setting_name, as this config file contains special characters + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") + ;; + + "melonds" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + ;; + + "xemu" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; + + "emulationstation" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") + ;; + +esac +} + +yuzu_init() { + echo "----------------------" + echo "Initializing YUZU" + echo "----------------------" + # removing dead symlinks as they were present in a past version + if [ -d $rdhome/bios/switch ]; then + find $rdhome/bios/switch -xtype l -exec rm {} \; + fi + # initializing the keys folder + dir_prep "$rdhome/bios/switch/keys" "/var/data/yuzu/keys" + # initializing the firmware folder + dir_prep "$rdhome/bios/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" + # configuring Yuzu + dir_prep "$rdhome/.logs/yuzu" "/var/data/yuzu/log" + mkdir -pv /var/config/yuzu/ + cp -fvr $emuconfigs/yuzu/* /var/config/yuzu/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/yuzu/qt-config.ini + dir_prep "$rdhome/screenshots" "/var/data/yuzu/screenshots" +} + +dolphin_init() { + echo "----------------------" + echo "Initializing DOLPHIN" + echo "----------------------" + mkdir -pv /var/config/dolphin-emu/ + cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/dolphin-emu/Dolphin.ini + dir_prep "$rdhome/saves/gc/dolphin/EUR" "/var/data/dolphin-emu/GC/EUR" + dir_prep "$rdhome/saves/gc/dolphin/USA" "/var/data/dolphin-emu/GC/USA" + dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" + dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" + dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" + dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" +} + +pcsx2_init() { + echo "----------------------" + echo "Initializing PCSX2" + echo "----------------------" + mkdir -pv "/var/config/PCSX2/inis" + mkdir -pv "$rdhome/saves/ps2/pcsx2/memcards" + mkdir -pv "$rdhome/states/ps2/pcsx2" + cp -fvr $emuconfigs/PCSX2/* /var/config/PCSX2/inis/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini +} + +melonds_init() { + echo "----------------------" + echo "Initializing MELONDS" + echo "----------------------" + mkdir -pv /var/config/melonDS/ + mkdir -pv "$rdhome/saves/nds/melonds" + mkdir -pv "$rdhome/states/nds/melonds" + dir_prep "$rdhome/bios" "/var/config/melonDS/bios" + cp -fvr $emuconfigs/melonDS.ini /var/config/melonDS/ + # Replace ~/retrodeck with $rdhome as ~ cannot be understood by MelonDS + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/melonDS/melonDS.ini +} + +citra_init() { + echo "------------------------" + echo "Initializing CITRA" + echo "------------------------" + mkdir -pv /var/config/citra-emu/ + mkdir -pv "$rdhome/saves/n3ds/citra/nand/" + mkdir -pv "$rdhome/saves/n3ds/citra/sdmc/" + dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log" + cp -fv $emuconfigs/citra-qt-config.ini /var/config/citra-emu/qt-config.ini + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini + #TODO: do the same with roms folders after new variables is pushed (check even the others qt-emu) + #But actually everything is always symlinked to retrodeck/roms so it might be not needed + #sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini +} + +rpcs3_init() { + echo "------------------------" + echo "Initializing RPCS3" + echo "------------------------" + mkdir -pv /var/config/rpcs3/ + cp -fvr $emuconfigs/rpcs3/* /var/config/rpcs3/ + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/rpcs3/vfs.yml +} + +xemu_init() { + echo "------------------------" + echo "Initializing XEMU" + echo "------------------------" + mkdir -pv $rdhome/saves/xbox/xemu/ + cp -fv $emuconfigs/xemu.toml /var/data/xemu/xemu.toml + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml + # Preparing HD dummy Image if the image is not found + if [ ! -f $rdhome/bios/xbox_hdd.qcow2 ] + then + wget "https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip" -P $rdhome/bios/ + unzip $rdhome/bios/xbox_hdd.qcow2.zip $rdhome/bios/ + rm -rfv $rdhome/bios/xbox_hdd.qcow2.zip + fi +} + +ppssppsdl_init() { + echo "------------------------" + echo "Initializing PPSSPPSDL" + echo "------------------------" + mkdir -p /var/config/ppsspp/PSP/SYSTEM/ + cp -fv $emuconfigs/ppssppsdl/* /var/config/ppsspp/PSP/SYSTEM/ + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/ppsspp/PSP/SYSTEM/ppsspp.ini +} + +duckstation_init() { + echo "------------------------" + echo "Initializing DUCKSTATION" + echo "------------------------" + mkdir -p /var/config/duckstation/ + cp -fv $emuconfigs/duckstation/* /var/config/duckstation + sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/ppsspp/PSP/SYSTEM/settings.ini +} + +standalones_init() { + # This script is configuring the standalone emulators with the default files present in emuconfigs folder + + echo "----------------------" + echo "Initializing standalone emulators" + echo "----------------------" + + yuzu_init + citra_init + dolphin_init + melonds_init + pcsx2_init + ppssppsdl_init + rpcs3_init + xemu_init + duckstation_init +} + +#========================= +# REUSABLE DIALOGS SECTION +#========================= + +debug_dialog() { + # This function is for displaying commands run by the Configurator without actually running them + # USAGE: debug_dialog "command" + + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --width=800 --height=600 \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Debug Dialog" \ + --text="$1" +} + +configurator_process_complete_dialog() { + # This dialog shows when a process is complete. + # USAGE: configurator_process_complete_dialog "process text" + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Quit" --extra-button="OK" --width=800 --height=600 \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Process Complete" \ + --text="The process of $1 is now complete.\n\nYou may need to quit and restart RetroDECK for your changes to take effect\n\nClick OK to return to the Main Menu or Quit to return to RetroDECK." + + if [ ! $? == 0 ] # OK button clicked + then + configurator_welcome_dialog + fi +} + +configurator_generic_dialog() { + # This dialog is for showing temporary messages before another process happens. + # USAGE: configurator_generid_dialog "info text" + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --width=800 --height=600 \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility" \ + --text="$1" +} + +configurator_destination_choice_dialog() { + # This dialog is for making things easy for new uers to move files to common locations. Gives the options for "Internal", "SD Card" and "Custom" locations. + # USAGE: $(configurator_destination_choice_dialog "folder being moved" "action text") + # This function returns one of the values: "Back" "Internal Storage" "SD Card" "Custom Location" + choice=$(zenity --title "RetroDECK Configurator Utility - Moving $1 folder" --info --no-wrap --ok-label="Back" --extra-button="Internal Storage" --extra-button="SD Card" --extra-button="Custom Location" --width=800 --height=600 \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="$2") + + echo $choice +} + + +#========================= +# LEGACY FUNCTIONS SECTION +#========================= + +# These functions were pulled from retrodeck.sh or global.sh and should be consolidated eventually + dir_prep() { # This script is creating a symlink preserving old folder contents and moving them in the new one - + # Call me with: # dir prep "real dir" "symlink location" real="$1" @@ -25,7 +413,7 @@ dir_prep() { echo "$real not found, creating it" #DEBUG mkdir -pv "$real" fi - + # creating the symlink echo "linking $real in $symlink" #DEBUG mkdir -pv "$(dirname "$symlink")" # creating the full path except the last folder @@ -52,141 +440,6 @@ tools_init() { cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml } -tools_init() { - rm -rfv /var/config/retrodeck/tools/ - mkdir -pv /var/config/retrodeck/tools/ - cp -rfv /app/retrodeck/tools/* /var/config/retrodeck/tools/ - mkdir -pv /var/config/emulationstation/.emulationstation/custom_systems/tools/ - rm -rfv /var/config/retrodeck/tools/gamelist.xml - cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml -} - -standalones_init() { - # This script is configuring the standalone emulators with the default files present in emuconfigs folder - - echo "----------------------" - echo "Initializing standalone emulators" - echo "----------------------" - - # Yuzu - echo "----------------------" - echo "Initializing YUZU" - echo "----------------------" - # removing dead symlinks as they were present in a past version - if [ -d $rdhome/bios/switch ]; then - find $rdhome/bios/switch -xtype l -exec rm {} \; - fi - # initializing the keys folder - dir_prep "$rdhome/bios/switch/keys" "/var/data/yuzu/keys" - # initializing the firmware folder - dir_prep "$rdhome/bios/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" - # configuring Yuzu - dir_prep "$rdhome/.logs/yuzu" "/var/data/yuzu/log" - mkdir -pv /var/config/yuzu/ - cp -fvr $emuconfigs/yuzu/* /var/config/yuzu/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/yuzu/qt-config.ini - dir_prep "$rdhome/screenshots" "/var/data/yuzu/screenshots" - - # Dolphin - echo "----------------------" - echo "Initializing DOLPHIN" - echo "----------------------" - mkdir -pv /var/config/dolphin-emu/ - cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/dolphin-emu/Dolphin.ini - dir_prep "$rdhome/saves/gc/dolphin/EUR" "/var/data/dolphin-emu/GC/EUR" - dir_prep "$rdhome/saves/gc/dolphin/USA" "/var/data/dolphin-emu/GC/USA" - dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" - dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" - dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" - dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" - - # pcsx2 - echo "----------------------" - echo "Initializing PCSX2" - echo "----------------------" - mkdir -pv "/var/config/PCSX2/inis" - mkdir -pv "$rdhome/saves/ps2/pcsx2/memcards" - mkdir -pv "$rdhome/states/ps2/pcsx2" - cp -fvr $emuconfigs/PCSX2/* /var/config/PCSX2/inis/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini - #dir_prep "$rdhome/states/ps2/pcsx2" "/var/config/PCSX2/sstates" - #dir_prep "$rdhome/screenshots" "/var/config/PCSX2/snaps" - #dir_prep "$rdhome/.logs" "/var/config/PCSX2/logs" - #dir_prep "$rdhome/bios" "$rdhome/bios/pcsx2" - - # MelonDS - echo "----------------------" - echo "Initializing MELONDS" - echo "----------------------" - mkdir -pv /var/config/melonDS/ - mkdir -pv "$rdhome/saves/nds/melonds" - mkdir -pv "$rdhome/states/nds/melonds" - dir_prep "$rdhome/bios" "/var/config/melonDS/bios" - cp -fvr $emuconfigs/melonDS.ini /var/config/melonDS/ - # Replace ~/retrodeck with $rdhome as ~ cannot be understood by MelonDS - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/melonDS/melonDS.ini - - # CITRA - echo "------------------------" - echo "Initializing CITRA" - echo "------------------------" - mkdir -pv /var/config/citra-emu/ - mkdir -pv "$rdhome/saves/n3ds/citra/nand/" - mkdir -pv "$rdhome/saves/n3ds/citra/sdmc/" - dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log" - cp -fv $emuconfigs/citra-qt-config.ini /var/config/citra-emu/qt-config.ini - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini - #TODO: do the same with roms folders after new variables is pushed (check even the others qt-emu) - #But actually everything is always symlinked to retrodeck/roms so it might be not needed - #sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini - - # RPCS3 - echo "------------------------" - echo "Initializing RPCS3" - echo "------------------------" - mkdir -pv /var/config/rpcs3/ - cp -fvr $emuconfigs/rpcs3/* /var/config/rpcs3/ - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/rpcs3/vfs.yml - - # XEMU - echo "------------------------" - echo "Initializing XEMU" - echo "------------------------" - mkdir -pv $rdhome/saves/xbox/xemu/ - cp -fv $emuconfigs/xemu.toml /var/data/xemu/xemu.toml - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml - # Preparing HD dummy Image if the image is not found - if [ ! -f $rdhome/bios/xbox_hdd.qcow2 ] - then - wget "https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip" -P $rdhome/bios/ - unzip $rdhome/bios/xbox_hdd.qcow2.zip $rdhome/bios/ - rm -rfv $rdhome/bios/xbox_hdd.qcow2.zip - fi - - # PPSSPPSDL - echo "------------------------" - echo "Initializing PPSSPPSDL" - echo "------------------------" - mkdir -p /var/config/ppsspp/PSP/SYSTEM/ - cp -fv $emuconfigs/ppssppsdl/* /var/config/ppsspp/PSP/SYSTEM/ - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/ppsspp/PSP/SYSTEM/ppsspp.ini - - # DUCKSTATION - echo "------------------------" - echo "Initializing DUCKSTATION" - echo "------------------------" - mkdir -p /var/config/duckstation/ - cp -fv $emuconfigs/duckstation/* /var/config/duckstation - sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/ppsspp/PSP/SYSTEM/settings.ini - - - # PICO-8 - # Moved PICO-8 stuff in the finit as only it knows here roms folders is - -} - ra_init() { dir_prep "$rdhome/bios" "/var/config/retroarch/system" dir_prep "$rdhome/.logs/retroarch" "/var/config/retroarch/logs" @@ -270,7 +523,7 @@ post_update() { dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" mkdir -pv $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/.emulationstation/es_settings.xml @@ -378,7 +631,7 @@ post_update() { [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file done - ) | + ) | zenity --progress \ --icon-name=net.retrodeck.retrodeck \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -424,7 +677,7 @@ browse(){ path_selected=false while [ $path_selected == false ] do - sdcard="$(zenity --file-selection --title="Choose retrodeck folder location" --directory)" + sdcard="$(zenity --file-selection --title="Choose retrodeck folder location" --directory)" echo "Path choosed: $sdcard, answer=$?" zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ --cancel-label="No" \ @@ -445,41 +698,6 @@ browse(){ done } -#advanced(){ -# # function to give advanced install options -# echo "Advaced choosed" -# -# choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ -# --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ -# --ok-label "ROMs" \ -# --extra-button "Media" \ -# --extra-button "Themes" \ -# --extra-button "Back" \ -# --text="What do you want to change?\n\nROMS folder = $roms_folder\nMedia folder (scraped data) = $media_folder\nThemes folder=$themes_folder" ) -# echo "Choice is $choice" -# -# case $choice in -# -# "" ) # Internal (yes) -# echo "ROMs" -# ;; -# -# "Media" ) -# echo "Media" -# ;; -# -# "Themes" ) -# echo "Themes" -# ;; -# -# "Back" ) # Browse + not found fallback -# echo "Back" -# finit -# ;; -# -# esac -#} - finit() { # Force/First init, depending on the situation @@ -540,7 +758,7 @@ finit() { rm -rfv /var/config/emulationstation/ rm -rfv /var/config/retrodeck/tools/ mkdir -pv /var/config/emulationstation/ - + # Initializing ES-DE # TODO: after the next update of ES-DE this will not be needed - let's test it emulationstation --home /var/config/emulationstation --create-system-dirs @@ -614,12 +832,12 @@ conf_write() { then sed -i "s%states_folder=.*%states_folder=$states_folder%" "$rd_conf" fi - + if [ ! -z "$bios_folder" ] then sed -i "s%bios_folder=.*%bios_folder=$bios_folder%" "$rd_conf" fi - + if [ ! -z "$media_folder" ] then sed -i "s%media_folder=.*%media_folder=$media_folder%" "$rd_conf" diff --git a/retrodeck.sh b/retrodeck.sh index 3d2c4d5a..87a949a1 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -434,7 +434,7 @@ browse(){ while [ $path_selected == false ] do sdcard="$(zenity --file-selection --title="Choose retrodeck folder location" --directory)" - echo "Path choosed: $sdcard, answer=$?" + # echo "Path choosed: $sdcard, answer=$?" # This echo breaks this function, the next "if" will always be answered yes if it is here zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ --cancel-label="No" \ --ok-label "Yes" \ diff --git a/tools/configurator.sh b/tools/configurator.sh index 13d3958c..6e415cab 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -2,8 +2,11 @@ # VARIABLES SECTION -source /app/bin/global.sh # Grab global variables -source /app/libexec/functions.sh # Source global functions +rd_conf="retrodeck.cfg" # uncomment for standalone testing +source functions.sh # uncomment for standalone testing + +#source /app/bin/global.sh # uncomment for flatpak testing +#source /app/libexec/functions.sh # uncomment for flatpak testing # Config files for emulators with single config files @@ -36,200 +39,6 @@ pcsx2conf="/var/config/PCSX2/inis/GS.ini" pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" - -# FUNCTION SECTION - -browse() { - # This function browses for a directory and returns the path chosen - # USAGE: path_to_be_browsed_for=$(browse $source/destination_text $action_text) - - path_selected=false - - while [ $path_selected == false ] - do - target="$(zenity --file-selection --title="Choose $1 location to $2" --directory)" - echo "Path chosen: $target, answer=$?" - if [ $? == 0 ] #yes - then - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ - --text="Directory $target chosen, is this correct?" - if [ $? == 0 ] - then - path_selected=true - echo $target - break - else - - fi - - else - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ - --text="No directory selected. Do you want to return to the main menu?" - if [ $? == 1 ] - then - configurator_welcome_dialog - fi - fi - done -} - -verify_space() { - # Function used for verifying adequate space before moving directories around - # USAGE: verify_space $source_dir $dest_dir - # Function returns "true" if there is enough space, "false" if there is not - - source_size=$(du -sk /home/deck/retrodeck | awk '{print $1}') - source_size=$((source_size+(source_size/10))) # Add 10% to source size for safety - dest_avail=$(df -k --output=avail $2 | tail -1) - - if [[ $source_size -ge $dest_avail ]]; then - echo "false" - else - echo "true" - fi -} - -move() { - # Function to move a directory from one parent to another - # USAGE: move $source_dir $dest_dir - - if [[ verify_space $1 $2 ]]; then - ( - echo "mv -v -t $2 $1" - ) | - 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 - Move in Progress" \ - --text="Moving directory $1 to new location of $2, please wait." - - else - zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move Directories" \ - --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." - - configurator_move_dialog - fi -} - -set_setting() { -# Function for editing settings -# USAGE: set_setting $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) - -case $4 in - - "retrodeck" ) - sed -i "s%$2=.*%$2=$3%" $1 - ;; - - "retroarch" ) - sed -i "s%$2 = \".*\"%$2 = \"$3\"%" $1 - ;; - - "dolphin" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "duckstation" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "pcsx2" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "ppsspp" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "rpcs3" ) # This does not currently work for settings with a $ in them - sed -i "s%$2: .*%$2: $3%" $1 - ;; - - "yuzu" ) - #sed -i "s%$2=.*%$2=$3%" $1 - ;; - - "citra" ) - #sed -i "s%$2=.*%$2=$3%" $1 - ;; - - "melonds" ) - sed -i "s%$2=.*%$2=$3%" $1 - ;; - - "xemu" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "emulationstation" ) - sed -i "s%$2\" \" value=\".*\"%$2\" \" value=\"$3\"" $1 - ;; - -esac - -} - -get_setting() { -# Function for getting the current value of a setting from a config file -# USAGE: get_setting $setting_file $setting_name $system (needed as different systems use different config file syntax) - -case $3 in - - "retrodeck" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") - ;; - - "retroarch" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") - ;; - - "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; - - "duckstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; - - "pcsx2" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; - - "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; - - "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces - echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") - ;; - - "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") - ;; - - "citra" ) # Use quotes when passing setting_name, as this config file contains special characters - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") - ;; - - "melonds" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") - ;; - - "xemu" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; - - "emulationstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") - ;; - -esac - -} - # DIALOG SECTION # Configurator Option Tree @@ -237,11 +46,13 @@ esac # Welcome # - Move Directories # - Migrate ROM directory -# - Migrate downloaded_media # - Migrate BIOS directory +# - Migrate downloaded_media # - Change Emulator Options # - RetroArch # - Change Rewind Setting +# - Enable/disable borders +# - Enable disable widescreen # - Add or Update Files # - Add specific cores # - Grab all missing cores @@ -250,70 +61,146 @@ esac # - Login prompt # - Reset RetroDECK # - Reset RetroArch -# - Reset Standalone Emulators +# - Reset Specific Standalone Emulator +# - Reset Yuzu +# - Reset Dolphin +# - Reset PCSX2 +# - Reset MelonDS +# - Reset Citra +# - Reset RPCS3 +# - Reset XEMU +# - Reset PPSSPP +# - Reset Duckstation +# - Reset All Standalone Emulators # - Reset Tools # - Reset All # Code for the menus should be put in reverse order, so functions for sub-menus exists before it is called by the parent menu -configurator_process_complete_dialog() { - # This dialog shows when a process is complete. - # USAGE: configurator_process_complete_dialog "process text" - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Process Complete" \ - --text="The process of $1 is now complete.\n\nYou may need to quit and restart RetroDECK for your changes to take effect\n\nClick OK to return to the Main Menu or Quit to return to RetroDECK." - - if [ $? == 0 ] # OK button clicked - then - configurator_welcome_dialog - fi -} +# DIALOG TREE FUNCTIONS configurator_reset_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Reset RetroArch" "Reset RetroArch to default settings" \ - "Reset Standalones" "Reset standalone emulators to default settings" \ + "Reset Specific Standalone" "Reset only one specific standalone emulator to default settings" \ + "Reset All Standalones" "Reset all standalone emulators to default settings" \ "Reset Tools" "Reset Tools menu entries" \ "Reset All" "Reset RetroDECK to default settings" ) case $choice in "Reset RetroArch" ) - ra_init + debug_dialog "ra_init" configurator_process_complete_dialog "resetting RetroArch" ;; - "Reset Standalones" ) - standalones_init + "Reset Specific Standalone" ) + emulator_to_reset=$(zenity --list \ + --title "RetroDECK Configurator Utility - Reset Specific Standalone Emulator" --cancel-label="Back" --width=800 --height=600 \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Which emulator do you want to reset to default?" \ + --hide-header \ + --column=emulator \ + "RetroArch" \ + "Citra" \ + "Dolphin" \ + "Duckstation" \ + "MelonDS" \ + "PCSX2" \ + "PPSSPP" \ + "RPCS3" \ + "XEMU" \ + "Yuzu") + + case $emulator_to_reset in + + "RetroArch" ) + debug_dialog "ra_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "Citra" ) + debug_dialog "citra_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "Dolphin" ) + debug_dialog "dolphin_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "Duckstation" ) + debug_dialog "duckstation_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "MelonDS" ) + debug_dialog "melonds_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "PCSX2" ) + debug_dialog "pcsx2_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "PPSSPP" ) + debug_dialog "ppssppsdl_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "RPCS3" ) + debug_dialog "rpcs3_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "XEMU" ) + debug_dialog "xemu_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "Yuzu" ) + debug_dialog "yuzu_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; + + "" ) # No selection made or Back button clicked + configurator_reset_dialog + ;; + + esac + ;; + + "Reset All Standalones" ) + debug_dialog "standalones_init" configurator_process_complete_dialog "resetting standalone emulators" ;; "Reset Tools" ) - tools_init + debug_dialog "tools_init" configurator_process_complete_dialog "resetting the tools menu" ;; "Reset All" ) - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Reset RetroDECK" \ --text="You are resetting RetroDECK to its default state.\n\nAfter the process is complete you will need to exit RetroDECK and run it again." - rm -f "$lockfile" + debug_dialog "rm -f "$lockfile"" configurator_process_complete_dialog "resetting RetroDECK" ;; "" ) # No selection made or Back button clicked configurator_welcome_dialog ;; - + esac } configurator_retroachivement_dialog() { - login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" \ + login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Enter your RetroAchievements Account details.\n\nBe aware that this tool cannot verify your login details.\nFor registration and more info visit\nhttps://retroachievements.org/\n" \ --separator="=SEP=" \ @@ -329,29 +216,32 @@ configurator_retroachivement_dialog() { user=${arrIN[0]} pass=${arrIN[1]} - sed -i "s%cheevos_enable =.*%cheevos_enable = \"true\"%" $raconf - sed -i "s%cheevos_username =.*%cheevos_username = \"$user\"%" $raconf - sed -i "s%cheevos_password =.*%cheevos_password = \"$pass\"%" $raconf + #sed -i "s%cheevos_enable =.*%cheevos_enable = \"true\"%" $raconf + #sed -i "s%cheevos_username =.*%cheevos_username = \"$user\"%" $raconf + #sed -i "s%cheevos_password =.*%cheevos_password = \"$pass\"%" $raconf + + debug_dialog "sed -i "s%cheevos_enable =.*%cheevos_enable = \"true\"%" $raconf\n\nsed -i "s%cheevos_username =.*%cheevos_username = \"$user\"%" $raconf\n\nsed -i "s%cheevos_password =.*%cheevos_password = \"$pass\"%" $raconf" configurator_process_complete_dialog "logging in to RetroAchievements" } configurator_update_dialog() { - + configurator_generic_dialog "This feature is not available yet" + configurator_welcome_dialog } configurator_power_user_changes_dialog() { - zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" \ + zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\n\nplease continue only if you know what you're doing.\n\nDo you want to continue?" - + if [ $? == 1 ] # Cancel button clicked then configurator_options_dialog fi - emulator="$(zenity --list \ - --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" \ + emulator=$(zenity --list \ + --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Which emulator do you want to configure?" \ --hide-header \ @@ -366,7 +256,7 @@ configurator_power_user_changes_dialog() { "PPSSPP" \ "RPCS3" \ "XEMU" \ - "Yuzu")" + "Yuzu") case $emulator in @@ -377,43 +267,43 @@ configurator_power_user_changes_dialog() { "Citra" ) citra-qt ;; - + "Dolphin" ) dolphin-emu ;; - + "Duckstation" ) duckstation-qt ;; - + "MelonDS" ) melonDS ;; - + "PCSX2-QT" ) pcsx2-qt ;; - + "PCSX2-Legacy" ) pcsx2 ;; - + "PPSSPP" ) PPSSPPSDL ;; - + "RPCS3" ) rpcs3 ;; - + "XEMU" ) xemu ;; - + "Yuzu" ) yuzu ;; - + "" ) # No selection made or Back button clicked configurator_options_dialog ;; @@ -423,36 +313,36 @@ configurator_power_user_changes_dialog() { configurator_retroarch_rewind_dialog() { if [[ $(get_setting $raconf rewind_enable retroarch) == "true" ]]; then - zenity --question \ + zenity --question --width=800 --height=600 \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Rewind" \ --text="Rewind is currently enabled. Do you want to disable it?." - if [ $? == 0 ] + if [ $? == 0 ] then - set_setting $raconf rewind_enable true retroarch + debug_dialog "set_setting $raconf rewind_enable true retroarch" configurator_process_complete_dialog "enabling Rewind" - else + else configurator_options_dialog fi else - zenity --question \ + zenity --question --width=800 --height=600 \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Rewind" \ --text="Rewind is currently disabled, do you want to enable it?\n\nNOTE:\nThis may impact performance expecially on the latest systems." - if [ $? == 0 ] + if [ $? == 0 ] then - set_setting $raconf rewind_enable false retroarch + debug_dialog "set_setting $raconf rewind_enable false retroarch" configurator_process_complete_dialog "disabling Rewind" - else + else configurator_options_dialog fi fi } configurator_retroarch_options_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Change Rewind Setting" "Enable or disable the Rewind function in RetroArch" ) @@ -466,12 +356,12 @@ configurator_retroarch_options_dialog() { "" ) # No selection made or Back button clicked configurator_options_dialog ;; - + esac } configurator_options_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Change RetroArch Settings" "Change settings specific to RetroArch" \ @@ -490,38 +380,200 @@ configurator_options_dialog() { "" ) # No selection made or Back button clicked configurator_welcome_dialog ;; - + esac } configurator_move_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Move ROMs" "Move your ROMs directory to a new location" \ "Move BIOS" "Move your BIOS directory to a new location" \ - "Move Downloaded Media" "Move your downloaded media directory to a new location" \ - "Move Saves and States" "Move your save and state directories to a new location" ) + "Move Downloaded Media" "Move your downloaded media directory to a new location" ) case $choice in "Move ROMs" ) - - ;; + if [[ -d $roms_folder ]]; then + configurator_generic_dialog "The current ROMs folder was found at $roms_folder.\n\nPlease select the location you would like to move it." + destination=$(configurator_destination_choice_dialog "ROMs" "Please choose a destination for the ROMs folder.") + case $destination in + "Back" ) + configurator_move_dialog + ;; + "Internal Storage" ) + if [[ $roms_folder == "$rdhome/roms" ]]; then + configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving ROMs folder to $destination" + move $roms_folder "$rdhome/roms" + roms_folder="$rdhome/roms" + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the ROMs directory to internal storage" + fi + ;; + "SD Card" ) + if [[ $roms_folder == "$sdcard/retrodeck/roms" ]]; then + configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving ROMs folder to $destination" + move $roms_folder "$sdcard/retrodeck/roms" + roms_folder="$sdcard/retrodeck/roms" + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the ROMs directory to SD card" + fi + ;; + "Custom Location" ) + configurator_generic_dialog "Please select the custom location to move the ROMs folder to." + destination=$(browse "ROMs directory destination") + if [[ $destination == $roms_folder ]]; then + configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving ROMs folder from $roms_folder\n\nto $destination.\n\nClick OK to continue." + move $roms_folder $destination + roms_folder=$destination + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the ROMs directory to $destination" + fi + ;; + esac + else + configurator_generic_dialog "The ROMs folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the ROMs folder." + roms_folder=$(browse "ROMs directory location") + conf_write + configurator_generic_dialog "ROMs folder now configured at $roms_folder. Please start the moving process again." + configurator_move_dialog + fi + ;; "Move BIOS" ) - - ;; + if [[ -d $bios_folder ]]; then + configurator_generic_dialog "The current BIOS folder was found at $bios_folder.\n\nPlease select the location you would like to move it." + destination=$(configurator_destination_choice_dialog "BIOS" "Please choose a destination for the BIOS folder.") + case $destination in + "Back" ) + configurator_move_dialog + ;; + "Internal Storage" ) + if [[ $bios_folder == "$rdhome/bios" ]]; then + configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving BIOS folder to $destination" + move $bios_folder "$rdhome/bios" + bios_folder="$rdhome/bios" + debug_dialog "dir_prep $bios_folder "$rdhome/bios"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the BIOS directory to internal storage" + fi + ;; + "SD Card" ) + if [[ $bios_folder == "$sdcard/retrodeck/bios" ]]; then + configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving BIOS folder to $destination" + move $bios_folder "$sdcard/retrodeck/bios" + bios_folder="$sdcard/retrodeck/bios" + debug_dialog "dir_prep $bios_folder "$rdhome/bios"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the BIOS directory to SD card" + fi + ;; + "Custom Location" ) + configurator_generic_dialog "Please select the custom location to move the BIOS folder to." + destination=$(browse "BIOS directory destination") + if [[ $destination == $bios_folder ]]; then + configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving BIOS folder from $bios_folder\n\nto $destination.\n\nClick OK to continue." + move $bios_folder $destination + bios_folder=$destination + debug_dialog "dir_prep $bios_folder "$rdhome/bios"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the BIOS directory to $destination" + fi + ;; + esac + else + configurator_generic_dialog "The BIOS folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the BIOS folder." + bios_folder=$(browse "BIOS directory location") + conf_write + configurator_generic_dialog "BIOS folder now configured at $bios_folder. Please start the moving process again." + configurator_move_dialog + fi + ;; "Move Downloaded Media" ) - ;; - - "Move Saves and States" ) - ;; + if [[ -d $media_folder ]]; then + configurator_generic_dialog "The current media folder was found at $media_folder.\n\nPlease select the location you would like to move it." + destination=$(configurator_destination_choice_dialog "Media" "Please choose a destination for the Media folder.") + case $destination in + "Back" ) + configurator_move_dialog + ;; + "Internal Storage" ) + if [[ $media_folder == "$rdhome/downloaded_media" ]]; then + configurator_generic_dialog "The media folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving media folder to $destination" + move $media_folder "$rdhome/downloaded_media" + media_folder="$rdhome/downloaded_media" + debug_dialog "dir_prep $media_folder "$rdhome/downloaded_media"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the media directory to internal storage" + fi + ;; + "SD Card" ) + if [[ $media_folder == "$sdcard/retrodeck/downloaded_media" ]]; then + configurator_generic_dialog "The media folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving media folder to $destination" + move $media_folder "$sdcard/retrodeck/downloaded_media" + media_folder="$sdcard/retrodeck/downloaded_media" + debug_dialog "dir_prep $media_folder "$rdhome/downloaded_media"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the media directory to SD card" + fi + ;; + "Custom Location" ) + configurator_generic_dialog "Please select the custom location to move the media folder to." + destination=$(browse "Media directory destination") + if [[ $destination == $media_folder ]]; then + configurator_generic_dialog "The media folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving media folder from $media_folder\n\nto $destination.\n\nClick OK to continue." + move $media_folder $destination + media_folder=$destination + debug_dialog "dir_prep $media_folder "$rdhome/downloaded_media"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the media directory to $destination" + fi + ;; + esac + else + configurator_generic_dialog "The media folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the media folder." + media_folder=$(browse "Media directory location") + conf_write + configurator_generic_dialog "Media folder now configured at $media_folder. Please start the moving process again." + configurator_move_dialog + fi + ;; "" ) # No selection made or Back button clicked configurator_welcome_dialog - ;; + ;; esac @@ -535,12 +587,12 @@ configurator_welcome_dialog() { setting= setting_value= - choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ + choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" --width=800 --height=600 \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Move Files" "Move files between internal/SD card or to custom locations" \ "Change Options" "Adjust how RetroDECK behaves" \ - "Upgrade" "Upgrade parts of RetroDECK" \ + "Update" "Update parts of RetroDECK" \ "RetroAchivements" "Log in to RetroAchievements" \ "Reset" "Reset parts of RetroDECK" ) @@ -554,7 +606,7 @@ configurator_welcome_dialog() { configurator_options_dialog ;; - "Upgrade" ) + "Update" ) configurator_update_dialog ;; @@ -565,11 +617,11 @@ configurator_welcome_dialog() { "Reset" ) configurator_reset_dialog ;; - - "" ) + "Quit" ) + exit 0 ;; - + esac } From e21beab26c2f646f77ef2cf44643b06a11622192 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Thu, 13 Oct 2022 15:26:02 -0400 Subject: [PATCH 08/46] Merge remote-tracking branch --- functions.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/functions.sh b/functions.sh index 158319fe..5311e61c 100644 --- a/functions.sh +++ b/functions.sh @@ -199,6 +199,14 @@ case $3 in esac } +disable_setting() { + +} + +enable_setting() { + +} + yuzu_init() { echo "----------------------" echo "Initializing YUZU" @@ -373,7 +381,7 @@ configurator_generic_dialog() { } configurator_destination_choice_dialog() { - # This dialog is for making things easy for new uers to move files to common locations. Gives the options for "Internal", "SD Card" and "Custom" locations. + # This dialog is for making things easy for new users to move files to common locations. Gives the options for "Internal", "SD Card" and "Custom" locations. # USAGE: $(configurator_destination_choice_dialog "folder being moved" "action text") # This function returns one of the values: "Back" "Internal Storage" "SD Card" "Custom Location" choice=$(zenity --title "RetroDECK Configurator Utility - Moving $1 folder" --info --no-wrap --ok-label="Back" --extra-button="Internal Storage" --extra-button="SD Card" --extra-button="Custom Location" --width=800 --height=600 \ @@ -383,7 +391,6 @@ configurator_destination_choice_dialog() { echo $choice } - #========================= # LEGACY FUNCTIONS SECTION #========================= From b42d046c203317da59d06df93418e47c39bd4b98 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 14 Oct 2022 15:14:07 -0400 Subject: [PATCH 09/46] Update Cheevos to use internal functions --- functions.sh | 2 +- tools/configurator.sh | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/functions.sh b/functions.sh index 5311e61c..e504899b 100644 --- a/functions.sh +++ b/functions.sh @@ -83,7 +83,7 @@ move() { set_setting() { # Function for editing settings # USAGE: set_setting $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) -# NOTES: Citra, Yuzu and RPCS3 have special conditions, see comments below +# NOTES: RPCS3 has special conditions, see comments below case $4 in diff --git a/tools/configurator.sh b/tools/configurator.sh index 6e415cab..d6562bc8 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -216,11 +216,11 @@ configurator_retroachivement_dialog() { user=${arrIN[0]} pass=${arrIN[1]} - #sed -i "s%cheevos_enable =.*%cheevos_enable = \"true\"%" $raconf - #sed -i "s%cheevos_username =.*%cheevos_username = \"$user\"%" $raconf - #sed -i "s%cheevos_password =.*%cheevos_password = \"$pass\"%" $raconf + #set_setting $raconf cheevos_enable true retroarch + #set_setting $raconf cheevos_username $user retroarch + #set_setting $raconf cheevos_password $pass retroarch - debug_dialog "sed -i "s%cheevos_enable =.*%cheevos_enable = \"true\"%" $raconf\n\nsed -i "s%cheevos_username =.*%cheevos_username = \"$user\"%" $raconf\n\nsed -i "s%cheevos_password =.*%cheevos_password = \"$pass\"%" $raconf" + debug_dialog "set_setting $raconf cheevos_enable true retroarch\n\nset_setting $raconf cheevos_username $user retroarch\n\nset_setting $raconf cheevos_password $pass retroarch" configurator_process_complete_dialog "logging in to RetroAchievements" } From 1156851c322023a53db663e8dc4193b8e4361fca Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 21 Oct 2022 14:58:50 -0400 Subject: [PATCH 10/46] Change function name for get_setting --- functions.sh | 8 ++++---- tools/configurator.sh | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/functions.sh b/functions.sh index e504899b..488caac2 100644 --- a/functions.sh +++ b/functions.sh @@ -80,9 +80,9 @@ move() { fi } -set_setting() { +set_setting_value() { # Function for editing settings -# USAGE: set_setting $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) +# USAGE: set_setting_value $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) # NOTES: RPCS3 has special conditions, see comments below case $4 in @@ -140,9 +140,9 @@ case $4 in esac } -get_setting() { +get_setting_value() { # Function for getting the current value of a setting from a config file -# USAGE: get_setting $setting_file $setting_name $system (needed as different systems use different config file syntax) +# USAGE: get_setting_value $setting_file $setting_name $system (needed as different systems use different config file syntax) case $3 in diff --git a/tools/configurator.sh b/tools/configurator.sh index d6562bc8..6e21b4a6 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -216,11 +216,11 @@ configurator_retroachivement_dialog() { user=${arrIN[0]} pass=${arrIN[1]} - #set_setting $raconf cheevos_enable true retroarch - #set_setting $raconf cheevos_username $user retroarch - #set_setting $raconf cheevos_password $pass retroarch + #set_setting_value $raconf cheevos_enable true retroarch + #set_setting_value $raconf cheevos_username $user retroarch + #set_setting_value $raconf cheevos_password $pass retroarch - debug_dialog "set_setting $raconf cheevos_enable true retroarch\n\nset_setting $raconf cheevos_username $user retroarch\n\nset_setting $raconf cheevos_password $pass retroarch" + debug_dialog "set_setting_value $raconf cheevos_enable true retroarch\n\nset_setting_value $raconf cheevos_username $user retroarch\n\nset_setting_value $raconf cheevos_password $pass retroarch" configurator_process_complete_dialog "logging in to RetroAchievements" } @@ -312,7 +312,7 @@ configurator_power_user_changes_dialog() { } configurator_retroarch_rewind_dialog() { - if [[ $(get_setting $raconf rewind_enable retroarch) == "true" ]]; then + if [[ $(get_setting_value $raconf rewind_enable retroarch) == "true" ]]; then zenity --question --width=800 --height=600 \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Rewind" \ @@ -320,7 +320,7 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then - debug_dialog "set_setting $raconf rewind_enable true retroarch" + debug_dialog "set_setting_value $raconf rewind_enable true retroarch" configurator_process_complete_dialog "enabling Rewind" else configurator_options_dialog @@ -333,7 +333,7 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then - debug_dialog "set_setting $raconf rewind_enable false retroarch" + debug_dialog "set_setting_value $raconf rewind_enable false retroarch" configurator_process_complete_dialog "disabling Rewind" else configurator_options_dialog From ececa7cbec759d33a9a11e19790c98f34152e5c8 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 24 Oct 2022 15:49:47 -0400 Subject: [PATCH 11/46] Set up basics for Configurator and config patching --- .../defaults/citra/citra-qt-config.ini | 496 +++ emu-configs/defaults/dolphin/Dolphin.ini | 55 + emu-configs/defaults/dolphin/FreeLook.ini | 3 + emu-configs/defaults/dolphin/GCKeyNew.ini | 93 + emu-configs/defaults/dolphin/GCPadNew.ini | 40 + emu-configs/defaults/dolphin/GFX.ini | 24 + emu-configs/defaults/dolphin/Hotkeys.ini | 45 + emu-configs/defaults/dolphin/Qt.ini | 84 + emu-configs/defaults/dolphin/WiimoteNew.ini | 106 + emu-configs/defaults/duckstation/settings.ini | 283 ++ emu-configs/defaults/melonds/melonDS.ini | 135 + emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini | 440 +++ emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini | 115 + emu-configs/defaults/ppsspp/controls.ini | 23 + emu-configs/defaults/ppsspp/ppsspp.ini | 449 +++ emu-configs/defaults/retroarch/retroarch.cfg | 3198 +++++++++++++++++ emu-configs/defaults/rpcs3/config.yml | 223 ++ emu-configs/defaults/rpcs3/vfs.yml | 49 + emu-configs/defaults/xemu/xemu.toml | 9 + emu-configs/defaults/yuzu/qt-config.ini | 1203 +++++++ functions.sh | 1481 ++++---- global.sh | 76 +- net.retrodeck.retrodeck.yml | 30 +- overlays/borders/dark/gb.png | Bin 357227 -> 0 bytes overlays/borders/light/gb.png | Bin 444603 -> 0 bytes retrodeck.sh | 616 +--- tools/configurator.sh | 37 +- 27 files changed, 7875 insertions(+), 1438 deletions(-) create mode 100644 emu-configs/defaults/citra/citra-qt-config.ini create mode 100644 emu-configs/defaults/dolphin/Dolphin.ini create mode 100644 emu-configs/defaults/dolphin/FreeLook.ini create mode 100644 emu-configs/defaults/dolphin/GCKeyNew.ini create mode 100644 emu-configs/defaults/dolphin/GCPadNew.ini create mode 100644 emu-configs/defaults/dolphin/GFX.ini create mode 100644 emu-configs/defaults/dolphin/Hotkeys.ini create mode 100644 emu-configs/defaults/dolphin/Qt.ini create mode 100644 emu-configs/defaults/dolphin/WiimoteNew.ini create mode 100644 emu-configs/defaults/duckstation/settings.ini create mode 100644 emu-configs/defaults/melonds/melonDS.ini create mode 100644 emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini create mode 100644 emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini create mode 100644 emu-configs/defaults/ppsspp/controls.ini create mode 100644 emu-configs/defaults/ppsspp/ppsspp.ini create mode 100644 emu-configs/defaults/retroarch/retroarch.cfg create mode 100644 emu-configs/defaults/rpcs3/config.yml create mode 100644 emu-configs/defaults/rpcs3/vfs.yml create mode 100644 emu-configs/defaults/xemu/xemu.toml create mode 100644 emu-configs/defaults/yuzu/qt-config.ini delete mode 100644 overlays/borders/dark/gb.png delete mode 100644 overlays/borders/light/gb.png diff --git a/emu-configs/defaults/citra/citra-qt-config.ini b/emu-configs/defaults/citra/citra-qt-config.ini new file mode 100644 index 00000000..6d162bb1 --- /dev/null +++ b/emu-configs/defaults/citra/citra-qt-config.ini @@ -0,0 +1,496 @@ +[Audio] +enable_audio_stretching=true +enable_audio_stretching\default=true +enable_dsp_lle=false +enable_dsp_lle\default=true +enable_dsp_lle_multithread=false +enable_dsp_lle_multithread\default=true +mic_input_device=Default +mic_input_device\default=true +mic_input_type=0 +mic_input_type\default=true +output_device=auto +output_device\default=true +output_engine=auto +output_engine\default=true +volume=@Variant(\0\0\0\x87?\x80\0\0) +volume\default=true + +[Camera] +camera_inner_config= +camera_inner_config\default=true +camera_inner_flip=0 +camera_inner_flip\default=true +camera_inner_name=blank +camera_inner_name\default=true +camera_outer_left_config= +camera_outer_left_config\default=true +camera_outer_left_flip=0 +camera_outer_left_flip\default=true +camera_outer_left_name=blank +camera_outer_left_name\default=true +camera_outer_right_config= +camera_outer_right_config\default=true +camera_outer_right_flip=0 +camera_outer_right_flip\default=true +camera_outer_right_name=blank +camera_outer_right_name\default=true + +[Controls] +profile=0 +profile\default=true +profiles\1\button_a="code:65,engine:keyboard" +profiles\1\button_a\default=true +profiles\1\button_b="code:83,engine:keyboard" +profiles\1\button_b\default=true +profiles\1\button_debug="code:79,engine:keyboard" +profiles\1\button_debug\default=true +profiles\1\button_down="code:71,engine:keyboard" +profiles\1\button_down\default=true +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="code:81,engine:keyboard" +profiles\1\button_l\default=true +profiles\1\button_left="code:70,engine:keyboard" +profiles\1\button_left\default=true +profiles\1\button_r="code:87,engine:keyboard" +profiles\1\button_r\default=true +profiles\1\button_right="code:72,engine:keyboard" +profiles\1\button_right\default=true +profiles\1\button_select="code:78,engine:keyboard" +profiles\1\button_select\default=true +profiles\1\button_start="code:77,engine:keyboard" +profiles\1\button_start\default=true +profiles\1\button_up="code:84,engine:keyboard" +profiles\1\button_up\default=true +profiles\1\button_x="code:90,engine:keyboard" +profiles\1\button_x\default=true +profiles\1\button_y="code:88,engine:keyboard" +profiles\1\button_y\default=true +profiles\1\button_zl="code:49,engine:keyboard" +profiles\1\button_zl\default=true +profiles\1\button_zr="code:50,engine:keyboard" +profiles\1\button_zr\default=true +profiles\1\c_stick="down:code$075$1engine$0keyboard,engine:analog_from_button,left:code$074$1engine$0keyboard,modifier:code$068$1engine$0keyboard,modifier_scale:0.500000,right:code$076$1engine$0keyboard,up:code$073$1engine$0keyboard" +profiles\1\c_stick\default=true +profiles\1\circle_pad="down:code$016777237$1engine$0keyboard,engine:analog_from_button,left:code$016777234$1engine$0keyboard,modifier:code$068$1engine$0keyboard,modifier_scale:0.500000,right:code$016777236$1engine$0keyboard,up:code$016777235$1engine$0keyboard" +profiles\1\circle_pad\default=true +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\name=default +profiles\1\name\default=true +profiles\1\touch_device=engine:emu_window +profiles\1\touch_device\default=true +profiles\1\touch_from_button_map=0 +profiles\1\touch_from_button_map\default=true +profiles\1\udp_input_address=127.0.0.1 +profiles\1\udp_input_address\default=true +profiles\1\udp_input_port=26760 +profiles\1\udp_input_port\default=true +profiles\1\udp_pad_index=0 +profiles\1\udp_pad_index\default=true +profiles\1\use_touch_from_button=false +profiles\1\use_touch_from_button\default=true +profiles\size=1 +touch_from_button_maps\1\entries\size=0 +touch_from_button_maps\1\name=default +touch_from_button_maps\1\name\default=true +touch_from_button_maps\size=1 + +[Core] +cpu_clock_percentage=100 +cpu_clock_percentage\default=true +use_cpu_jit=true +use_cpu_jit\default=true + +[Data%20Storage] +nand_directory= +nand_directory\default=true +sdmc_directory= +sdmc_directory\default=true +use_virtual_sd=true +use_virtual_sd\default=true + +[Debugging] +LLE\AC=false +LLE\AC\default=true +LLE\ACT=false +LLE\ACT\default=true +LLE\AM=false +LLE\AM\default=true +LLE\BOSS=false +LLE\BOSS\default=true +LLE\CAM=false +LLE\CAM\default=true +LLE\CDC=false +LLE\CDC\default=true +LLE\CECD=false +LLE\CECD\default=true +LLE\CFG=false +LLE\CFG\default=true +LLE\CSND=false +LLE\CSND\default=true +LLE\DLP=false +LLE\DLP\default=true +LLE\DSP=false +LLE\DSP\default=true +LLE\ERR=false +LLE\ERR\default=true +LLE\FRD=false +LLE\FRD\default=true +LLE\FS=false +LLE\FS\default=true +LLE\GPIO=false +LLE\GPIO\default=true +LLE\GSP=false +LLE\GSP\default=true +LLE\HID=false +LLE\HID\default=true +LLE\HTTP=false +LLE\HTTP\default=true +LLE\I2C=false +LLE\I2C\default=true +LLE\IR=false +LLE\IR\default=true +LLE\LDR=false +LLE\LDR\default=true +LLE\MCU=false +LLE\MCU\default=true +LLE\MIC=false +LLE\MIC\default=true +LLE\MP=false +LLE\MP\default=true +LLE\MVD=false +LLE\MVD\default=true +LLE\NDM=false +LLE\NDM\default=true +LLE\NEWS=false +LLE\NEWS\default=true +LLE\NFC=false +LLE\NFC\default=true +LLE\NIM=false +LLE\NIM\default=true +LLE\NS=false +LLE\NS\default=true +LLE\NWM=false +LLE\NWM\default=true +LLE\PDN=false +LLE\PDN\default=true +LLE\PM=false +LLE\PM\default=true +LLE\PS=false +LLE\PS\default=true +LLE\PTM=false +LLE\PTM\default=true +LLE\PXI=false +LLE\PXI\default=true +LLE\QTM=false +LLE\QTM\default=true +LLE\SOC=false +LLE\SOC\default=true +LLE\SPI=false +LLE\SPI\default=true +LLE\SSL=false +LLE\SSL\default=true +gdbstub_port=24689 +gdbstub_port\default=true +record_frame_times=false +use_gdbstub=false +use_gdbstub\default=true + +[Layout] +custom_bottom_bottom=480 +custom_bottom_bottom\default=true +custom_bottom_left=40 +custom_bottom_left\default=true +custom_bottom_right=360 +custom_bottom_right\default=true +custom_bottom_top=240 +custom_bottom_top\default=true +custom_layout=false +custom_layout\default=true +custom_top_bottom=240 +custom_top_bottom\default=true +custom_top_left=0 +custom_top_left\default=true +custom_top_right=400 +custom_top_right\default=true +custom_top_top=0 +custom_top_top\default=true +factor_3d=0 +factor_3d\default=true +filter_mode=true +filter_mode\default=true +layout_option=0 +pp_shader_name=none (builtin) +pp_shader_name\default=true +render_3d=0 +render_3d\default=true +swap_screen=false +swap_screen\default=true +upright_screen=false +upright_screen\default=true + +[Miscellaneous] +log_filter=*:Info +log_filter\default=true + +[Renderer] +bg_blue=0 +bg_blue\default=true +bg_green=0 +bg_green\default=true +bg_red=0 +bg_red\default=true +frame_limit=100 +frame_limit\default=true +frame_limit_alternate=200 +frame_limit_alternate\default=true +resolution_factor=1 +resolution_factor\default=true +shaders_accurate_mul=true +shaders_accurate_mul\default=true +texture_filter_name=none +texture_filter_name\default=true +use_disk_shader_cache=true +use_disk_shader_cache\default=true +use_frame_limit_alternate=false +use_frame_limit_alternate\default=true +use_hw_renderer=true +use_hw_renderer\default=true +use_hw_shader=true +use_hw_shader\default=true +use_shader_jit=true +use_shader_jit\default=true +use_vsync_new=true +use_vsync_new\default=true + +[System] +init_clock=0 +init_clock\default=true +init_time=946681277 +init_time\default=true +is_new_3ds=true +is_new_3ds\default=true +region_value=-1 +region_value\default=true + +[UI] +GameList\hideNoIcon=false +GameList\hideNoIcon\default=true +GameList\iconSize=2 +GameList\iconSize\default=true +GameList\row1=2 +GameList\row1\default=true +GameList\row2=0 +GameList\row2\default=true +GameList\singleLineMode=false +GameList\singleLineMode\default=true +Multiplayer\game_id=0 +Multiplayer\game_id\default=true +Multiplayer\host_type=0 +Multiplayer\host_type\default=true +Multiplayer\ip= +Multiplayer\ip\default=true +Multiplayer\ip_ban_list\size=0 +Multiplayer\max_player=8 +Multiplayer\max_player\default=true +Multiplayer\nickname= +Multiplayer\nickname\default=true +Multiplayer\port=24872 +Multiplayer\port\default=true +Multiplayer\room_description= +Multiplayer\room_description\default=true +Multiplayer\room_name= +Multiplayer\room_name\default=true +Multiplayer\room_nickname= +Multiplayer\room_nickname\default=true +Multiplayer\room_port=24872 +Multiplayer\room_port\default=true +Multiplayer\username_ban_list\size=0 +Paths\gamedirs\1\deep_scan=false +Paths\gamedirs\1\deep_scan\default=true +Paths\gamedirs\1\expanded=true +Paths\gamedirs\1\expanded\default=true +Paths\gamedirs\1\path=INSTALLED +Paths\gamedirs\2\deep_scan=false +Paths\gamedirs\2\deep_scan\default=true +Paths\gamedirs\2\expanded=true +Paths\gamedirs\2\expanded\default=true +Paths\gamedirs\2\path=SYSTEM +Paths\gamedirs\size=2 +Paths\language=en +Paths\language\default=false +Paths\moviePlaybackPath= +Paths\movieRecordPath= +Paths\recentFiles=@Invalid() +Paths\romsPath= +Paths\screenshotPath= +Paths\symbolsPath= +Paths\videoDumpingPath= +Shortcuts\Main%20Window\Advance%20Frame\Context=2 +Shortcuts\Main%20Window\Advance%20Frame\Context\default=true +Shortcuts\Main%20Window\Advance%20Frame\KeySeq=\\ +Shortcuts\Main%20Window\Advance%20Frame\KeySeq\default=true +Shortcuts\Main%20Window\Capture%20Screenshot\Context=2 +Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true +Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+P +Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\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\KeySeq=F4 +Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context=2 +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context\default=true +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq=- +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq\default=true +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=true +Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1 +Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true +Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Esc +Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq\default=true +Shortcuts\Main%20Window\Fullscreen\Context=1 +Shortcuts\Main%20Window\Fullscreen\Context\default=true +Shortcuts\Main%20Window\Fullscreen\KeySeq=F11 +Shortcuts\Main%20Window\Fullscreen\KeySeq\default=true +Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context=2 +Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context\default=true +Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq=+ +Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq\default=true +Shortcuts\Main%20Window\Load%20Amiibo\Context=2 +Shortcuts\Main%20Window\Load%20Amiibo\Context\default=true +Shortcuts\Main%20Window\Load%20Amiibo\KeySeq=F2 +Shortcuts\Main%20Window\Load%20Amiibo\KeySeq\default=true +Shortcuts\Main%20Window\Load%20File\Context=1 +Shortcuts\Main%20Window\Load%20File\Context\default=true +Shortcuts\Main%20Window\Load%20File\KeySeq=Ctrl+O +Shortcuts\Main%20Window\Load%20File\KeySeq\default=true +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+V +Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq\default=true +Shortcuts\Main%20Window\Remove%20Amiibo\Context=2 +Shortcuts\Main%20Window\Remove%20Amiibo\Context\default=true +Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq=F3 +Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq\default=true +Shortcuts\Main%20Window\Restart%20Emulation\Context=1 +Shortcuts\Main%20Window\Restart%20Emulation\Context\default=true +Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=F6 +Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context=1 +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context\default=true +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq=F8 +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq\default=true +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context=1 +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context\default=true +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq=Ctrl+C +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq\default=true +Shortcuts\Main%20Window\Stop%20Emulation\Context=1 +Shortcuts\Main%20Window\Stop%20Emulation\Context\default=true +Shortcuts\Main%20Window\Stop%20Emulation\KeySeq=F5 +Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Swap%20Screens\Context=1 +Shortcuts\Main%20Window\Swap%20Screens\Context\default=true +Shortcuts\Main%20Window\Swap%20Screens\KeySeq=F9 +Shortcuts\Main%20Window\Swap%20Screens\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\Context=2 +Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\Context\default=true +Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\KeySeq=Ctrl+Z +Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\KeySeq\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\KeySeq=Ctrl+F +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context=2 +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=true +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq=Ctrl+A +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context=1 +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context\default=true +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq=F10 +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq\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\KeySeq=Ctrl+S +Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context=2 +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context\default=true +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq=Ctrl+D +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\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\0\xbb\0\0\x5?\0\0\x2\xb6\0\0\x1\r\0\0\0\xd8\0\0\x5?\0\0\x2\xb6\0\0\0\0\0\0\0\0\x6M\0\0\x1\r\0\0\0\xd8\0\0\x5?\0\0\x2\xb6) +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) +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\0y\x1\0\0\x3\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\0\x85\x1\0\0\x3\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\0y\x1\0\0\x3\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\xad\x1\0\0\x3\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\xad\x1\0\0\x3\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\xde\x1\0\0\x3\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\0P\x1\0\0\x3\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\0y\x1\0\0\x3\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\xef\x1\0\0\x3\0\0\x4\x33\0\0\x1\xa2\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 +Updater\update_on_close\default=true +calloutFlags=1 +calloutFlags\default=false +confirmClose=true +confirmClose\default=true +displayTitleBars=true +displayTitleBars\default=true +enable_discord_presence=true +enable_discord_presence\default=true +firstStart=false +firstStart\default=false +fullscreen=false +fullscreen\default=true +hideInactiveMouse=false +hideInactiveMouse\default=true +pauseWhenInBackground=false +pauseWhenInBackground\default=true +screenshot_resolution_factor=0 +screenshot_resolution_factor\default=true +showConsole=false +showConsole\default=true +showFilterBar=true +showFilterBar\default=true +showStatusBar=true +showStatusBar\default=true +singleWindowMode=true +singleWindowMode\default=true +theme=default +theme\default=true + +[Utility] +custom_textures=false +custom_textures\default=true +dump_textures=false +dump_textures\default=true +preload_textures=false +preload_textures\default=true + +[VideoDumping] +audio_bitrate=64000 +audio_bitrate\default=true +audio_encoder=libvorbis +audio_encoder\default=true +audio_encoder_options= +audio_encoder_options\default=true +format_options= +output_format=webm +output_format\default=true +video_bitrate=2500000 +video_bitrate\default=true +video_encoder=libvpx-vp9 +video_encoder\default=true +video_encoder_options="quality:realtime,speed:6,tile-columns:4,frame-parallel:1,threads:8,row-mt:1" +video_encoder_options\default=true + +[WebService] +citra_token= +citra_username= +enable_telemetry=false +enable_telemetry\default=false +web_api_url=https://api.citra-emu.org +web_api_url\default=true diff --git a/emu-configs/defaults/dolphin/Dolphin.ini b/emu-configs/defaults/dolphin/Dolphin.ini new file mode 100644 index 00000000..db74b4ea --- /dev/null +++ b/emu-configs/defaults/dolphin/Dolphin.ini @@ -0,0 +1,55 @@ +[Analytics] +ID = 20ba4576ae03327109c65c05b7340909 +PermissionAsked = True +[NetPlay] +TraversalChoice = direct +[Core] +GFXBackend = OGL +AutoDiscChange = False +CPUThread = True +EnableCheats = False +OverrideRegionSettings = False +AudioStretch = False +AudioStretchMaxLatency = 80 +DPL2Decoder = False +DPL2Quality = 2 +DSPHLE = True +MMU = False +SelectedLanguage = 0 +SerialPort1 = 255 +SkipIPL = True +SlotA = 8 +SlotB = 255 +WiiKeyboard = False +WiimoteContinuousScanning = False +WiimoteControllerInterface = False +WiimoteEnableSpeaker = False +WiiSDCardAllowWrites = True +WiiSDCardEnableFolderSync = False +[Display] +DisableScreenSaver = True +[General] +HotkeysRequireFocus = True +RecursiveISOPaths = False +[Interface] +ConfirmStop = True +OnScreenDisplayMessages = True +PauseOnFocusLost = False +ShowActiveTitle = True +UseBuiltinTitleDatabase = True +UsePanicHandlers = True +[BluetoothPassthrough] +Enabled = False +[DSP] +EnableJIT = False +[GBA] +BIOS = /home/deck/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu/GBA/gba_bios.bin +Rom1 = +Rom2 = +Rom3 = +Rom4 = +SavesInRomPath = False +SavesPath = /home/deck/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu/GBA/Saves/ +Threads = True +[Input] +BackgroundInput = False diff --git a/emu-configs/defaults/dolphin/FreeLook.ini b/emu-configs/defaults/dolphin/FreeLook.ini new file mode 100644 index 00000000..2fbe8a68 --- /dev/null +++ b/emu-configs/defaults/dolphin/FreeLook.ini @@ -0,0 +1,3 @@ +[General] +BackgroundInput = False +Enabled = False diff --git a/emu-configs/defaults/dolphin/GCKeyNew.ini b/emu-configs/defaults/dolphin/GCKeyNew.ini new file mode 100644 index 00000000..dcdb8ce3 --- /dev/null +++ b/emu-configs/defaults/dolphin/GCKeyNew.ini @@ -0,0 +1,93 @@ +[GCKeyboard1] +Device = XInput2/0/Virtual core pointer +Keys/HOME = Home +Keys/END = End +Keys/PGUP = Prior +Keys/PGDN = Next +Keys/SCR LK = Scroll_Lock +Keys/A = A +Keys/B = B +Keys/C = C +Keys/D = D +Keys/E = E +Keys/F = F +Keys/G = G +Keys/H = H +Keys/I = I +Keys/J = J +Keys/K = K +Keys/L = L +Keys/M = M +Keys/N = N +Keys/O = O +Keys/P = P +Keys/Q = Q +Keys/R = R +Keys/S = S +Keys/T = T +Keys/U = U +Keys/V = V +Keys/W = W +Keys/X = X +Keys/Y = Y +Keys/Z = Z +Keys/1 = `1` +Keys/2 = `2` +Keys/3 = `3` +Keys/4 = `4` +Keys/5 = `5` +Keys/6 = `6` +Keys/7 = `7` +Keys/8 = `8` +Keys/9 = `9` +Keys/0 = `0` +Keys/- = minus +Keys/` = grave +Keys/PRT SC = Print +Keys/' = apostrophe +Keys/[ = bracketleft +Keys/EQUALS = equal +Keys/* = KP_Multiply +Keys/] = bracketright +Keys/, = comma +Keys/. = period +Keys// = slash +Keys/\ = backslash +Keys/F1 = F1 +Keys/F2 = F2 +Keys/F3 = F3 +Keys/F4 = F4 +Keys/F5 = F5 +Keys/F6 = F6 +Keys/F7 = F7 +Keys/F8 = F8 +Keys/F9 = F9 +Keys/F10 = F10 +Keys/F11 = F11 +Keys/F12 = F12 +Keys/ESC = Escape +Keys/INSERT = Insert +Keys/DELETE = Delete +Keys/; = semicolon +Keys/BACKSPACE = BackSpace +Keys/TAB = Tab +Keys/CAPS LOCK = Caps_Lock +Keys/L SHIFT = Shift_L +Keys/R SHIFT = Shift_R +Keys/L CTRL = Control_L +Keys/R ALT = Alt_R +Keys/L WIN = Super_L +Keys/SPACE = space +Keys/R WIN = Super_R +Keys/MENU = Menu +Keys/LEFT = Left +Keys/DOWN = Down +Keys/UP = Up +Keys/RIGHT = Right +Keys/ENTER = Return +[GCKeyboard2] +Device = XInput2/0/Virtual core pointer +[GCKeyboard3] +Device = XInput2/0/Virtual core pointer +[GCKeyboard4] +Device = XInput2/0/Virtual core pointer diff --git a/emu-configs/defaults/dolphin/GCPadNew.ini b/emu-configs/defaults/dolphin/GCPadNew.ini new file mode 100644 index 00000000..4157abb6 --- /dev/null +++ b/emu-configs/defaults/dolphin/GCPadNew.ini @@ -0,0 +1,40 @@ +[GCPad1] +Device = XInput2/0/Virtual core pointer +Buttons/A = `X` +Buttons/B = `Z` +Buttons/X = `C` +Buttons/Y = `S` +Buttons/Z = `D` +Buttons/Start = `Return` +Main Stick/Up = `Up` +Main Stick/Down = `Down` +Main Stick/Left = `Left` +Main Stick/Right = `Right` +Main Stick/Modifier = `Shift` +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 = `I` +C-Stick/Down = `K` +C-Stick/Left = `J` +C-Stick/Right = `L` +C-Stick/Modifier = `Ctrl` +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 = `Q` +Triggers/R = `W` +D-Pad/Up = `T` +D-Pad/Down = `G` +D-Pad/Left = `F` +D-Pad/Right = `H` +[GCPad2] +Device = XInput2/0/Virtual core pointer +Main Stick/Modifier/Range = 50.0 +C-Stick/Modifier/Range = 50.0 +[GCPad3] +Device = XInput2/0/Virtual core pointer +Main Stick/Modifier/Range = 50.0 +C-Stick/Modifier/Range = 50.0 +[GCPad4] +Device = XInput2/0/Virtual core pointer +Main Stick/Modifier/Range = 50.0 +C-Stick/Modifier/Range = 50.0 diff --git a/emu-configs/defaults/dolphin/GFX.ini b/emu-configs/defaults/dolphin/GFX.ini new file mode 100644 index 00000000..950ba65a --- /dev/null +++ b/emu-configs/defaults/dolphin/GFX.ini @@ -0,0 +1,24 @@ +[Enhancements] +ArbitraryMipmapDetection = True +DisableCopyFilter = True +ForceTrueColor = True +ForceFiltering = False +[Hacks] +BBoxEnable = False +DeferEFBCopies = True +EFBEmulateFormatChanges = False +EFBScaledCopy = True +EFBToTextureEnable = True +SkipDuplicateXFBs = True +XFBToTextureEnable = True +EFBAccessEnable = True +[Settings] +BackendMultithreading = True +DumpBaseTextures = True +DumpMipTextures = True +FastDepthCalc = True +InternalResolution = 1 +SaveTextureCacheToState = True +WireFrame = False +[Hardware] +VSync = False diff --git a/emu-configs/defaults/dolphin/Hotkeys.ini b/emu-configs/defaults/dolphin/Hotkeys.ini new file mode 100644 index 00000000..def83470 --- /dev/null +++ b/emu-configs/defaults/dolphin/Hotkeys.ini @@ -0,0 +1,45 @@ +[Hotkeys] +Device = XInput2/0/Virtual core pointer +General/Open = @(Ctrl+O) +General/Toggle Pause = F10 +General/Stop = Escape +General/Toggle Fullscreen = @(Alt+Return) +General/Take Screenshot = F9 +Emulation Speed/Disable Emulation Speed Limit = Tab +Stepping/Step Into = F11 +Stepping/Step Over = @(Shift+F10) +Stepping/Step Out = @(Shift+F11) +Breakpoint/Toggle Breakpoint = @(Shift+F9) +Wii/Connect Wii Remote 1 = @(Alt+F5) +Wii/Connect Wii Remote 2 = @(Alt+F6) +Wii/Connect Wii Remote 3 = @(Alt+F7) +Wii/Connect Wii Remote 4 = @(Alt+F8) +Wii/Connect Balance Board = @(Alt+F9) +Load State/Load State Slot 1 = `F1` +Load State/Load State Slot 2 = F2 +Load State/Load State Slot 3 = F3 +Load State/Load State Slot 4 = F4 +Load State/Load State Slot 5 = F5 +Load State/Load State Slot 6 = F6 +Load State/Load State Slot 7 = F7 +Load State/Load State Slot 8 = F8 +Save State/Save State Slot 1 = @(Shift+F1) +Save State/Save State Slot 2 = @(Shift+F2) +Save State/Save State Slot 3 = @(Shift+F3) +Save State/Save State Slot 4 = @(Shift+F4) +Save State/Save State Slot 5 = @(Shift+F5) +Save State/Save State Slot 6 = @(Shift+F6) +Save State/Save State Slot 7 = @(Shift+F7) +Save State/Save State Slot 8 = @(Shift+F8) +Other State Hotkeys/Undo Load State = F12 +Other State Hotkeys/Undo Save State = @(Shift+F12) +GBA Core/Load ROM = @(`Ctrl`+`Shift`+`O`) +GBA Core/Unload ROM = @(`Ctrl`+`Shift`+`W`) +GBA Core/Reset = @(`Ctrl`+`Shift`+`R`) +GBA Volume/Volume Down = `KP_Subtract` +GBA Volume/Volume Up = `KP_Add` +GBA Volume/Volume Toggle Mute = `M` +GBA Window Size/1x = `KP_1` +GBA Window Size/2x = `KP_2` +GBA Window Size/3x = `KP_3` +GBA Window Size/4x = `KP_4` diff --git a/emu-configs/defaults/dolphin/Qt.ini b/emu-configs/defaults/dolphin/Qt.ini new file mode 100644 index 00000000..b9f0b1b9 --- /dev/null +++ b/emu-configs/defaults/dolphin/Qt.ini @@ -0,0 +1,84 @@ +[breakpointwidget] +floating=false +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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[codewidget] +boxsplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x4\0\0\0\x89\0\0\0\x89\0\0\0\x89\0\0\0\x89\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}\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\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\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[gridview] +scale=@Variant(\0\0\0\x87?\x80\0\0) + +[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\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\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) +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\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\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[logging] +font=0 +wraplines=false + +[logwidget] +floating=false +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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[mainwindow] +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1\x96\0\0\0\x8e\0\0\x4\xb5\0\0\x3\x2\0\0\x1\x96\0\0\0\xab\0\0\x4\xb5\0\0\x3\x2\0\0\0\0\0\0\0\0\x6M\0\0\x1\x96\0\0\0\xab\0\0\x4\xb5\0\0\x3\x2) +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\xad\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\x1\xef\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\x2l\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\x2q\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\x2\x62\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\0\xfd\x1\0\0\x3\0\0\x3 \0\0\x1\xec\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 +addrspace_effective=true +addrspace_physical=false +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\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\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) +inputcombo=1 +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) + +[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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3) +splitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0\x9f\0\0\0\xcf\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\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\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[registerwidget] +floating=false +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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[renderwidget] +geometry=@ByteArray() + +[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\b\0\0\0\x64\0\0\0\t\0\0\0\x64\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\n\0\0\0\x64\0\0\0\v\0\0\0\x64\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) + +[threadwidget] +floating=false +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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) + +[toolbar] +visible=true + +[userstyle] +enabled=false +name= + +[watchwidget] +floating=false +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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) diff --git a/emu-configs/defaults/dolphin/WiimoteNew.ini b/emu-configs/defaults/dolphin/WiimoteNew.ini new file mode 100644 index 00000000..aacc2c18 --- /dev/null +++ b/emu-configs/defaults/dolphin/WiimoteNew.ini @@ -0,0 +1,106 @@ +[Wiimote1] +Device = XInput2/0/Virtual core pointer +Buttons/A = `Click 1` +Buttons/B = `Click 3` +Buttons/1 = `1` +Buttons/2 = `2` +Buttons/- = Q +Buttons/+ = E +Buttons/Home = Return +IR/Up = `Cursor Y-` +IR/Down = `Cursor Y+` +IR/Left = `Cursor X-` +IR/Right = `Cursor X+` +Tilt/Modifier/Range = 50.0 +Shake/X = `Click 2` +Shake/Y = `Click 2` +Shake/Z = `Click 2` +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` +Extension = Nunchuk +Nunchuk/Buttons/C = Control_L +Nunchuk/Buttons/Z = Shift_L +Nunchuk/Stick/Up = W +Nunchuk/Stick/Down = S +Nunchuk/Stick/Left = A +Nunchuk/Stick/Right = D +Nunchuk/Stick/Modifier/Range = 50.0 +Nunchuk/Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42 +Nunchuk/Tilt/Modifier/Range = 50.0 +Nunchuk/Shake/X = `Click 2` +Nunchuk/Shake/Y = `Click 2` +Nunchuk/Shake/Z = `Click 2` +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 +D-Pad/Up = Up +D-Pad/Down = Down +D-Pad/Left = Left +D-Pad/Right = Right +Source = 1 +[Wiimote2] +Device = XInput2/0/Virtual core pointer +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 = 0 +[Wiimote3] +Device = XInput2/0/Virtual core pointer +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 = 0 +[Wiimote4] +Device = XInput2/0/Virtual core pointer +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 = 0 +[BalanceBoard] +Device = XInput2/0/Virtual core pointer +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 = 0 diff --git a/emu-configs/defaults/duckstation/settings.ini b/emu-configs/defaults/duckstation/settings.ini new file mode 100644 index 00000000..e6bff72f --- /dev/null +++ b/emu-configs/defaults/duckstation/settings.ini @@ -0,0 +1,283 @@ +[Main] +SettingsVersion = 3 +EmulationSpeed = 1.000000 +FastForwardSpeed = 0.000000 +TurboSpeed = 0.000000 +SyncToHostRefreshRate = false +IncreaseTimerResolution = true +InhibitScreensaver = true +StartPaused = false +StartFullscreen = false +PauseOnFocusLoss = false +PauseOnMenu = true +SaveStateOnExit = true +CreateSaveStateBackups = true +CompressSaveStates = true +ConfirmPowerOff = true +LoadDevicesFromSaveStates = false +ApplyCompatibilitySettings = true +ApplyGameSettings = true +AutoLoadCheats = true +DisableAllEnhancements = false +RewindEnable = false +RewindFrequency = 10.000000 +RewindSaveSlots = 10 +RunaheadFrameCount = 0 +EnableDiscordPresence = false + + +[Console] +Region = Auto +Enable8MBRAM = false + + +[CPU] +ExecutionMode = Recompiler +OverclockEnable = false +OverclockNumerator = 1 +OverclockDenominator = 1 +RecompilerMemoryExceptions = false +RecompilerBlockLinking = true +RecompilerICache = false +FastmemMode = MMap + + +[GPU] +Renderer = OpenGL +Adapter = +ResolutionScale = 1 +Multisamples = 1 +UseDebugDevice = false +PerSampleShading = false +UseThread = true +ThreadedPresentation = true +UseSoftwareRendererForReadbacks = false +TrueColor = true +ScaledDithering = true +TextureFilter = Nearest +DownsampleMode = Disabled +DisableInterlacing = true +ForceNTSCTimings = false +WidescreenHack = false +ChromaSmoothing24Bit = false +PGXPEnable = false +PGXPCulling = true +PGXPTextureCorrection = true +PGXPColorCorrection = false +PGXPVertexCache = false +PGXPCPU = false +PGXPPreserveProjFP = false +PGXPTolerance = -1.000000 +PGXPDepthBuffer = false +PGXPDepthClearThreshold = 1228800.000000 + + +[Display] +CropMode = Overscan +ActiveStartOffset = 0 +ActiveEndOffset = 0 +LineStartOffset = 0 +LineEndOffset = 0 +Force4_3For24Bit = false +AspectRatio = Auto (Game Native) +Alignment = Center +CustomAspectRatioNumerator = 0 +LinearFiltering = true +IntegerScaling = false +Stretch = false +PostProcessing = false +ShowOSDMessages = true +ShowFPS = false +ShowSpeed = false +ShowResolution = false +ShowCPU = false +ShowGPU = false +ShowStatusIndicators = true +ShowInputs = false +ShowEnhancements = false +DisplayAllFrames = false +InternalResolutionScreenshots = false +VSync = false +MaxFPS = 0.000000 +OSDScale = 100.000000 + + +[CDROM] +ReadaheadSectors = 8 +RegionCheck = false +LoadImageToRAM = false +LoadImagePatches = false +MuteCDAudio = false +ReadSpeedup = 1 +SeekSpeedup = 1 + + +[Audio] +Backend = Cubeb +Driver = +StretchMode = TimeStretch +BufferMS = 50 +OutputLatencyMS = 20 +OutputVolume = 100 +FastForwardVolume = 100 +OutputMuted = false +DumpOnBoot = false + + +[Hacks] +DMAMaxSliceTicks = 1000 +DMAHaltTicks = 100 +GPUFIFOSize = 16 +GPUMaxRunAhead = 128 + + +[BIOS] +PatchTTYEnable = false +PatchFastBoot = false +SearchDirectory = bios + + +[MemoryCards] +Card1Type = PerGameTitle +Card2Type = None +UsePlaylistTitle = true +Directory = memcards + + +[ControllerPorts] +MultitapMode = Disabled +PointerXScale = 8.000000 +PointerYScale = 8.000000 +PointerXInvert = false +PointerYInvert = false + + +[Cheevos] +Enabled = false +TestMode = false +UnofficialTestMode = false +UseFirstDiscFromPlaylist = true +RichPresence = true +ChallengeMode = false +Leaderboards = true +SoundEffects = true +PrimedIndicators = true + + +[Logging] +LogLevel = Info +LogFilter = +LogToConsole = true +LogToDebug = false +LogToWindow = false +LogToFile = false + + +[Debug] +ShowVRAM = false +DumpCPUToVRAMCopies = false +DumpVRAMToCPUCopies = false +ShowGPUState = false +ShowCDROMState = false +ShowSPUState = false +ShowTimersState = false +ShowMDECState = false +ShowDMAState = false + + +[TextureReplacements] +EnableVRAMWriteReplacements = false +PreloadTextures = false +DumpVRAMWrites = false +DumpVRAMWriteForceAlphaChannel = true +DumpVRAMWriteWidthThreshold = 128 +DumpVRAMWriteHeightThreshold = 128 + + +[Folders] +Cache = cache +Cheats = cheats +Covers = covers +Dumps = dump +GameSettings = gamesettings +InputProfiles = inputprofiles +SaveStates = savestates +Screenshots = screenshots +Shaders = shaders +Textures = textures + + +[InputSources] +SDL = true +SDLControllerEnhancedMode = false +Evdev = false +XInput = false +RawInput = false + + +[Pad1] +Type = AnalogController +Up = Keyboard/Up +Right = Keyboard/Right +Down = Keyboard/Down +Left = Keyboard/Left +Triangle = Keyboard/I +Circle = Keyboard/L +Cross = Keyboard/K +Square = Keyboard/J +Select = Keyboard/Backspace +Start = Keyboard/Return +L1 = Keyboard/Q +R1 = Keyboard/E +L2 = Keyboard/1 +R2 = Keyboard/3 +L3 = Keyboard/2 +R3 = Keyboard/4 +LLeft = Keyboard/A +LRight = Keyboard/D +LDown = Keyboard/S +LUp = Keyboard/W +RLeft = Keyboard/F +RRight = Keyboard/H +RDown = Keyboard/G +RUp = Keyboard/T + + +[Pad2] +Type = None + + +[Pad3] +Type = None + + +[Pad4] +Type = None + + +[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/defaults/melonds/melonDS.ini b/emu-configs/defaults/melonds/melonDS.ini new file mode 100644 index 00000000..5fce82e9 --- /dev/null +++ b/emu-configs/defaults/melonds/melonDS.ini @@ -0,0 +1,135 @@ +Key_A=-1 +Key_B=-1 +Key_Select=-1 +Key_Start=-1 +Key_Right=-1 +Key_Left=-1 +Key_Up=-1 +Key_Down=-1 +Key_R=-1 +Key_L=-1 +Key_X=-1 +Key_Y=-1 +Joy_A=-1 +Joy_B=-1 +Joy_Select=-1 +Joy_Start=-1 +Joy_Right=-1 +Joy_Left=-1 +Joy_Up=-1 +Joy_Down=-1 +Joy_R=-1 +Joy_L=-1 +Joy_X=-1 +Joy_Y=-1 +HKKey_Lid=-1 +HKKey_Mic=-1 +HKKey_Pause=-1 +HKKey_Reset=-1 +HKKey_FastForward=-1 +HKKey_FastForwardToggle=-1 +HKKey_FullscreenToggle=-1 +HKKey_SwapScreens=-1 +HKKey_SolarSensorDecrease=-1 +HKKey_SolarSensorIncrease=-1 +HKKey_FrameStep=-1 +HKJoy_Lid=-1 +HKJoy_Mic=-1 +HKJoy_Pause=-1 +HKJoy_Reset=-1 +HKJoy_FastForward=-1 +HKJoy_FastForwardToggle=-1 +HKJoy_FullscreenToggle=-1 +HKJoy_SwapScreens=-1 +HKJoy_SolarSensorDecrease=-1 +HKJoy_SolarSensorIncrease=-1 +HKJoy_FrameStep=-1 +JoystickID=0 +WindowWidth=256 +WindowHeight=414 +WindowMax=0 +ScreenRotation=0 +ScreenGap=0 +ScreenLayout=0 +ScreenSwap=0 +ScreenSizing=0 +IntegerScaling=0 +ScreenAspectTop=0 +ScreenAspectBot=0 +ScreenFilter=1 +ScreenUseGL=0 +ScreenVSync=0 +ScreenVSyncInterval=1 +3DRenderer=0 +Threaded3D=1 +GL_ScaleFactor=1 +GL_BetterPolygons=0 +LimitFPS=1 +AudioSync=0 +ShowOSD=1 +ConsoleType=0 +DirectBoot=1 +JIT_Enable=0 +JIT_MaxBlockSize=32 +JIT_BranchOptimisations=1 +JIT_LiteralOptimisations=1 +JIT_FastMemory=1 +ExternalBIOSEnable=0 +BIOS9Path= +BIOS7Path= +FirmwarePath= +DSiBIOS9Path= +DSiBIOS7Path= +DSiFirmwarePath= +DSiNANDPath= +DLDIEnable=0 +DLDISDPath=dldi.bin +DLDISize=0 +DLDIReadOnly=0 +DLDIFolderSync=0 +DLDIFolderPath= +DSiSDEnable=0 +DSiSDPath=dsisd.bin +DSiSDSize=0 +DSiSDReadOnly=0 +DSiSDFolderSync=0 +DSiSDFolderPath= +FirmwareOverrideSettings=0 +FirmwareUsername=melonDS +FirmwareLanguage=1 +FirmwareBirthdayMonth=1 +FirmwareBirthdayDay=1 +FirmwareFavouriteColour=0 +FirmwareMessage= +FirmwareMAC= +RandomizeMAC=0 +SockBindAnyAddr=0 +LANDevice= +DirectLAN=0 +SavStaRelocSRAM=0 +AudioInterp=0 +AudioBitrate=0 +AudioVolume=256 +MicInputType=1 +MicWavPath= +LastROMFolder= +RecentROM_0= +RecentROM_1= +RecentROM_2= +RecentROM_3= +RecentROM_4= +RecentROM_5= +RecentROM_6= +RecentROM_7= +RecentROM_8= +RecentROM_9= +SaveFilePath= +SavestatePath= +CheatFilePath= +EnableCheats=0 +MouseHide=0 +MouseHideSeconds=5 +PauseLostFocus=0 +DSBatteryLevelOkay=1 +DSiBatteryLevel=15 +DSiBatteryCharging=1 diff --git a/emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini b/emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini new file mode 100644 index 00000000..1fbf8e0c --- /dev/null +++ b/emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini @@ -0,0 +1,440 @@ +[UI] +SettingsVersion = 1 +InhibitScreensaver = true +ConfirmShutdown = true +StartPaused = false +PauseOnFocusLoss = false +StartFullscreen = false +DoubleClickTogglesFullscreen = true +HideMouseCursor = false +RenderToSeparateWindow = false +HideMainWindowWhenRunning = false +DisableWindowResize = false +Theme = darkfusion + + +[Folders] +Bios = bios +Snapshots = snaps +Savestates = sstates +MemoryCards = memcards +Logs = logs +Cheats = cheats +CheatsWS = cheats_ws +CheatsNI = cheats_ni +Cache = cache +Textures = textures +InputProfiles = inputprofiles + + +[EmuCore] +CdvdVerboseReads = false +CdvdDumpBlocks = false +CdvdShareWrite = false +EnablePatches = true +EnableCheats = false +EnablePINE = false +EnableWideScreenPatches = false +EnableNoInterlacingPatches = false +EnableRecordingTools = true +EnableGameFixes = true +SaveStateOnShutdown = false +EnableDiscordPresence = false +ConsoleToStdio = false +HostFs = false +BackupSavestate = true +SavestateZstdCompression = true +McdEnableEjection = true +McdFolderAutoManage = true +WarnAboutUnsafeSettings = true +GzipIsoIndexTemplate = $(f).pindex.tmp +BlockDumpSaveDirectory = +EnableFastBoot = true + + +[EmuCore/Speedhacks] +EECycleRate = 0 +EECycleSkip = 0 +fastCDVD = false +IntcStat = true +WaitLoop = true +vuFlagHack = true +vuThread = false +vu1Instant = true + + +[EmuCore/CPU] +FPU.DenormalsAreZero = true +FPU.FlushToZero = true +FPU.Roundmode = 3 +AffinityControlMode = 0 +VU.DenormalsAreZero = true +VU.FlushToZero = true +VU.Roundmode = 3 + + +[EmuCore/CPU/Recompiler] +EnableEE = true +EnableIOP = true +EnableEECache = false +EnableVU0 = true +EnableVU1 = true +vuOverflow = true +vuExtraOverflow = false +vuSignOverflow = false +vuUnderflow = false +fpuOverflow = true +fpuExtraOverflow = false +fpuFullMode = false +StackFrameChecks = false +PreBlockCheckEE = false +PreBlockCheckIOP = false + + +[EmuCore/GS] +VsyncQueueSize = 2 +FrameLimitEnable = true +VsyncEnable = 0 +FramerateNTSC = 59.94 +FrameratePAL = 50 +SyncToHostRefreshRate = false +AspectRatio = Auto 4:3/3:2 +FMVAspectRatioSwitch = Off +Zoom = 100 +StretchY = 100 +CropLeft = 0 +CropTop = 0 +CropRight = 0 +CropBottom = 0 +pcrtc_antiblur = true +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 +SkipDuplicateFrames = false +OsdShowMessages = true +OsdShowSpeed = false +OsdShowFPS = false +OsdShowCPU = false +OsdShowGPU = false +OsdShowResolution = false +OsdShowGSStats = false +OsdShowIndicators = true +HWDisableReadbacks = 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_DisableDepthSupport = false +UserHacks_DisablePartialInvalidation = false +UserHacks_Disable_Safe_Features = false +UserHacks_merge_pp_sprite = false +UserHacks_WildHack = false +UserHacks_TextureInsideRt = false +fxaa = false +ShadeBoost = false +shaderfx = false +dump = false +save = false +savef = false +savet = false +savez = false +DumpReplaceableTextures = false +DumpReplaceableMipmaps = false +DumpTexturesWithFMVActive = false +DumpDirectTextures = true +DumpPaletteTextures = true +LoadTextureReplacements = false +LoadTextureReplacementsAsync = true +PrecacheTextureReplacements = false +deinterlace = 7 +OsdScale = 100 +Renderer = -1 +upscale_multiplier = 1 +mipmap_hw = -1 +accurate_blending_unit = 1 +crc_hack_level = -1 +filter = 2 +texture_preloading = 2 +GSDumpCompression = 1 +dithering_ps2 = 2 +MaxAnisotropy = 0 +extrathreads = 2 +extrathreads_height = 4 +TVShader = 0 +UserHacks_SkipDraw_Start = 0 +UserHacks_SkipDraw_End = 0 +UserHacks_Half_Bottom_Override = -1 +UserHacks_HalfPixelOffset = 0 +UserHacks_round_sprite_offset = 0 +UserHacks_TCOffsetX = 0 +UserHacks_TCOffsetY = 0 +UserHacks_CPUSpriteRenderBW = 0 +TriFilter = -1 +OverrideTextureBarriers = -1 +OverrideGeometryShaders = -1 +ShadeBoost_Brightness = 50 +ShadeBoost_Contrast = 50 +ShadeBoost_Saturation = 50 +saven = 0 +savel = 5000 +Adapter = +shaderfx_conf = shaders/GS_FX_Settings.ini +shaderfx_glsl = shaders/GS.fx + + +[SPU2/Mixing] +Interpolation = 5 +FinalVolume = 100 +VolumeAdjustC = 0 +VolumeAdjustFL = 0 +VolumeAdjustFR = 0 +VolumeAdjustBL = 0 +VolumeAdjustBR = 0 +VolumeAdjustSL = 0 +VolumeAdjustSR = 0 +VolumeAdjustLFE = 0 + + +[SPU2/Output] +OutputModule = cubeb +BackendName = +Latency = 100 +SynchMode = 0 +SpeakerConfiguration = 0 +DplDecodingLevel = 0 + + +[DEV9/Eth] +EthEnable = false +EthApi = Unset +EthDevice = +EthLogDNS = false +InterceptDHCP = false +PS2IP = 0.0.0.0 +Mask = 0.0.0.0 +Gateway = 0.0.0.0 +DNS1 = 0.0.0.0 +DNS2 = 0.0.0.0 +AutoMask = true +AutoGateway = true +ModeDNS1 = Auto +ModeDNS2 = Auto + + +[DEV9/Eth/Hosts] +Count = 0 + + +[DEV9/Hdd] +HddEnable = false +HddFile = DEV9hdd.raw +HddSizeSectors = 83886080 + + +[EmuCore/Gamefixes] +VuAddSubHack = false +FpuMulHack = false +FpuNegDivHack = false +XgKickHack = false +EETimingHack = false +SoftwareRendererFMVHack = false +SkipMPEGHack = false +OPHFlagHack = false +DMABusyHack = false +VIFFIFOHack = false +VIF1StallHack = false +GIFFIFOHack = false +GoemonTlbHack = false +IbitHack = false +VUSyncHack = false +VUOverflowHack = false +BlitInternalFPSHack = false + + +[EmuCore/Profiler] +Enabled = false +RecBlocks_EE = true +RecBlocks_IOP = true +RecBlocks_VU0 = true +RecBlocks_VU1 = true + + +[EmuCore/Debugger] +ShowDebuggerOnStart = false +AlignMemoryWindowStart = true +FontWidth = 8 +FontHeight = 12 +WindowWidth = 0 +WindowHeight = 0 +MemoryViewBytesPerRow = 16 + + +[EmuCore/TraceLog] +Enabled = false +EE.bitset = 0 +IOP.bitset = 0 + + +[Achievements] +Enabled = false +TestMode = false +UnofficialTestMode = false +RichPresence = true +ChallengeMode = false +Leaderboards = true +SoundEffects = true + + +[Filenames] +BIOS = + + +[Framerate] +NominalScalar = 1 +TurboScalar = 2 +SlomoScalar = 0.5 + + +[MemoryCards] +Slot1_Enable = true +Slot1_Filename = Mcd001.ps2 +Slot2_Enable = true +Slot2_Filename = Mcd002.ps2 +Multitap1_Slot2_Enable = false +Multitap1_Slot2_Filename = Mcd-Multitap1-Slot02.ps2 +Multitap1_Slot3_Enable = false +Multitap1_Slot3_Filename = Mcd-Multitap1-Slot03.ps2 +Multitap1_Slot4_Enable = false +Multitap1_Slot4_Filename = Mcd-Multitap1-Slot04.ps2 +Multitap2_Slot2_Enable = false +Multitap2_Slot2_Filename = Mcd-Multitap2-Slot02.ps2 +Multitap2_Slot3_Enable = false +Multitap2_Slot3_Filename = Mcd-Multitap2-Slot03.ps2 +Multitap2_Slot4_Enable = false +Multitap2_Slot4_Filename = Mcd-Multitap2-Slot04.ps2 + + +[Logging] +EnableSystemConsole = false +EnableFileLogging = false +EnableTimestamps = true +EnableVerbose = false +EnableEEConsole = false +EnableIOPConsole = false +EnableInputRecordingLogs = true +EnableControllerLogs = false + + +[InputSources] +Keyboard = true +Mouse = true +SDL = true +SDLControllerEnhancedMode = false + + +[Hotkeys] +ToggleFullscreen = Keyboard/Alt & Keyboard/Return +CycleAspectRatio = Keyboard/F6 +CycleInterlaceMode = Keyboard/F5 +CycleMipmapMode = Keyboard/Insert +GSDumpMultiFrame = Keyboard/Control & Keyboard/Shift & Keyboard/F8 +Screenshot = Keyboard/F8 +GSDumpSingleFrame = Keyboard/Shift & Keyboard/F8 +ToggleSoftwareRendering = Keyboard/F9 +ZoomIn = Keyboard/Control & Keyboard/Plus +ZoomOut = Keyboard/Control & Keyboard/Minus +InputRecToggleMode = Keyboard/Shift & Keyboard/R +LoadStateFromSlot = Keyboard/F3 +SaveStateToSlot = Keyboard/F1 +NextSaveStateSlot = Keyboard/F2 +PreviousSaveStateSlot = Keyboard/Shift & Keyboard/F2 +OpenPauseMenu = Keyboard/Escape +ToggleFrameLimit = Keyboard/F4 +TogglePause = Keyboard/Space +ToggleSlowMotion = Keyboard/Shift & Keyboard/Backtab +ToggleTurbo = Keyboard/Tab +HoldTurbo = Keyboard/Period + + +[Pad] +MultitapPort1 = false +MultitapPort2 = false +PointerXScale = 8 +PointerYScale = 8 + + +[Pad1] +Type = DualShock2 +InvertL = 0 +InvertR = 0 +Deadzone = 0 +AxisScale = 1.33 +LargeMotorScale = 1 +SmallMotorScale = 1 +ButtonDeadzone = 0 +PressureModifier = 0.5 +Up = Keyboard/Up +Right = Keyboard/Right +Down = Keyboard/Down +Left = Keyboard/Left +Triangle = Keyboard/I +Circle = Keyboard/L +Cross = Keyboard/K +Square = Keyboard/J +Select = Keyboard/Backspace +Start = Keyboard/Return +L1 = Keyboard/Q +L2 = Keyboard/1 +R1 = Keyboard/E +R2 = Keyboard/3 +L3 = Keyboard/2 +R3 = Keyboard/4 +LUp = Keyboard/W +LRight = Keyboard/D +LDown = Keyboard/S +LLeft = Keyboard/A +RUp = Keyboard/T +RRight = Keyboard/H +RDown = Keyboard/G +RLeft = Keyboard/F + + +[Pad2] +Type = None + + +[Pad3] +Type = None + + +[Pad4] +Type = None + + +[Pad5] +Type = None + + +[Pad6] +Type = None + + +[Pad7] +Type = None + + +[Pad8] +Type = None diff --git a/emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini b/emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini new file mode 100644 index 00000000..ab8a88b8 --- /dev/null +++ b/emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini @@ -0,0 +1,115 @@ +[EmuCore] +CdvdVerboseReads=disabled +CdvdDumpBlocks=disabled +CdvdShareWrite=disabled +EnablePatches=enabled +EnableCheats=disabled +EnablePINE=disabled +EnableWideScreenPatches=disabled +EnableNoInterlacingPatches=disabled +EnableRecordingTools=enabled +ConsoleToStdio=disabled +HostFs=disabled +BackupSavestate=enabled +SavestateZstdCompression=enabled +McdEnableEjection=enabled +McdFolderAutoManage=enabled +MultitapPort0_Enabled=disabled +MultitapPort1_Enabled=disabled +WarnAboutUnsafeSettings=enabled +GzipIsoIndexTemplate=$(f).pindex.tmp +[EmuCore/Speedhacks] +EECycleRate=0 +EECycleSkip=0 +fastCDVD=disabled +IntcStat=enabled +WaitLoop=enabled +vuFlagHack=enabled +vuThread=disabled +vu1Instant=enabled +[EmuCore/CPU] +FPU.DenormalsAreZero=enabled +FPU.FlushToZero=enabled +FPU.Roundmode=3 +AffinityControlMode=0 +VU.DenormalsAreZero=enabled +VU.FlushToZero=enabled +VU.Roundmode=3 +[EmuCore/CPU/Recompiler] +EnableEE=enabled +EnableIOP=enabled +EnableEECache=disabled +EnableVU0=enabled +EnableVU1=enabled +vuOverflow=enabled +vuExtraOverflow=disabled +vuSignOverflow=disabled +vuUnderflow=disabled +fpuOverflow=enabled +fpuExtraOverflow=disabled +fpuFullMode=disabled +StackFrameChecks=disabled +PreBlockCheckEE=disabled +PreBlockCheckIOP=disabled +[EmuCore/GS] +VsyncQueueSize=2 +FrameLimitEnable=enabled +VsyncEnable=0 +FramerateNTSC=59.94 +FrameratePAL=50 +[EmuCore/Gamefixes] +VuAddSubHack=disabled +FpuMulHack=disabled +FpuNegDivHack=disabled +XgKickHack=disabled +EETimingHack=disabled +SoftwareRendererFMVHack=disabled +SkipMPEGHack=disabled +OPHFlagHack=disabled +DMABusyHack=disabled +VIFFIFOHack=disabled +VIF1StallHack=disabled +GIFFIFOHack=disabled +GoemonTlbHack=disabled +IbitHack=disabled +VUSyncHack=disabled +VUOverflowHack=disabled +BlitInternalFPSHack=disabled +[EmuCore/Profiler] +Enabled=disabled +RecBlocks_EE=enabled +RecBlocks_IOP=enabled +RecBlocks_VU0=enabled +RecBlocks_VU1=enabled +[EmuCore/Debugger] +ShowDebuggerOnStart=disabled +AlignMemoryWindowStart=enabled +FontWidth=8 +FontHeight=12 +WindowWidth=0 +WindowHeight=0 +MemoryViewBytesPerRow=16 +[EmuCore/TraceLog] +Enabled=disabled +EE.bitset=0 +IOP.bitset=0 +[DEV9] +[DEV9/Eth] +EthEnable=disabled +EthApi=Unset +EthDevice= +EthLogDNS=disabled +InterceptDHCP=disabled +PS2IP=0.0.0.0 +Mask=0.0.0.0 +Gateway=0.0.0.0 +DNS1=0.0.0.0 +DNS2=0.0.0.0 +AutoMask=enabled +AutoGateway=enabled +ModeDNS1=Auto +ModeDNS2=Auto +[DEV9/Hdd] +HddEnable=disabled +HddFile=DEV9hdd.raw +HddSizeSectors=83886080 diff --git a/emu-configs/defaults/ppsspp/controls.ini b/emu-configs/defaults/ppsspp/controls.ini new file mode 100644 index 00000000..476bb718 --- /dev/null +++ b/emu-configs/defaults/ppsspp/controls.ini @@ -0,0 +1,23 @@ +[ControlMapping] +Up = 1-19,10-19 +Down = 1-20,10-20 +Left = 1-21,10-21 +Right = 1-22,10-22 +Circle = 1-52,10-190 +Cross = 1-54,10-189 +Square = 1-29,10-191 +Triangle = 1-47,10-188 +Start = 1-62,10-197 +Select = 1-66,10-196 +L = 1-45,10-194 +R = 1-51,10-195 +An.Up = 1-37,10-4003 +An.Down = 1-39,10-4002 +An.Left = 1-38,10-4001 +An.Right = 1-40,10-4000 +Analog limiter = 1-60 +RapidFire = 1-59 +Fast-forward = 1-61 +SpeedToggle = 1-68 +Pause = 1-111,10-109,10-104 +Rewind = 1-67 diff --git a/emu-configs/defaults/ppsspp/ppsspp.ini b/emu-configs/defaults/ppsspp/ppsspp.ini new file mode 100644 index 00000000..c4112ae2 --- /dev/null +++ b/emu-configs/defaults/ppsspp/ppsspp.ini @@ -0,0 +1,449 @@ +[General] +FirstRun = False +RunCount = 1 +Enable Logging = True +AutoRun = True +Browse = False +IgnoreBadMemAccess = True +CurrentDirectory = /home/deck +ShowDebuggerOnLoad = False +CheckForNewVersion = True +Language = en_US +ForceLagSync2 = False +DiscordPresence = True +UISound = False +AutoLoadSaveState = 0 +EnableCheats = False +CwCheatRefreshRate = 77 +CwCheatScrollPosition = 0.000000 +GameListScrollPosition = 0.000000 +ScreenshotsAsPNG = False +UseFFV1 = False +DumpFrames = False +DumpVideoOutput = False +DumpAudio = False +SaveLoadResetsAVdumping = False +StateSlot = 0 +EnableStateUndo = True +StateLoadUndoGame = NA +StateUndoLastSaveGame = NA +StateUndoLastSaveSlot = -5 +RewindFlipFrequency = 0 +ShowOnScreenMessage = True +ShowRegionOnGameIcon = False +ShowIDOnGameIcon = False +GameGridScale = 1.000000 +GridView1 = True +GridView2 = True +GridView3 = False +RightAnalogUp = 0 +RightAnalogDown = 0 +RightAnalogLeft = 0 +RightAnalogRight = 0 +RightAnalogPress = 0 +RightAnalogCustom = False +RightAnalogDisableDiagonal = False +SwipeUp = 0 +SwipeDown = 0 +SwipeLeft = 0 +SwipeRight = 0 +SwipeSensitivity = 1.000000 +SwipeSmoothing = 0.300000 +DoubleTapGesture = 0 +GestureControlEnabled = False +ReportingHost = default +AutoSaveSymbolMap = False +CacheFullIsoInRam = False +RemoteISOPort = 0 +LastRemoteISOServer = +LastRemoteISOPort = 0 +RemoteISOManualConfig = False +RemoteShareOnStartup = False +RemoteISOSubdir = / +RemoteDebuggerOnStartup = False +InternalScreenRotation = 1 +BackgroundAnimation = 1 +UITint = 0.000000 +UISaturation = 1.000000 +PauseWhenMinimized = False +DumpDecryptedEboots = False +MemStickInserted = True +EnablePlugins = True +IgnoreCompatSettings = +[CPU] +CPUCore = 1 +SeparateSASThread = True +IOTimingMethod = 0 +FastMemoryAccess = True +FunctionReplacements = True +HideSlowWarnings = False +HideStateWarnings = False +PreloadFunctions = False +JitDisableFlags = 0x00000000 +CPUSpeed = 0 +[Graphics] +EnableCardboardVR = False +CardboardScreenSize = 50 +CardboardXShift = 0 +CardboardYShift = 0 +ShowFPSCounter = 0 +GraphicsBackend = 0 (OPENGL) +FailedGraphicsBackends = +DisabledGraphicsBackends = +VulkanDevice = +CameraDevice = +RenderingMode = 1 +SoftwareRenderer = False +SoftwareRendererJit = True +HardwareTransform = True +SoftwareSkinning = True +TextureFiltering = 1 +BufferFiltering = 1 +InternalResolution = 1 +AndroidHwScale = 1 +HighQualityDepth = 1 +FrameSkip = 0 +FrameSkipType = 0 +AutoFrameSkip = False +FrameRate = 0 +FrameRate2 = -1 +AnalogFrameRate = 240 +AnalogFrameRateMode = 0 +UnthrottlingMode = CONTINUOUS +AnisotropyLevel = 4 +VertexDecCache = False +TextureBackoffCache = False +TextureSecondaryCache = False +FullScreen = False +FullScreenMulti = False +SmallDisplayZoomType = 2 +SmallDisplayOffsetX = 0.500000 +SmallDisplayOffsetY = 0.500000 +SmallDisplayZoomLevel = 1.000000 +ImmersiveMode = True +SustainedPerformanceMode = False +IgnoreScreenInsets = True +ReplaceTextures = True +SaveNewTextures = False +IgnoreTextureFilenames = False +ReplaceTexturesAllowLate = True +TexScalingLevel = 1 +TexScalingType = 0 +TexDeposterize = False +TexHardwareScaling = False +VSyncInterval = False +BloomHack = 0 +SplineBezierQuality = 2 +HardwareTessellation = False +TextureShader = Off +ShaderChainRequires60FPS = False +MemBlockTransferGPU = True +DisableSlowFramebufEffects = False +FragmentTestCache = True +LogFrameDrops = False +InflightFrames = 2 +RenderDuplicateFrames = False +GpuLogProfiler = False +[Sound] +Enable = True +AudioBackend = 0 +ExtraAudioBuffering = False +GlobalVolume = 10 +ReverbVolume = 10 +AltSpeedVolume = -1 +AudioDevice = +AutoAudioDevice = True +[Control] +HapticFeedback = False +ShowTouchCross = True +ShowTouchCircle = True +ShowTouchSquare = True +ShowTouchTriangle = True +Custom0Mapping = 0x0000000000000000 +Custom0Image = 0 +Custom0Shape = 0 +Custom0Toggle = False +Custom0Repeat = False +Custom1Mapping = 0x0000000000000000 +Custom1Image = 1 +Custom1Shape = 0 +Custom1Toggle = False +Custom1Repeat = False +Custom2Mapping = 0x0000000000000000 +Custom2Image = 2 +Custom2Shape = 0 +Custom2Toggle = False +Custom2Repeat = False +Custom3Mapping = 0x0000000000000000 +Custom3Image = 3 +Custom3Shape = 0 +Custom3Toggle = False +Custom3Repeat = False +Custom4Mapping = 0x0000000000000000 +Custom4Image = 4 +Custom4Shape = 0 +Custom4Toggle = False +Custom4Repeat = False +Custom5Mapping = 0x0000000000000000 +Custom5Image = 0 +Custom5Shape = 1 +Custom5Toggle = False +Custom5Repeat = False +Custom6Mapping = 0x0000000000000000 +Custom6Image = 1 +Custom6Shape = 1 +Custom6Toggle = False +Custom6Repeat = False +Custom7Mapping = 0x0000000000000000 +Custom7Image = 2 +Custom7Shape = 1 +Custom7Toggle = False +Custom7Repeat = False +Custom8Mapping = 0x0000000000000000 +Custom8Image = 3 +Custom8Shape = 1 +Custom8Toggle = False +Custom8Repeat = False +Custom9Mapping = 0x0000000000000000 +Custom9Image = 4 +Custom9Shape = 1 +Custom9Toggle = False +Custom9Repeat = False +ShowTouchPause = False +ShowTouchControls = False +DisableDpadDiagonals = False +GamepadOnlyFocused = False +TouchButtonStyle = 1 +TouchButtonOpacity = 65 +TouchButtonHideSeconds = 20 +AutoCenterTouchAnalog = False +AnalogAutoRotSpeed = 8.000000 +TouchSnapToGrid = False +TouchSnapGridSize = 64 +ActionButtonSpacing2 = 1.000000 +ActionButtonCenterX = -1.000000 +ActionButtonCenterY = -1.000000 +ActionButtonScale = 1.150000 +DPadX = -1.000000 +DPadY = -1.000000 +DPadScale = 1.150000 +ShowTouchDpad = True +DPadSpacing = 1.000000 +StartKeyX = -1.000000 +StartKeyY = -1.000000 +StartKeyScale = 1.150000 +ShowTouchStart = True +SelectKeyX = -1.000000 +SelectKeyY = -1.000000 +SelectKeyScale = 1.150000 +ShowTouchSelect = True +UnthrottleKeyX = -1.000000 +UnthrottleKeyY = -1.000000 +UnthrottleKeyScale = 1.150000 +ShowTouchUnthrottle = True +LKeyX = -1.000000 +LKeyY = -1.000000 +LKeyScale = 1.150000 +ShowTouchLTrigger = True +RKeyX = -1.000000 +RKeyY = -1.000000 +RKeyScale = 1.150000 +ShowTouchRTrigger = True +AnalogStickX = -1.000000 +AnalogStickY = -1.000000 +AnalogStickScale = 1.150000 +ShowAnalogStick = True +RightAnalogStickX = -1.000000 +RightAnalogStickY = -1.000000 +RightAnalogStickScale = 1.150000 +ShowRightAnalogStick = False +fcombo0X = -1.000000 +fcombo0Y = -1.000000 +comboKeyScale0 = 1.150000 +ShowComboKey0 = False +fcombo1X = -1.000000 +fcombo1Y = -1.000000 +comboKeyScale1 = 1.150000 +ShowComboKey1 = False +fcombo2X = -1.000000 +fcombo2Y = -1.000000 +comboKeyScale2 = 1.150000 +ShowComboKey2 = False +fcombo3X = -1.000000 +fcombo3Y = -1.000000 +comboKeyScale3 = 1.150000 +ShowComboKey3 = False +fcombo4X = -1.000000 +fcombo4Y = -1.000000 +comboKeyScale4 = 1.150000 +ShowComboKey4 = False +fcombo5X = -1.000000 +fcombo5Y = -1.000000 +comboKeyScale5 = 1.150000 +ShowComboKey5 = False +fcombo6X = -1.000000 +fcombo6Y = -1.000000 +comboKeyScale6 = 1.150000 +ShowComboKey6 = False +fcombo7X = -1.000000 +fcombo7Y = -1.000000 +comboKeyScale7 = 1.150000 +ShowComboKey7 = False +fcombo8X = -1.000000 +fcombo8Y = -1.000000 +comboKeyScale8 = 1.150000 +ShowComboKey8 = False +fcombo9X = -1.000000 +fcombo9Y = -1.000000 +comboKeyScale9 = 1.150000 +ShowComboKey9 = False +AnalogDeadzone = 0.150000 +AnalogInverseDeadzone = 0.000000 +AnalogSensitivity = 1.100000 +AnalogIsCircular = False +AnalogLimiterDeadzone = 0.600000 +LeftStickHeadScale = 1.000000 +RightStickHeadScale = 1.000000 +HideStickBackground = False +UseMouse = False +MapMouse = False +ConfineMap = False +MouseSensitivity = 0.100000 +MouseSmoothing = 0.900000 +SystemControls = True +[Network] +EnableWlan = False +EnableAdhocServer = False +proAdhocServer = socom.cc +PortOffset = 10000 +MinTimeout = 0 +ForcedFirstConnect = False +EnableUPnP = False +UPnPUseOriginalPort = False +EnableNetworkChat = False +ChatButtonPosition = 0 +ChatScreenPosition = 0 +EnableQuickChat = True +QuickChat1 = Quick Chat 1 +QuickChat2 = Quick Chat 2 +QuickChat3 = Quick Chat 3 +QuickChat4 = Quick Chat 4 +QuickChat5 = Quick Chat 5 +[SystemParam] +PSPModel = 1 +PSPFirmwareVersion = 660 +NickName = PPSSPP +MacAddress = c8:56:7c:5c:fb:eb +Language = 1 +ParamTimeFormat = 0 +ParamDateFormat = 0 +TimeZone = 0 +DayLightSavings = False +ButtonPreference = 1 +LockParentalLevel = 0 +WlanAdhocChannel = 0 +WlanPowerSave = False +EncryptSave = True +SavedataUpgradeVersion = True +MemStickSize = 16 +[Debugger] +DisasmWindowX = -1 +DisasmWindowY = -1 +DisasmWindowW = -1 +DisasmWindowH = -1 +GEWindowX = -1 +GEWindowY = -1 +GEWindowW = -1 +GEWindowH = -1 +ConsoleWindowX = -1 +ConsoleWindowY = -1 +FontWidth = 8 +FontHeight = 12 +DisplayStatusBar = True +ShowBottomTabTitles = True +ShowDeveloperMenu = False +SkipDeadbeefFilling = False +FuncHashMap = False +MemInfoDetailed = False +DrawFrameGraph = False +[Upgrade] +UpgradeMessage = +UpgradeVersion = +DismissedVersion = +[Theme] +ThemeName = Default +[Recent] +MaxRecent = 60 +[Log] +SYSTEMEnabled = True +SYSTEMLevel = 2 +BOOTEnabled = True +BOOTLevel = 2 +COMMONEnabled = True +COMMONLevel = 2 +CPUEnabled = True +CPULevel = 2 +FILESYSEnabled = True +FILESYSLevel = 2 +G3DEnabled = True +G3DLevel = 2 +HLEEnabled = True +HLELevel = 2 +JITEnabled = True +JITLevel = 2 +LOADEREnabled = True +LOADERLevel = 2 +MEEnabled = True +MELevel = 2 +MEMMAPEnabled = True +MEMMAPLevel = 2 +SASMIXEnabled = True +SASMIXLevel = 2 +SAVESTATEEnabled = True +SAVESTATELevel = 2 +FRAMEBUFEnabled = True +FRAMEBUFLevel = 2 +AUDIOEnabled = True +AUDIOLevel = 2 +IOEnabled = True +IOLevel = 2 +SCEAUDIOEnabled = True +SCEAUDIOLevel = 2 +SCECTRLEnabled = True +SCECTRLLevel = 2 +SCEDISPEnabled = True +SCEDISPLevel = 2 +SCEFONTEnabled = True +SCEFONTLevel = 2 +SCEGEEnabled = True +SCEGELevel = 2 +SCEINTCEnabled = True +SCEINTCLevel = 2 +SCEIOEnabled = True +SCEIOLevel = 2 +SCEKERNELEnabled = True +SCEKERNELLevel = 2 +SCEMODULEEnabled = True +SCEMODULELevel = 2 +SCENETEnabled = True +SCENETLevel = 2 +SCERTCEnabled = True +SCERTCLevel = 2 +SCESASEnabled = True +SCESASLevel = 2 +SCEUTILEnabled = True +SCEUTILLevel = 2 +SCEMISCEnabled = True +SCEMISCLevel = 2 +[PostShaderSetting] +BloomSettingValue1 = 0.600000 +BloomSettingValue2 = 0.500000 +CRTSettingValue1 = 1.000000 +CartoonSettingValue1 = 0.500000 +ColorCorrectionSettingValue1 = 1.000000 +ColorCorrectionSettingValue2 = 1.000000 +ColorCorrectionSettingValue3 = 1.000000 +ColorCorrectionSettingValue4 = 1.000000 +ScanlinesSettingValue1 = 1.000000 +ScanlinesSettingValue2 = 0.500000 +SharpenSettingValue1 = 1.500000 diff --git a/emu-configs/defaults/retroarch/retroarch.cfg b/emu-configs/defaults/retroarch/retroarch.cfg new file mode 100644 index 00000000..0ee6dd1a --- /dev/null +++ b/emu-configs/defaults/retroarch/retroarch.cfg @@ -0,0 +1,3198 @@ +accessibility_enable = "false" +accessibility_narrator_speech_speed = "5" +ai_service_enable = "false" +ai_service_mode = "1" +ai_service_pause = "false" +ai_service_source_lang = "0" +ai_service_target_lang = "0" +ai_service_url = "http://localhost:4404/" +all_users_control_menu = "false" +apply_cheats_after_load = "false" +apply_cheats_after_toggle = "false" +aspect_ratio_index = "22" +assets_directory = "~/.config/retroarch/assets" +audio_block_frames = "0" +audio_device = "" +audio_driver = "pulse" +audio_dsp_plugin = "" +audio_enable = "true" +audio_enable_menu = "false" +audio_enable_menu_bgm = "false" +audio_enable_menu_cancel = "false" +audio_enable_menu_notice = "false" +audio_enable_menu_ok = "false" +audio_fastforward_mute = "false" +audio_filter_dir = "~/.config/retroarch/filters/audio" +audio_latency = "64" +audio_max_timing_skew = "0.050000" +audio_mixer_mute_enable = "false" +audio_mixer_volume = "0.000000" +audio_mute_enable = "false" +audio_out_rate = "48000" +audio_rate_control = "true" +audio_rate_control_delta = "0.005000" +audio_resampler = "sinc" +audio_resampler_quality = "3" +audio_sync = "true" +audio_volume = "0.000000" +auto_overrides_enable = "true" +auto_remaps_enable = "true" +auto_screenshot_filename = "true" +auto_shaders_enable = "true" +autosave_interval = "10" +block_sram_overwrite = "false" +bluetooth_driver = "null" +builtin_imageviewer_enable = "true" +builtin_mediaplayer_enable = "false" +bundle_assets_dst_path = "" +bundle_assets_dst_path_subdir = "" +bundle_assets_extract_enable = "false" +bundle_assets_extract_last_version = "0" +bundle_assets_extract_version_current = "0" +bundle_assets_src_path = "" +cache_directory = "" +camera_allow = "false" +camera_device = "" +camera_driver = "video4linux2" +cheat_database_path = "~/.config/retroarch/cheats" +check_firmware_before_loading = "false" +cheevos_auto_screenshot = "false" +cheevos_badges_enable = "false" +cheevos_challenge_indicators = "true" +cheevos_custom_host = "" +cheevos_enable = "false" +cheevos_hardcore_mode_enable = "true" +cheevos_leaderboards_enable = "true" +cheevos_password = "" +cheevos_richpresence_enable = "true" +cheevos_start_active = "false" +cheevos_test_unofficial = "false" +cheevos_token = "" +cheevos_unlock_sound_enable = "false" +cheevos_username = "" +cheevos_verbose_enable = "true" +config_save_on_exit = "true" +content_database_path = "~/.config/retroarch/database/rdb" +content_favorites_directory = "default" +content_favorites_path = "~/.config/retroarch/content_favorites.lpl" +content_favorites_size = "200" +content_history_directory = "default" +content_history_path = "~/.config/retroarch/content_history.lpl" +content_history_size = "200" +content_image_history_directory = "default" +content_image_history_path = "~/.config/retroarch/content_image_history.lpl" +content_music_history_directory = "default" +content_music_history_path = "~/.config/retroarch/content_music_history.lpl" +content_runtime_log = "true" +content_runtime_log_aggregate = "false" +content_show_add = "true" +content_show_add_entry = "2" +content_show_contentless_cores = "2" +content_show_explore = "true" +content_show_favorites = "true" +content_show_history = "true" +content_show_images = "true" +content_show_music = "true" +content_show_netplay = "true" +content_show_playlists = "true" +content_show_settings = "true" +content_show_settings_password = "" +content_video_directory = "default" +content_video_history_path = "~/.config/retroarch/content_video_history.lpl" +core_assets_directory = "~/.config/retroarch/downloads" +core_info_cache_enable = "true" +core_option_category_enable = "true" +core_options_path = "" +core_set_supports_no_game_enable = "true" +core_updater_auto_backup = "true" +core_updater_auto_backup_history_size = "1" +core_updater_auto_extract_archive = "true" +core_updater_buildbot_assets_url = "http://buildbot.libretro.com/assets/" +core_updater_buildbot_cores_url = "http://buildbot.libretro.com/nightly/linux/x86_64/latest/" +core_updater_show_experimental_cores = "false" +crt_switch_center_adjust = "0" +crt_switch_hires_menu = "false" +crt_switch_porch_adjust = "0" +crt_switch_resolution = "0" +crt_switch_resolution_super = "2560" +crt_switch_resolution_use_custom_refresh_rate = "false" +crt_switch_timings = "" +crt_video_refresh_rate = "60.000000" +current_resolution_id = "0" +cursor_directory = "~/.config/retroarch/database/cursors" +custom_viewport_height = "720" +custom_viewport_width = "960" +custom_viewport_x = "0" +custom_viewport_y = "0" +desktop_menu_enable = "true" +discord_allow = "false" +discord_app_id = "475456035851599874" +driver_switch_enable = "true" +dynamic_wallpapers_directory = "default" +enable_device_vibration = "false" +facebook_stream_key = "" +fastforward_frameskip = "true" +fastforward_ratio = "0.000000" +filter_by_current_core = "false" +flicker_filter_enable = "false" +flicker_filter_index = "0" +fps_show = "false" +fps_update_interval = "256" +frame_time_counter_reset_after_fastforwarding = "false" +frame_time_counter_reset_after_load_state = "false" +frame_time_counter_reset_after_save_state = "false" +framecount_show = "false" +frontend_log_level = "1" +game_specific_options = "true" +gamemode_enable = "false" +gamma_correction = "0" +global_core_options = "false" +history_list_enable = "true" +input_ai_service = "nul" +input_ai_service_axis = "nul" +input_ai_service_btn = "nul" +input_ai_service_mbtn = "nul" +input_analog_deadzone = "0.000000" +input_analog_sensitivity = "1.000000" +input_audio_mute = "f9" +input_audio_mute_axis = "nul" +input_audio_mute_btn = "nul" +input_audio_mute_mbtn = "nul" +input_auto_game_focus = "0" +input_auto_mouse_grab = "false" +input_autodetect_enable = "true" +input_axis_threshold = "0.500000" +input_bind_hold = "2" +input_bind_timeout = "5" +input_cheat_index_minus = "t" +input_cheat_index_minus_axis = "nul" +input_cheat_index_minus_btn = "nul" +input_cheat_index_minus_mbtn = "nul" +input_cheat_index_plus = "y" +input_cheat_index_plus_axis = "nul" +input_cheat_index_plus_btn = "nul" +input_cheat_index_plus_mbtn = "nul" +input_cheat_toggle = "u" +input_cheat_toggle_axis = "nul" +input_cheat_toggle_btn = "nul" +input_cheat_toggle_mbtn = "nul" +input_close_content = "nul" +input_close_content_axis = "nul" +input_close_content_btn = "nul" +input_close_content_mbtn = "nul" +input_descriptor_hide_unbound = "false" +input_descriptor_label_show = "true" +input_desktop_menu_toggle = "f5" +input_desktop_menu_toggle_axis = "nul" +input_desktop_menu_toggle_btn = "nul" +input_desktop_menu_toggle_mbtn = "nul" +input_device_p1 = "0" +input_device_p10 = "0" +input_device_p11 = "0" +input_device_p12 = "0" +input_device_p13 = "0" +input_device_p14 = "0" +input_device_p15 = "0" +input_device_p16 = "0" +input_device_p2 = "0" +input_device_p3 = "0" +input_device_p4 = "0" +input_device_p5 = "0" +input_device_p6 = "0" +input_device_p7 = "0" +input_device_p8 = "0" +input_device_p9 = "0" +input_disk_eject_toggle = "nul" +input_disk_eject_toggle_axis = "nul" +input_disk_eject_toggle_btn = "nul" +input_disk_eject_toggle_mbtn = "nul" +input_disk_next = "nul" +input_disk_next_axis = "nul" +input_disk_next_btn = "nul" +input_disk_next_mbtn = "nul" +input_disk_prev = "nul" +input_disk_prev_axis = "nul" +input_disk_prev_btn = "nul" +input_disk_prev_mbtn = "nul" +input_driver = "x" +input_duty_cycle = "3" +input_enable_hotkey = "nul" +input_enable_hotkey_axis = "nul" +input_enable_hotkey_btn = "nul" +input_enable_hotkey_mbtn = "nul" +input_exit_emulator = "escape" +input_exit_emulator_axis = "nul" +input_exit_emulator_btn = "nul" +input_exit_emulator_mbtn = "nul" +input_fps_toggle = "f3" +input_fps_toggle_axis = "nul" +input_fps_toggle_btn = "nul" +input_fps_toggle_mbtn = "nul" +input_frame_advance = "k" +input_frame_advance_axis = "nul" +input_frame_advance_btn = "nul" +input_frame_advance_mbtn = "nul" +input_game_focus_toggle = "scroll_lock" +input_game_focus_toggle_axis = "nul" +input_game_focus_toggle_btn = "nul" +input_game_focus_toggle_mbtn = "nul" +input_grab_mouse_toggle = "f11" +input_grab_mouse_toggle_axis = "nul" +input_grab_mouse_toggle_btn = "nul" +input_grab_mouse_toggle_mbtn = "nul" +input_hold_fast_forward = "l" +input_hold_fast_forward_axis = "nul" +input_hold_fast_forward_btn = "nul" +input_hold_fast_forward_mbtn = "nul" +input_hold_slowmotion = "e" +input_hold_slowmotion_axis = "nul" +input_hold_slowmotion_btn = "nul" +input_hold_slowmotion_mbtn = "nul" +input_hotkey_block_delay = "5" +input_joypad_driver = "udev" +input_keyboard_layout = "" +input_load_state = "f4" +input_load_state_axis = "nul" +input_load_state_btn = "nul" +input_load_state_mbtn = "nul" +input_max_users = "5" +input_menu_toggle = "f1" +input_menu_toggle_axis = "nul" +input_menu_toggle_btn = "nul" +input_menu_toggle_gamepad_combo = "0" +input_menu_toggle_mbtn = "nul" +input_movie_record_toggle = "o" +input_movie_record_toggle_axis = "nul" +input_movie_record_toggle_btn = "nul" +input_movie_record_toggle_mbtn = "nul" +input_netplay_fade_chat_toggle = "nul" +input_netplay_fade_chat_toggle_axis = "nul" +input_netplay_fade_chat_toggle_btn = "nul" +input_netplay_fade_chat_toggle_mbtn = "nul" +input_netplay_game_watch = "i" +input_netplay_game_watch_axis = "nul" +input_netplay_game_watch_btn = "nul" +input_netplay_game_watch_mbtn = "nul" +input_netplay_host_toggle = "nul" +input_netplay_host_toggle_axis = "nul" +input_netplay_host_toggle_btn = "nul" +input_netplay_host_toggle_mbtn = "nul" +input_netplay_ping_toggle = "nul" +input_netplay_ping_toggle_axis = "nul" +input_netplay_ping_toggle_btn = "nul" +input_netplay_ping_toggle_mbtn = "nul" +input_netplay_player_chat = "tilde" +input_netplay_player_chat_axis = "nul" +input_netplay_player_chat_btn = "nul" +input_netplay_player_chat_mbtn = "nul" +input_nowinkey_enable = "false" +input_osk_toggle = "f12" +input_osk_toggle_axis = "nul" +input_osk_toggle_btn = "nul" +input_osk_toggle_mbtn = "nul" +input_overlay = "" +input_overlay_aspect_adjust_landscape = "0.000000" +input_overlay_aspect_adjust_portrait = "0.000000" +input_overlay_auto_rotate = "false" +input_overlay_auto_scale = "false" +input_overlay_behind_menu = "false" +input_overlay_enable = "true" +input_overlay_enable_autopreferred = "true" +input_overlay_hide_in_menu = "true" +input_overlay_hide_when_gamepad_connected = "false" +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_scale_landscape = "1.000000" +input_overlay_scale_portrait = "1.000000" +input_overlay_show_inputs = "2" +input_overlay_show_inputs_port = "0" +input_overlay_show_mouse_cursor = "true" +input_overlay_x_offset_landscape = "0.000000" +input_overlay_x_offset_portrait = "0.000000" +input_overlay_x_separation_landscape = "0.000000" +input_overlay_x_separation_portrait = "0.000000" +input_overlay_y_offset_landscape = "0.000000" +input_overlay_y_offset_portrait = "0.000000" +input_overlay_y_separation_landscape = "0.000000" +input_overlay_y_separation_portrait = "0.000000" +input_pause_toggle = "p" +input_pause_toggle_axis = "nul" +input_pause_toggle_btn = "nul" +input_pause_toggle_mbtn = "nul" +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_b = "nul" +input_player10_b_axis = "nul" +input_player10_b_btn = "nul" +input_player10_b_mbtn = "nul" +input_player10_down = "nul" +input_player10_down_axis = "nul" +input_player10_down_btn = "nul" +input_player10_down_mbtn = "nul" +input_player10_gun_aux_a = "nul" +input_player10_gun_aux_a_axis = "nul" +input_player10_gun_aux_a_btn = "nul" +input_player10_gun_aux_a_mbtn = "nul" +input_player10_gun_aux_b = "nul" +input_player10_gun_aux_b_axis = "nul" +input_player10_gun_aux_b_btn = "nul" +input_player10_gun_aux_b_mbtn = "nul" +input_player10_gun_aux_c = "nul" +input_player10_gun_aux_c_axis = "nul" +input_player10_gun_aux_c_btn = "nul" +input_player10_gun_aux_c_mbtn = "nul" +input_player10_gun_dpad_down = "nul" +input_player10_gun_dpad_down_axis = "nul" +input_player10_gun_dpad_down_btn = "nul" +input_player10_gun_dpad_down_mbtn = "nul" +input_player10_gun_dpad_left = "nul" +input_player10_gun_dpad_left_axis = "nul" +input_player10_gun_dpad_left_btn = "nul" +input_player10_gun_dpad_left_mbtn = "nul" +input_player10_gun_dpad_right = "nul" +input_player10_gun_dpad_right_axis = "nul" +input_player10_gun_dpad_right_btn = "nul" +input_player10_gun_dpad_right_mbtn = "nul" +input_player10_gun_dpad_up = "nul" +input_player10_gun_dpad_up_axis = "nul" +input_player10_gun_dpad_up_btn = "nul" +input_player10_gun_dpad_up_mbtn = "nul" +input_player10_gun_offscreen_shot = "nul" +input_player10_gun_offscreen_shot_axis = "nul" +input_player10_gun_offscreen_shot_btn = "nul" +input_player10_gun_offscreen_shot_mbtn = "nul" +input_player10_gun_select = "nul" +input_player10_gun_select_axis = "nul" +input_player10_gun_select_btn = "nul" +input_player10_gun_select_mbtn = "nul" +input_player10_gun_start = "nul" +input_player10_gun_start_axis = "nul" +input_player10_gun_start_btn = "nul" +input_player10_gun_start_mbtn = "nul" +input_player10_gun_trigger = "nul" +input_player10_gun_trigger_axis = "nul" +input_player10_gun_trigger_btn = "nul" +input_player10_gun_trigger_mbtn = "1" +input_player10_joypad_index = "9" +input_player10_l = "nul" +input_player10_l2 = "nul" +input_player10_l2_axis = "nul" +input_player10_l2_btn = "nul" +input_player10_l2_mbtn = "nul" +input_player10_l3 = "nul" +input_player10_l3_axis = "nul" +input_player10_l3_btn = "nul" +input_player10_l3_mbtn = "nul" +input_player10_l_axis = "nul" +input_player10_l_btn = "nul" +input_player10_l_mbtn = "nul" +input_player10_l_x_minus = "nul" +input_player10_l_x_minus_axis = "nul" +input_player10_l_x_minus_btn = "nul" +input_player10_l_x_minus_mbtn = "nul" +input_player10_l_x_plus = "nul" +input_player10_l_x_plus_axis = "nul" +input_player10_l_x_plus_btn = "nul" +input_player10_l_x_plus_mbtn = "nul" +input_player10_l_y_minus = "nul" +input_player10_l_y_minus_axis = "nul" +input_player10_l_y_minus_btn = "nul" +input_player10_l_y_minus_mbtn = "nul" +input_player10_l_y_plus = "nul" +input_player10_l_y_plus_axis = "nul" +input_player10_l_y_plus_btn = "nul" +input_player10_l_y_plus_mbtn = "nul" +input_player10_left = "nul" +input_player10_left_axis = "nul" +input_player10_left_btn = "nul" +input_player10_left_mbtn = "nul" +input_player10_mouse_index = "9" +input_player10_r = "nul" +input_player10_r2 = "nul" +input_player10_r2_axis = "nul" +input_player10_r2_btn = "nul" +input_player10_r2_mbtn = "nul" +input_player10_r3 = "nul" +input_player10_r3_axis = "nul" +input_player10_r3_btn = "nul" +input_player10_r3_mbtn = "nul" +input_player10_r_axis = "nul" +input_player10_r_btn = "nul" +input_player10_r_mbtn = "nul" +input_player10_r_x_minus = "nul" +input_player10_r_x_minus_axis = "nul" +input_player10_r_x_minus_btn = "nul" +input_player10_r_x_minus_mbtn = "nul" +input_player10_r_x_plus = "nul" +input_player10_r_x_plus_axis = "nul" +input_player10_r_x_plus_btn = "nul" +input_player10_r_x_plus_mbtn = "nul" +input_player10_r_y_minus = "nul" +input_player10_r_y_minus_axis = "nul" +input_player10_r_y_minus_btn = "nul" +input_player10_r_y_minus_mbtn = "nul" +input_player10_r_y_plus = "nul" +input_player10_r_y_plus_axis = "nul" +input_player10_r_y_plus_btn = "nul" +input_player10_r_y_plus_mbtn = "nul" +input_player10_right = "nul" +input_player10_right_axis = "nul" +input_player10_right_btn = "nul" +input_player10_right_mbtn = "nul" +input_player10_select = "nul" +input_player10_select_axis = "nul" +input_player10_select_btn = "nul" +input_player10_select_mbtn = "nul" +input_player10_start = "nul" +input_player10_start_axis = "nul" +input_player10_start_btn = "nul" +input_player10_start_mbtn = "nul" +input_player10_turbo = "nul" +input_player10_turbo_axis = "nul" +input_player10_turbo_btn = "nul" +input_player10_turbo_mbtn = "nul" +input_player10_up = "nul" +input_player10_up_axis = "nul" +input_player10_up_btn = "nul" +input_player10_up_mbtn = "nul" +input_player10_x = "nul" +input_player10_x_axis = "nul" +input_player10_x_btn = "nul" +input_player10_x_mbtn = "nul" +input_player10_y = "nul" +input_player10_y_axis = "nul" +input_player10_y_btn = "nul" +input_player10_y_mbtn = "nul" +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_b = "nul" +input_player11_b_axis = "nul" +input_player11_b_btn = "nul" +input_player11_b_mbtn = "nul" +input_player11_down = "nul" +input_player11_down_axis = "nul" +input_player11_down_btn = "nul" +input_player11_down_mbtn = "nul" +input_player11_gun_aux_a = "nul" +input_player11_gun_aux_a_axis = "nul" +input_player11_gun_aux_a_btn = "nul" +input_player11_gun_aux_a_mbtn = "nul" +input_player11_gun_aux_b = "nul" +input_player11_gun_aux_b_axis = "nul" +input_player11_gun_aux_b_btn = "nul" +input_player11_gun_aux_b_mbtn = "nul" +input_player11_gun_aux_c = "nul" +input_player11_gun_aux_c_axis = "nul" +input_player11_gun_aux_c_btn = "nul" +input_player11_gun_aux_c_mbtn = "nul" +input_player11_gun_dpad_down = "nul" +input_player11_gun_dpad_down_axis = "nul" +input_player11_gun_dpad_down_btn = "nul" +input_player11_gun_dpad_down_mbtn = "nul" +input_player11_gun_dpad_left = "nul" +input_player11_gun_dpad_left_axis = "nul" +input_player11_gun_dpad_left_btn = "nul" +input_player11_gun_dpad_left_mbtn = "nul" +input_player11_gun_dpad_right = "nul" +input_player11_gun_dpad_right_axis = "nul" +input_player11_gun_dpad_right_btn = "nul" +input_player11_gun_dpad_right_mbtn = "nul" +input_player11_gun_dpad_up = "nul" +input_player11_gun_dpad_up_axis = "nul" +input_player11_gun_dpad_up_btn = "nul" +input_player11_gun_dpad_up_mbtn = "nul" +input_player11_gun_offscreen_shot = "nul" +input_player11_gun_offscreen_shot_axis = "nul" +input_player11_gun_offscreen_shot_btn = "nul" +input_player11_gun_offscreen_shot_mbtn = "nul" +input_player11_gun_select = "nul" +input_player11_gun_select_axis = "nul" +input_player11_gun_select_btn = "nul" +input_player11_gun_select_mbtn = "nul" +input_player11_gun_start = "nul" +input_player11_gun_start_axis = "nul" +input_player11_gun_start_btn = "nul" +input_player11_gun_start_mbtn = "nul" +input_player11_gun_trigger = "nul" +input_player11_gun_trigger_axis = "nul" +input_player11_gun_trigger_btn = "nul" +input_player11_gun_trigger_mbtn = "1" +input_player11_joypad_index = "10" +input_player11_l = "nul" +input_player11_l2 = "nul" +input_player11_l2_axis = "nul" +input_player11_l2_btn = "nul" +input_player11_l2_mbtn = "nul" +input_player11_l3 = "nul" +input_player11_l3_axis = "nul" +input_player11_l3_btn = "nul" +input_player11_l3_mbtn = "nul" +input_player11_l_axis = "nul" +input_player11_l_btn = "nul" +input_player11_l_mbtn = "nul" +input_player11_l_x_minus = "nul" +input_player11_l_x_minus_axis = "nul" +input_player11_l_x_minus_btn = "nul" +input_player11_l_x_minus_mbtn = "nul" +input_player11_l_x_plus = "nul" +input_player11_l_x_plus_axis = "nul" +input_player11_l_x_plus_btn = "nul" +input_player11_l_x_plus_mbtn = "nul" +input_player11_l_y_minus = "nul" +input_player11_l_y_minus_axis = "nul" +input_player11_l_y_minus_btn = "nul" +input_player11_l_y_minus_mbtn = "nul" +input_player11_l_y_plus = "nul" +input_player11_l_y_plus_axis = "nul" +input_player11_l_y_plus_btn = "nul" +input_player11_l_y_plus_mbtn = "nul" +input_player11_left = "nul" +input_player11_left_axis = "nul" +input_player11_left_btn = "nul" +input_player11_left_mbtn = "nul" +input_player11_mouse_index = "10" +input_player11_r = "nul" +input_player11_r2 = "nul" +input_player11_r2_axis = "nul" +input_player11_r2_btn = "nul" +input_player11_r2_mbtn = "nul" +input_player11_r3 = "nul" +input_player11_r3_axis = "nul" +input_player11_r3_btn = "nul" +input_player11_r3_mbtn = "nul" +input_player11_r_axis = "nul" +input_player11_r_btn = "nul" +input_player11_r_mbtn = "nul" +input_player11_r_x_minus = "nul" +input_player11_r_x_minus_axis = "nul" +input_player11_r_x_minus_btn = "nul" +input_player11_r_x_minus_mbtn = "nul" +input_player11_r_x_plus = "nul" +input_player11_r_x_plus_axis = "nul" +input_player11_r_x_plus_btn = "nul" +input_player11_r_x_plus_mbtn = "nul" +input_player11_r_y_minus = "nul" +input_player11_r_y_minus_axis = "nul" +input_player11_r_y_minus_btn = "nul" +input_player11_r_y_minus_mbtn = "nul" +input_player11_r_y_plus = "nul" +input_player11_r_y_plus_axis = "nul" +input_player11_r_y_plus_btn = "nul" +input_player11_r_y_plus_mbtn = "nul" +input_player11_right = "nul" +input_player11_right_axis = "nul" +input_player11_right_btn = "nul" +input_player11_right_mbtn = "nul" +input_player11_select = "nul" +input_player11_select_axis = "nul" +input_player11_select_btn = "nul" +input_player11_select_mbtn = "nul" +input_player11_start = "nul" +input_player11_start_axis = "nul" +input_player11_start_btn = "nul" +input_player11_start_mbtn = "nul" +input_player11_turbo = "nul" +input_player11_turbo_axis = "nul" +input_player11_turbo_btn = "nul" +input_player11_turbo_mbtn = "nul" +input_player11_up = "nul" +input_player11_up_axis = "nul" +input_player11_up_btn = "nul" +input_player11_up_mbtn = "nul" +input_player11_x = "nul" +input_player11_x_axis = "nul" +input_player11_x_btn = "nul" +input_player11_x_mbtn = "nul" +input_player11_y = "nul" +input_player11_y_axis = "nul" +input_player11_y_btn = "nul" +input_player11_y_mbtn = "nul" +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_b = "nul" +input_player12_b_axis = "nul" +input_player12_b_btn = "nul" +input_player12_b_mbtn = "nul" +input_player12_down = "nul" +input_player12_down_axis = "nul" +input_player12_down_btn = "nul" +input_player12_down_mbtn = "nul" +input_player12_gun_aux_a = "nul" +input_player12_gun_aux_a_axis = "nul" +input_player12_gun_aux_a_btn = "nul" +input_player12_gun_aux_a_mbtn = "nul" +input_player12_gun_aux_b = "nul" +input_player12_gun_aux_b_axis = "nul" +input_player12_gun_aux_b_btn = "nul" +input_player12_gun_aux_b_mbtn = "nul" +input_player12_gun_aux_c = "nul" +input_player12_gun_aux_c_axis = "nul" +input_player12_gun_aux_c_btn = "nul" +input_player12_gun_aux_c_mbtn = "nul" +input_player12_gun_dpad_down = "nul" +input_player12_gun_dpad_down_axis = "nul" +input_player12_gun_dpad_down_btn = "nul" +input_player12_gun_dpad_down_mbtn = "nul" +input_player12_gun_dpad_left = "nul" +input_player12_gun_dpad_left_axis = "nul" +input_player12_gun_dpad_left_btn = "nul" +input_player12_gun_dpad_left_mbtn = "nul" +input_player12_gun_dpad_right = "nul" +input_player12_gun_dpad_right_axis = "nul" +input_player12_gun_dpad_right_btn = "nul" +input_player12_gun_dpad_right_mbtn = "nul" +input_player12_gun_dpad_up = "nul" +input_player12_gun_dpad_up_axis = "nul" +input_player12_gun_dpad_up_btn = "nul" +input_player12_gun_dpad_up_mbtn = "nul" +input_player12_gun_offscreen_shot = "nul" +input_player12_gun_offscreen_shot_axis = "nul" +input_player12_gun_offscreen_shot_btn = "nul" +input_player12_gun_offscreen_shot_mbtn = "nul" +input_player12_gun_select = "nul" +input_player12_gun_select_axis = "nul" +input_player12_gun_select_btn = "nul" +input_player12_gun_select_mbtn = "nul" +input_player12_gun_start = "nul" +input_player12_gun_start_axis = "nul" +input_player12_gun_start_btn = "nul" +input_player12_gun_start_mbtn = "nul" +input_player12_gun_trigger = "nul" +input_player12_gun_trigger_axis = "nul" +input_player12_gun_trigger_btn = "nul" +input_player12_gun_trigger_mbtn = "1" +input_player12_joypad_index = "11" +input_player12_l = "nul" +input_player12_l2 = "nul" +input_player12_l2_axis = "nul" +input_player12_l2_btn = "nul" +input_player12_l2_mbtn = "nul" +input_player12_l3 = "nul" +input_player12_l3_axis = "nul" +input_player12_l3_btn = "nul" +input_player12_l3_mbtn = "nul" +input_player12_l_axis = "nul" +input_player12_l_btn = "nul" +input_player12_l_mbtn = "nul" +input_player12_l_x_minus = "nul" +input_player12_l_x_minus_axis = "nul" +input_player12_l_x_minus_btn = "nul" +input_player12_l_x_minus_mbtn = "nul" +input_player12_l_x_plus = "nul" +input_player12_l_x_plus_axis = "nul" +input_player12_l_x_plus_btn = "nul" +input_player12_l_x_plus_mbtn = "nul" +input_player12_l_y_minus = "nul" +input_player12_l_y_minus_axis = "nul" +input_player12_l_y_minus_btn = "nul" +input_player12_l_y_minus_mbtn = "nul" +input_player12_l_y_plus = "nul" +input_player12_l_y_plus_axis = "nul" +input_player12_l_y_plus_btn = "nul" +input_player12_l_y_plus_mbtn = "nul" +input_player12_left = "nul" +input_player12_left_axis = "nul" +input_player12_left_btn = "nul" +input_player12_left_mbtn = "nul" +input_player12_mouse_index = "11" +input_player12_r = "nul" +input_player12_r2 = "nul" +input_player12_r2_axis = "nul" +input_player12_r2_btn = "nul" +input_player12_r2_mbtn = "nul" +input_player12_r3 = "nul" +input_player12_r3_axis = "nul" +input_player12_r3_btn = "nul" +input_player12_r3_mbtn = "nul" +input_player12_r_axis = "nul" +input_player12_r_btn = "nul" +input_player12_r_mbtn = "nul" +input_player12_r_x_minus = "nul" +input_player12_r_x_minus_axis = "nul" +input_player12_r_x_minus_btn = "nul" +input_player12_r_x_minus_mbtn = "nul" +input_player12_r_x_plus = "nul" +input_player12_r_x_plus_axis = "nul" +input_player12_r_x_plus_btn = "nul" +input_player12_r_x_plus_mbtn = "nul" +input_player12_r_y_minus = "nul" +input_player12_r_y_minus_axis = "nul" +input_player12_r_y_minus_btn = "nul" +input_player12_r_y_minus_mbtn = "nul" +input_player12_r_y_plus = "nul" +input_player12_r_y_plus_axis = "nul" +input_player12_r_y_plus_btn = "nul" +input_player12_r_y_plus_mbtn = "nul" +input_player12_right = "nul" +input_player12_right_axis = "nul" +input_player12_right_btn = "nul" +input_player12_right_mbtn = "nul" +input_player12_select = "nul" +input_player12_select_axis = "nul" +input_player12_select_btn = "nul" +input_player12_select_mbtn = "nul" +input_player12_start = "nul" +input_player12_start_axis = "nul" +input_player12_start_btn = "nul" +input_player12_start_mbtn = "nul" +input_player12_turbo = "nul" +input_player12_turbo_axis = "nul" +input_player12_turbo_btn = "nul" +input_player12_turbo_mbtn = "nul" +input_player12_up = "nul" +input_player12_up_axis = "nul" +input_player12_up_btn = "nul" +input_player12_up_mbtn = "nul" +input_player12_x = "nul" +input_player12_x_axis = "nul" +input_player12_x_btn = "nul" +input_player12_x_mbtn = "nul" +input_player12_y = "nul" +input_player12_y_axis = "nul" +input_player12_y_btn = "nul" +input_player12_y_mbtn = "nul" +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_b = "nul" +input_player13_b_axis = "nul" +input_player13_b_btn = "nul" +input_player13_b_mbtn = "nul" +input_player13_down = "nul" +input_player13_down_axis = "nul" +input_player13_down_btn = "nul" +input_player13_down_mbtn = "nul" +input_player13_gun_aux_a = "nul" +input_player13_gun_aux_a_axis = "nul" +input_player13_gun_aux_a_btn = "nul" +input_player13_gun_aux_a_mbtn = "nul" +input_player13_gun_aux_b = "nul" +input_player13_gun_aux_b_axis = "nul" +input_player13_gun_aux_b_btn = "nul" +input_player13_gun_aux_b_mbtn = "nul" +input_player13_gun_aux_c = "nul" +input_player13_gun_aux_c_axis = "nul" +input_player13_gun_aux_c_btn = "nul" +input_player13_gun_aux_c_mbtn = "nul" +input_player13_gun_dpad_down = "nul" +input_player13_gun_dpad_down_axis = "nul" +input_player13_gun_dpad_down_btn = "nul" +input_player13_gun_dpad_down_mbtn = "nul" +input_player13_gun_dpad_left = "nul" +input_player13_gun_dpad_left_axis = "nul" +input_player13_gun_dpad_left_btn = "nul" +input_player13_gun_dpad_left_mbtn = "nul" +input_player13_gun_dpad_right = "nul" +input_player13_gun_dpad_right_axis = "nul" +input_player13_gun_dpad_right_btn = "nul" +input_player13_gun_dpad_right_mbtn = "nul" +input_player13_gun_dpad_up = "nul" +input_player13_gun_dpad_up_axis = "nul" +input_player13_gun_dpad_up_btn = "nul" +input_player13_gun_dpad_up_mbtn = "nul" +input_player13_gun_offscreen_shot = "nul" +input_player13_gun_offscreen_shot_axis = "nul" +input_player13_gun_offscreen_shot_btn = "nul" +input_player13_gun_offscreen_shot_mbtn = "nul" +input_player13_gun_select = "nul" +input_player13_gun_select_axis = "nul" +input_player13_gun_select_btn = "nul" +input_player13_gun_select_mbtn = "nul" +input_player13_gun_start = "nul" +input_player13_gun_start_axis = "nul" +input_player13_gun_start_btn = "nul" +input_player13_gun_start_mbtn = "nul" +input_player13_gun_trigger = "nul" +input_player13_gun_trigger_axis = "nul" +input_player13_gun_trigger_btn = "nul" +input_player13_gun_trigger_mbtn = "1" +input_player13_joypad_index = "12" +input_player13_l = "nul" +input_player13_l2 = "nul" +input_player13_l2_axis = "nul" +input_player13_l2_btn = "nul" +input_player13_l2_mbtn = "nul" +input_player13_l3 = "nul" +input_player13_l3_axis = "nul" +input_player13_l3_btn = "nul" +input_player13_l3_mbtn = "nul" +input_player13_l_axis = "nul" +input_player13_l_btn = "nul" +input_player13_l_mbtn = "nul" +input_player13_l_x_minus = "nul" +input_player13_l_x_minus_axis = "nul" +input_player13_l_x_minus_btn = "nul" +input_player13_l_x_minus_mbtn = "nul" +input_player13_l_x_plus = "nul" +input_player13_l_x_plus_axis = "nul" +input_player13_l_x_plus_btn = "nul" +input_player13_l_x_plus_mbtn = "nul" +input_player13_l_y_minus = "nul" +input_player13_l_y_minus_axis = "nul" +input_player13_l_y_minus_btn = "nul" +input_player13_l_y_minus_mbtn = "nul" +input_player13_l_y_plus = "nul" +input_player13_l_y_plus_axis = "nul" +input_player13_l_y_plus_btn = "nul" +input_player13_l_y_plus_mbtn = "nul" +input_player13_left = "nul" +input_player13_left_axis = "nul" +input_player13_left_btn = "nul" +input_player13_left_mbtn = "nul" +input_player13_mouse_index = "12" +input_player13_r = "nul" +input_player13_r2 = "nul" +input_player13_r2_axis = "nul" +input_player13_r2_btn = "nul" +input_player13_r2_mbtn = "nul" +input_player13_r3 = "nul" +input_player13_r3_axis = "nul" +input_player13_r3_btn = "nul" +input_player13_r3_mbtn = "nul" +input_player13_r_axis = "nul" +input_player13_r_btn = "nul" +input_player13_r_mbtn = "nul" +input_player13_r_x_minus = "nul" +input_player13_r_x_minus_axis = "nul" +input_player13_r_x_minus_btn = "nul" +input_player13_r_x_minus_mbtn = "nul" +input_player13_r_x_plus = "nul" +input_player13_r_x_plus_axis = "nul" +input_player13_r_x_plus_btn = "nul" +input_player13_r_x_plus_mbtn = "nul" +input_player13_r_y_minus = "nul" +input_player13_r_y_minus_axis = "nul" +input_player13_r_y_minus_btn = "nul" +input_player13_r_y_minus_mbtn = "nul" +input_player13_r_y_plus = "nul" +input_player13_r_y_plus_axis = "nul" +input_player13_r_y_plus_btn = "nul" +input_player13_r_y_plus_mbtn = "nul" +input_player13_right = "nul" +input_player13_right_axis = "nul" +input_player13_right_btn = "nul" +input_player13_right_mbtn = "nul" +input_player13_select = "nul" +input_player13_select_axis = "nul" +input_player13_select_btn = "nul" +input_player13_select_mbtn = "nul" +input_player13_start = "nul" +input_player13_start_axis = "nul" +input_player13_start_btn = "nul" +input_player13_start_mbtn = "nul" +input_player13_turbo = "nul" +input_player13_turbo_axis = "nul" +input_player13_turbo_btn = "nul" +input_player13_turbo_mbtn = "nul" +input_player13_up = "nul" +input_player13_up_axis = "nul" +input_player13_up_btn = "nul" +input_player13_up_mbtn = "nul" +input_player13_x = "nul" +input_player13_x_axis = "nul" +input_player13_x_btn = "nul" +input_player13_x_mbtn = "nul" +input_player13_y = "nul" +input_player13_y_axis = "nul" +input_player13_y_btn = "nul" +input_player13_y_mbtn = "nul" +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_b = "nul" +input_player14_b_axis = "nul" +input_player14_b_btn = "nul" +input_player14_b_mbtn = "nul" +input_player14_down = "nul" +input_player14_down_axis = "nul" +input_player14_down_btn = "nul" +input_player14_down_mbtn = "nul" +input_player14_gun_aux_a = "nul" +input_player14_gun_aux_a_axis = "nul" +input_player14_gun_aux_a_btn = "nul" +input_player14_gun_aux_a_mbtn = "nul" +input_player14_gun_aux_b = "nul" +input_player14_gun_aux_b_axis = "nul" +input_player14_gun_aux_b_btn = "nul" +input_player14_gun_aux_b_mbtn = "nul" +input_player14_gun_aux_c = "nul" +input_player14_gun_aux_c_axis = "nul" +input_player14_gun_aux_c_btn = "nul" +input_player14_gun_aux_c_mbtn = "nul" +input_player14_gun_dpad_down = "nul" +input_player14_gun_dpad_down_axis = "nul" +input_player14_gun_dpad_down_btn = "nul" +input_player14_gun_dpad_down_mbtn = "nul" +input_player14_gun_dpad_left = "nul" +input_player14_gun_dpad_left_axis = "nul" +input_player14_gun_dpad_left_btn = "nul" +input_player14_gun_dpad_left_mbtn = "nul" +input_player14_gun_dpad_right = "nul" +input_player14_gun_dpad_right_axis = "nul" +input_player14_gun_dpad_right_btn = "nul" +input_player14_gun_dpad_right_mbtn = "nul" +input_player14_gun_dpad_up = "nul" +input_player14_gun_dpad_up_axis = "nul" +input_player14_gun_dpad_up_btn = "nul" +input_player14_gun_dpad_up_mbtn = "nul" +input_player14_gun_offscreen_shot = "nul" +input_player14_gun_offscreen_shot_axis = "nul" +input_player14_gun_offscreen_shot_btn = "nul" +input_player14_gun_offscreen_shot_mbtn = "nul" +input_player14_gun_select = "nul" +input_player14_gun_select_axis = "nul" +input_player14_gun_select_btn = "nul" +input_player14_gun_select_mbtn = "nul" +input_player14_gun_start = "nul" +input_player14_gun_start_axis = "nul" +input_player14_gun_start_btn = "nul" +input_player14_gun_start_mbtn = "nul" +input_player14_gun_trigger = "nul" +input_player14_gun_trigger_axis = "nul" +input_player14_gun_trigger_btn = "nul" +input_player14_gun_trigger_mbtn = "1" +input_player14_joypad_index = "13" +input_player14_l = "nul" +input_player14_l2 = "nul" +input_player14_l2_axis = "nul" +input_player14_l2_btn = "nul" +input_player14_l2_mbtn = "nul" +input_player14_l3 = "nul" +input_player14_l3_axis = "nul" +input_player14_l3_btn = "nul" +input_player14_l3_mbtn = "nul" +input_player14_l_axis = "nul" +input_player14_l_btn = "nul" +input_player14_l_mbtn = "nul" +input_player14_l_x_minus = "nul" +input_player14_l_x_minus_axis = "nul" +input_player14_l_x_minus_btn = "nul" +input_player14_l_x_minus_mbtn = "nul" +input_player14_l_x_plus = "nul" +input_player14_l_x_plus_axis = "nul" +input_player14_l_x_plus_btn = "nul" +input_player14_l_x_plus_mbtn = "nul" +input_player14_l_y_minus = "nul" +input_player14_l_y_minus_axis = "nul" +input_player14_l_y_minus_btn = "nul" +input_player14_l_y_minus_mbtn = "nul" +input_player14_l_y_plus = "nul" +input_player14_l_y_plus_axis = "nul" +input_player14_l_y_plus_btn = "nul" +input_player14_l_y_plus_mbtn = "nul" +input_player14_left = "nul" +input_player14_left_axis = "nul" +input_player14_left_btn = "nul" +input_player14_left_mbtn = "nul" +input_player14_mouse_index = "13" +input_player14_r = "nul" +input_player14_r2 = "nul" +input_player14_r2_axis = "nul" +input_player14_r2_btn = "nul" +input_player14_r2_mbtn = "nul" +input_player14_r3 = "nul" +input_player14_r3_axis = "nul" +input_player14_r3_btn = "nul" +input_player14_r3_mbtn = "nul" +input_player14_r_axis = "nul" +input_player14_r_btn = "nul" +input_player14_r_mbtn = "nul" +input_player14_r_x_minus = "nul" +input_player14_r_x_minus_axis = "nul" +input_player14_r_x_minus_btn = "nul" +input_player14_r_x_minus_mbtn = "nul" +input_player14_r_x_plus = "nul" +input_player14_r_x_plus_axis = "nul" +input_player14_r_x_plus_btn = "nul" +input_player14_r_x_plus_mbtn = "nul" +input_player14_r_y_minus = "nul" +input_player14_r_y_minus_axis = "nul" +input_player14_r_y_minus_btn = "nul" +input_player14_r_y_minus_mbtn = "nul" +input_player14_r_y_plus = "nul" +input_player14_r_y_plus_axis = "nul" +input_player14_r_y_plus_btn = "nul" +input_player14_r_y_plus_mbtn = "nul" +input_player14_right = "nul" +input_player14_right_axis = "nul" +input_player14_right_btn = "nul" +input_player14_right_mbtn = "nul" +input_player14_select = "nul" +input_player14_select_axis = "nul" +input_player14_select_btn = "nul" +input_player14_select_mbtn = "nul" +input_player14_start = "nul" +input_player14_start_axis = "nul" +input_player14_start_btn = "nul" +input_player14_start_mbtn = "nul" +input_player14_turbo = "nul" +input_player14_turbo_axis = "nul" +input_player14_turbo_btn = "nul" +input_player14_turbo_mbtn = "nul" +input_player14_up = "nul" +input_player14_up_axis = "nul" +input_player14_up_btn = "nul" +input_player14_up_mbtn = "nul" +input_player14_x = "nul" +input_player14_x_axis = "nul" +input_player14_x_btn = "nul" +input_player14_x_mbtn = "nul" +input_player14_y = "nul" +input_player14_y_axis = "nul" +input_player14_y_btn = "nul" +input_player14_y_mbtn = "nul" +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_b = "nul" +input_player15_b_axis = "nul" +input_player15_b_btn = "nul" +input_player15_b_mbtn = "nul" +input_player15_down = "nul" +input_player15_down_axis = "nul" +input_player15_down_btn = "nul" +input_player15_down_mbtn = "nul" +input_player15_gun_aux_a = "nul" +input_player15_gun_aux_a_axis = "nul" +input_player15_gun_aux_a_btn = "nul" +input_player15_gun_aux_a_mbtn = "nul" +input_player15_gun_aux_b = "nul" +input_player15_gun_aux_b_axis = "nul" +input_player15_gun_aux_b_btn = "nul" +input_player15_gun_aux_b_mbtn = "nul" +input_player15_gun_aux_c = "nul" +input_player15_gun_aux_c_axis = "nul" +input_player15_gun_aux_c_btn = "nul" +input_player15_gun_aux_c_mbtn = "nul" +input_player15_gun_dpad_down = "nul" +input_player15_gun_dpad_down_axis = "nul" +input_player15_gun_dpad_down_btn = "nul" +input_player15_gun_dpad_down_mbtn = "nul" +input_player15_gun_dpad_left = "nul" +input_player15_gun_dpad_left_axis = "nul" +input_player15_gun_dpad_left_btn = "nul" +input_player15_gun_dpad_left_mbtn = "nul" +input_player15_gun_dpad_right = "nul" +input_player15_gun_dpad_right_axis = "nul" +input_player15_gun_dpad_right_btn = "nul" +input_player15_gun_dpad_right_mbtn = "nul" +input_player15_gun_dpad_up = "nul" +input_player15_gun_dpad_up_axis = "nul" +input_player15_gun_dpad_up_btn = "nul" +input_player15_gun_dpad_up_mbtn = "nul" +input_player15_gun_offscreen_shot = "nul" +input_player15_gun_offscreen_shot_axis = "nul" +input_player15_gun_offscreen_shot_btn = "nul" +input_player15_gun_offscreen_shot_mbtn = "nul" +input_player15_gun_select = "nul" +input_player15_gun_select_axis = "nul" +input_player15_gun_select_btn = "nul" +input_player15_gun_select_mbtn = "nul" +input_player15_gun_start = "nul" +input_player15_gun_start_axis = "nul" +input_player15_gun_start_btn = "nul" +input_player15_gun_start_mbtn = "nul" +input_player15_gun_trigger = "nul" +input_player15_gun_trigger_axis = "nul" +input_player15_gun_trigger_btn = "nul" +input_player15_gun_trigger_mbtn = "1" +input_player15_joypad_index = "14" +input_player15_l = "nul" +input_player15_l2 = "nul" +input_player15_l2_axis = "nul" +input_player15_l2_btn = "nul" +input_player15_l2_mbtn = "nul" +input_player15_l3 = "nul" +input_player15_l3_axis = "nul" +input_player15_l3_btn = "nul" +input_player15_l3_mbtn = "nul" +input_player15_l_axis = "nul" +input_player15_l_btn = "nul" +input_player15_l_mbtn = "nul" +input_player15_l_x_minus = "nul" +input_player15_l_x_minus_axis = "nul" +input_player15_l_x_minus_btn = "nul" +input_player15_l_x_minus_mbtn = "nul" +input_player15_l_x_plus = "nul" +input_player15_l_x_plus_axis = "nul" +input_player15_l_x_plus_btn = "nul" +input_player15_l_x_plus_mbtn = "nul" +input_player15_l_y_minus = "nul" +input_player15_l_y_minus_axis = "nul" +input_player15_l_y_minus_btn = "nul" +input_player15_l_y_minus_mbtn = "nul" +input_player15_l_y_plus = "nul" +input_player15_l_y_plus_axis = "nul" +input_player15_l_y_plus_btn = "nul" +input_player15_l_y_plus_mbtn = "nul" +input_player15_left = "nul" +input_player15_left_axis = "nul" +input_player15_left_btn = "nul" +input_player15_left_mbtn = "nul" +input_player15_mouse_index = "14" +input_player15_r = "nul" +input_player15_r2 = "nul" +input_player15_r2_axis = "nul" +input_player15_r2_btn = "nul" +input_player15_r2_mbtn = "nul" +input_player15_r3 = "nul" +input_player15_r3_axis = "nul" +input_player15_r3_btn = "nul" +input_player15_r3_mbtn = "nul" +input_player15_r_axis = "nul" +input_player15_r_btn = "nul" +input_player15_r_mbtn = "nul" +input_player15_r_x_minus = "nul" +input_player15_r_x_minus_axis = "nul" +input_player15_r_x_minus_btn = "nul" +input_player15_r_x_minus_mbtn = "nul" +input_player15_r_x_plus = "nul" +input_player15_r_x_plus_axis = "nul" +input_player15_r_x_plus_btn = "nul" +input_player15_r_x_plus_mbtn = "nul" +input_player15_r_y_minus = "nul" +input_player15_r_y_minus_axis = "nul" +input_player15_r_y_minus_btn = "nul" +input_player15_r_y_minus_mbtn = "nul" +input_player15_r_y_plus = "nul" +input_player15_r_y_plus_axis = "nul" +input_player15_r_y_plus_btn = "nul" +input_player15_r_y_plus_mbtn = "nul" +input_player15_right = "nul" +input_player15_right_axis = "nul" +input_player15_right_btn = "nul" +input_player15_right_mbtn = "nul" +input_player15_select = "nul" +input_player15_select_axis = "nul" +input_player15_select_btn = "nul" +input_player15_select_mbtn = "nul" +input_player15_start = "nul" +input_player15_start_axis = "nul" +input_player15_start_btn = "nul" +input_player15_start_mbtn = "nul" +input_player15_turbo = "nul" +input_player15_turbo_axis = "nul" +input_player15_turbo_btn = "nul" +input_player15_turbo_mbtn = "nul" +input_player15_up = "nul" +input_player15_up_axis = "nul" +input_player15_up_btn = "nul" +input_player15_up_mbtn = "nul" +input_player15_x = "nul" +input_player15_x_axis = "nul" +input_player15_x_btn = "nul" +input_player15_x_mbtn = "nul" +input_player15_y = "nul" +input_player15_y_axis = "nul" +input_player15_y_btn = "nul" +input_player15_y_mbtn = "nul" +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_b = "nul" +input_player16_b_axis = "nul" +input_player16_b_btn = "nul" +input_player16_b_mbtn = "nul" +input_player16_down = "nul" +input_player16_down_axis = "nul" +input_player16_down_btn = "nul" +input_player16_down_mbtn = "nul" +input_player16_gun_aux_a = "nul" +input_player16_gun_aux_a_axis = "nul" +input_player16_gun_aux_a_btn = "nul" +input_player16_gun_aux_a_mbtn = "nul" +input_player16_gun_aux_b = "nul" +input_player16_gun_aux_b_axis = "nul" +input_player16_gun_aux_b_btn = "nul" +input_player16_gun_aux_b_mbtn = "nul" +input_player16_gun_aux_c = "nul" +input_player16_gun_aux_c_axis = "nul" +input_player16_gun_aux_c_btn = "nul" +input_player16_gun_aux_c_mbtn = "nul" +input_player16_gun_dpad_down = "nul" +input_player16_gun_dpad_down_axis = "nul" +input_player16_gun_dpad_down_btn = "nul" +input_player16_gun_dpad_down_mbtn = "nul" +input_player16_gun_dpad_left = "nul" +input_player16_gun_dpad_left_axis = "nul" +input_player16_gun_dpad_left_btn = "nul" +input_player16_gun_dpad_left_mbtn = "nul" +input_player16_gun_dpad_right = "nul" +input_player16_gun_dpad_right_axis = "nul" +input_player16_gun_dpad_right_btn = "nul" +input_player16_gun_dpad_right_mbtn = "nul" +input_player16_gun_dpad_up = "nul" +input_player16_gun_dpad_up_axis = "nul" +input_player16_gun_dpad_up_btn = "nul" +input_player16_gun_dpad_up_mbtn = "nul" +input_player16_gun_offscreen_shot = "nul" +input_player16_gun_offscreen_shot_axis = "nul" +input_player16_gun_offscreen_shot_btn = "nul" +input_player16_gun_offscreen_shot_mbtn = "nul" +input_player16_gun_select = "nul" +input_player16_gun_select_axis = "nul" +input_player16_gun_select_btn = "nul" +input_player16_gun_select_mbtn = "nul" +input_player16_gun_start = "nul" +input_player16_gun_start_axis = "nul" +input_player16_gun_start_btn = "nul" +input_player16_gun_start_mbtn = "nul" +input_player16_gun_trigger = "nul" +input_player16_gun_trigger_axis = "nul" +input_player16_gun_trigger_btn = "nul" +input_player16_gun_trigger_mbtn = "1" +input_player16_joypad_index = "15" +input_player16_l = "nul" +input_player16_l2 = "nul" +input_player16_l2_axis = "nul" +input_player16_l2_btn = "nul" +input_player16_l2_mbtn = "nul" +input_player16_l3 = "nul" +input_player16_l3_axis = "nul" +input_player16_l3_btn = "nul" +input_player16_l3_mbtn = "nul" +input_player16_l_axis = "nul" +input_player16_l_btn = "nul" +input_player16_l_mbtn = "nul" +input_player16_l_x_minus = "nul" +input_player16_l_x_minus_axis = "nul" +input_player16_l_x_minus_btn = "nul" +input_player16_l_x_minus_mbtn = "nul" +input_player16_l_x_plus = "nul" +input_player16_l_x_plus_axis = "nul" +input_player16_l_x_plus_btn = "nul" +input_player16_l_x_plus_mbtn = "nul" +input_player16_l_y_minus = "nul" +input_player16_l_y_minus_axis = "nul" +input_player16_l_y_minus_btn = "nul" +input_player16_l_y_minus_mbtn = "nul" +input_player16_l_y_plus = "nul" +input_player16_l_y_plus_axis = "nul" +input_player16_l_y_plus_btn = "nul" +input_player16_l_y_plus_mbtn = "nul" +input_player16_left = "nul" +input_player16_left_axis = "nul" +input_player16_left_btn = "nul" +input_player16_left_mbtn = "nul" +input_player16_mouse_index = "15" +input_player16_r = "nul" +input_player16_r2 = "nul" +input_player16_r2_axis = "nul" +input_player16_r2_btn = "nul" +input_player16_r2_mbtn = "nul" +input_player16_r3 = "nul" +input_player16_r3_axis = "nul" +input_player16_r3_btn = "nul" +input_player16_r3_mbtn = "nul" +input_player16_r_axis = "nul" +input_player16_r_btn = "nul" +input_player16_r_mbtn = "nul" +input_player16_r_x_minus = "nul" +input_player16_r_x_minus_axis = "nul" +input_player16_r_x_minus_btn = "nul" +input_player16_r_x_minus_mbtn = "nul" +input_player16_r_x_plus = "nul" +input_player16_r_x_plus_axis = "nul" +input_player16_r_x_plus_btn = "nul" +input_player16_r_x_plus_mbtn = "nul" +input_player16_r_y_minus = "nul" +input_player16_r_y_minus_axis = "nul" +input_player16_r_y_minus_btn = "nul" +input_player16_r_y_minus_mbtn = "nul" +input_player16_r_y_plus = "nul" +input_player16_r_y_plus_axis = "nul" +input_player16_r_y_plus_btn = "nul" +input_player16_r_y_plus_mbtn = "nul" +input_player16_right = "nul" +input_player16_right_axis = "nul" +input_player16_right_btn = "nul" +input_player16_right_mbtn = "nul" +input_player16_select = "nul" +input_player16_select_axis = "nul" +input_player16_select_btn = "nul" +input_player16_select_mbtn = "nul" +input_player16_start = "nul" +input_player16_start_axis = "nul" +input_player16_start_btn = "nul" +input_player16_start_mbtn = "nul" +input_player16_turbo = "nul" +input_player16_turbo_axis = "nul" +input_player16_turbo_btn = "nul" +input_player16_turbo_mbtn = "nul" +input_player16_up = "nul" +input_player16_up_axis = "nul" +input_player16_up_btn = "nul" +input_player16_up_mbtn = "nul" +input_player16_x = "nul" +input_player16_x_axis = "nul" +input_player16_x_btn = "nul" +input_player16_x_mbtn = "nul" +input_player16_y = "nul" +input_player16_y_axis = "nul" +input_player16_y_btn = "nul" +input_player16_y_mbtn = "nul" +input_player1_a = "x" +input_player1_a_axis = "nul" +input_player1_a_btn = "nul" +input_player1_a_mbtn = "nul" +input_player1_analog_dpad_mode = "0" +input_player1_b = "z" +input_player1_b_axis = "nul" +input_player1_b_btn = "nul" +input_player1_b_mbtn = "nul" +input_player1_down = "down" +input_player1_down_axis = "nul" +input_player1_down_btn = "nul" +input_player1_down_mbtn = "nul" +input_player1_gun_aux_a = "nul" +input_player1_gun_aux_a_axis = "nul" +input_player1_gun_aux_a_btn = "nul" +input_player1_gun_aux_a_mbtn = "nul" +input_player1_gun_aux_b = "nul" +input_player1_gun_aux_b_axis = "nul" +input_player1_gun_aux_b_btn = "nul" +input_player1_gun_aux_b_mbtn = "nul" +input_player1_gun_aux_c = "nul" +input_player1_gun_aux_c_axis = "nul" +input_player1_gun_aux_c_btn = "nul" +input_player1_gun_aux_c_mbtn = "nul" +input_player1_gun_dpad_down = "nul" +input_player1_gun_dpad_down_axis = "nul" +input_player1_gun_dpad_down_btn = "nul" +input_player1_gun_dpad_down_mbtn = "nul" +input_player1_gun_dpad_left = "nul" +input_player1_gun_dpad_left_axis = "nul" +input_player1_gun_dpad_left_btn = "nul" +input_player1_gun_dpad_left_mbtn = "nul" +input_player1_gun_dpad_right = "nul" +input_player1_gun_dpad_right_axis = "nul" +input_player1_gun_dpad_right_btn = "nul" +input_player1_gun_dpad_right_mbtn = "nul" +input_player1_gun_dpad_up = "nul" +input_player1_gun_dpad_up_axis = "nul" +input_player1_gun_dpad_up_btn = "nul" +input_player1_gun_dpad_up_mbtn = "nul" +input_player1_gun_offscreen_shot = "nul" +input_player1_gun_offscreen_shot_axis = "nul" +input_player1_gun_offscreen_shot_btn = "nul" +input_player1_gun_offscreen_shot_mbtn = "nul" +input_player1_gun_select = "nul" +input_player1_gun_select_axis = "nul" +input_player1_gun_select_btn = "nul" +input_player1_gun_select_mbtn = "nul" +input_player1_gun_start = "nul" +input_player1_gun_start_axis = "nul" +input_player1_gun_start_btn = "nul" +input_player1_gun_start_mbtn = "nul" +input_player1_gun_trigger = "nul" +input_player1_gun_trigger_axis = "nul" +input_player1_gun_trigger_btn = "nul" +input_player1_gun_trigger_mbtn = "1" +input_player1_joypad_index = "0" +input_player1_l = "q" +input_player1_l2 = "nul" +input_player1_l2_axis = "nul" +input_player1_l2_btn = "nul" +input_player1_l2_mbtn = "nul" +input_player1_l3 = "nul" +input_player1_l3_axis = "nul" +input_player1_l3_btn = "nul" +input_player1_l3_mbtn = "nul" +input_player1_l_axis = "nul" +input_player1_l_btn = "nul" +input_player1_l_mbtn = "nul" +input_player1_l_x_minus = "nul" +input_player1_l_x_minus_axis = "nul" +input_player1_l_x_minus_btn = "nul" +input_player1_l_x_minus_mbtn = "nul" +input_player1_l_x_plus = "nul" +input_player1_l_x_plus_axis = "nul" +input_player1_l_x_plus_btn = "nul" +input_player1_l_x_plus_mbtn = "nul" +input_player1_l_y_minus = "nul" +input_player1_l_y_minus_axis = "nul" +input_player1_l_y_minus_btn = "nul" +input_player1_l_y_minus_mbtn = "nul" +input_player1_l_y_plus = "nul" +input_player1_l_y_plus_axis = "nul" +input_player1_l_y_plus_btn = "nul" +input_player1_l_y_plus_mbtn = "nul" +input_player1_left = "left" +input_player1_left_axis = "nul" +input_player1_left_btn = "nul" +input_player1_left_mbtn = "nul" +input_player1_mouse_index = "0" +input_player1_r = "w" +input_player1_r2 = "nul" +input_player1_r2_axis = "nul" +input_player1_r2_btn = "nul" +input_player1_r2_mbtn = "nul" +input_player1_r3 = "nul" +input_player1_r3_axis = "nul" +input_player1_r3_btn = "nul" +input_player1_r3_mbtn = "nul" +input_player1_r_axis = "nul" +input_player1_r_btn = "nul" +input_player1_r_mbtn = "nul" +input_player1_r_x_minus = "nul" +input_player1_r_x_minus_axis = "nul" +input_player1_r_x_minus_btn = "nul" +input_player1_r_x_minus_mbtn = "nul" +input_player1_r_x_plus = "nul" +input_player1_r_x_plus_axis = "nul" +input_player1_r_x_plus_btn = "nul" +input_player1_r_x_plus_mbtn = "nul" +input_player1_r_y_minus = "nul" +input_player1_r_y_minus_axis = "nul" +input_player1_r_y_minus_btn = "nul" +input_player1_r_y_minus_mbtn = "nul" +input_player1_r_y_plus = "nul" +input_player1_r_y_plus_axis = "nul" +input_player1_r_y_plus_btn = "nul" +input_player1_r_y_plus_mbtn = "nul" +input_player1_right = "right" +input_player1_right_axis = "nul" +input_player1_right_btn = "nul" +input_player1_right_mbtn = "nul" +input_player1_select = "rshift" +input_player1_select_axis = "nul" +input_player1_select_btn = "nul" +input_player1_select_mbtn = "nul" +input_player1_start = "enter" +input_player1_start_axis = "nul" +input_player1_start_btn = "nul" +input_player1_start_mbtn = "nul" +input_player1_turbo = "nul" +input_player1_turbo_axis = "nul" +input_player1_turbo_btn = "nul" +input_player1_turbo_mbtn = "nul" +input_player1_up = "up" +input_player1_up_axis = "nul" +input_player1_up_btn = "nul" +input_player1_up_mbtn = "nul" +input_player1_x = "s" +input_player1_x_axis = "nul" +input_player1_x_btn = "nul" +input_player1_x_mbtn = "nul" +input_player1_y = "a" +input_player1_y_axis = "nul" +input_player1_y_btn = "nul" +input_player1_y_mbtn = "nul" +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_b = "nul" +input_player2_b_axis = "nul" +input_player2_b_btn = "nul" +input_player2_b_mbtn = "nul" +input_player2_down = "nul" +input_player2_down_axis = "nul" +input_player2_down_btn = "nul" +input_player2_down_mbtn = "nul" +input_player2_gun_aux_a = "nul" +input_player2_gun_aux_a_axis = "nul" +input_player2_gun_aux_a_btn = "nul" +input_player2_gun_aux_a_mbtn = "nul" +input_player2_gun_aux_b = "nul" +input_player2_gun_aux_b_axis = "nul" +input_player2_gun_aux_b_btn = "nul" +input_player2_gun_aux_b_mbtn = "nul" +input_player2_gun_aux_c = "nul" +input_player2_gun_aux_c_axis = "nul" +input_player2_gun_aux_c_btn = "nul" +input_player2_gun_aux_c_mbtn = "nul" +input_player2_gun_dpad_down = "nul" +input_player2_gun_dpad_down_axis = "nul" +input_player2_gun_dpad_down_btn = "nul" +input_player2_gun_dpad_down_mbtn = "nul" +input_player2_gun_dpad_left = "nul" +input_player2_gun_dpad_left_axis = "nul" +input_player2_gun_dpad_left_btn = "nul" +input_player2_gun_dpad_left_mbtn = "nul" +input_player2_gun_dpad_right = "nul" +input_player2_gun_dpad_right_axis = "nul" +input_player2_gun_dpad_right_btn = "nul" +input_player2_gun_dpad_right_mbtn = "nul" +input_player2_gun_dpad_up = "nul" +input_player2_gun_dpad_up_axis = "nul" +input_player2_gun_dpad_up_btn = "nul" +input_player2_gun_dpad_up_mbtn = "nul" +input_player2_gun_offscreen_shot = "nul" +input_player2_gun_offscreen_shot_axis = "nul" +input_player2_gun_offscreen_shot_btn = "nul" +input_player2_gun_offscreen_shot_mbtn = "nul" +input_player2_gun_select = "nul" +input_player2_gun_select_axis = "nul" +input_player2_gun_select_btn = "nul" +input_player2_gun_select_mbtn = "nul" +input_player2_gun_start = "nul" +input_player2_gun_start_axis = "nul" +input_player2_gun_start_btn = "nul" +input_player2_gun_start_mbtn = "nul" +input_player2_gun_trigger = "nul" +input_player2_gun_trigger_axis = "nul" +input_player2_gun_trigger_btn = "nul" +input_player2_gun_trigger_mbtn = "1" +input_player2_joypad_index = "1" +input_player2_l = "nul" +input_player2_l2 = "nul" +input_player2_l2_axis = "nul" +input_player2_l2_btn = "nul" +input_player2_l2_mbtn = "nul" +input_player2_l3 = "nul" +input_player2_l3_axis = "nul" +input_player2_l3_btn = "nul" +input_player2_l3_mbtn = "nul" +input_player2_l_axis = "nul" +input_player2_l_btn = "nul" +input_player2_l_mbtn = "nul" +input_player2_l_x_minus = "nul" +input_player2_l_x_minus_axis = "nul" +input_player2_l_x_minus_btn = "nul" +input_player2_l_x_minus_mbtn = "nul" +input_player2_l_x_plus = "nul" +input_player2_l_x_plus_axis = "nul" +input_player2_l_x_plus_btn = "nul" +input_player2_l_x_plus_mbtn = "nul" +input_player2_l_y_minus = "nul" +input_player2_l_y_minus_axis = "nul" +input_player2_l_y_minus_btn = "nul" +input_player2_l_y_minus_mbtn = "nul" +input_player2_l_y_plus = "nul" +input_player2_l_y_plus_axis = "nul" +input_player2_l_y_plus_btn = "nul" +input_player2_l_y_plus_mbtn = "nul" +input_player2_left = "nul" +input_player2_left_axis = "nul" +input_player2_left_btn = "nul" +input_player2_left_mbtn = "nul" +input_player2_mouse_index = "1" +input_player2_r = "nul" +input_player2_r2 = "nul" +input_player2_r2_axis = "nul" +input_player2_r2_btn = "nul" +input_player2_r2_mbtn = "nul" +input_player2_r3 = "nul" +input_player2_r3_axis = "nul" +input_player2_r3_btn = "nul" +input_player2_r3_mbtn = "nul" +input_player2_r_axis = "nul" +input_player2_r_btn = "nul" +input_player2_r_mbtn = "nul" +input_player2_r_x_minus = "nul" +input_player2_r_x_minus_axis = "nul" +input_player2_r_x_minus_btn = "nul" +input_player2_r_x_minus_mbtn = "nul" +input_player2_r_x_plus = "nul" +input_player2_r_x_plus_axis = "nul" +input_player2_r_x_plus_btn = "nul" +input_player2_r_x_plus_mbtn = "nul" +input_player2_r_y_minus = "nul" +input_player2_r_y_minus_axis = "nul" +input_player2_r_y_minus_btn = "nul" +input_player2_r_y_minus_mbtn = "nul" +input_player2_r_y_plus = "nul" +input_player2_r_y_plus_axis = "nul" +input_player2_r_y_plus_btn = "nul" +input_player2_r_y_plus_mbtn = "nul" +input_player2_right = "nul" +input_player2_right_axis = "nul" +input_player2_right_btn = "nul" +input_player2_right_mbtn = "nul" +input_player2_select = "nul" +input_player2_select_axis = "nul" +input_player2_select_btn = "nul" +input_player2_select_mbtn = "nul" +input_player2_start = "nul" +input_player2_start_axis = "nul" +input_player2_start_btn = "nul" +input_player2_start_mbtn = "nul" +input_player2_turbo = "nul" +input_player2_turbo_axis = "nul" +input_player2_turbo_btn = "nul" +input_player2_turbo_mbtn = "nul" +input_player2_up = "nul" +input_player2_up_axis = "nul" +input_player2_up_btn = "nul" +input_player2_up_mbtn = "nul" +input_player2_x = "nul" +input_player2_x_axis = "nul" +input_player2_x_btn = "nul" +input_player2_x_mbtn = "nul" +input_player2_y = "nul" +input_player2_y_axis = "nul" +input_player2_y_btn = "nul" +input_player2_y_mbtn = "nul" +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_b = "nul" +input_player3_b_axis = "nul" +input_player3_b_btn = "nul" +input_player3_b_mbtn = "nul" +input_player3_down = "nul" +input_player3_down_axis = "nul" +input_player3_down_btn = "nul" +input_player3_down_mbtn = "nul" +input_player3_gun_aux_a = "nul" +input_player3_gun_aux_a_axis = "nul" +input_player3_gun_aux_a_btn = "nul" +input_player3_gun_aux_a_mbtn = "nul" +input_player3_gun_aux_b = "nul" +input_player3_gun_aux_b_axis = "nul" +input_player3_gun_aux_b_btn = "nul" +input_player3_gun_aux_b_mbtn = "nul" +input_player3_gun_aux_c = "nul" +input_player3_gun_aux_c_axis = "nul" +input_player3_gun_aux_c_btn = "nul" +input_player3_gun_aux_c_mbtn = "nul" +input_player3_gun_dpad_down = "nul" +input_player3_gun_dpad_down_axis = "nul" +input_player3_gun_dpad_down_btn = "nul" +input_player3_gun_dpad_down_mbtn = "nul" +input_player3_gun_dpad_left = "nul" +input_player3_gun_dpad_left_axis = "nul" +input_player3_gun_dpad_left_btn = "nul" +input_player3_gun_dpad_left_mbtn = "nul" +input_player3_gun_dpad_right = "nul" +input_player3_gun_dpad_right_axis = "nul" +input_player3_gun_dpad_right_btn = "nul" +input_player3_gun_dpad_right_mbtn = "nul" +input_player3_gun_dpad_up = "nul" +input_player3_gun_dpad_up_axis = "nul" +input_player3_gun_dpad_up_btn = "nul" +input_player3_gun_dpad_up_mbtn = "nul" +input_player3_gun_offscreen_shot = "nul" +input_player3_gun_offscreen_shot_axis = "nul" +input_player3_gun_offscreen_shot_btn = "nul" +input_player3_gun_offscreen_shot_mbtn = "nul" +input_player3_gun_select = "nul" +input_player3_gun_select_axis = "nul" +input_player3_gun_select_btn = "nul" +input_player3_gun_select_mbtn = "nul" +input_player3_gun_start = "nul" +input_player3_gun_start_axis = "nul" +input_player3_gun_start_btn = "nul" +input_player3_gun_start_mbtn = "nul" +input_player3_gun_trigger = "nul" +input_player3_gun_trigger_axis = "nul" +input_player3_gun_trigger_btn = "nul" +input_player3_gun_trigger_mbtn = "1" +input_player3_joypad_index = "2" +input_player3_l = "nul" +input_player3_l2 = "nul" +input_player3_l2_axis = "nul" +input_player3_l2_btn = "nul" +input_player3_l2_mbtn = "nul" +input_player3_l3 = "nul" +input_player3_l3_axis = "nul" +input_player3_l3_btn = "nul" +input_player3_l3_mbtn = "nul" +input_player3_l_axis = "nul" +input_player3_l_btn = "nul" +input_player3_l_mbtn = "nul" +input_player3_l_x_minus = "nul" +input_player3_l_x_minus_axis = "nul" +input_player3_l_x_minus_btn = "nul" +input_player3_l_x_minus_mbtn = "nul" +input_player3_l_x_plus = "nul" +input_player3_l_x_plus_axis = "nul" +input_player3_l_x_plus_btn = "nul" +input_player3_l_x_plus_mbtn = "nul" +input_player3_l_y_minus = "nul" +input_player3_l_y_minus_axis = "nul" +input_player3_l_y_minus_btn = "nul" +input_player3_l_y_minus_mbtn = "nul" +input_player3_l_y_plus = "nul" +input_player3_l_y_plus_axis = "nul" +input_player3_l_y_plus_btn = "nul" +input_player3_l_y_plus_mbtn = "nul" +input_player3_left = "nul" +input_player3_left_axis = "nul" +input_player3_left_btn = "nul" +input_player3_left_mbtn = "nul" +input_player3_mouse_index = "2" +input_player3_r = "nul" +input_player3_r2 = "nul" +input_player3_r2_axis = "nul" +input_player3_r2_btn = "nul" +input_player3_r2_mbtn = "nul" +input_player3_r3 = "nul" +input_player3_r3_axis = "nul" +input_player3_r3_btn = "nul" +input_player3_r3_mbtn = "nul" +input_player3_r_axis = "nul" +input_player3_r_btn = "nul" +input_player3_r_mbtn = "nul" +input_player3_r_x_minus = "nul" +input_player3_r_x_minus_axis = "nul" +input_player3_r_x_minus_btn = "nul" +input_player3_r_x_minus_mbtn = "nul" +input_player3_r_x_plus = "nul" +input_player3_r_x_plus_axis = "nul" +input_player3_r_x_plus_btn = "nul" +input_player3_r_x_plus_mbtn = "nul" +input_player3_r_y_minus = "nul" +input_player3_r_y_minus_axis = "nul" +input_player3_r_y_minus_btn = "nul" +input_player3_r_y_minus_mbtn = "nul" +input_player3_r_y_plus = "nul" +input_player3_r_y_plus_axis = "nul" +input_player3_r_y_plus_btn = "nul" +input_player3_r_y_plus_mbtn = "nul" +input_player3_right = "nul" +input_player3_right_axis = "nul" +input_player3_right_btn = "nul" +input_player3_right_mbtn = "nul" +input_player3_select = "nul" +input_player3_select_axis = "nul" +input_player3_select_btn = "nul" +input_player3_select_mbtn = "nul" +input_player3_start = "nul" +input_player3_start_axis = "nul" +input_player3_start_btn = "nul" +input_player3_start_mbtn = "nul" +input_player3_turbo = "nul" +input_player3_turbo_axis = "nul" +input_player3_turbo_btn = "nul" +input_player3_turbo_mbtn = "nul" +input_player3_up = "nul" +input_player3_up_axis = "nul" +input_player3_up_btn = "nul" +input_player3_up_mbtn = "nul" +input_player3_x = "nul" +input_player3_x_axis = "nul" +input_player3_x_btn = "nul" +input_player3_x_mbtn = "nul" +input_player3_y = "nul" +input_player3_y_axis = "nul" +input_player3_y_btn = "nul" +input_player3_y_mbtn = "nul" +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_b = "nul" +input_player4_b_axis = "nul" +input_player4_b_btn = "nul" +input_player4_b_mbtn = "nul" +input_player4_down = "nul" +input_player4_down_axis = "nul" +input_player4_down_btn = "nul" +input_player4_down_mbtn = "nul" +input_player4_gun_aux_a = "nul" +input_player4_gun_aux_a_axis = "nul" +input_player4_gun_aux_a_btn = "nul" +input_player4_gun_aux_a_mbtn = "nul" +input_player4_gun_aux_b = "nul" +input_player4_gun_aux_b_axis = "nul" +input_player4_gun_aux_b_btn = "nul" +input_player4_gun_aux_b_mbtn = "nul" +input_player4_gun_aux_c = "nul" +input_player4_gun_aux_c_axis = "nul" +input_player4_gun_aux_c_btn = "nul" +input_player4_gun_aux_c_mbtn = "nul" +input_player4_gun_dpad_down = "nul" +input_player4_gun_dpad_down_axis = "nul" +input_player4_gun_dpad_down_btn = "nul" +input_player4_gun_dpad_down_mbtn = "nul" +input_player4_gun_dpad_left = "nul" +input_player4_gun_dpad_left_axis = "nul" +input_player4_gun_dpad_left_btn = "nul" +input_player4_gun_dpad_left_mbtn = "nul" +input_player4_gun_dpad_right = "nul" +input_player4_gun_dpad_right_axis = "nul" +input_player4_gun_dpad_right_btn = "nul" +input_player4_gun_dpad_right_mbtn = "nul" +input_player4_gun_dpad_up = "nul" +input_player4_gun_dpad_up_axis = "nul" +input_player4_gun_dpad_up_btn = "nul" +input_player4_gun_dpad_up_mbtn = "nul" +input_player4_gun_offscreen_shot = "nul" +input_player4_gun_offscreen_shot_axis = "nul" +input_player4_gun_offscreen_shot_btn = "nul" +input_player4_gun_offscreen_shot_mbtn = "nul" +input_player4_gun_select = "nul" +input_player4_gun_select_axis = "nul" +input_player4_gun_select_btn = "nul" +input_player4_gun_select_mbtn = "nul" +input_player4_gun_start = "nul" +input_player4_gun_start_axis = "nul" +input_player4_gun_start_btn = "nul" +input_player4_gun_start_mbtn = "nul" +input_player4_gun_trigger = "nul" +input_player4_gun_trigger_axis = "nul" +input_player4_gun_trigger_btn = "nul" +input_player4_gun_trigger_mbtn = "1" +input_player4_joypad_index = "3" +input_player4_l = "nul" +input_player4_l2 = "nul" +input_player4_l2_axis = "nul" +input_player4_l2_btn = "nul" +input_player4_l2_mbtn = "nul" +input_player4_l3 = "nul" +input_player4_l3_axis = "nul" +input_player4_l3_btn = "nul" +input_player4_l3_mbtn = "nul" +input_player4_l_axis = "nul" +input_player4_l_btn = "nul" +input_player4_l_mbtn = "nul" +input_player4_l_x_minus = "nul" +input_player4_l_x_minus_axis = "nul" +input_player4_l_x_minus_btn = "nul" +input_player4_l_x_minus_mbtn = "nul" +input_player4_l_x_plus = "nul" +input_player4_l_x_plus_axis = "nul" +input_player4_l_x_plus_btn = "nul" +input_player4_l_x_plus_mbtn = "nul" +input_player4_l_y_minus = "nul" +input_player4_l_y_minus_axis = "nul" +input_player4_l_y_minus_btn = "nul" +input_player4_l_y_minus_mbtn = "nul" +input_player4_l_y_plus = "nul" +input_player4_l_y_plus_axis = "nul" +input_player4_l_y_plus_btn = "nul" +input_player4_l_y_plus_mbtn = "nul" +input_player4_left = "nul" +input_player4_left_axis = "nul" +input_player4_left_btn = "nul" +input_player4_left_mbtn = "nul" +input_player4_mouse_index = "3" +input_player4_r = "nul" +input_player4_r2 = "nul" +input_player4_r2_axis = "nul" +input_player4_r2_btn = "nul" +input_player4_r2_mbtn = "nul" +input_player4_r3 = "nul" +input_player4_r3_axis = "nul" +input_player4_r3_btn = "nul" +input_player4_r3_mbtn = "nul" +input_player4_r_axis = "nul" +input_player4_r_btn = "nul" +input_player4_r_mbtn = "nul" +input_player4_r_x_minus = "nul" +input_player4_r_x_minus_axis = "nul" +input_player4_r_x_minus_btn = "nul" +input_player4_r_x_minus_mbtn = "nul" +input_player4_r_x_plus = "nul" +input_player4_r_x_plus_axis = "nul" +input_player4_r_x_plus_btn = "nul" +input_player4_r_x_plus_mbtn = "nul" +input_player4_r_y_minus = "nul" +input_player4_r_y_minus_axis = "nul" +input_player4_r_y_minus_btn = "nul" +input_player4_r_y_minus_mbtn = "nul" +input_player4_r_y_plus = "nul" +input_player4_r_y_plus_axis = "nul" +input_player4_r_y_plus_btn = "nul" +input_player4_r_y_plus_mbtn = "nul" +input_player4_right = "nul" +input_player4_right_axis = "nul" +input_player4_right_btn = "nul" +input_player4_right_mbtn = "nul" +input_player4_select = "nul" +input_player4_select_axis = "nul" +input_player4_select_btn = "nul" +input_player4_select_mbtn = "nul" +input_player4_start = "nul" +input_player4_start_axis = "nul" +input_player4_start_btn = "nul" +input_player4_start_mbtn = "nul" +input_player4_turbo = "nul" +input_player4_turbo_axis = "nul" +input_player4_turbo_btn = "nul" +input_player4_turbo_mbtn = "nul" +input_player4_up = "nul" +input_player4_up_axis = "nul" +input_player4_up_btn = "nul" +input_player4_up_mbtn = "nul" +input_player4_x = "nul" +input_player4_x_axis = "nul" +input_player4_x_btn = "nul" +input_player4_x_mbtn = "nul" +input_player4_y = "nul" +input_player4_y_axis = "nul" +input_player4_y_btn = "nul" +input_player4_y_mbtn = "nul" +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_b = "nul" +input_player5_b_axis = "nul" +input_player5_b_btn = "nul" +input_player5_b_mbtn = "nul" +input_player5_down = "nul" +input_player5_down_axis = "nul" +input_player5_down_btn = "nul" +input_player5_down_mbtn = "nul" +input_player5_gun_aux_a = "nul" +input_player5_gun_aux_a_axis = "nul" +input_player5_gun_aux_a_btn = "nul" +input_player5_gun_aux_a_mbtn = "nul" +input_player5_gun_aux_b = "nul" +input_player5_gun_aux_b_axis = "nul" +input_player5_gun_aux_b_btn = "nul" +input_player5_gun_aux_b_mbtn = "nul" +input_player5_gun_aux_c = "nul" +input_player5_gun_aux_c_axis = "nul" +input_player5_gun_aux_c_btn = "nul" +input_player5_gun_aux_c_mbtn = "nul" +input_player5_gun_dpad_down = "nul" +input_player5_gun_dpad_down_axis = "nul" +input_player5_gun_dpad_down_btn = "nul" +input_player5_gun_dpad_down_mbtn = "nul" +input_player5_gun_dpad_left = "nul" +input_player5_gun_dpad_left_axis = "nul" +input_player5_gun_dpad_left_btn = "nul" +input_player5_gun_dpad_left_mbtn = "nul" +input_player5_gun_dpad_right = "nul" +input_player5_gun_dpad_right_axis = "nul" +input_player5_gun_dpad_right_btn = "nul" +input_player5_gun_dpad_right_mbtn = "nul" +input_player5_gun_dpad_up = "nul" +input_player5_gun_dpad_up_axis = "nul" +input_player5_gun_dpad_up_btn = "nul" +input_player5_gun_dpad_up_mbtn = "nul" +input_player5_gun_offscreen_shot = "nul" +input_player5_gun_offscreen_shot_axis = "nul" +input_player5_gun_offscreen_shot_btn = "nul" +input_player5_gun_offscreen_shot_mbtn = "nul" +input_player5_gun_select = "nul" +input_player5_gun_select_axis = "nul" +input_player5_gun_select_btn = "nul" +input_player5_gun_select_mbtn = "nul" +input_player5_gun_start = "nul" +input_player5_gun_start_axis = "nul" +input_player5_gun_start_btn = "nul" +input_player5_gun_start_mbtn = "nul" +input_player5_gun_trigger = "nul" +input_player5_gun_trigger_axis = "nul" +input_player5_gun_trigger_btn = "nul" +input_player5_gun_trigger_mbtn = "1" +input_player5_joypad_index = "4" +input_player5_l = "nul" +input_player5_l2 = "nul" +input_player5_l2_axis = "nul" +input_player5_l2_btn = "nul" +input_player5_l2_mbtn = "nul" +input_player5_l3 = "nul" +input_player5_l3_axis = "nul" +input_player5_l3_btn = "nul" +input_player5_l3_mbtn = "nul" +input_player5_l_axis = "nul" +input_player5_l_btn = "nul" +input_player5_l_mbtn = "nul" +input_player5_l_x_minus = "nul" +input_player5_l_x_minus_axis = "nul" +input_player5_l_x_minus_btn = "nul" +input_player5_l_x_minus_mbtn = "nul" +input_player5_l_x_plus = "nul" +input_player5_l_x_plus_axis = "nul" +input_player5_l_x_plus_btn = "nul" +input_player5_l_x_plus_mbtn = "nul" +input_player5_l_y_minus = "nul" +input_player5_l_y_minus_axis = "nul" +input_player5_l_y_minus_btn = "nul" +input_player5_l_y_minus_mbtn = "nul" +input_player5_l_y_plus = "nul" +input_player5_l_y_plus_axis = "nul" +input_player5_l_y_plus_btn = "nul" +input_player5_l_y_plus_mbtn = "nul" +input_player5_left = "nul" +input_player5_left_axis = "nul" +input_player5_left_btn = "nul" +input_player5_left_mbtn = "nul" +input_player5_mouse_index = "4" +input_player5_r = "nul" +input_player5_r2 = "nul" +input_player5_r2_axis = "nul" +input_player5_r2_btn = "nul" +input_player5_r2_mbtn = "nul" +input_player5_r3 = "nul" +input_player5_r3_axis = "nul" +input_player5_r3_btn = "nul" +input_player5_r3_mbtn = "nul" +input_player5_r_axis = "nul" +input_player5_r_btn = "nul" +input_player5_r_mbtn = "nul" +input_player5_r_x_minus = "nul" +input_player5_r_x_minus_axis = "nul" +input_player5_r_x_minus_btn = "nul" +input_player5_r_x_minus_mbtn = "nul" +input_player5_r_x_plus = "nul" +input_player5_r_x_plus_axis = "nul" +input_player5_r_x_plus_btn = "nul" +input_player5_r_x_plus_mbtn = "nul" +input_player5_r_y_minus = "nul" +input_player5_r_y_minus_axis = "nul" +input_player5_r_y_minus_btn = "nul" +input_player5_r_y_minus_mbtn = "nul" +input_player5_r_y_plus = "nul" +input_player5_r_y_plus_axis = "nul" +input_player5_r_y_plus_btn = "nul" +input_player5_r_y_plus_mbtn = "nul" +input_player5_right = "nul" +input_player5_right_axis = "nul" +input_player5_right_btn = "nul" +input_player5_right_mbtn = "nul" +input_player5_select = "nul" +input_player5_select_axis = "nul" +input_player5_select_btn = "nul" +input_player5_select_mbtn = "nul" +input_player5_start = "nul" +input_player5_start_axis = "nul" +input_player5_start_btn = "nul" +input_player5_start_mbtn = "nul" +input_player5_turbo = "nul" +input_player5_turbo_axis = "nul" +input_player5_turbo_btn = "nul" +input_player5_turbo_mbtn = "nul" +input_player5_up = "nul" +input_player5_up_axis = "nul" +input_player5_up_btn = "nul" +input_player5_up_mbtn = "nul" +input_player5_x = "nul" +input_player5_x_axis = "nul" +input_player5_x_btn = "nul" +input_player5_x_mbtn = "nul" +input_player5_y = "nul" +input_player5_y_axis = "nul" +input_player5_y_btn = "nul" +input_player5_y_mbtn = "nul" +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_b = "nul" +input_player6_b_axis = "nul" +input_player6_b_btn = "nul" +input_player6_b_mbtn = "nul" +input_player6_down = "nul" +input_player6_down_axis = "nul" +input_player6_down_btn = "nul" +input_player6_down_mbtn = "nul" +input_player6_gun_aux_a = "nul" +input_player6_gun_aux_a_axis = "nul" +input_player6_gun_aux_a_btn = "nul" +input_player6_gun_aux_a_mbtn = "nul" +input_player6_gun_aux_b = "nul" +input_player6_gun_aux_b_axis = "nul" +input_player6_gun_aux_b_btn = "nul" +input_player6_gun_aux_b_mbtn = "nul" +input_player6_gun_aux_c = "nul" +input_player6_gun_aux_c_axis = "nul" +input_player6_gun_aux_c_btn = "nul" +input_player6_gun_aux_c_mbtn = "nul" +input_player6_gun_dpad_down = "nul" +input_player6_gun_dpad_down_axis = "nul" +input_player6_gun_dpad_down_btn = "nul" +input_player6_gun_dpad_down_mbtn = "nul" +input_player6_gun_dpad_left = "nul" +input_player6_gun_dpad_left_axis = "nul" +input_player6_gun_dpad_left_btn = "nul" +input_player6_gun_dpad_left_mbtn = "nul" +input_player6_gun_dpad_right = "nul" +input_player6_gun_dpad_right_axis = "nul" +input_player6_gun_dpad_right_btn = "nul" +input_player6_gun_dpad_right_mbtn = "nul" +input_player6_gun_dpad_up = "nul" +input_player6_gun_dpad_up_axis = "nul" +input_player6_gun_dpad_up_btn = "nul" +input_player6_gun_dpad_up_mbtn = "nul" +input_player6_gun_offscreen_shot = "nul" +input_player6_gun_offscreen_shot_axis = "nul" +input_player6_gun_offscreen_shot_btn = "nul" +input_player6_gun_offscreen_shot_mbtn = "nul" +input_player6_gun_select = "nul" +input_player6_gun_select_axis = "nul" +input_player6_gun_select_btn = "nul" +input_player6_gun_select_mbtn = "nul" +input_player6_gun_start = "nul" +input_player6_gun_start_axis = "nul" +input_player6_gun_start_btn = "nul" +input_player6_gun_start_mbtn = "nul" +input_player6_gun_trigger = "nul" +input_player6_gun_trigger_axis = "nul" +input_player6_gun_trigger_btn = "nul" +input_player6_gun_trigger_mbtn = "1" +input_player6_joypad_index = "5" +input_player6_l = "nul" +input_player6_l2 = "nul" +input_player6_l2_axis = "nul" +input_player6_l2_btn = "nul" +input_player6_l2_mbtn = "nul" +input_player6_l3 = "nul" +input_player6_l3_axis = "nul" +input_player6_l3_btn = "nul" +input_player6_l3_mbtn = "nul" +input_player6_l_axis = "nul" +input_player6_l_btn = "nul" +input_player6_l_mbtn = "nul" +input_player6_l_x_minus = "nul" +input_player6_l_x_minus_axis = "nul" +input_player6_l_x_minus_btn = "nul" +input_player6_l_x_minus_mbtn = "nul" +input_player6_l_x_plus = "nul" +input_player6_l_x_plus_axis = "nul" +input_player6_l_x_plus_btn = "nul" +input_player6_l_x_plus_mbtn = "nul" +input_player6_l_y_minus = "nul" +input_player6_l_y_minus_axis = "nul" +input_player6_l_y_minus_btn = "nul" +input_player6_l_y_minus_mbtn = "nul" +input_player6_l_y_plus = "nul" +input_player6_l_y_plus_axis = "nul" +input_player6_l_y_plus_btn = "nul" +input_player6_l_y_plus_mbtn = "nul" +input_player6_left = "nul" +input_player6_left_axis = "nul" +input_player6_left_btn = "nul" +input_player6_left_mbtn = "nul" +input_player6_mouse_index = "5" +input_player6_r = "nul" +input_player6_r2 = "nul" +input_player6_r2_axis = "nul" +input_player6_r2_btn = "nul" +input_player6_r2_mbtn = "nul" +input_player6_r3 = "nul" +input_player6_r3_axis = "nul" +input_player6_r3_btn = "nul" +input_player6_r3_mbtn = "nul" +input_player6_r_axis = "nul" +input_player6_r_btn = "nul" +input_player6_r_mbtn = "nul" +input_player6_r_x_minus = "nul" +input_player6_r_x_minus_axis = "nul" +input_player6_r_x_minus_btn = "nul" +input_player6_r_x_minus_mbtn = "nul" +input_player6_r_x_plus = "nul" +input_player6_r_x_plus_axis = "nul" +input_player6_r_x_plus_btn = "nul" +input_player6_r_x_plus_mbtn = "nul" +input_player6_r_y_minus = "nul" +input_player6_r_y_minus_axis = "nul" +input_player6_r_y_minus_btn = "nul" +input_player6_r_y_minus_mbtn = "nul" +input_player6_r_y_plus = "nul" +input_player6_r_y_plus_axis = "nul" +input_player6_r_y_plus_btn = "nul" +input_player6_r_y_plus_mbtn = "nul" +input_player6_right = "nul" +input_player6_right_axis = "nul" +input_player6_right_btn = "nul" +input_player6_right_mbtn = "nul" +input_player6_select = "nul" +input_player6_select_axis = "nul" +input_player6_select_btn = "nul" +input_player6_select_mbtn = "nul" +input_player6_start = "nul" +input_player6_start_axis = "nul" +input_player6_start_btn = "nul" +input_player6_start_mbtn = "nul" +input_player6_turbo = "nul" +input_player6_turbo_axis = "nul" +input_player6_turbo_btn = "nul" +input_player6_turbo_mbtn = "nul" +input_player6_up = "nul" +input_player6_up_axis = "nul" +input_player6_up_btn = "nul" +input_player6_up_mbtn = "nul" +input_player6_x = "nul" +input_player6_x_axis = "nul" +input_player6_x_btn = "nul" +input_player6_x_mbtn = "nul" +input_player6_y = "nul" +input_player6_y_axis = "nul" +input_player6_y_btn = "nul" +input_player6_y_mbtn = "nul" +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_b = "nul" +input_player7_b_axis = "nul" +input_player7_b_btn = "nul" +input_player7_b_mbtn = "nul" +input_player7_down = "nul" +input_player7_down_axis = "nul" +input_player7_down_btn = "nul" +input_player7_down_mbtn = "nul" +input_player7_gun_aux_a = "nul" +input_player7_gun_aux_a_axis = "nul" +input_player7_gun_aux_a_btn = "nul" +input_player7_gun_aux_a_mbtn = "nul" +input_player7_gun_aux_b = "nul" +input_player7_gun_aux_b_axis = "nul" +input_player7_gun_aux_b_btn = "nul" +input_player7_gun_aux_b_mbtn = "nul" +input_player7_gun_aux_c = "nul" +input_player7_gun_aux_c_axis = "nul" +input_player7_gun_aux_c_btn = "nul" +input_player7_gun_aux_c_mbtn = "nul" +input_player7_gun_dpad_down = "nul" +input_player7_gun_dpad_down_axis = "nul" +input_player7_gun_dpad_down_btn = "nul" +input_player7_gun_dpad_down_mbtn = "nul" +input_player7_gun_dpad_left = "nul" +input_player7_gun_dpad_left_axis = "nul" +input_player7_gun_dpad_left_btn = "nul" +input_player7_gun_dpad_left_mbtn = "nul" +input_player7_gun_dpad_right = "nul" +input_player7_gun_dpad_right_axis = "nul" +input_player7_gun_dpad_right_btn = "nul" +input_player7_gun_dpad_right_mbtn = "nul" +input_player7_gun_dpad_up = "nul" +input_player7_gun_dpad_up_axis = "nul" +input_player7_gun_dpad_up_btn = "nul" +input_player7_gun_dpad_up_mbtn = "nul" +input_player7_gun_offscreen_shot = "nul" +input_player7_gun_offscreen_shot_axis = "nul" +input_player7_gun_offscreen_shot_btn = "nul" +input_player7_gun_offscreen_shot_mbtn = "nul" +input_player7_gun_select = "nul" +input_player7_gun_select_axis = "nul" +input_player7_gun_select_btn = "nul" +input_player7_gun_select_mbtn = "nul" +input_player7_gun_start = "nul" +input_player7_gun_start_axis = "nul" +input_player7_gun_start_btn = "nul" +input_player7_gun_start_mbtn = "nul" +input_player7_gun_trigger = "nul" +input_player7_gun_trigger_axis = "nul" +input_player7_gun_trigger_btn = "nul" +input_player7_gun_trigger_mbtn = "1" +input_player7_joypad_index = "6" +input_player7_l = "nul" +input_player7_l2 = "nul" +input_player7_l2_axis = "nul" +input_player7_l2_btn = "nul" +input_player7_l2_mbtn = "nul" +input_player7_l3 = "nul" +input_player7_l3_axis = "nul" +input_player7_l3_btn = "nul" +input_player7_l3_mbtn = "nul" +input_player7_l_axis = "nul" +input_player7_l_btn = "nul" +input_player7_l_mbtn = "nul" +input_player7_l_x_minus = "nul" +input_player7_l_x_minus_axis = "nul" +input_player7_l_x_minus_btn = "nul" +input_player7_l_x_minus_mbtn = "nul" +input_player7_l_x_plus = "nul" +input_player7_l_x_plus_axis = "nul" +input_player7_l_x_plus_btn = "nul" +input_player7_l_x_plus_mbtn = "nul" +input_player7_l_y_minus = "nul" +input_player7_l_y_minus_axis = "nul" +input_player7_l_y_minus_btn = "nul" +input_player7_l_y_minus_mbtn = "nul" +input_player7_l_y_plus = "nul" +input_player7_l_y_plus_axis = "nul" +input_player7_l_y_plus_btn = "nul" +input_player7_l_y_plus_mbtn = "nul" +input_player7_left = "nul" +input_player7_left_axis = "nul" +input_player7_left_btn = "nul" +input_player7_left_mbtn = "nul" +input_player7_mouse_index = "6" +input_player7_r = "nul" +input_player7_r2 = "nul" +input_player7_r2_axis = "nul" +input_player7_r2_btn = "nul" +input_player7_r2_mbtn = "nul" +input_player7_r3 = "nul" +input_player7_r3_axis = "nul" +input_player7_r3_btn = "nul" +input_player7_r3_mbtn = "nul" +input_player7_r_axis = "nul" +input_player7_r_btn = "nul" +input_player7_r_mbtn = "nul" +input_player7_r_x_minus = "nul" +input_player7_r_x_minus_axis = "nul" +input_player7_r_x_minus_btn = "nul" +input_player7_r_x_minus_mbtn = "nul" +input_player7_r_x_plus = "nul" +input_player7_r_x_plus_axis = "nul" +input_player7_r_x_plus_btn = "nul" +input_player7_r_x_plus_mbtn = "nul" +input_player7_r_y_minus = "nul" +input_player7_r_y_minus_axis = "nul" +input_player7_r_y_minus_btn = "nul" +input_player7_r_y_minus_mbtn = "nul" +input_player7_r_y_plus = "nul" +input_player7_r_y_plus_axis = "nul" +input_player7_r_y_plus_btn = "nul" +input_player7_r_y_plus_mbtn = "nul" +input_player7_right = "nul" +input_player7_right_axis = "nul" +input_player7_right_btn = "nul" +input_player7_right_mbtn = "nul" +input_player7_select = "nul" +input_player7_select_axis = "nul" +input_player7_select_btn = "nul" +input_player7_select_mbtn = "nul" +input_player7_start = "nul" +input_player7_start_axis = "nul" +input_player7_start_btn = "nul" +input_player7_start_mbtn = "nul" +input_player7_turbo = "nul" +input_player7_turbo_axis = "nul" +input_player7_turbo_btn = "nul" +input_player7_turbo_mbtn = "nul" +input_player7_up = "nul" +input_player7_up_axis = "nul" +input_player7_up_btn = "nul" +input_player7_up_mbtn = "nul" +input_player7_x = "nul" +input_player7_x_axis = "nul" +input_player7_x_btn = "nul" +input_player7_x_mbtn = "nul" +input_player7_y = "nul" +input_player7_y_axis = "nul" +input_player7_y_btn = "nul" +input_player7_y_mbtn = "nul" +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_b = "nul" +input_player8_b_axis = "nul" +input_player8_b_btn = "nul" +input_player8_b_mbtn = "nul" +input_player8_down = "nul" +input_player8_down_axis = "nul" +input_player8_down_btn = "nul" +input_player8_down_mbtn = "nul" +input_player8_gun_aux_a = "nul" +input_player8_gun_aux_a_axis = "nul" +input_player8_gun_aux_a_btn = "nul" +input_player8_gun_aux_a_mbtn = "nul" +input_player8_gun_aux_b = "nul" +input_player8_gun_aux_b_axis = "nul" +input_player8_gun_aux_b_btn = "nul" +input_player8_gun_aux_b_mbtn = "nul" +input_player8_gun_aux_c = "nul" +input_player8_gun_aux_c_axis = "nul" +input_player8_gun_aux_c_btn = "nul" +input_player8_gun_aux_c_mbtn = "nul" +input_player8_gun_dpad_down = "nul" +input_player8_gun_dpad_down_axis = "nul" +input_player8_gun_dpad_down_btn = "nul" +input_player8_gun_dpad_down_mbtn = "nul" +input_player8_gun_dpad_left = "nul" +input_player8_gun_dpad_left_axis = "nul" +input_player8_gun_dpad_left_btn = "nul" +input_player8_gun_dpad_left_mbtn = "nul" +input_player8_gun_dpad_right = "nul" +input_player8_gun_dpad_right_axis = "nul" +input_player8_gun_dpad_right_btn = "nul" +input_player8_gun_dpad_right_mbtn = "nul" +input_player8_gun_dpad_up = "nul" +input_player8_gun_dpad_up_axis = "nul" +input_player8_gun_dpad_up_btn = "nul" +input_player8_gun_dpad_up_mbtn = "nul" +input_player8_gun_offscreen_shot = "nul" +input_player8_gun_offscreen_shot_axis = "nul" +input_player8_gun_offscreen_shot_btn = "nul" +input_player8_gun_offscreen_shot_mbtn = "nul" +input_player8_gun_select = "nul" +input_player8_gun_select_axis = "nul" +input_player8_gun_select_btn = "nul" +input_player8_gun_select_mbtn = "nul" +input_player8_gun_start = "nul" +input_player8_gun_start_axis = "nul" +input_player8_gun_start_btn = "nul" +input_player8_gun_start_mbtn = "nul" +input_player8_gun_trigger = "nul" +input_player8_gun_trigger_axis = "nul" +input_player8_gun_trigger_btn = "nul" +input_player8_gun_trigger_mbtn = "1" +input_player8_joypad_index = "7" +input_player8_l = "nul" +input_player8_l2 = "nul" +input_player8_l2_axis = "nul" +input_player8_l2_btn = "nul" +input_player8_l2_mbtn = "nul" +input_player8_l3 = "nul" +input_player8_l3_axis = "nul" +input_player8_l3_btn = "nul" +input_player8_l3_mbtn = "nul" +input_player8_l_axis = "nul" +input_player8_l_btn = "nul" +input_player8_l_mbtn = "nul" +input_player8_l_x_minus = "nul" +input_player8_l_x_minus_axis = "nul" +input_player8_l_x_minus_btn = "nul" +input_player8_l_x_minus_mbtn = "nul" +input_player8_l_x_plus = "nul" +input_player8_l_x_plus_axis = "nul" +input_player8_l_x_plus_btn = "nul" +input_player8_l_x_plus_mbtn = "nul" +input_player8_l_y_minus = "nul" +input_player8_l_y_minus_axis = "nul" +input_player8_l_y_minus_btn = "nul" +input_player8_l_y_minus_mbtn = "nul" +input_player8_l_y_plus = "nul" +input_player8_l_y_plus_axis = "nul" +input_player8_l_y_plus_btn = "nul" +input_player8_l_y_plus_mbtn = "nul" +input_player8_left = "nul" +input_player8_left_axis = "nul" +input_player8_left_btn = "nul" +input_player8_left_mbtn = "nul" +input_player8_mouse_index = "7" +input_player8_r = "nul" +input_player8_r2 = "nul" +input_player8_r2_axis = "nul" +input_player8_r2_btn = "nul" +input_player8_r2_mbtn = "nul" +input_player8_r3 = "nul" +input_player8_r3_axis = "nul" +input_player8_r3_btn = "nul" +input_player8_r3_mbtn = "nul" +input_player8_r_axis = "nul" +input_player8_r_btn = "nul" +input_player8_r_mbtn = "nul" +input_player8_r_x_minus = "nul" +input_player8_r_x_minus_axis = "nul" +input_player8_r_x_minus_btn = "nul" +input_player8_r_x_minus_mbtn = "nul" +input_player8_r_x_plus = "nul" +input_player8_r_x_plus_axis = "nul" +input_player8_r_x_plus_btn = "nul" +input_player8_r_x_plus_mbtn = "nul" +input_player8_r_y_minus = "nul" +input_player8_r_y_minus_axis = "nul" +input_player8_r_y_minus_btn = "nul" +input_player8_r_y_minus_mbtn = "nul" +input_player8_r_y_plus = "nul" +input_player8_r_y_plus_axis = "nul" +input_player8_r_y_plus_btn = "nul" +input_player8_r_y_plus_mbtn = "nul" +input_player8_right = "nul" +input_player8_right_axis = "nul" +input_player8_right_btn = "nul" +input_player8_right_mbtn = "nul" +input_player8_select = "nul" +input_player8_select_axis = "nul" +input_player8_select_btn = "nul" +input_player8_select_mbtn = "nul" +input_player8_start = "nul" +input_player8_start_axis = "nul" +input_player8_start_btn = "nul" +input_player8_start_mbtn = "nul" +input_player8_turbo = "nul" +input_player8_turbo_axis = "nul" +input_player8_turbo_btn = "nul" +input_player8_turbo_mbtn = "nul" +input_player8_up = "nul" +input_player8_up_axis = "nul" +input_player8_up_btn = "nul" +input_player8_up_mbtn = "nul" +input_player8_x = "nul" +input_player8_x_axis = "nul" +input_player8_x_btn = "nul" +input_player8_x_mbtn = "nul" +input_player8_y = "nul" +input_player8_y_axis = "nul" +input_player8_y_btn = "nul" +input_player8_y_mbtn = "nul" +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_b = "nul" +input_player9_b_axis = "nul" +input_player9_b_btn = "nul" +input_player9_b_mbtn = "nul" +input_player9_down = "nul" +input_player9_down_axis = "nul" +input_player9_down_btn = "nul" +input_player9_down_mbtn = "nul" +input_player9_gun_aux_a = "nul" +input_player9_gun_aux_a_axis = "nul" +input_player9_gun_aux_a_btn = "nul" +input_player9_gun_aux_a_mbtn = "nul" +input_player9_gun_aux_b = "nul" +input_player9_gun_aux_b_axis = "nul" +input_player9_gun_aux_b_btn = "nul" +input_player9_gun_aux_b_mbtn = "nul" +input_player9_gun_aux_c = "nul" +input_player9_gun_aux_c_axis = "nul" +input_player9_gun_aux_c_btn = "nul" +input_player9_gun_aux_c_mbtn = "nul" +input_player9_gun_dpad_down = "nul" +input_player9_gun_dpad_down_axis = "nul" +input_player9_gun_dpad_down_btn = "nul" +input_player9_gun_dpad_down_mbtn = "nul" +input_player9_gun_dpad_left = "nul" +input_player9_gun_dpad_left_axis = "nul" +input_player9_gun_dpad_left_btn = "nul" +input_player9_gun_dpad_left_mbtn = "nul" +input_player9_gun_dpad_right = "nul" +input_player9_gun_dpad_right_axis = "nul" +input_player9_gun_dpad_right_btn = "nul" +input_player9_gun_dpad_right_mbtn = "nul" +input_player9_gun_dpad_up = "nul" +input_player9_gun_dpad_up_axis = "nul" +input_player9_gun_dpad_up_btn = "nul" +input_player9_gun_dpad_up_mbtn = "nul" +input_player9_gun_offscreen_shot = "nul" +input_player9_gun_offscreen_shot_axis = "nul" +input_player9_gun_offscreen_shot_btn = "nul" +input_player9_gun_offscreen_shot_mbtn = "nul" +input_player9_gun_select = "nul" +input_player9_gun_select_axis = "nul" +input_player9_gun_select_btn = "nul" +input_player9_gun_select_mbtn = "nul" +input_player9_gun_start = "nul" +input_player9_gun_start_axis = "nul" +input_player9_gun_start_btn = "nul" +input_player9_gun_start_mbtn = "nul" +input_player9_gun_trigger = "nul" +input_player9_gun_trigger_axis = "nul" +input_player9_gun_trigger_btn = "nul" +input_player9_gun_trigger_mbtn = "1" +input_player9_joypad_index = "8" +input_player9_l = "nul" +input_player9_l2 = "nul" +input_player9_l2_axis = "nul" +input_player9_l2_btn = "nul" +input_player9_l2_mbtn = "nul" +input_player9_l3 = "nul" +input_player9_l3_axis = "nul" +input_player9_l3_btn = "nul" +input_player9_l3_mbtn = "nul" +input_player9_l_axis = "nul" +input_player9_l_btn = "nul" +input_player9_l_mbtn = "nul" +input_player9_l_x_minus = "nul" +input_player9_l_x_minus_axis = "nul" +input_player9_l_x_minus_btn = "nul" +input_player9_l_x_minus_mbtn = "nul" +input_player9_l_x_plus = "nul" +input_player9_l_x_plus_axis = "nul" +input_player9_l_x_plus_btn = "nul" +input_player9_l_x_plus_mbtn = "nul" +input_player9_l_y_minus = "nul" +input_player9_l_y_minus_axis = "nul" +input_player9_l_y_minus_btn = "nul" +input_player9_l_y_minus_mbtn = "nul" +input_player9_l_y_plus = "nul" +input_player9_l_y_plus_axis = "nul" +input_player9_l_y_plus_btn = "nul" +input_player9_l_y_plus_mbtn = "nul" +input_player9_left = "nul" +input_player9_left_axis = "nul" +input_player9_left_btn = "nul" +input_player9_left_mbtn = "nul" +input_player9_mouse_index = "8" +input_player9_r = "nul" +input_player9_r2 = "nul" +input_player9_r2_axis = "nul" +input_player9_r2_btn = "nul" +input_player9_r2_mbtn = "nul" +input_player9_r3 = "nul" +input_player9_r3_axis = "nul" +input_player9_r3_btn = "nul" +input_player9_r3_mbtn = "nul" +input_player9_r_axis = "nul" +input_player9_r_btn = "nul" +input_player9_r_mbtn = "nul" +input_player9_r_x_minus = "nul" +input_player9_r_x_minus_axis = "nul" +input_player9_r_x_minus_btn = "nul" +input_player9_r_x_minus_mbtn = "nul" +input_player9_r_x_plus = "nul" +input_player9_r_x_plus_axis = "nul" +input_player9_r_x_plus_btn = "nul" +input_player9_r_x_plus_mbtn = "nul" +input_player9_r_y_minus = "nul" +input_player9_r_y_minus_axis = "nul" +input_player9_r_y_minus_btn = "nul" +input_player9_r_y_minus_mbtn = "nul" +input_player9_r_y_plus = "nul" +input_player9_r_y_plus_axis = "nul" +input_player9_r_y_plus_btn = "nul" +input_player9_r_y_plus_mbtn = "nul" +input_player9_right = "nul" +input_player9_right_axis = "nul" +input_player9_right_btn = "nul" +input_player9_right_mbtn = "nul" +input_player9_select = "nul" +input_player9_select_axis = "nul" +input_player9_select_btn = "nul" +input_player9_select_mbtn = "nul" +input_player9_start = "nul" +input_player9_start_axis = "nul" +input_player9_start_btn = "nul" +input_player9_start_mbtn = "nul" +input_player9_turbo = "nul" +input_player9_turbo_axis = "nul" +input_player9_turbo_btn = "nul" +input_player9_turbo_mbtn = "nul" +input_player9_up = "nul" +input_player9_up_axis = "nul" +input_player9_up_btn = "nul" +input_player9_up_mbtn = "nul" +input_player9_x = "nul" +input_player9_x_axis = "nul" +input_player9_x_btn = "nul" +input_player9_x_mbtn = "nul" +input_player9_y = "nul" +input_player9_y_axis = "nul" +input_player9_y_btn = "nul" +input_player9_y_mbtn = "nul" +input_poll_type_behavior = "2" +input_quit_gamepad_combo = "0" +input_recording_toggle = "nul" +input_recording_toggle_axis = "nul" +input_recording_toggle_btn = "nul" +input_recording_toggle_mbtn = "nul" +input_remap_binds_enable = "true" +input_remapping_directory = "~/.config/retroarch/config/remaps" +input_reset = "h" +input_reset_axis = "nul" +input_reset_btn = "nul" +input_reset_mbtn = "nul" +input_rewind = "r" +input_rewind_axis = "nul" +input_rewind_btn = "nul" +input_rewind_mbtn = "nul" +input_rumble_gain = "100" +input_runahead_toggle = "nul" +input_runahead_toggle_axis = "nul" +input_runahead_toggle_btn = "nul" +input_runahead_toggle_mbtn = "nul" +input_save_state = "f2" +input_save_state_axis = "nul" +input_save_state_btn = "nul" +input_save_state_mbtn = "nul" +input_screenshot = "f8" +input_screenshot_axis = "nul" +input_screenshot_btn = "nul" +input_screenshot_mbtn = "nul" +input_send_debug_info = "f10" +input_send_debug_info_axis = "nul" +input_send_debug_info_btn = "nul" +input_send_debug_info_mbtn = "nul" +input_sensors_enable = "true" +input_shader_next = "m" +input_shader_next_axis = "nul" +input_shader_next_btn = "nul" +input_shader_next_mbtn = "nul" +input_shader_prev = "n" +input_shader_prev_axis = "nul" +input_shader_prev_btn = "nul" +input_shader_prev_mbtn = "nul" +input_state_slot_decrease = "f6" +input_state_slot_decrease_axis = "nul" +input_state_slot_decrease_btn = "nul" +input_state_slot_decrease_mbtn = "nul" +input_state_slot_increase = "f7" +input_state_slot_increase_axis = "nul" +input_state_slot_increase_btn = "nul" +input_state_slot_increase_mbtn = "nul" +input_streaming_toggle = "nul" +input_streaming_toggle_axis = "nul" +input_streaming_toggle_btn = "nul" +input_streaming_toggle_mbtn = "nul" +input_toggle_fast_forward = "space" +input_toggle_fast_forward_axis = "nul" +input_toggle_fast_forward_btn = "nul" +input_toggle_fast_forward_mbtn = "nul" +input_toggle_fullscreen = "f" +input_toggle_fullscreen_axis = "nul" +input_toggle_fullscreen_btn = "nul" +input_toggle_fullscreen_mbtn = "nul" +input_toggle_slowmotion = "nul" +input_toggle_slowmotion_axis = "nul" +input_toggle_slowmotion_btn = "nul" +input_toggle_slowmotion_mbtn = "nul" +input_toggle_statistics = "nul" +input_toggle_statistics_axis = "nul" +input_toggle_statistics_btn = "nul" +input_toggle_statistics_mbtn = "nul" +input_toggle_vrr_runloop = "nul" +input_toggle_vrr_runloop_axis = "nul" +input_toggle_vrr_runloop_btn = "nul" +input_toggle_vrr_runloop_mbtn = "nul" +input_touch_scale = "1" +input_turbo_default_button = "0" +input_turbo_mode = "0" +input_turbo_period = "6" +input_volume_down = "subtract" +input_volume_down_axis = "nul" +input_volume_down_btn = "nul" +input_volume_down_mbtn = "nul" +input_volume_up = "add" +input_volume_up_axis = "nul" +input_volume_up_btn = "nul" +input_volume_up_mbtn = "nul" +joypad_autoconfig_dir = "~/.config/retroarch/autoconfig" +keyboard_gamepad_enable = "true" +keyboard_gamepad_mapping_type = "1" +kiosk_mode_enable = "false" +kiosk_mode_password = "" +led_driver = "null" +libretro_directory = "~/.config/retroarch/cores" +libretro_info_path = "~/.config/retroarch/cores" +libretro_log_level = "1" +load_dummy_on_core_shutdown = "true" +location_allow = "false" +location_driver = "null" +log_dir = "~/.config/retroarch/logs" +log_to_file = "false" +log_to_file_timestamp = "false" +log_verbosity = "false" +materialui_auto_rotate_nav_bar = "true" +materialui_dual_thumbnail_list_view_enable = "true" +materialui_icons_enable = "true" +materialui_landscape_layout_optimization = "1" +materialui_menu_color_theme = "9" +materialui_menu_transition_animation = "0" +materialui_playlist_icons_enable = "true" +materialui_show_nav_bar = "true" +materialui_thumbnail_background_enable = "true" +materialui_thumbnail_view_landscape = "2" +materialui_thumbnail_view_portrait = "1" +memory_show = "false" +memory_update_interval = "256" +menu_battery_level_enable = "true" +menu_core_enable = "true" +menu_disable_info_button = "false" +menu_disable_search_button = "false" +menu_driver = "ozone" +menu_dynamic_wallpaper_enable = "true" +menu_enable_widgets = "true" +menu_font_color_blue = "255" +menu_font_color_green = "255" +menu_font_color_red = "255" +menu_footer_opacity = "1.000000" +menu_framebuffer_opacity = "0.900000" +menu_header_opacity = "1.000000" +menu_horizontal_animation = "true" +menu_insert_disk_resume = "true" +menu_left_thumbnails = "0" +menu_linear_filter = "false" +menu_mouse_enable = "true" +menu_navigation_browser_filter_supported_extensions_enable = "true" +menu_navigation_wraparound_enable = "true" +menu_pause_libretro = "true" +menu_pointer_enable = "false" +menu_rgui_full_width_layout = "true" +menu_rgui_shadows = "false" +menu_rgui_transparency = "true" +menu_savestate_resume = "true" +menu_scale_factor = "1.000000" +menu_screensaver_animation = "0" +menu_screensaver_animation_speed = "1.000000" +menu_screensaver_timeout = "0" +menu_scroll_delay = "256" +menu_scroll_fast = "false" +menu_shader_pipeline = "2" +menu_show_advanced_settings = "true" +menu_show_configurations = "true" +menu_show_core_updater = "true" +menu_show_dump_disc = "true" +menu_show_help = "true" +menu_show_information = "true" +menu_show_latency = "true" +menu_show_legacy_thumbnail_updater = "false" +menu_show_load_content = "true" +menu_show_load_content_animation = "true" +menu_show_load_core = "true" +menu_show_load_disc = "true" +menu_show_online_updater = "true" +menu_show_overlays = "true" +menu_show_quit_retroarch = "true" +menu_show_reboot = "true" +menu_show_restart_retroarch = "true" +menu_show_rewind = "true" +menu_show_shutdown = "true" +menu_show_sublabels = "true" +menu_show_video_layout = "true" +menu_swap_ok_cancel_buttons = "false" +menu_throttle_framerate = "true" +menu_thumbnail_upscale_threshold = "0" +menu_thumbnails = "3" +menu_ticker_smooth = "true" +menu_ticker_speed = "2.000000" +menu_ticker_type = "1" +menu_timedate_date_separator = "0" +menu_timedate_enable = "true" +menu_timedate_style = "11" +menu_unified_controls = "false" +menu_use_preferred_system_color_theme = "false" +menu_wallpaper = "" +menu_wallpaper_opacity = "0.300000" +menu_widget_scale_auto = "true" +menu_widget_scale_factor = "1.000000" +menu_widget_scale_factor_windowed = "1.000000" +menu_xmb_animation_horizontal_highlight = "0" +menu_xmb_animation_move_up_down = "0" +menu_xmb_animation_opening_main_menu = "0" +menu_xmb_show_title_header = "true" +menu_xmb_thumbnail_scale_factor = "100" +menu_xmb_title_margin = "5" +menu_xmb_title_margin_horizontal_offset = "0" +menu_xmb_vertical_fade_factor = "100" +midi_driver = "alsa" +midi_input = "Off" +midi_output = "Off" +midi_volume = "100" +netplay_allow_pausing = "false" +netplay_allow_slaves = "true" +netplay_chat_color_msg = "16777215" +netplay_chat_color_name = "32768" +netplay_check_frames = "600" +netplay_custom_mitm_server = "" +netplay_fade_chat = "true" +netplay_input_latency_frames_min = "0" +netplay_input_latency_frames_range = "0" +netplay_ip_address = "" +netplay_ip_port = "55435" +netplay_max_connections = "3" +netplay_max_ping = "0" +netplay_mitm_server = "nyc" +netplay_nat_traversal = "true" +netplay_nickname = "" +netplay_password = "" +netplay_ping_show = "false" +netplay_public_announce = "true" +netplay_request_device_p1 = "false" +netplay_request_device_p10 = "false" +netplay_request_device_p11 = "false" +netplay_request_device_p12 = "false" +netplay_request_device_p13 = "false" +netplay_request_device_p14 = "false" +netplay_request_device_p15 = "false" +netplay_request_device_p16 = "false" +netplay_request_device_p2 = "false" +netplay_request_device_p3 = "false" +netplay_request_device_p4 = "false" +netplay_request_device_p5 = "false" +netplay_request_device_p6 = "false" +netplay_request_device_p7 = "false" +netplay_request_device_p8 = "false" +netplay_request_device_p9 = "false" +netplay_require_slaves = "false" +netplay_share_analog = "0" +netplay_share_digital = "0" +netplay_show_only_connectable = "true" +netplay_show_only_installed_cores = "false" +netplay_show_passworded = "true" +netplay_spectate_password = "" +netplay_start_as_spectator = "false" +netplay_use_mitm_server = "false" +network_cmd_enable = "false" +network_cmd_port = "55355" +network_on_demand_thumbnails = "false" +network_remote_base_port = "55400" +network_remote_enable = "false" +network_remote_enable_user_p1 = "false" +network_remote_enable_user_p10 = "false" +network_remote_enable_user_p11 = "false" +network_remote_enable_user_p12 = "false" +network_remote_enable_user_p13 = "false" +network_remote_enable_user_p14 = "false" +network_remote_enable_user_p15 = "false" +network_remote_enable_user_p16 = "false" +network_remote_enable_user_p2 = "false" +network_remote_enable_user_p3 = "false" +network_remote_enable_user_p4 = "false" +network_remote_enable_user_p5 = "false" +network_remote_enable_user_p6 = "false" +network_remote_enable_user_p7 = "false" +network_remote_enable_user_p8 = "false" +network_remote_enable_user_p9 = "false" +notification_show_autoconfig = "true" +notification_show_cheats_applied = "true" +notification_show_config_override_load = "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_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" +overlay_directory = "~/.config/retroarch/overlay" +ozone_collapse_sidebar = "false" +ozone_menu_color_theme = "1" +ozone_scroll_content_metadata = "false" +ozone_sort_after_truncate_playlist_name = "true" +ozone_thumbnail_scale_factor = "1.000000" +ozone_truncate_playlist_name = "true" +pause_nonactive = "true" +perfcnt_enable = "false" +playlist_compression = "false" +playlist_directory = "~/.config/retroarch/playlists" +playlist_entry_remove_enable = "1" +playlist_entry_rename = "true" +playlist_fuzzy_archive_match = "false" +playlist_portable_paths = "false" +playlist_show_entry_idx = "true" +playlist_show_history_icons = "0" +playlist_show_inline_core_name = "0" +playlist_show_sublabels = "true" +playlist_sort_alphabetical = "true" +playlist_sublabel_last_played_style = "0" +playlist_sublabel_runtime_type = "0" +playlist_use_old_format = "false" +quick_menu_show_add_to_favorites = "true" +quick_menu_show_cheats = "true" +quick_menu_show_close_content = "true" +quick_menu_show_controls = "true" +quick_menu_show_core_options_flush = "false" +quick_menu_show_download_thumbnails = "true" +quick_menu_show_information = "true" +quick_menu_show_options = "true" +quick_menu_show_recording = "true" +quick_menu_show_reset_core_association = "true" +quick_menu_show_restart_content = "true" +quick_menu_show_resume_content = "true" +quick_menu_show_save_content_dir_overrides = "true" +quick_menu_show_save_core_overrides = "true" +quick_menu_show_save_game_overrides = "true" +quick_menu_show_save_load_state = "true" +quick_menu_show_savestate_submenu = "false" +quick_menu_show_set_core_association = "true" +quick_menu_show_shaders = "true" +quick_menu_show_start_recording = "true" +quick_menu_show_start_streaming = "true" +quick_menu_show_streaming = "true" +quick_menu_show_take_screenshot = "true" +quick_menu_show_undo_save_load_state = "true" +quit_on_close_content = "0" +quit_press_twice = "true" +record_driver = "null" +recording_config_directory = "~/.config/retroarch/records_config" +recording_output_directory = "~/.config/retroarch/records" +remap_save_on_exit = "true" +resampler_directory = "" +rewind_buffer_size = "20971520" +rewind_buffer_size_step = "10" +rewind_enable = "false" +rewind_granularity = "1" +rgui_aspect_ratio = "0" +rgui_aspect_ratio_lock = "0" +rgui_background_filler_thickness_enable = "true" +rgui_border_filler_enable = "true" +rgui_border_filler_thickness_enable = "true" +rgui_browser_directory = "default" +rgui_config_directory = "~/.config/retroarch/config" +rgui_extended_ascii = "false" +rgui_inline_thumbnails = "false" +rgui_internal_upscale_level = "0" +rgui_menu_color_theme = "4" +rgui_menu_theme_preset = "" +rgui_particle_effect = "0" +rgui_particle_effect_screensaver = "true" +rgui_particle_effect_speed = "1.000000" +rgui_show_start_screen = "false" +rgui_swap_thumbnails = "false" +rgui_switch_icons = "true" +rgui_thumbnail_delay = "0" +rgui_thumbnail_downscaler = "0" +run_ahead_enabled = "false" +run_ahead_frames = "1" +run_ahead_hide_warnings = "false" +run_ahead_secondary_instance = "true" +runtime_log_directory = "default" +save_file_compression = "false" +savefile_directory = "~/.config/retroarch/saves" +savefiles_in_content_dir = "false" +savestate_auto_index = "false" +savestate_auto_load = "false" +savestate_auto_save = "false" +savestate_directory = "~/.config/retroarch/states" +savestate_file_compression = "true" +savestate_max_keep = "0" +savestate_thumbnail_enable = "false" +savestates_in_content_dir = "false" +scan_without_core_match = "false" +screen_brightness = "100" +screen_orientation = "0" +screenshot_directory = "~/.config/retroarch/screenshots" +screenshots_in_content_dir = "false" +settings_show_accessibility = "true" +settings_show_achievements = "true" +settings_show_ai_service = "true" +settings_show_audio = "true" +settings_show_configuration = "true" +settings_show_core = "true" +settings_show_directory = "true" +settings_show_drivers = "true" +settings_show_file_browser = "true" +settings_show_frame_throttle = "true" +settings_show_input = "true" +settings_show_latency = "true" +settings_show_logging = "true" +settings_show_network = "true" +settings_show_onscreen_display = "true" +settings_show_playlists = "true" +settings_show_power_management = "true" +settings_show_recording = "true" +settings_show_saving = "true" +settings_show_user = "true" +settings_show_user_interface = "true" +settings_show_video = "true" +show_hidden_files = "false" +slowmotion_ratio = "3.000000" +soft_filter_enable = "false" +soft_filter_index = "0" +sort_savefiles_by_content_enable = "false" +sort_savefiles_enable = "false" +sort_savestates_by_content_enable = "false" +sort_savestates_enable = "false" +sort_screenshots_by_content_enable = "false" +state_slot = "0" +statistics_show = "false" +stdin_cmd_enable = "false" +streaming_mode = "0" +suspend_screensaver_enable = "true" +sustained_performance_mode = "false" +system_directory = "~/.config/retroarch/system" +systemfiles_in_content_dir = "false" +threaded_data_runloop_enable = "true" +thumbnails_directory = "~/.config/retroarch/thumbnails" +twitch_stream_key = "" +ui_companion_enable = "false" +ui_companion_start_on_boot = "true" +ui_companion_toggle = "false" +ui_menubar_enable = "true" +use_last_start_directory = "false" +user_language = "0" +vibrate_on_keypress = "false" +video_adaptive_vsync = "false" +video_allow_rotate = "true" +video_aspect_ratio = "1.333300" +video_aspect_ratio_auto = "false" +video_autoswitch_refresh_rate = "0" +video_black_frame_insertion = "0" +video_context_driver = "" +video_crop_overscan = "true" +video_ctx_scaling = "false" +video_disable_composition = "false" +video_driver = "gl" +video_filter = "" +video_filter_dir = "~/.config/retroarch/filters/video" +video_font_enable = "true" +video_font_path = "" +video_font_size = "32.000000" +video_force_aspect = "true" +video_force_srgb_disable = "false" +video_frame_delay = "0" +video_frame_delay_auto = "false" +video_fullscreen = "false" +video_fullscreen_x = "0" +video_fullscreen_y = "0" +video_gpu_record = "false" +video_gpu_screenshot = "true" +video_hard_sync = "false" +video_hard_sync_frames = "0" +video_hdr_display_contrast = "5.000000" +video_hdr_enable = "false" +video_hdr_expand_gamut = "true" +video_hdr_max_nits = "1000.000000" +video_hdr_paper_white_nits = "200.000000" +video_layout_directory = "~/.config/retroarch/layouts" +video_layout_enable = "true" +video_layout_path = "" +video_layout_selected_view = "0" +video_max_frame_latency = "1" +video_max_swapchain_images = "3" +video_message_color = "ffff00" +video_message_pos_x = "0.050000" +video_message_pos_y = "0.050000" +video_monitor_index = "0" +video_msg_bgcolor_blue = "0" +video_msg_bgcolor_enable = "false" +video_msg_bgcolor_green = "0" +video_msg_bgcolor_opacity = "1.000000" +video_msg_bgcolor_red = "0" +video_notch_write_over_enable = "false" +video_post_filter_record = "false" +video_record_config = "" +video_record_quality = "2" +video_record_scale_factor = "1" +video_record_threads = "2" +video_refresh_rate = "60.000000" +video_rotation = "0" +video_scale = "3" +video_scale_integer = "false" +video_scale_integer_overscale = "false" +video_shader_delay = "0" +video_shader_dir = "~/.config/retroarch/shaders" +video_shader_enable = "false" +video_shader_preset_save_reference_enable = "true" +video_shader_remember_last_dir = "false" +video_shader_watch_files = "false" +video_shared_context = "false" +video_smooth = "false" +video_stream_config = "" +video_stream_port = "56400" +video_stream_quality = "11" +video_stream_scale_factor = "1" +video_stream_url = "" +video_swap_interval = "1" +video_threaded = "false" +video_vsync = "true" +video_waitable_swapchains = "true" +video_window_auto_height_max = "1080" +video_window_auto_width_max = "1920" +video_window_custom_size_enable = "false" +video_window_opacity = "100" +video_window_save_positions = "false" +video_window_show_decorations = "true" +video_windowed_fullscreen = "true" +video_windowed_position_height = "720" +video_windowed_position_width = "1280" +video_windowed_position_x = "0" +video_windowed_position_y = "0" +vrr_runloop_enable = "false" +vulkan_gpu_index = "0" +wifi_driver = "null" +wifi_enabled = "true" +xmb_alpha_factor = "75" +xmb_font = "" +xmb_layout = "0" +xmb_menu_color_theme = "4" +xmb_shadows_enable = "true" +xmb_theme = "0" +xmb_vertical_thumbnails = "false" +youtube_stream_key = "" diff --git a/emu-configs/defaults/rpcs3/config.yml b/emu-configs/defaults/rpcs3/config.yml new file mode 100644 index 00000000..d0829b8c --- /dev/null +++ b/emu-configs/defaults/rpcs3/config.yml @@ -0,0 +1,223 @@ +Core: + PPU Decoder: Recompiler (LLVM) + PPU Threads: 2 + PPU Debug: false + PPU Calling History: false + Save LLVM logs: false + Use LLVM CPU: "" + Max LLVM Compile Threads: 0 + PPU LLVM Greedy Mode: false + PPU LLVM Precompilation: true + Thread Scheduler Mode: Operating System + Set DAZ and FTZ: false + SPU Decoder: Recompiler (LLVM) + SPU Reservation Busy Waiting Percentage: 0 + SPU GETLLAR Busy Waiting Percentage: 100 + SPU Debug: false + MFC Debug: false + Preferred SPU Threads: 0 + SPU delay penalty: 3 + SPU loop detection: false + Max SPURS Threads: 6 + SPU Block Size: Safe + Accurate GETLLAR: false + Accurate SPU DMA: false + Accurate SPU Reservations: true + Accurate Cache Line Stores: false + Accurate RSX reservation access: false + RSX FIFO Accuracy: Fast + SPU Verification: true + SPU Cache: true + SPU Profiler: false + MFC Commands Shuffling Limit: 0 + MFC Commands Timeout: 0 + MFC Commands Shuffling In Steps: false + Enable TSX: Disabled + Accurate xfloat: false + Approximate xfloat: true + Relaxed xfloat: true + Accurate PPU 128-byte Reservation Op Max Length: 0 + Stub PPU Traps: 0 + Full Width AVX-512: false + PPU LLVM Java Mode Handling: true + Use Accurate DFMA: true + PPU Set Saturation Bit: false + PPU Accurate Non-Java Mode: false + PPU Fixup Vector NaN Values: false + PPU Accurate Vector NaN Values: false + PPU Set FPCC Bits: false + Debug Console Mode: false + Hook static functions: false + Libraries Control: + [] + HLE lwmutex: false + SPU LLVM Lower Bound: 0 + SPU LLVM Upper Bound: 18446744073709551615 + TSX Transaction First Limit: 800 + TSX Transaction Second Limit: 2000 + Clocks scale: 100 + SPU Wake-Up Delay: 0 + SPU Wake-Up Delay Thread Mask: 63 + Max CPU Preempt Count: 0 + Allow RSX CPU Preemptions: true + Sleep Timers Accuracy: As Host + Performance Report Threshold: 500 + Enable Performance Report: false + Assume External Debugger: false +VFS: + Enable /host_root/: false + Initialize Directories: true + Limit disk cache size: false + Disk cache maximum size (MB): 5120 + Empty /dev_hdd0/tmp/: true +Video: + Renderer: Vulkan + Resolution: 1280x720 + Aspect ratio: 16:9 + Frame limit: Auto + MSAA: Auto + Shader Mode: Async Shader Recompiler + Shader Precision: High + Write Color Buffers: false + Write Depth Buffer: false + Read Color Buffers: false + Read Depth Buffer: false + Log shader programs: false + VSync: false + Debug output: false + Debug overlay: false + Renderdoc Compatibility Mode: false + Use GPU texture scaling: false + Stretch To Display Area: false + Force High Precision Z buffer: false + Strict Rendering Mode: false + Disable ZCull Occlusion Queries: false + Disable Video Output: false + Disable Vertex Cache: false + Disable FIFO Reordering: false + Enable Frame Skip: false + Force CPU Blit: false + Disable On-Disk Shader Cache: false + Disable Vulkan Memory Allocator: false + Use full RGB output range: true + Strict Texture Flushing: false + Multithreaded RSX: false + Relaxed ZCULL Sync: false + Enable 3D: false + Debug Program Analyser: false + Accurate ZCULL stats: true + Consecutive Frames To Draw: 1 + Consecutive Frames To Skip: 1 + Resolution Scale: 100 + Anisotropic Filter Override: 0 + Texture LOD Bias Addend: 0 + Minimum Scalable Dimension: 16 + Shader Compiler Threads: 0 + Driver Recovery Timeout: 1000000 + Driver Wake-Up Delay: 1 + Vblank Rate: 60 + Vblank NTSC Fixup: false + DECR memory layout: false + Allow Host GPU Labels: false + Disable MSL Fast Math: false + Vulkan: + Adapter: llvmpipe (LLVM 14.0.6, 256 bits) + Force FIFO present mode: false + Force primitive restart flag: false + Force Disable Exclusive Fullscreen Mode: false + Asynchronous Texture Streaming 2: false + Enable FidelityFX Super Resolution Upscaling: false + FidelityFX CAS Sharpening Intensity: 50 + Asynchronous Queue Scheduler: Safe + Performance Overlay: + Enabled: false + Enable Framerate Graph: false + Enable Frametime Graph: false + Framerate datapoints: 50 + Frametime datapoints: 170 + Detail level: Medium + Framerate graph detail level: All + Frametime graph detail level: All + Metrics update interval (ms): 350 + Font size (px): 10 + Position: Top Left + Font: n023055ms.ttf + Horizontal Margin (px): 50 + Vertical Margin (px): 50 + Center Horizontally: false + Center Vertically: false + Opacity (%): 70 + Body Color (hex): "#FFE138FF" + Body Background (hex): "#002339FF" + Title Color (hex): "#F26C24FF" + Title Background (hex): "#00000000" + Shader Compilation Hint: + Position X (px): 20 + Position Y (px): 690 + Shader Loading Dialog: + Allow custom background: true + Darkening effect strength: 30 + Blur effect strength: 0 +Audio: + Renderer: Cubeb + Audio Provider: CellAudio + RSXAudio Avport: HDMI 0 + Dump to file: false + Convert to 16 bit: false + Audio Format: Stereo + Audio Formats: 0 + Audio Device: "@@@default@@@" + Master Volume: 100 + Enable Buffering: true + Desired Audio Buffer Duration: 100 + Enable Time Stretching: false + Time Stretching Threshold: 75 + Microphone Type: "Null" + Microphone Devices: "@@@@@@@@@@@@" + Music Handler: Qt +Input/Output: + Keyboard: "Null" + Mouse: Basic + Camera: "Null" + Camera type: Unknown + Camera flip: None + Camera ID: Default + Move: "Null" + Buzz emulated controller: "Null" + Turntable emulated controller: "Null" + GHLtar emulated controller: "Null" + Pad handler mode: Single-threaded + Pad handler sleep (microseconds): 1000 + Background input enabled: true + Show move cursor: false +System: + License Area: SCEA + Language: English (US) + Keyboard Type: English keyboard (US standard) + Enter button assignment: Enter with cross + Console time offset (s): 0 + PSID high: 0 + PSID low: 0 +Net: + Internet enabled: Disconnected + IP address: 0.0.0.0 + DNS address: 8.8.8.8 + IP swap list: "" + PSN status: Disconnected +Savestate: + Start Paused: false + Suspend Emulation Savestate Mode: true + Inspection Mode Savestates: false + Save Disc Game Data: false +Miscellaneous: + Automatically start games after boot: true + Exit RPCS3 when process finishes: false + Start games in fullscreen mode: false + Prevent display sleep while running games: true + Show trophy popups: true + Show shader compilation hint: true + Use native user interface: true + GDB Server: 127.0.0.1:2345 + Silence All Logs: false + Window Title Format: "FPS: %F | %R | %V | %T [%t]" +Log: {} \ No newline at end of file diff --git a/emu-configs/defaults/rpcs3/vfs.yml b/emu-configs/defaults/rpcs3/vfs.yml new file mode 100644 index 00000000..ae39eb56 --- /dev/null +++ b/emu-configs/defaults/rpcs3/vfs.yml @@ -0,0 +1,49 @@ +$(EmulatorDir): "" +/dev_hdd0/: $(EmulatorDir)dev_hdd0/ +/dev_hdd1/: $(EmulatorDir)dev_hdd1/ +/dev_flash/: $(EmulatorDir)dev_flash/ +/dev_flash2/: $(EmulatorDir)dev_flash2/ +/dev_flash3/: $(EmulatorDir)dev_flash3/ +/dev_bdvd/: $(EmulatorDir)dev_bdvd/ +/app_home/: "" +/dev_usb***/: + /dev_usb000: + Path: $(EmulatorDir)dev_usb000/ + Serial: "" + VID: "" + PID: "" + /dev_usb001: + Path: "" + Serial: "" + VID: "" + PID: "" + /dev_usb002: + Path: "" + Serial: "" + VID: "" + PID: "" + /dev_usb003: + Path: "" + Serial: "" + VID: "" + PID: "" + /dev_usb004: + Path: "" + Serial: "" + VID: "" + PID: "" + /dev_usb005: + Path: "" + Serial: "" + VID: "" + PID: "" + /dev_usb006: + Path: "" + Serial: "" + VID: "" + PID: "" + /dev_usb007: + Path: "" + Serial: "" + VID: "" + PID: "" \ No newline at end of file diff --git a/emu-configs/defaults/xemu/xemu.toml b/emu-configs/defaults/xemu/xemu.toml new file mode 100644 index 00000000..1daa4bd5 --- /dev/null +++ b/emu-configs/defaults/xemu/xemu.toml @@ -0,0 +1,9 @@ +[general] +show_welcome = false +last_viewed_menu_index = 6 + +[display.window] +last_height = 885 + +[sys.files] +eeprom_path = '/home/deck/.var/app/app.xemu.xemu/data/xemu/xemu/eeprom.bin' \ No newline at end of file diff --git a/emu-configs/defaults/yuzu/qt-config.ini b/emu-configs/defaults/yuzu/qt-config.ini new file mode 100644 index 00000000..a0fa387e --- /dev/null +++ b/emu-configs/defaults/yuzu/qt-config.ini @@ -0,0 +1,1203 @@ +[Audio] +input_device=auto +input_device\default=true +output_device=auto +output_device\default=true +output_engine=auto +output_engine\default=true +volume=100 +volume\default=true + +[Controls] +controller_navigation=true +controller_navigation\default=true +debug_pad_button_a="toggle:0,code:67,engine:keyboard" +debug_pad_button_a\default=true +debug_pad_button_b="toggle:0,code:88,engine:keyboard" +debug_pad_button_b\default=true +debug_pad_button_ddown="toggle:0,code:16777237,engine:keyboard" +debug_pad_button_ddown\default=true +debug_pad_button_dleft="toggle:0,code:16777234,engine:keyboard" +debug_pad_button_dleft\default=true +debug_pad_button_dright="toggle:0,code:16777236,engine:keyboard" +debug_pad_button_dright\default=true +debug_pad_button_dup="toggle:0,code:16777235,engine:keyboard" +debug_pad_button_dup\default=true +debug_pad_button_home="toggle:0,code:0,engine:keyboard" +debug_pad_button_home\default=true +debug_pad_button_l="toggle:0,code:81,engine:keyboard" +debug_pad_button_l\default=true +debug_pad_button_lstick="toggle:0,code:70,engine:keyboard" +debug_pad_button_lstick\default=true +debug_pad_button_minus="toggle:0,code:78,engine:keyboard" +debug_pad_button_minus\default=true +debug_pad_button_plus="toggle:0,code:77,engine:keyboard" +debug_pad_button_plus\default=true +debug_pad_button_r="toggle:0,code:69,engine:keyboard" +debug_pad_button_r\default=true +debug_pad_button_rstick="toggle:0,code:71,engine:keyboard" +debug_pad_button_rstick\default=true +debug_pad_button_screenshot="toggle:0,code:0,engine:keyboard" +debug_pad_button_screenshot\default=true +debug_pad_button_sl="toggle:0,code:81,engine:keyboard" +debug_pad_button_sl\default=true +debug_pad_button_sr="toggle:0,code:69,engine:keyboard" +debug_pad_button_sr\default=true +debug_pad_button_x="toggle:0,code:86,engine:keyboard" +debug_pad_button_x\default=true +debug_pad_button_y="toggle:0,code:90,engine:keyboard" +debug_pad_button_y\default=true +debug_pad_button_zl="toggle:0,code:82,engine:keyboard" +debug_pad_button_zl\default=true +debug_pad_button_zr="toggle:0,code:84,engine:keyboard" +debug_pad_button_zr\default=true +debug_pad_enabled=false +debug_pad_enabled\default=true +debug_pad_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" +debug_pad_lstick\default=true +debug_pad_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" +debug_pad_rstick\default=true +emulate_analog_keyboard=false +emulate_analog_keyboard\default=true +enable_accurate_vibrations=false +enable_accurate_vibrations\default=true +enable_ir_sensor=false +enable_ir_sensor\default=true +enable_raw_input=false +enable_raw_input\default=true +enable_ring_controller=true +enable_ring_controller\default=true +enable_udp_controller=false +enable_udp_controller\default=true +ir_sensor_device=auto +ir_sensor_device\default=true +keyboard_enabled=false +keyboard_enabled\default=true +motion_enabled=true +motion_enabled\default=true +mouse_enabled=false +mouse_enabled\default=true +mouse_panning_sensitivity=10 +mouse_panning_sensitivity\default=true +pause_tas_on_load=true +pause_tas_on_load\default=true +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_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_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_type=0 +player_0_type\default=true +player_0_vibration_enabled=true +player_0_vibration_enabled\default=true +player_0_vibration_strength=100 +player_0_vibration_strength\default=true +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_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_type=0 +player_1_type\default=true +player_1_vibration_enabled=true +player_1_vibration_enabled\default=true +player_1_vibration_strength=100 +player_1_vibration_strength\default=true +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_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_type=0 +player_2_type\default=true +player_2_vibration_enabled=true +player_2_vibration_enabled\default=true +player_2_vibration_strength=100 +player_2_vibration_strength\default=true +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_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_type=0 +player_3_type\default=true +player_3_vibration_enabled=true +player_3_vibration_enabled\default=true +player_3_vibration_strength=100 +player_3_vibration_strength\default=true +player_4_body_color_left=4278893030 +player_4_body_color_left\default=false +player_4_body_color_right=4294917160 +player_4_body_color_right\default=false +player_4_button_a="toggle:0,code:67,engine:keyboard" +player_4_button_a\default=true +player_4_button_b="toggle:0,code:88,engine:keyboard" +player_4_button_b\default=true +player_4_button_color_left=4278197790 +player_4_button_color_left\default=false +player_4_button_color_right=4280158730 +player_4_button_color_right\default=false +player_4_button_ddown="toggle:0,code:16777237,engine:keyboard" +player_4_button_ddown\default=true +player_4_button_dleft="toggle:0,code:16777234,engine:keyboard" +player_4_button_dleft\default=true +player_4_button_dright="toggle:0,code:16777236,engine:keyboard" +player_4_button_dright\default=true +player_4_button_dup="toggle:0,code:16777235,engine:keyboard" +player_4_button_dup\default=true +player_4_button_home="toggle:0,code:0,engine:keyboard" +player_4_button_home\default=true +player_4_button_l="toggle:0,code:81,engine:keyboard" +player_4_button_l\default=true +player_4_button_lstick="toggle:0,code:70,engine:keyboard" +player_4_button_lstick\default=true +player_4_button_minus="toggle:0,code:78,engine:keyboard" +player_4_button_minus\default=true +player_4_button_plus="toggle:0,code:77,engine:keyboard" +player_4_button_plus\default=true +player_4_button_r="toggle:0,code:69,engine:keyboard" +player_4_button_r\default=true +player_4_button_rstick="toggle:0,code:71,engine:keyboard" +player_4_button_rstick\default=true +player_4_button_screenshot="toggle:0,code:0,engine:keyboard" +player_4_button_screenshot\default=true +player_4_button_sl="toggle:0,code:81,engine:keyboard" +player_4_button_sl\default=true +player_4_button_sr="toggle:0,code:69,engine:keyboard" +player_4_button_sr\default=true +player_4_button_x="toggle:0,code:86,engine:keyboard" +player_4_button_x\default=true +player_4_button_y="toggle:0,code:90,engine:keyboard" +player_4_button_y\default=true +player_4_button_zl="toggle:0,code:82,engine:keyboard" +player_4_button_zl\default=true +player_4_button_zr="toggle:0,code:84,engine:keyboard" +player_4_button_zr\default=true +player_4_connected=false +player_4_connected\default=true +player_4_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_4_lstick\default=true +player_4_motionleft="toggle:0,code:55,engine:keyboard" +player_4_motionleft\default=true +player_4_motionright="toggle:0,code:56,engine:keyboard" +player_4_motionright\default=true +player_4_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_4_rstick\default=true +player_4_type=0 +player_4_type\default=true +player_4_vibration_enabled=true +player_4_vibration_enabled\default=true +player_4_vibration_strength=100 +player_4_vibration_strength\default=true +player_5_body_color_left=4278893030 +player_5_body_color_left\default=false +player_5_body_color_right=4294917160 +player_5_body_color_right\default=false +player_5_button_a="toggle:0,code:67,engine:keyboard" +player_5_button_a\default=true +player_5_button_b="toggle:0,code:88,engine:keyboard" +player_5_button_b\default=true +player_5_button_color_left=4278197790 +player_5_button_color_left\default=false +player_5_button_color_right=4280158730 +player_5_button_color_right\default=false +player_5_button_ddown="toggle:0,code:16777237,engine:keyboard" +player_5_button_ddown\default=true +player_5_button_dleft="toggle:0,code:16777234,engine:keyboard" +player_5_button_dleft\default=true +player_5_button_dright="toggle:0,code:16777236,engine:keyboard" +player_5_button_dright\default=true +player_5_button_dup="toggle:0,code:16777235,engine:keyboard" +player_5_button_dup\default=true +player_5_button_home="toggle:0,code:0,engine:keyboard" +player_5_button_home\default=true +player_5_button_l="toggle:0,code:81,engine:keyboard" +player_5_button_l\default=true +player_5_button_lstick="toggle:0,code:70,engine:keyboard" +player_5_button_lstick\default=true +player_5_button_minus="toggle:0,code:78,engine:keyboard" +player_5_button_minus\default=true +player_5_button_plus="toggle:0,code:77,engine:keyboard" +player_5_button_plus\default=true +player_5_button_r="toggle:0,code:69,engine:keyboard" +player_5_button_r\default=true +player_5_button_rstick="toggle:0,code:71,engine:keyboard" +player_5_button_rstick\default=true +player_5_button_screenshot="toggle:0,code:0,engine:keyboard" +player_5_button_screenshot\default=true +player_5_button_sl="toggle:0,code:81,engine:keyboard" +player_5_button_sl\default=true +player_5_button_sr="toggle:0,code:69,engine:keyboard" +player_5_button_sr\default=true +player_5_button_x="toggle:0,code:86,engine:keyboard" +player_5_button_x\default=true +player_5_button_y="toggle:0,code:90,engine:keyboard" +player_5_button_y\default=true +player_5_button_zl="toggle:0,code:82,engine:keyboard" +player_5_button_zl\default=true +player_5_button_zr="toggle:0,code:84,engine:keyboard" +player_5_button_zr\default=true +player_5_connected=false +player_5_connected\default=true +player_5_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_5_lstick\default=true +player_5_motionleft="toggle:0,code:55,engine:keyboard" +player_5_motionleft\default=true +player_5_motionright="toggle:0,code:56,engine:keyboard" +player_5_motionright\default=true +player_5_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_5_rstick\default=true +player_5_type=0 +player_5_type\default=true +player_5_vibration_enabled=true +player_5_vibration_enabled\default=true +player_5_vibration_strength=100 +player_5_vibration_strength\default=true +player_6_body_color_left=4278893030 +player_6_body_color_left\default=false +player_6_body_color_right=4294917160 +player_6_body_color_right\default=false +player_6_button_a="toggle:0,code:67,engine:keyboard" +player_6_button_a\default=true +player_6_button_b="toggle:0,code:88,engine:keyboard" +player_6_button_b\default=true +player_6_button_color_left=4278197790 +player_6_button_color_left\default=false +player_6_button_color_right=4280158730 +player_6_button_color_right\default=false +player_6_button_ddown="toggle:0,code:16777237,engine:keyboard" +player_6_button_ddown\default=true +player_6_button_dleft="toggle:0,code:16777234,engine:keyboard" +player_6_button_dleft\default=true +player_6_button_dright="toggle:0,code:16777236,engine:keyboard" +player_6_button_dright\default=true +player_6_button_dup="toggle:0,code:16777235,engine:keyboard" +player_6_button_dup\default=true +player_6_button_home="toggle:0,code:0,engine:keyboard" +player_6_button_home\default=true +player_6_button_l="toggle:0,code:81,engine:keyboard" +player_6_button_l\default=true +player_6_button_lstick="toggle:0,code:70,engine:keyboard" +player_6_button_lstick\default=true +player_6_button_minus="toggle:0,code:78,engine:keyboard" +player_6_button_minus\default=true +player_6_button_plus="toggle:0,code:77,engine:keyboard" +player_6_button_plus\default=true +player_6_button_r="toggle:0,code:69,engine:keyboard" +player_6_button_r\default=true +player_6_button_rstick="toggle:0,code:71,engine:keyboard" +player_6_button_rstick\default=true +player_6_button_screenshot="toggle:0,code:0,engine:keyboard" +player_6_button_screenshot\default=true +player_6_button_sl="toggle:0,code:81,engine:keyboard" +player_6_button_sl\default=true +player_6_button_sr="toggle:0,code:69,engine:keyboard" +player_6_button_sr\default=true +player_6_button_x="toggle:0,code:86,engine:keyboard" +player_6_button_x\default=true +player_6_button_y="toggle:0,code:90,engine:keyboard" +player_6_button_y\default=true +player_6_button_zl="toggle:0,code:82,engine:keyboard" +player_6_button_zl\default=true +player_6_button_zr="toggle:0,code:84,engine:keyboard" +player_6_button_zr\default=true +player_6_connected=false +player_6_connected\default=true +player_6_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_6_lstick\default=true +player_6_motionleft="toggle:0,code:55,engine:keyboard" +player_6_motionleft\default=true +player_6_motionright="toggle:0,code:56,engine:keyboard" +player_6_motionright\default=true +player_6_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_6_rstick\default=true +player_6_type=0 +player_6_type\default=true +player_6_vibration_enabled=true +player_6_vibration_enabled\default=true +player_6_vibration_strength=100 +player_6_vibration_strength\default=true +player_7_body_color_left=4278893030 +player_7_body_color_left\default=false +player_7_body_color_right=4294917160 +player_7_body_color_right\default=false +player_7_button_a="toggle:0,code:67,engine:keyboard" +player_7_button_a\default=true +player_7_button_b="toggle:0,code:88,engine:keyboard" +player_7_button_b\default=true +player_7_button_color_left=4278197790 +player_7_button_color_left\default=false +player_7_button_color_right=4280158730 +player_7_button_color_right\default=false +player_7_button_ddown="toggle:0,code:16777237,engine:keyboard" +player_7_button_ddown\default=true +player_7_button_dleft="toggle:0,code:16777234,engine:keyboard" +player_7_button_dleft\default=true +player_7_button_dright="toggle:0,code:16777236,engine:keyboard" +player_7_button_dright\default=true +player_7_button_dup="toggle:0,code:16777235,engine:keyboard" +player_7_button_dup\default=true +player_7_button_home="toggle:0,code:0,engine:keyboard" +player_7_button_home\default=true +player_7_button_l="toggle:0,code:81,engine:keyboard" +player_7_button_l\default=true +player_7_button_lstick="toggle:0,code:70,engine:keyboard" +player_7_button_lstick\default=true +player_7_button_minus="toggle:0,code:78,engine:keyboard" +player_7_button_minus\default=true +player_7_button_plus="toggle:0,code:77,engine:keyboard" +player_7_button_plus\default=true +player_7_button_r="toggle:0,code:69,engine:keyboard" +player_7_button_r\default=true +player_7_button_rstick="toggle:0,code:71,engine:keyboard" +player_7_button_rstick\default=true +player_7_button_screenshot="toggle:0,code:0,engine:keyboard" +player_7_button_screenshot\default=true +player_7_button_sl="toggle:0,code:81,engine:keyboard" +player_7_button_sl\default=true +player_7_button_sr="toggle:0,code:69,engine:keyboard" +player_7_button_sr\default=true +player_7_button_x="toggle:0,code:86,engine:keyboard" +player_7_button_x\default=true +player_7_button_y="toggle:0,code:90,engine:keyboard" +player_7_button_y\default=true +player_7_button_zl="toggle:0,code:82,engine:keyboard" +player_7_button_zl\default=true +player_7_button_zr="toggle:0,code:84,engine:keyboard" +player_7_button_zr\default=true +player_7_connected=false +player_7_connected\default=true +player_7_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_7_lstick\default=true +player_7_motionleft="toggle:0,code:55,engine:keyboard" +player_7_motionleft\default=true +player_7_motionright="toggle:0,code:56,engine:keyboard" +player_7_motionright\default=true +player_7_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_7_rstick\default=true +player_7_type=0 +player_7_type\default=true +player_7_vibration_enabled=true +player_7_vibration_enabled\default=true +player_7_vibration_strength=100 +player_7_vibration_strength\default=true +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_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_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_type=0 +player_8_type\default=true +player_8_vibration_enabled=true +player_8_vibration_enabled\default=true +player_8_vibration_strength=100 +player_8_vibration_strength\default=true +player_9_body_color_left=702950 +player_9_body_color_left\default=true +player_9_body_color_right=16727080 +player_9_body_color_right\default=true +player_9_button_a="toggle:0,code:67,engine:keyboard" +player_9_button_a\default=true +player_9_button_b="toggle:0,code:88,engine:keyboard" +player_9_button_b\default=true +player_9_button_color_left=7710 +player_9_button_color_left\default=true +player_9_button_color_right=1968650 +player_9_button_color_right\default=true +player_9_button_ddown="toggle:0,code:16777237,engine:keyboard" +player_9_button_ddown\default=true +player_9_button_dleft="toggle:0,code:16777234,engine:keyboard" +player_9_button_dleft\default=true +player_9_button_dright="toggle:0,code:16777236,engine:keyboard" +player_9_button_dright\default=true +player_9_button_dup="toggle:0,code:16777235,engine:keyboard" +player_9_button_dup\default=true +player_9_button_home="toggle:0,code:0,engine:keyboard" +player_9_button_home\default=true +player_9_button_l="toggle:0,code:81,engine:keyboard" +player_9_button_l\default=true +player_9_button_lstick="toggle:0,code:70,engine:keyboard" +player_9_button_lstick\default=true +player_9_button_minus="toggle:0,code:78,engine:keyboard" +player_9_button_minus\default=true +player_9_button_plus="toggle:0,code:77,engine:keyboard" +player_9_button_plus\default=true +player_9_button_r="toggle:0,code:69,engine:keyboard" +player_9_button_r\default=true +player_9_button_rstick="toggle:0,code:71,engine:keyboard" +player_9_button_rstick\default=true +player_9_button_screenshot="toggle:0,code:0,engine:keyboard" +player_9_button_screenshot\default=true +player_9_button_sl="toggle:0,code:81,engine:keyboard" +player_9_button_sl\default=true +player_9_button_sr="toggle:0,code:69,engine:keyboard" +player_9_button_sr\default=true +player_9_button_x="toggle:0,code:86,engine:keyboard" +player_9_button_x\default=true +player_9_button_y="toggle:0,code:90,engine:keyboard" +player_9_button_y\default=true +player_9_button_zl="toggle:0,code:82,engine:keyboard" +player_9_button_zl\default=true +player_9_button_zr="toggle:0,code:84,engine:keyboard" +player_9_button_zr\default=true +player_9_connected=false +player_9_connected\default=true +player_9_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_9_lstick\default=true +player_9_motionleft="toggle:0,code:55,engine:keyboard" +player_9_motionleft\default=true +player_9_motionright="toggle:0,code:56,engine:keyboard" +player_9_motionright\default=true +player_9_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_9_rstick\default=true +player_9_type=0 +player_9_type\default=true +player_9_vibration_enabled=true +player_9_vibration_enabled\default=true +player_9_vibration_strength=100 +player_9_vibration_strength\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 +tas_enable\default=true +tas_loop=false +tas_loop\default=true +touch_device="min_x:100,min_y:50,max_x:1800,max_y:850" +touch_device\default=true +touch_from_button_map=0 +touch_from_button_map\default=true +touch_from_button_maps\1\entries\size=0 +touch_from_button_maps\1\name=default +touch_from_button_maps\1\name\default=true +touch_from_button_maps\size=1 +touchscreen_angle=0 +touchscreen_angle\default=true +touchscreen_diameter_x=15 +touchscreen_diameter_x\default=true +touchscreen_diameter_y=15 +touchscreen_diameter_y\default=true +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 +vibration_enabled=true +vibration_enabled\default=true + +[Core] +use_extended_memory_layout=false +use_extended_memory_layout\default=true +use_multi_core=true +use_multi_core\default=true + +[Cpu] +cpu_accuracy=0 +cpu_accuracy\default=true +cpu_accuracy_first_time=false +cpu_accuracy_first_time\default=false +cpu_debug_mode=false +cpu_debug_mode\default=true +cpuopt_block_linking=true +cpuopt_block_linking\default=true +cpuopt_const_prop=true +cpuopt_const_prop\default=true +cpuopt_context_elimination=true +cpuopt_context_elimination\default=true +cpuopt_fast_dispatcher=true +cpuopt_fast_dispatcher\default=true +cpuopt_fastmem=true +cpuopt_fastmem\default=true +cpuopt_fastmem_exclusives=true +cpuopt_fastmem_exclusives\default=true +cpuopt_misc_ir=true +cpuopt_misc_ir\default=true +cpuopt_page_tables=true +cpuopt_page_tables\default=true +cpuopt_recompile_exclusives=true +cpuopt_recompile_exclusives\default=true +cpuopt_reduce_misalign_checks=true +cpuopt_reduce_misalign_checks\default=true +cpuopt_return_stack_buffer=true +cpuopt_return_stack_buffer\default=true +cpuopt_unsafe_fastmem_check=true +cpuopt_unsafe_fastmem_check\default=true +cpuopt_unsafe_ignore_global_monitor=true +cpuopt_unsafe_ignore_global_monitor\default=true +cpuopt_unsafe_ignore_standard_fpcr=true +cpuopt_unsafe_ignore_standard_fpcr\default=true +cpuopt_unsafe_inaccurate_nan=true +cpuopt_unsafe_inaccurate_nan\default=true +cpuopt_unsafe_reduce_fp_error=true +cpuopt_unsafe_reduce_fp_error\default=true +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\default=true +gamecard_current_game=false +gamecard_current_game\default=true +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\default=true +nand_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/nand +nand_directory\default=true +sdmc_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/sdmc +sdmc_directory\default=true +tas_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/tas +tas_directory\default=true +use_virtual_sd=true +use_virtual_sd\default=true + +[Debugging] +create_crash_dumps=false +create_crash_dumps\default=true +disable_macro_jit=false +disable_macro_jit\default=true +dump_exefs=false +dump_exefs\default=true +dump_nso=false +dump_nso\default=true +enable_all_controllers=false +enable_all_controllers\default=true +enable_fs_access_log=false +enable_fs_access_log\default=true +gdbstub_port=6543 +gdbstub_port\default=true +perform_vulkan_check=true +perform_vulkan_check\default=true +program_args= +program_args\default=true +quest_flag=false +quest_flag\default=true +record_frame_times=false +use_debug_asserts=false +use_debug_asserts\default=true +use_gdbstub=false +use_gdbstub\default=true + +[DisabledAddOns] +size=0 + +[Miscellaneous] +log_filter=*:Info +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= +room_nickname\default=true +room_port=24872 +room_port\default=true +username_ban_list\size=0 + +[Renderer] +accelerate_astc=true +accelerate_astc\default=true +anti_aliasing=0 +anti_aliasing\default=true +aspect_ratio=0 +aspect_ratio\default=true +backend=1 +backend\default=true +bg_blue=0 +bg_blue\default=true +bg_green=0 +bg_green\default=true +bg_red=0 +bg_red\default=true +debug=false +debug\default=true +disable_shader_loop_safety_checks=false +disable_shader_loop_safety_checks\default=true +fullscreen_mode=1 +fullscreen_mode\default=true +gpu_accuracy=1 +gpu_accuracy\default=true +max_anisotropy=0 +max_anisotropy\default=true +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 +shader_backend\default=true +shader_feedback=false +shader_feedback\default=true +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_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_speed_limit=true +use_speed_limit\default=true +use_vsync=true +use_vsync\default=true +vulkan_device=0 +vulkan_device\default=true + +[Services] +network_interface=None +network_interface\default=false + +[System] +current_user=0 +current_user\default=true +custom_rtc=0 +custom_rtc\default=true +custom_rtc_enabled=false +custom_rtc_enabled\default=true +language_index=1 +language_index\default=true +region_index=1 +region_index\default=true +rng_seed=0 +rng_seed\default=true +rng_seed_enabled=false +rng_seed_enabled\default=true +sound_index=1 +sound_index\default=true +time_zone_index=0 +time_zone_index\default=true + +[UI] +Multiplayer\game_id=0 +Multiplayer\game_id\default=true +Multiplayer\host_type=0 +Multiplayer\host_type\default=true +Multiplayer\ip= +Multiplayer\ip\default=true +Multiplayer\ip_ban_list\size=0 +Multiplayer\max_player=8 +Multiplayer\max_player\default=true +Multiplayer\nickname= +Multiplayer\nickname\default=true +Multiplayer\port=24872 +Multiplayer\port\default=true +Multiplayer\room_description= +Multiplayer\room_description\default=true +Multiplayer\room_name= +Multiplayer\room_name\default=true +Multiplayer\room_nickname= +Multiplayer\room_nickname\default=true +Multiplayer\room_port=24872 +Multiplayer\room_port\default=true +Multiplayer\username_ban_list\size=0 +Paths\gamedirs\1\deep_scan=false +Paths\gamedirs\1\deep_scan\default=true +Paths\gamedirs\1\expanded=true +Paths\gamedirs\1\expanded\default=true +Paths\gamedirs\1\path=SDMC +Paths\gamedirs\2\deep_scan=false +Paths\gamedirs\2\deep_scan\default=true +Paths\gamedirs\2\expanded=true +Paths\gamedirs\2\expanded\default=true +Paths\gamedirs\2\path=UserNAND +Paths\gamedirs\3\deep_scan=false +Paths\gamedirs\3\deep_scan\default=true +Paths\gamedirs\3\expanded=true +Paths\gamedirs\3\expanded\default=true +Paths\gamedirs\3\path=SysNAND +Paths\gamedirs\size=3 +Paths\language= +Paths\language\default=true +Paths\recentFiles=@Invalid() +Paths\romsPath= +Paths\symbolsPath= +Screenshots\enable_screenshot_save_as=true +Screenshots\enable_screenshot_save_as\default=true +Screenshots\screenshot_path=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/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%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%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\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\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%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%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\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\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=Esc +Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq\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\KeySeq=Ctrl+Q +Shortcuts\Main%20Window\Exit%20yuzu\KeySeq\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\Load%20File\Context=3 +Shortcuts\Main%20Window\Load%20File\Context\default=true +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\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\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\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\TAS%20Record\Context=2 +Shortcuts\Main%20Window\TAS%20Record\Context\default=true +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%20Reset\Context=2 +Shortcuts\Main%20Window\TAS%20Reset\Context\default=true +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%20Start\Stop\Context=2 +Shortcuts\Main%20Window\TAS%20Start\Stop\Context\default=true +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\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%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%20Mouse%20Panning\Context=2 +Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context\default=true +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%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 +UIGameList\cache_game_list=true +UIGameList\cache_game_list\default=true +UIGameList\favorites\size=0 +UIGameList\favorites_expanded=true +UIGameList\favorites_expanded\default=true +UIGameList\folder_icon_size=48 +UIGameList\folder_icon_size\default=true +UIGameList\game_icon_size=64 +UIGameList\game_icon_size\default=true +UIGameList\row_1_text_id=3 +UIGameList\row_1_text_id\default=true +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) +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) +calloutFlags=1 +calloutFlags\default=false +confirmClose=true +confirmClose\default=true +disable_web_applet=true +disable_web_applet\default=true +displayTitleBars=true +displayTitleBars\default=true +enable_discord_presence=true +enable_discord_presence\default=true +firstStart=false +firstStart\default=false +fullscreen=false +fullscreen\default=true +hideInactiveMouse=true +hideInactiveMouse\default=true +muteWhenInBackground=false +muteWhenInBackground\default=true +pauseWhenInBackground=false +pauseWhenInBackground\default=true +select_user_on_boot=false +select_user_on_boot\default=true +showConsole=false +showConsole\default=true +showFilterBar=true +showFilterBar\default=true +showStatusBar=true +showStatusBar\default=true +singleWindowMode=true +singleWindowMode\default=true +theme=colorful +theme\default=true + +[WebService] +enable_telemetry=false +enable_telemetry\default=false +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 diff --git a/functions.sh b/functions.sh index 488caac2..6bc9ea68 100644 --- a/functions.sh +++ b/functions.sh @@ -9,135 +9,140 @@ #================= browse() { - # This function browses for a directory and returns the path chosen - # USAGE: path_to_be_browsed_for=$(browse $action_text) + # This function browses for a directory and returns the path chosen + # USAGE: path_to_be_browsed_for=$(browse $action_text) - path_selected=false + path_selected=false - while [ $path_selected == false ] - do - target="$(zenity --file-selection --title="Choose $1" --directory)" - if [ $? == 0 ] #yes - then - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ - --text="Directory $target chosen, is this correct?" - if [ $? == 0 ] - then - path_selected=true - echo $target - break - fi - else - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ - --text="No directory selected. Do you want to return to the main menu?" - if [ $? == 1 ] - then - configurator_welcome_dialog - fi - fi - done + while [ $path_selected == false ] + do + target="$(zenity --file-selection --title="Choose $1" --directory)" + if [ $? == 0 ] #yes + then + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ + --text="Directory $target chosen, is this correct?" + if [ $? == 0 ] + then + path_selected=true + echo $target + break + fi + else + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \ + --text="No directory selected. Do you want to return to the main menu?" + if [ $? == 1 ] + then + configurator_welcome_dialog + fi + fi + done } verify_space() { - # Function used for verifying adequate space before moving directories around - # USAGE: verify_space $source_dir $dest_dir - # Function returns "true" if there is enough space, "false" if there is not + # Function used for verifying adequate space before moving directories around + # USAGE: verify_space $source_dir $dest_dir + # Function returns "true" if there is enough space, "false" if there is not - source_size=$(du -sk /home/deck/retrodeck | awk '{print $1}') - source_size=$((source_size+(source_size/10))) # Add 10% to source size for safety - dest_avail=$(df -k --output=avail $2 | tail -1) + source_size=$(du -sk /home/deck/retrodeck | awk '{print $1}') + source_size=$((source_size+(source_size/10))) # Add 10% to source size for safety + dest_avail=$(df -k --output=avail $2 | tail -1) - if [[ $source_size -ge $dest_avail ]]; then - echo "false" - else - echo "true" - fi + if [[ $source_size -ge $dest_avail ]]; then + echo "false" + else + echo "true" + fi } move() { - # Function to move a directory from one parent to another - # USAGE: move $source_dir $dest_dir + # Function to move a directory from one parent to another + # USAGE: move $source_dir $dest_dir - if [[ $(verify_space $1 $2) ]]; then - ( - if [[ ! -d $2 ]]; then # Create destination directory if it doesn't already exist - debug_dialog "mkdir -pv $2" - fi - debug_dialog "mv -v -t $2 $1" - ) | - zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close --width=800 --height=600 \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move in Progress" \ - --text="Moving directory $1 to new location of $2, please wait." + if [[ $(verify_space $1 $2) ]]; then + ( + if [[ ! -d $2 ]]; then # Create destination directory if it doesn't already exist + debug_dialog "mkdir -pv $2" + fi + debug_dialog "mv -v -t $2 $1" + ) | + 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 - Move in Progress" \ + --text="Moving directory $1 to new location of $2, please wait." + else + zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move Directories" \ + --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." - else - zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=800 --height=600 \ - --title "RetroDECK Configurator Utility - Move Directories" \ - --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." - - configurator_move_dialog - fi + configurator_move_dialog + fi } set_setting_value() { -# Function for editing settings -# USAGE: set_setting_value $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) -# NOTES: RPCS3 has special conditions, see comments below + # Function for editing settings + # USAGE: set_setting_value $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) + # NOTES: RPCS3 has special conditions, see comments below -case $4 in + case $4 in "retrodeck" ) - sed -i "s%$2=.*%$2=$3%" $1 - ;; + sed -i "s%$2=.*%$2=$3%" $1 + ;; "retroarch" ) - sed -i "s%$2 = \".*\"%$2 = \"$3\"%" $1 - ;; + sed -i "s%$2 = \".*\"%$2 = \"$3\"%" $1 + ;; "dolphin" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "duckstation" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "pcsx2" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "ppsspp" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "rpcs3" ) # This does not currently work for settings with a $ in them - sed -i "s%$2: .*%$2: $3%" $1 - ;; + sed -i "s%$2: .*%$2: $3%" $1 + ;; "yuzu" ) - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%$yuzu_setting=.*%$yuzu_setting=$3%" $1 - ;; + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%$yuzu_setting=.*%$yuzu_setting=$3%" $1 + ;; "citra" ) - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%$citra_setting=.*%$citra_setting=$3%" $1 - ;; + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%$citra_setting=.*%$citra_setting=$3%" $1 + ;; "melonds" ) - sed -i "s%$2=.*%$2=$3%" $1 - ;; + sed -i "s%$2=.*%$2=$3%" $1 + ;; "xemu" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; + sed -i "s%$2 = .*%$2 = $3%" $1 + ;; "emulationstation" ) - sed -i "s%$2\" \" value=\".*\"%$2\" \" value=\"$3\"" $1 - ;; + sed -i "s%$2\" \" value=\".*\"%$2\" \" value=\"$3\"" $1 + ;; + + esac +} + +get_setting_name() { + # Function for getting the setting name from a full setting line from a config file + # USAGE: get_setting_name $setting_line $system (needed as different systems use different config file syntax) -esac } get_setting_value() { @@ -146,55 +151,55 @@ get_setting_value() { case $3 in - "retrodeck" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") - ;; + "retrodeck" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + ;; - "retroarch" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") - ;; + "retroarch" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") + ;; - "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; - "duckstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + "duckstation" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; - "pcsx2" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + "pcsx2" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; - "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; - "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces - echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") - ;; + "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces + echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") + ;; - "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") - ;; + "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") + ;; - "citra" ) # Use quotes when passing setting_name, as this config file contains special characters - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") - ;; + "citra" ) # Use quotes when passing setting_name, as this config file contains special characters + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") + ;; - "melonds" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") - ;; + "melonds" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + ;; - "xemu" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") - ;; + "xemu" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + ;; - "emulationstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") - ;; + "emulationstation" ) + echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") + ;; esac } @@ -207,604 +212,6 @@ enable_setting() { } -yuzu_init() { - echo "----------------------" - echo "Initializing YUZU" - echo "----------------------" - # removing dead symlinks as they were present in a past version - if [ -d $rdhome/bios/switch ]; then - find $rdhome/bios/switch -xtype l -exec rm {} \; - fi - # initializing the keys folder - dir_prep "$rdhome/bios/switch/keys" "/var/data/yuzu/keys" - # initializing the firmware folder - dir_prep "$rdhome/bios/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" - # configuring Yuzu - dir_prep "$rdhome/.logs/yuzu" "/var/data/yuzu/log" - mkdir -pv /var/config/yuzu/ - cp -fvr $emuconfigs/yuzu/* /var/config/yuzu/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/yuzu/qt-config.ini - dir_prep "$rdhome/screenshots" "/var/data/yuzu/screenshots" -} - -dolphin_init() { - echo "----------------------" - echo "Initializing DOLPHIN" - echo "----------------------" - mkdir -pv /var/config/dolphin-emu/ - cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/dolphin-emu/Dolphin.ini - dir_prep "$rdhome/saves/gc/dolphin/EUR" "/var/data/dolphin-emu/GC/EUR" - dir_prep "$rdhome/saves/gc/dolphin/USA" "/var/data/dolphin-emu/GC/USA" - dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" - dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" - dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" - dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" -} - -pcsx2_init() { - echo "----------------------" - echo "Initializing PCSX2" - echo "----------------------" - mkdir -pv "/var/config/PCSX2/inis" - mkdir -pv "$rdhome/saves/ps2/pcsx2/memcards" - mkdir -pv "$rdhome/states/ps2/pcsx2" - cp -fvr $emuconfigs/PCSX2/* /var/config/PCSX2/inis/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini -} - -melonds_init() { - echo "----------------------" - echo "Initializing MELONDS" - echo "----------------------" - mkdir -pv /var/config/melonDS/ - mkdir -pv "$rdhome/saves/nds/melonds" - mkdir -pv "$rdhome/states/nds/melonds" - dir_prep "$rdhome/bios" "/var/config/melonDS/bios" - cp -fvr $emuconfigs/melonDS.ini /var/config/melonDS/ - # Replace ~/retrodeck with $rdhome as ~ cannot be understood by MelonDS - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/melonDS/melonDS.ini -} - -citra_init() { - echo "------------------------" - echo "Initializing CITRA" - echo "------------------------" - mkdir -pv /var/config/citra-emu/ - mkdir -pv "$rdhome/saves/n3ds/citra/nand/" - mkdir -pv "$rdhome/saves/n3ds/citra/sdmc/" - dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log" - cp -fv $emuconfigs/citra-qt-config.ini /var/config/citra-emu/qt-config.ini - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini - #TODO: do the same with roms folders after new variables is pushed (check even the others qt-emu) - #But actually everything is always symlinked to retrodeck/roms so it might be not needed - #sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini -} - -rpcs3_init() { - echo "------------------------" - echo "Initializing RPCS3" - echo "------------------------" - mkdir -pv /var/config/rpcs3/ - cp -fvr $emuconfigs/rpcs3/* /var/config/rpcs3/ - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/rpcs3/vfs.yml -} - -xemu_init() { - echo "------------------------" - echo "Initializing XEMU" - echo "------------------------" - mkdir -pv $rdhome/saves/xbox/xemu/ - cp -fv $emuconfigs/xemu.toml /var/data/xemu/xemu.toml - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml - # Preparing HD dummy Image if the image is not found - if [ ! -f $rdhome/bios/xbox_hdd.qcow2 ] - then - wget "https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip" -P $rdhome/bios/ - unzip $rdhome/bios/xbox_hdd.qcow2.zip $rdhome/bios/ - rm -rfv $rdhome/bios/xbox_hdd.qcow2.zip - fi -} - -ppssppsdl_init() { - echo "------------------------" - echo "Initializing PPSSPPSDL" - echo "------------------------" - mkdir -p /var/config/ppsspp/PSP/SYSTEM/ - cp -fv $emuconfigs/ppssppsdl/* /var/config/ppsspp/PSP/SYSTEM/ - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/ppsspp/PSP/SYSTEM/ppsspp.ini -} - -duckstation_init() { - echo "------------------------" - echo "Initializing DUCKSTATION" - echo "------------------------" - mkdir -p /var/config/duckstation/ - cp -fv $emuconfigs/duckstation/* /var/config/duckstation - sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/ppsspp/PSP/SYSTEM/settings.ini -} - -standalones_init() { - # This script is configuring the standalone emulators with the default files present in emuconfigs folder - - echo "----------------------" - echo "Initializing standalone emulators" - echo "----------------------" - - yuzu_init - citra_init - dolphin_init - melonds_init - pcsx2_init - ppssppsdl_init - rpcs3_init - xemu_init - duckstation_init -} - -#========================= -# REUSABLE DIALOGS SECTION -#========================= - -debug_dialog() { - # This function is for displaying commands run by the Configurator without actually running them - # USAGE: debug_dialog "command" - - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --width=800 --height=600 \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Debug Dialog" \ - --text="$1" -} - -configurator_process_complete_dialog() { - # This dialog shows when a process is complete. - # USAGE: configurator_process_complete_dialog "process text" - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Quit" --extra-button="OK" --width=800 --height=600 \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Process Complete" \ - --text="The process of $1 is now complete.\n\nYou may need to quit and restart RetroDECK for your changes to take effect\n\nClick OK to return to the Main Menu or Quit to return to RetroDECK." - - if [ ! $? == 0 ] # OK button clicked - then - configurator_welcome_dialog - fi -} - -configurator_generic_dialog() { - # This dialog is for showing temporary messages before another process happens. - # USAGE: configurator_generid_dialog "info text" - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --width=800 --height=600 \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility" \ - --text="$1" -} - -configurator_destination_choice_dialog() { - # This dialog is for making things easy for new users to move files to common locations. Gives the options for "Internal", "SD Card" and "Custom" locations. - # USAGE: $(configurator_destination_choice_dialog "folder being moved" "action text") - # This function returns one of the values: "Back" "Internal Storage" "SD Card" "Custom Location" - choice=$(zenity --title "RetroDECK Configurator Utility - Moving $1 folder" --info --no-wrap --ok-label="Back" --extra-button="Internal Storage" --extra-button="SD Card" --extra-button="Custom Location" --width=800 --height=600 \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --text="$2") - - echo $choice -} - -#========================= -# LEGACY FUNCTIONS SECTION -#========================= - -# These functions were pulled from retrodeck.sh or global.sh and should be consolidated eventually - -dir_prep() { - # This script is creating a symlink preserving old folder contents and moving them in the new one - - # Call me with: - # dir prep "real dir" "symlink location" - real="$1" - symlink="$2" - - echo -e "\n[DIR PREP]\nMoving $symlink in $real" #DEBUG - - # if the dest dir exists we want to backup it - if [ -d "$symlink" ]; - then - echo "$symlink found" #DEBUG - mv -fv "$symlink" "$symlink.old" - 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" - fi - - # creating the symlink - echo "linking $real in $symlink" #DEBUG - mkdir -pv "$(dirname "$symlink")" # creating the full path except the last folder - ln -sv "$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 - mv -fv "$symlink".old/* $real - echo "Removing $symlink.old" #DEBUG - rm -rf "$symlink.old" - fi - - echo -e "$symlink is now $real\n" -} - -tools_init() { - rm -rfv /var/config/retrodeck/tools/ - mkdir -pv /var/config/retrodeck/tools/ - cp -rfv /app/retrodeck/tools/* /var/config/retrodeck/tools/ - mkdir -pv /var/config/emulationstation/.emulationstation/custom_systems/tools/ - rm -rfv /var/config/retrodeck/tools/gamelist.xml - cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml -} - -ra_init() { - dir_prep "$rdhome/bios" "/var/config/retroarch/system" - dir_prep "$rdhome/.logs/retroarch" "/var/config/retroarch/logs" - mkdir -pv /var/config/retroarch/cores/ - cp /app/share/libretro/cores/* /var/config/retroarch/cores/ - cp -fv $emuconfigs/retroarch.cfg /var/config/retroarch/ - cp -fv $emuconfigs/retroarch-core-options.cfg /var/config/retroarch/ - #rm -rf $rdhome/bios/bios # in some situations a double bios symlink is created - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/retroarch/retroarch.cfg - - # PPSSPP - echo "--------------------------------" - echo "Initializing PPSSPP_LIBRETRO" - echo "--------------------------------" - if [ -d $rdhome/bios/PPSSPP/flash0/font ] - then - mv -fv $rdhome/bios/PPSSPP/flash0/font $rdhome/bios/PPSSPP/flash0/font.bak - fi - mkdir -p $rdhome/bios/PPSSPP - #if [ ! -f "$rdhome/bios/PPSSPP/ppge_atlas.zim" ] - #then - wget "https://github.com/hrydgard/ppsspp/archive/refs/heads/master.zip" -P $rdhome/bios/PPSSPP - unzip "$rdhome/bios/PPSSPP/master.zip" -d $rdhome/bios/PPSSPP/ - mv "$rdhome/bios/PPSSPP/ppsspp-master/assets/"* "$rdhome/bios/PPSSPP/" - rm -rfv "$rdhome/bios/PPSSPP/master.zip" - rm -rfv "$rdhome/bios/PPSSPP/ppsspp-master" - #fi - if [ -d $rdhome/bios/PPSSPP/flash0/font.bak ] - then - mv -fv $rdhome/bios/PPSSPP/flash0/font.bak $rdhome/bios/PPSSPP/flash0/font - fi - - - # MSX / SVI / ColecoVision / SG-1000 - echo "-----------------------------------------------------------" - echo "Initializing MSX / SVI / ColecoVision / SG-1000 LIBRETRO" - echo "-----------------------------------------------------------" - wget "http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip" -P $rdhome/bios/MSX - unzip "$rdhome/bios/MSX/blueMSXv282full.zip" $rdhome/bios/MSX - mv -rfv $rdhome/bios/MSX/Databases $rdhome/bios/Databases - mv -rfv $rdhome/bios/MSX/Machines $rdhome/bios/Machines - rm -rfv $rdhome/bios/MSX - -} - -create_lock() { - # creating RetroDECK's lock file and writing the version in the config file - version=$hard_version - touch "$lockfile" - conf_write -} - -post_update() { - # post update script - echo "Executing post-update script" - - # Finding existing ROMs folder - if [ -d "$default_sd/retrodeck" ] - then - # ROMs on SD card - roms_folder="$default_sd/retrodeck/roms" - else - # ROMs on Internal - roms_folder="$HOME/retrodeck/roms" - fi - echo "ROMs folder found at $roms_folder" - - # Unhiding downloaded media from the previous versions - if [ -d "$rdhome/.downloaded_media" ] - then - mv -fv "$rdhome/.downloaded_media" "$media_folder" - fi - - # Unhiding themes folder from the previous versions - if [ -d "$rdhome/.themes" ] - then - mv -fv "$rdhome/.themes" "$themes_folder" - fi - - # Doing the dir prep as we don't know from which version we came - dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" - dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" - mkdir -pv $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/.emulationstation/es_settings.xml - - - # 0.4 -> 0.5 - # Perform save and state migration if needed - - # Moving PCSX2 Saves - mv -fv /var/config/PCSX2/sstates/* $rdhome/states/ps2/pcsx2 - mv -fv /var/config/PCSX2/memcards/* $rdhome/saves/ps2/memcards - - versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves - - if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $hard_version) == $(sed -e "s/\.//g" <<< $version) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 - migration_logfile=$rdhome/.logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log" - save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" - state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" - - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="You are updating to a version of RetroDECK where save file locations have changed!\n\nYour existing files will be backed up for safety and then sorted automatically.\n\nIf a file cannot be sorted automatically it will remain where it is for manual sorting.\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." - - allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder - - allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder - - allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder - - totalsaves=${#allsaves[@]} - totalstates=${#allstates[@]} - filesleft= - current_dest_folder= - gamestoskip= - - tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety - echo "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 - - ( - movefile() { # Take matching save and rom files and sort save into appropriate system folder - echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar - progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) - echo $progress - filesleft=$((filesleft-1)) - if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually - game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder - gamebasename=$(basename "$game" | sed -e 's/\..*//') # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to - matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found - if [[ ${#matches[@]} -gt 1 ]]; then - echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile - gamestoskip+=("$1") - return - fi - echo "INFO: Examining ROM file:" "$game" >> $migration_logfile - echo "INFO: 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 - 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 - 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 - fi - } - - find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script - - totalfiles=$totalsaves #set variables for save file migration - filesleft=$totalsaves - currentlybeingmoved="saves" - current_dest_folder=$saves_folder - - for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match - found= - currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 - for j in "${allgames[@]}"; do - currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - [[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip - done - [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file - done - - totalfiles=$totalstates #set variables for state file migration - filesleft=$totalstates - currentlybeingmoved="states" - current_dest_folder=$states_folder - - for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match - found= - currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 - for j in "${allgames[@]}"; do - currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - [[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip - done - [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file - done - - ) | - zenity --progress \ - --icon-name=net.retrodeck.retrodeck \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title="Processing Files" \ - --text="# files remaining..." \ - --percentage=0 \ - --no-cancel \ - --auto-close - - if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." - - else - cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" - fi - - else - echo "Version" $version "is after the save and state organization was changed, no need to sort again" - fi - - ra_init - standalones_init - tools_init - - create_lock -} - -start_retrodeck() { - # normal startup - echo "Starting RetroDECK v$version" - emulationstation --home /var/config/emulationstation -} - -browse(){ - # Function for browsing the sd card - path_selected=false - while [ $path_selected == false ] - do - sdcard="$(zenity --file-selection --title="Choose retrodeck folder location" --directory)" - echo "Path choosed: $sdcard, answer=$?" - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ - --cancel-label="No" \ - --ok-label "Yes" \ - --text="Your rom folder will be:\n\n$sdcard/retrodeck/roms\n\nis that ok?" - if [ $? == 0 ] #yes - then - path_selected == true - roms_folder="$sdcard/retrodeck/roms" - break - else - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" - if [ $? == 0 ] # yes, quit - then - exit 0 - fi - fi - done -} - -finit() { - # Force/First init, depending on the situation - - echo "Executing finit" - - # Internal or SD Card? - choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ - --ok-label "Cancel" \ - --extra-button "Internal" \ - --extra-button "SD Card" \ - --text="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 roms folder to be located?" ) - echo "Choice is $choice" - - case $choice in - - "" ) # Cancel or X button quits - echo "Now quitting" - kill $$ - ;; - - "Internal" ) # Internal - echo "Internal selected" - roms_folder="$rdhome/roms" - ;; - - "SD Card" ) - echo "SD Card selected" - if [ ! -d "$sdcard" ] # SD Card path is not existing - then - echo "Error: SD card not found" - zenity --question --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" --cancel-label="Cancel" \ - --ok-label "Browse" \ - --text="SD Card was not find in the default location.\nPlease choose the SD Card root.\nA retrodeck/roms folder will be created starting from the directory that you selected." - browse # Calling the browse function - else - roms_folder="$sdcard/retrodeck/roms" # sdcard variable is correct as its given by browse function - echo "ROMs folder = $roms_folder" - fi - ;; - - #"Advanced" ) # Browse + not found fallback - # echo "Advanced" - # advanced - #;; - - esac - - mkdir -pv $roms_folder - - # TODO: after the next update of ES-DE this will not be needed - #zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --text="EmulationStation will now initialize the system.\nPlease DON'T EDIT THE ROMS LOCATION, just select:\n\nCREATE DIRECTORIES\nYES\nOK\nQUIT\n\nRetroDECK will manage the rest." - 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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." - - # Recreating the folder - rm -rfv /var/config/emulationstation/ - rm -rfv /var/config/retrodeck/tools/ - mkdir -pv /var/config/emulationstation/ - - # Initializing ES-DE - # TODO: after the next update of ES-DE this will not be needed - let's test it - emulationstation --home /var/config/emulationstation --create-system-dirs - - mkdir -pv /var/config/retrodeck/tools/ - - #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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." - - # Initializing ROMs folder - Original in retrodeck home (or SD Card) - dir_prep $roms_folder "/var/config/emulationstation/ROMs" - - mkdir -pv $rdhome/saves - mkdir -pv $rdhome/states - mkdir -pv $rdhome/screenshots - mkdir -pv $rdhome/bios/pico8 - mkdir -pv $rdhome/.logs - - # XMLSTARLET HERE - cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml - - # ES-DE preparing themes and scraped folders - dir_prep "$rdhome/downloaded_media" "/var/config/emulationstation/.emulationstation/downloaded_media" - dir_prep "$rdhome/themes" "/var/config/emulationstation/.emulationstation/themes" - - # PICO-8 - dir_prep "$roms_folder/pico8" "$rdhome/bios/pico8/bbs/carts" #this is the folder where pico-8 is saving the carts - - ra_init - standalones_init - tools_init - create_lock - - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="Installation completed.\nPlease put your roms in:\n\n$roms_folder\n\nand your bioses in\n\n$rdhome/bios\n\nThen start the program again.\nIf you wish to change the roms location, you may use the tool located the tools section of RetroDECK.\n\nIMPORTANT NOTES:\n- RetroDECK must be manually added and launched from your Steam Library in order to work correctly.\n- It's recommended to use the 'RetroDECK Offical Controller Config' from Steam (under community layouts).\n- It's suggested to use BoilR to automatically add the SteamGridDB images to Steam (this will be automated soon).\nhttps://github.com/PhilipK/BoilR" - # TODO: Replace the stuff above with BoilR code when ready -} - conf_write() { # writes the variables in the retrodeck config file @@ -862,5 +269,631 @@ conf_write() { echo "DEBUG: New contents:" cat "$rd_conf" echo "" +} +dir_prep() { + # This script is creating a symlink preserving old folder contents and moving them in the new one + + # Call me with: + # dir prep "real dir" "symlink location" + real="$1" + symlink="$2" + + echo -e "\n[DIR PREP]\nMoving $symlink in $real" #DEBUG + + # if the dest dir exists we want to backup it + if [ -d "$symlink" ]; + then + echo "$symlink found" #DEBUG + mv -fv "$symlink" "$symlink.old" + 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" + fi + + # creating the symlink + echo "linking $real in $symlink" #DEBUG + mkdir -pv "$(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 + mv -fv "$symlink".old/* $real + echo "Removing $symlink.old" #DEBUG + rm -rf "$symlink.old" + fi + + echo -e "$symlink is now $real\n" +} + +yuzu_init() { + echo "----------------------" + echo "Initializing YUZU" + echo "----------------------" + # removing dead symlinks as they were present in a past version + if [ -d $rdhome/bios/switch ]; then + find $rdhome/bios/switch -xtype l -exec rm {} \; + fi + # initializing the keys folder + dir_prep "$rdhome/bios/switch/keys" "/var/data/yuzu/keys" + # initializing the firmware folder + dir_prep "$rdhome/bios/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" + # initializing the save folders + dir_prep "$rdhome/saves/switch/yuzu/nand" "/var/data/yuzu/nand" + dir_prep "$rdhome/saves/switch/yuzy/sdmc" "/var/data/yuzu/sdmc" + # configuring Yuzu + dir_prep "$rdhome/.logs/yuzu" "/var/data/yuzu/log" + mkdir -pv /var/config/yuzu/ + cp -fvr $emuconfigs/yuzu/* /var/config/yuzu/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/yuzu/qt-config.ini + dir_prep "$rdhome/screenshots" "/var/data/yuzu/screenshots" +} + +dolphin_init() { + echo "----------------------" + echo "Initializing DOLPHIN" + echo "----------------------" + mkdir -pv /var/config/dolphin-emu/ + cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/dolphin-emu/Dolphin.ini + dir_prep "$rdhome/saves/gc/dolphin/EUR" "/var/data/dolphin-emu/GC/EUR" + dir_prep "$rdhome/saves/gc/dolphin/USA" "/var/data/dolphin-emu/GC/USA" + dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" + dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" + dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" + dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" +} + +pcsx2_init() { + echo "----------------------" + echo "Initializing PCSX2" + echo "----------------------" + mkdir -pv "/var/config/PCSX2/inis" + mkdir -pv "$rdhome/saves/ps2/pcsx2/memcards" + mkdir -pv "$rdhome/states/ps2/pcsx2" + cp -fvr $emuconfigs/PCSX2/* /var/config/PCSX2/inis/ + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini + #dir_prep "$rdhome/states/ps2/pcsx2" "/var/config/PCSX2/sstates" + #dir_prep "$rdhome/screenshots" "/var/config/PCSX2/snaps" + #dir_prep "$rdhome/.logs" "/var/config/PCSX2/logs" + #dir_prep "$rdhome/bios" "$rdhome/bios/pcsx2" + +melonds_init() { + echo "----------------------" + echo "Initializing MELONDS" + echo "----------------------" + mkdir -pv /var/config/melonDS/ + mkdir -pv "$rdhome/saves/nds/melonds" + mkdir -pv "$rdhome/states/nds/melonds" + dir_prep "$rdhome/bios" "/var/config/melonDS/bios" + cp -fvr $emuconfigs/melonDS.ini /var/config/melonDS/ + # Replace ~/retrodeck with $rdhome as ~ cannot be understood by MelonDS + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/melonDS/melonDS.ini +} + +citra_init() { + echo "------------------------" + echo "Initializing CITRA" + echo "------------------------" + mkdir -pv /var/config/citra-emu/ + mkdir -pv "$rdhome/saves/n3ds/citra/nand/" + mkdir -pv "$rdhome/saves/n3ds/citra/sdmc/" + dir_prep "$rdhome/bios/citra/sysdata" "/var/data/citra-emu/sysdata" + dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log" + cp -fv $emuconfigs/citra-qt-config.ini /var/config/citra-emu/qt-config.ini + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini + #TODO: do the same with roms folders after new variables is pushed (check even the others qt-emu) + #But actually everything is always symlinked to retrodeck/roms so it might be not needed + #sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini +} + +rpcs3_init() { + echo "------------------------" + echo "Initializing RPCS3" + echo "------------------------" + mkdir -pv /var/config/rpcs3/ + cp -fvr $emuconfigs/rpcs3/* /var/config/rpcs3/ + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/rpcs3/vfs.yml +} + +xemu_init() { + echo "------------------------" + echo "Initializing XEMU" + echo "------------------------" + mkdir -pv $rdhome/saves/xbox/xemu/ + cp -fv $emuconfigs/xemu.toml /var/data/xemu/xemu.toml + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml + # Preparing HD dummy Image if the image is not found + if [ ! -f $rdhome/bios/xbox_hdd.qcow2 ] + then + wget "https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip" -P $rdhome/bios/ + unzip -q $rdhome/bios/xbox_hdd.qcow2.zip $rdhome/bios/ + rm -rfv $rdhome/bios/xbox_hdd.qcow2.zip + fi +} + +ppssppsdl_init() { + echo "------------------------" + echo "Initializing PPSSPPSDL" + echo "------------------------" + mkdir -p /var/config/ppsspp/PSP/SYSTEM/ + cp -fv $emuconfigs/ppssppsdl/* /var/config/ppsspp/PSP/SYSTEM/ + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/ppsspp/PSP/SYSTEM/ppsspp.ini +} + +duckstation_init() { + echo "------------------------" + echo "Initializing DUCKSTATION" + echo "------------------------" + mkdir -p /var/config/duckstation/ + cp -fv $emuconfigs/duckstation/* /var/config/duckstation + sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/ppsspp/PSP/SYSTEM/settings.ini +} + +standalones_init() { + # This script is configuring the standalone emulators with the default files present in emuconfigs folder + + echo "----------------------" + echo "Initializing standalone emulators" + echo "----------------------" + + yuzu_init + citra_init + dolphin_init + melonds_init + pcsx2_init + ppssppsdl_init + rpcs3_init + xemu_init + duckstation_init +} + +#========================= +# REUSABLE DIALOGS SECTION +#========================= + +debug_dialog() { + # This function is for displaying commands run by the Configurator without actually running them + # USAGE: debug_dialog "command" + + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Debug Dialog" \ + --text="$1" +} + +configurator_process_complete_dialog() { + # This dialog shows when a process is complete. + # USAGE: configurator_process_complete_dialog "process text" + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Quit" --extra-button="OK" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Process Complete" \ + --text="The process of $1 is now complete.\n\nYou may need to quit and restart RetroDECK for your changes to take effect\n\nClick OK to return to the Main Menu or Quit to return to RetroDECK." + + if [ ! $? == 0 ] # OK button clicked + then + configurator_welcome_dialog + fi +} + +configurator_generic_dialog() { + # This dialog is for showing temporary messages before another process happens. + # USAGE: configurator_generid_dialog "info text" + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility" \ + --text="$1" +} + +configurator_destination_choice_dialog() { + # This dialog is for making things easy for new users to move files to common locations. Gives the options for "Internal", "SD Card" and "Custom" locations. + # USAGE: $(configurator_destination_choice_dialog "folder being moved" "action text") + # This function returns one of the values: "Back" "Internal Storage" "SD Card" "Custom Location" + choice=$(zenity --title "RetroDECK Configurator Utility - Moving $1 folder" --info --no-wrap --ok-label="Back" --extra-button="Internal Storage" --extra-button="SD Card" --extra-button="Custom Location" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="$2") + + echo $choice +} + +#========================= +# LEGACY FUNCTIONS SECTION +#========================= + +# These functions were pulled from retrodeck.sh or global.sh and should be consolidated eventually + +tools_init() { + rm -rfv /var/config/retrodeck/tools/ + mkdir -pv /var/config/retrodeck/tools/ + cp -rfv /app/retrodeck/tools/* /var/config/retrodeck/tools/ + mkdir -pv /var/config/emulationstation/.emulationstation/custom_systems/tools/ + rm -rfv /var/config/retrodeck/tools/gamelist.xml + cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml +} + +ra_init() { + dir_prep "$rdhome/bios" "/var/config/retroarch/system" + dir_prep "$rdhome/.logs/retroarch" "/var/config/retroarch/logs" + mkdir -pv /var/config/retroarch/shaders/ + cp -rfv /app/share/libretro/shaders /var/config/retroarch/ + dir_prep "$rdhome/shaders/retroarch" "/var/config/retroarch/shaders" + mkdir -pv /var/config/retroarch/cores/ + cp -f /app/share/libretro/cores/* /var/config/retroarch/cores/ + cp -fv $emuconfigs/retroarch.cfg /var/config/retroarch/ + cp -fv $emuconfigs/retroarch-core-options.cfg /var/config/retroarch/ + cp -rfv $emuconfigs/retroarch-core-overrides/* /var/config/retroarch/config + #rm -rf $rdhome/bios/bios # in some situations a double bios symlink is created + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/retroarch/retroarch.cfg + + # PPSSPP + echo "--------------------------------" + echo "Initializing PPSSPP_LIBRETRO" + echo "--------------------------------" + if [ -d $rdhome/bios/PPSSPP/flash0/font ] + then + mv -fv $rdhome/bios/PPSSPP/flash0/font $rdhome/bios/PPSSPP/flash0/font.bak + fi + mkdir -p $rdhome/bios/PPSSPP + #if [ ! -f "$rdhome/bios/PPSSPP/ppge_atlas.zim" ] + #then + wget "https://github.com/hrydgard/ppsspp/archive/refs/heads/master.zip" -P $rdhome/bios/PPSSPP + unzip -q "$rdhome/bios/PPSSPP/master.zip" -d $rdhome/bios/PPSSPP/ + mv "$rdhome/bios/PPSSPP/ppsspp-master/assets/"* "$rdhome/bios/PPSSPP/" + rm -rfv "$rdhome/bios/PPSSPP/master.zip" + rm -rfv "$rdhome/bios/PPSSPP/ppsspp-master" + #fi + if [ -d $rdhome/bios/PPSSPP/flash0/font.bak ] + then + mv -fv $rdhome/bios/PPSSPP/flash0/font.bak $rdhome/bios/PPSSPP/flash0/font + fi + + # MSX / SVI / ColecoVision / SG-1000 + echo "-----------------------------------------------------------" + echo "Initializing MSX / SVI / ColecoVision / SG-1000 LIBRETRO" + echo "-----------------------------------------------------------" + wget "http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip" -P $rdhome/bios/MSX + unzip -q "$rdhome/bios/MSX/blueMSXv282full.zip" $rdhome/bios/MSX + mv -rfv $rdhome/bios/MSX/Databases $rdhome/bios/Databases + mv -rfv $rdhome/bios/MSX/Machines $rdhome/bios/Machines + rm -rfv $rdhome/bios/MSX +} + +create_lock() { + # creating RetroDECK's lock file and writing the version in the config file + version=$hard_version + touch "$lockfile" + conf_write +} + +post_update() { + # post update script + echo "Executing post-update script" + + # Finding existing ROMs folder + if [ -d "$default_sd/retrodeck" ] + then + # ROMs on SD card + roms_folder="$default_sd/retrodeck/roms" + if [[ ! -L $rdhome && ! -L $rdhome/roms ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory + ln -s $roms_folder $rdhome/roms + fi + else + # ROMs on Internal + roms_folder="$HOME/retrodeck/roms" + fi + echo "ROMs folder found at $roms_folder" + + # Unhiding downloaded media from the previous versions + if [ -d "$rdhome/.downloaded_media" ] + then + mv -fv "$rdhome/.downloaded_media" "$media_folder" + fi + + # Unhiding themes folder from the previous versions + if [ -d "$rdhome/.themes" ] + then + mv -fv "$rdhome/.themes" "$themes_folder" + fi + + # Doing the dir prep as we don't know from which version we came + dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" + mkdir -pv $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/.emulationstation/es_settings.xml + + + # 0.4 -> 0.5 + # Perform save and state migration if needed + + # Moving PCSX2 Saves + mv -fv /var/config/PCSX2/sstates/* $rdhome/states/ps2/pcsx2 + mv -fv /var/config/PCSX2/memcards/* $rdhome/saves/ps2/memcards + + # Moving Citra saves from legacy location to 0.5.0b structure + + mv -fv $rdhome/saves/Citra/* $rdhome/saves/n3ds/citra + rmdir $rdhome/saves/Citra # Old folder cleanup + + versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves + + if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 + migration_logfile=$rdhome/.logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log" + save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" + state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" + + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="You are updating to a version of RetroDECK where save file locations have changed!\n\nYour existing files will be backed up for safety and then sorted automatically.\n\nIf a file cannot be sorted automatically it will remain where it is for manual sorting.\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." + + allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder + + allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder + + allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder + + totalsaves=${#allsaves[@]} + totalstates=${#allstates[@]} + filesleft= + current_dest_folder= + gamestoskip= + + tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety + echo "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 + + ( + movefile() { # Take matching save and rom files and sort save into appropriate system folder + echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar + progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) + echo $progress + filesleft=$((filesleft-1)) + if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually + game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder + gamebasename=$(basename "$game" | sed -e 's/\..*//') # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to + matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found + if [[ ${#matches[@]} -gt 1 ]]; then + echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile + gamestoskip+=("$1") + return + fi + echo "INFO: Examining ROM file:" "$game" >> $migration_logfile + echo "INFO: 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 + 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 + 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 + fi + } + + find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script + + totalfiles=$totalsaves #set variables for save file migration + filesleft=$totalsaves + currentlybeingmoved="saves" + current_dest_folder=$saves_folder + + for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match + found= + currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 + for j in "${allgames[@]}"; do + currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + [[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip + done + [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file + done + + totalfiles=$totalstates #set variables for state file migration + filesleft=$totalstates + currentlybeingmoved="states" + current_dest_folder=$states_folder + + for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match + found= + currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 + for j in "${allgames[@]}"; do + currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + [[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip + done + [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file + done + + ) | + zenity --progress \ + --icon-name=net.retrodeck.retrodeck \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title="Processing Files" \ + --text="# files remaining..." \ + --percentage=0 \ + --no-cancel \ + --auto-close + + if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." + + else + cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" + fi + + else + echo "Version" $version "is after the save and state organization was changed, no need to sort again" + fi + + ( + ra_init + standalones_init + tools_init + ) | + 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." + + create_lock +} + +start_retrodeck() { + # normal startup + echo "Starting RetroDECK v$version" + emulationstation --home /var/config/emulationstation +} + +old_browse(){ + # Function for browsing the sd card + path_selected=false + while [ $path_selected == false ] + do + sdcard="$(zenity --file-selection --title="Choose SD card location" --directory)" + echo "Path chosen: $sdcard, answer=$?" + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ + --cancel-label="No" \ + --ok-label "Yes" \ + --text="Your rom folder will be:\n\n$sdcard/retrodeck/roms\n\nis that ok?" + if [ $? == 0 ] #yes + then + path_selected == true + roms_folder="$sdcard/retrodeck/roms" + break + else + zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" + if [ $? == 0 ] # yes, quit + then + exit 0 + fi + fi + done +} + +finit() { + # Force/First init, depending on the situation + + echo "Executing finit" + + # Internal or SD Card? + choice=$(configurator_destination_choice_dialog "ROMs" "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 roms folder to be located?" ) + echo "Choice is $choice" + + case $choice in + + "" ) # Cancel or X button quits + echo "Now quitting" + exit 0 + ;; + + "Internal Storage" ) # Internal + echo "Internal selected" + roms_folder="$rdhome/roms" + ;; + + "SD Card" ) + echo "SD Card selected" + if [ ! -d "$sdcard" ] # SD Card path is not existing + then + echo "Error: SD card not found" + zenity --question --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" --cancel-label="Cancel" \ + --ok-label "Browse" \ + --text="SD Card was not find in the default location.\nPlease choose the SD Card root.\nA retrodeck/roms folder will be created starting from the directory that you selected." + old_browse # Calling the browse function + elif [ ! -w "$sdcard" ] #SD card found but not writable + then + echo "Error: 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." + echo "Now quitting" + exit 0 + else + roms_folder="$sdcard/retrodeck/roms" # sdcard variable is correct as its given by browse function + echo "ROMs folder = $roms_folder" + fi + ;; + + esac + + mkdir -pv $roms_folder + + # TODO: after the next update of ES-DE this will not be needed + #zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --text="EmulationStation will now initialize the system.\nPlease DON'T EDIT THE ROMS LOCATION, just select:\n\nCREATE DIRECTORIES\nYES\nOK\nQUIT\n\nRetroDECK will manage the rest." + 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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." + + # Recreating the folder + rm -rfv /var/config/emulationstation/ + rm -rfv /var/config/retrodeck/tools/ + mkdir -pv /var/config/emulationstation/ + + # Initializing ES-DE + # TODO: after the next update of ES-DE this will not be needed - let's test it + emulationstation --home /var/config/emulationstation --create-system-dirs + + mkdir -pv /var/config/retrodeck/tools/ + + #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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." + + # Initializing ROMs folder - Original in retrodeck home (or SD Card) + dir_prep $roms_folder "/var/config/emulationstation/ROMs" + + mkdir -pv $rdhome/saves + mkdir -pv $rdhome/states + mkdir -pv $rdhome/screenshots + mkdir -pv $rdhome/bios/pico8 + mkdir -pv $rdhome/.logs + + # XMLSTARLET HERE + cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml + + # ES-DE preparing themes and scraped folders + dir_prep "$rdhome/downloaded_media" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$rdhome/themes" "/var/config/emulationstation/.emulationstation/themes" + + # PICO-8 + dir_prep "$roms_folder/pico8" "$rdhome/bios/pico8/bbs/carts" #this is the folder where pico-8 is saving the carts + + ( + ra_init + standalones_init + tools_init + ) | + 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." + create_lock + + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="Installation completed.\nPlease put your roms in:\n\n$roms_folder\n\nand your bioses in\n\n$rdhome/bios\n\nThen start the program again.\nIf you wish to change the roms location, you may use the tool located the tools section of RetroDECK.\n\nIMPORTANT NOTES:\n- RetroDECK must be manually added and launched from your Steam Library in order to work correctly.\n- It's recommended to use the 'RetroDECK Offical Controller Config' from Steam (under community layouts).\n- It's suggested to use BoilR to automatically add the SteamGridDB images to Steam (this will be automated soon).\nhttps://github.com/PhilipK/BoilR" + # TODO: Replace the stuff above with BoilR code when ready } \ No newline at end of file diff --git a/global.sh b/global.sh index 32dfef6f..9ea10aee 100755 --- a/global.sh +++ b/global.sh @@ -2,6 +2,8 @@ # This file is containing some global function needed for the script such as the config file tools +source /app/libexec/functions.sh + # Static variables rd_conf="/var/config/retrodeck/retrodeck.cfg" # RetroDECK config file path emuconfigs="/app/retrodeck/emu-configs" # folder with all the default emulator configs @@ -9,78 +11,24 @@ lockfile="/var/config/retrodeck/.lock" # where the lockfile default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem) -conf_write() { - # writes the variables in the retrodeck config file - - echo "DEBUG: printing the config file content before writing it:" - cat "$rd_conf" - echo "" - - echo "Writing the config file: $rd_conf" - - # TODO: this can be optimized with a while and a list of variables to check - if [ ! -z "$version" ] #if the variable is not null then I update it - then - sed -i "s%version=.*%version=$version%" "$rd_conf" - fi - - if [ ! -z "$rdhome" ] - then - sed -i "s%rdhome=.*%rdhome=$rdhome%" "$rd_conf" - fi - - if [ ! -z "$roms_folder" ] - then - sed -i "s%roms_folder=.*%roms_folder=$roms_folder%" "$rd_conf" - fi - - if [ ! -z "$saves_folder" ] - then - sed -i "s%saves_folder=.*%saves_folder=$saves_folder%" "$rd_conf" - fi - - if [ ! -z "$states_folder" ] - then - sed -i "s%states_folder=.*%states_folder=$states_folder%" "$rd_conf" - fi - - if [ ! -z "$bios_folder" ] - then - sed -i "s%bios_folder=.*%bios_folder=$bios_folder%" "$rd_conf" - fi - - if [ ! -z "$media_folder" ] - then - sed -i "s%media_folder=.*%media_folder=$media_folder%" "$rd_conf" - fi - - if [ ! -z "$themes_folder" ] - then - sed -i "s%themes_folder=.*%themes_folder=$themes_folder%" "$rd_conf" - fi - - if [ ! -z "$sdcard" ] - then - sed -i "s%sdcard=.*%sdcard=$sdcard%" "$rd_conf" - fi - echo "DEBUG: New contents:" - cat "$rd_conf" - echo "" - -} - # 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" - + # 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 - version="$hard_version" # if we are here means that the we are in a new installation, so the version is valorized with the hardcoded one + if [[ $(cat $lockfile) == *"0.4."* ]] || [[ $(cat $lockfile) == *"0.3."* ]] || [[ $(cat $lockfile) == *"0.2."* ]] || [[ $(cat $lockfile) == *"0.1."* ]]; then + echo "Running version workaround" + version=$(cat $lockfile) + else + version="$hard_version" + fi fi + rdhome="$HOME/retrodeck" # the retrodeck home, aka ~/retrodeck roms_folder="$rdhome/roms" # the default roms folder path saves_folder="$rdhome/saves" # the default saves folder path @@ -103,7 +51,7 @@ then echo "sdcard=$sdcard" >> $rd_conf echo "Setting config file permissions" - chmod +rwx $rd_conf + chmod +rw $rd_conf # If the config file is existing i just read the variables (source it) else diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 0e2198bb..7b2b50c1 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -62,7 +62,7 @@ modules: # If the version is set as cooker it will automatically generate the version tag based on the date # else it will just put what is written, "v" is not needed # The version number is hardcoded in /app/retrodeck/version - # + # # UPDATE STEPS FOR MAIN: # [ ] Update the VERSION variable # [ ] Update the appdata.xml with the version number and notes @@ -136,7 +136,7 @@ modules: # - sed -e 's@$$QT_MODULE_LIB_BASE@'${FLATPAK_DEST}'/lib@g' -i ${FLATPAK_DEST}/lib/mkspecs/modules/*.pri # cleanup: # - /app/mkspecs - + # mesa repo got a double certificate issue and gnutils cannot handle that so GLU download fails, # this affects even the shared-modules's glu so I have to replace it temporarly # more info there: https://gitlab.com/gnutls/gnutls/-/issues/1335 @@ -243,7 +243,7 @@ modules: # ES-DE - END # ES-DE Themes - START - + - name: art-book-next buildsystem: simple build-commands: @@ -253,7 +253,7 @@ modules: - type: git url: https://github.com/anthonycaccese/art-book-next-retropie.git commit: 23932f484a9949313baf80f92b2fbca38a7a8f37 - + - name: alekfull-nx-light buildsystem: simple build-commands: @@ -263,7 +263,7 @@ modules: - type: git url: https://github.com/anthonycaccese/alekfull-nx-retropie.git commit: 67c8c8dee086bd06bcdc6dc34bb9bef1e1c11be7 - + - name: retrofix-revisited buildsystem: simple build-commands: @@ -398,8 +398,8 @@ modules: - mv ./RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores/* /app/share/libretro/cores/ sources: - type: archive - url: https://buildbot.libretro.com/stable/1.11.1/linux/x86_64/RetroArch_cores.7z - sha256: fa98c9a5b3aab2b4808ce14726be0393cad36bd033ffe4b8378b7d5e5dede448 + url: https://buildbot.libretro.com/stable/1.12.0/linux/x86_64/RetroArch_cores.7z + sha256: b5c87aa3462c023fa4e1aa171d1bd4f5b0b5cf9d8e4f0a6b5606ff26b05e0059 # PPSSPP - START # https://github.com/flathub/org.ppsspp.PPSSPP @@ -753,7 +753,7 @@ modules: x-checker-data: type: git tag-pattern: ^v([\d.]+)$ - + - name: libaio no-autogen: true make-install-args: @@ -940,7 +940,7 @@ modules: # - type: git # url: https://github.com/PCSX2/pcsx2.git # tag: v1.7.3229 - # commit: e3eae7fbe83aad3952e3ed6a8e56fc016b51a9c3 + # commit: e3eae7fbe83aad3952e3ed6a8e56fc016b51a9c3 # # same as above # #disable-submodules: true @@ -1314,7 +1314,7 @@ modules: - type: git url: https://github.com/stenzek/duckstation.git commit: 3fb61865e505ba639609fbf16cb8bdf5c66e020c - + # Duckstation - END # CEMU - START @@ -1365,8 +1365,8 @@ modules: # builddir: true # config-opts: # - -DENABLE_VCPKG=false -# - -DCMAKE_BUILD_TYPE=release -# - -DCMAKE_C_COMPILER=/usr/bin/gcc +# - -DCMAKE_BUILD_TYPE=release +# - -DCMAKE_C_COMPILER=/usr/bin/gcc # - -DCMAKE_CXX_COMPILER=/usr/bin/g++ # - -G Ninja # - -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja @@ -1408,15 +1408,13 @@ modules: - mkdir -p ${FLATPAK_DEST}/retrodeck/tools/ - cp tools/* ${FLATPAK_DEST}/retrodeck/tools/ - mv -f es-configs/tools-gamelist.xml ${FLATPAK_DEST}/retrodeck/ - + - cp retrodeck.sh /app/bin/retrodeck.sh - chmod +x /app/bin/retrodeck.sh - - cp global.sh /app/bin/global.sh - - chmod +x /app/bin/global.sh + - cp global.sh /app/libexec/global.sh - cp functions.sh /app/libexec/functions.sh - - chmod +x /app/libexec/functions.sh # Desktop entry - cp net.retrodeck.retrodeck.desktop /app/share/applications/net.retrodeck.retrodeck.desktop diff --git a/overlays/borders/dark/gb.png b/overlays/borders/dark/gb.png deleted file mode 100644 index abd707e404ab2370efcb1f6a55cead05cc71f0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357227 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

>kKY2Ioz4-N7^@-F?B2495 z?t$DMenNH<@2kUS&Y?Z5sI}{N1!Qw1OIz;xGHe4+F}RMS95=HL(Ps+{0e^l;|Aap? zi}(21;dycGCaq@vJdnyn_mmZFedSLmLUNbnq`p=pWr+O4q%t#coQ!yBHnoCttp=nY zpZaA~3^!-d2!YYe&f23gT3AxzM`!PRgfa%M&ZtKUdE#B{!JM0FiS|zeA7pGY+JanG zpYx-wNnVnWf0iJv$O>_j6~Ekq^UO*SPrH~O8a@iPWNZ9{a@0wc}>$~O8?$z8zAE#mR z!X%Pv;$CH}ZEN+P#MoU$zb=%-8nZHz_*2aXHv`gjs#}F#1MrA|yo$7KBAVwa&eY+D zq#oJw*3fRH_=_x>!U`ukd!ED(xkH0gnrci!ZBK9F1CML@^Qvcm^7AFn?mxyC$9lK> zG&ZQ!wA8wRxFbxiPKCiaR=1h)DZX1Qg#YZaQ5AINO0)*e0C5Sn3oRyDisyu<_V`D( zwA|o2A~p&6U!JY^o!WBp6~~HTRnM*i{2;>XO$-Hpw!#PQ2L8D@hiG>5MgOu!II^fh zVzGO_4bW6WA5lk-N#76yYw%c_%Sqy>IY@$rQ~gyc-PA0gL_-A>*7Wd+QObV<^RlCD z?LDUjQ8D#^mZ8imG8g?t=bn6d+*cRk;SWSt-sNA-;fpL6NYl9&>a=S-_#+KkHp{bjR2lajA*@i-xEQZ33RXO&I=7D*0AdDZ0lr% z16Z<}lw}&SBAiU+?^VqS2ClN0ar{*7Bk{5BPf|P7ulE6t{GUH_C&jCscG%JMwsn^7 zYz15&o+mysckps;cyjdBn16Rz<8jkH; z!3EMk+Y|lNFKRaLmEhWmO4168&KXCW&95ib@S3j*u0j%=eOl-!Mbzikm$a07#3-fsI z!<_Kakdr=RQcWrWYez#MR)ixF=lkQgcQ*YjxMS4ISN@LV!l6YIn&u2jp-G6EpP+hI zgyZ04X-H+5wl+0=qWf#5iFD5AuQ;J5>L4K_AxmhuuAopx{G<&v_A0~bG8+B_ME9l| zB+!IvbMNHy@p0ag!4LcNsP&6G=xg@Si9pb8wluyod4KJcGeWXV@h}V}c^}(2d{6Fh zE7xF?I#+!ESk#Z#ER_#+hjwPs_n}!eO0(ggtD$Ir%lU1LFYMbEXY0IV#cDbf(r8Ob zuj*3cx>fz)!tfKCL{9%~1e%8E^?er_C_GBa$8LJYHcZj_!JD=_UzLE>QSlljEfy2@ z0>xRy3B_i~w2%$;A4H_}JJFj@Y#HS&4k{Skeqb6PFXB(Pec>B39RB1gb~Vj$9U_Xw zXD*unds(Unz&vEDfV@E;vcJDyYP`)L9d!F2(DeBrk9Q^t_|bJ90z#RFDVrW^A(vPH z3S+YDCZR$8@)QBh293Wy?cq~}VaX8y5-vLDz1T$aSMGs(L`?k1 zok>O?y~%2VFD}I>Eq;#@Ju~w$wkxl+zrEcyU7abXnF<$roWd1-2xQop={sp}`aFs` z$=+(TjdtW{GKZtONy~uf)?*X`T8aVu&0M248;*T7`ZsSEpZ~|S&2V(&^o8I4q;AZF zBicG(QnZnOzu8BcWsH4;@6lZ#oY&^Lvy2G4(>`XzIVhC39UVaI_iM~Ko5tYpGlVDY zwQFWQ;ABAGo{kmER&FJZNwAqvzir;UL3Sv@#~RIXXnDa=23`;*sf-ns?08FYCYc~` z7tE6}WnoWfbm7&&sPEd*5oz%CR4)5M&O0!vk_y%v^(> zLFI>VQ{@~@1dvJHLyFI3KGAk}cRcO*w5b;@b5uTZ=a+_wKuKNJb?>}TKP1D7cc5#X z3Vdl7db7n5oQ9A^#tiED5dZZyM1OQpe~o0%YSO4eZxMB@NwT!eWIy+t(_Kj665B8Y_@9e61EhYd;#uW$Q1TVFMfr zFKEwHF@K~UW{Q}Ux+b^gaZjt{X5I;9-hOAASY53?fs5xDy5g9aHn2exr-bG4S33Gn z6M|2;6_mwg&RYIPAw0FzgY2;L9=(37nvzWXbhvoWp3GAB-Mo)+df<<>7iN>6HVEHZ z$rPo1y;H$S`>ecTsw}Q#H8*q;xw`4&__OKcgk$rE<%yF1Z`b%h6j#|FZnEwCg1>tB zr4@hirjiobap*^Y0VfPvNDD*f4p@N{)xgQ)?V}iSyd;D06;F`BgZh$MDL>?D&qF+_ zlL}cEEFe$~#l6Rs14-T#&$uIaBJjZc)7RJW+cpt`G5jSCv9qFL)2U)2m&aXQ`JmO+ zwfG;hIhH#{M4=4*AWPjm#`Q9{^gb#Bx9O}Wd|_Bvq40SeT^M{)njyw{JO&DC6BB<9NUCLrJg z`PIK1!J5_Yw2*ZH5lg^(5XANu^Qpoam0yTR!w1byvE|@hW+AUhAxzY`W%+MI6k(z- z9mP+&{+a_RH`BuN$yDlxkFc<)aj_ZpK1Z%H&w76^I~Hn~Ns0F@Rz zWm(Qf)^OToU9-M2WPJdU7PF|P?Qehgre%EXy>Z^Ygnq`3rT8dDDyF97kV!rrv6N+| z_~$SnG9+X&iGW32{d)C#CULe5tEe!8U)ZWSXg@yh7*V%S1p8yG%=&emKWR{LgI=gxL?qAuq}U zd>i-G8OK@?O8~6cj$S|I_h)m`j*Yz7mk@Z+?R@zC=RtuLvl!#M;HidgF->EMG(cnG zgSoCN&Hk6zwNJx$B3QWBoYR2D0RPph%r{!F=^IWxbF%B>4H z$Hm`YGCLW4vgsahA4sh5j$xzsMFX>Kp7_zR4mS{dKYEbU3E#8Nsk`+E)_r_(*8Co9cf#A1^@2+{ILNuYe9xhtn5BP8(!M z%$^NJ^RL-OVozgpK!O_}%^Ps+Gv(CkQLukaWz>1{hUK9%A=wcT1-BT_(wy69&*D{u z3Q|fspa}@;1ds#(eFgk;T>w5x^zrYtYzK?TCM=S?F%)@;TIvDw9s`OgjmCh;i3a(A z&o}a#fQzFT5Csp^5(5HY!1Y^JrE*6PXZj0Q@!9#B2t>HE@#Svz*d)1*)~0O zq}iuFmq$P+CTd!U8WDx7LpjNfKi}hdw)OA^q59G=G>v!d{+Ci4nj)8%{GET`NJZGO z+qAV4y|ewHkEAP@{wYs>z4nv3*rC;|OpjuA3jTrM$bXpSEl}L0d4y##yR<-Y%6hH) zX@Qgm;OtokPMNs7pFQX2B+@~x1|uy(bTeCe0Y?hRAauJzaNPE<3v$9>;y*As&lULcXoD~$;M&#TMfi~lP>rsZI!NLV;ude{8Pni8R7xQ zh_3VFc&9r5tGAW7-XaFJ0#a@B~&~t}G(j0DK}M2o|+3 zv4VeRI+H>5F~LABb{o>AgxAGM{iVZ~mGkO>)$!2LQT8-<%7JKNJZfY3r%n(~Gzda0 zzULOHO;e|_-}*-M?R~Za>-Dc1WZBD!i;1eC_$~`Nzq!ut?jMQ~kMV$1sn0GGjb1?@ z2S6^CrKyVfn1}c40VBgE!a=?p7|mlcq^Mo4Y%eILQ`if6TK0IgsnG6EaEkP`SdVKd6OI$AwON zk0`3gwuH&W5e1I1z2R6_`C1sp(`Vs^{rxe$Q))^gNlfUutDX(x*!79_;o z9fFM;)ha7V3?hDmeAJEQNc#zfg@wmNN+L16z|>fYyXtBn19a24a#>ukJv17W2mHx7sm|72sqqmaZZ^I}9;L zPBe-A;ZloW5ldRY%HE%dGpm-6%=5$wQC#r#_<`U5G&{5l^i&Sdn#-Y~=iD(gB;-~3 zgcu~hgs%z9iTL6yNY>2W$1vYfV+VR{AWIhNMr>+TQcfQT@9_=IJQAAV&y)Yci1%S4 zP>A1r>YPoTwaRoF;_5UihIPDCGkggwtoHr2ZYD+sfe+PuO^W!P1+uX#`jqlt+`S_d zBLZE&nDN=%F#YC!6eEx5e;878-0%iYLc0puaH$sit;jGWHEt~y`(=wk{Adx28lQOQ zeFioT(fE7v5b7sF_$pK0iy|51HY#Q!EAO9#M#*aed5^IM&hFGuAP@q`u&5id6JU3e zx><`vqHeF;f#w`APOVK8C<0o|?yCTWDInSf+tc_TXQhz?R>;`~XtM27+pGhrpwhP+sU!+CdZddQHjzP?ybSI7h0-6e6; zQxNGF7%Rz?6-)9r#H~ya=&sjhTKFCfg}eDW%RS)s0FVkkb}Q<>_PNm$RcldH#^t`? zCPBYhnlt&PK|OuY?fT=z8m+Y2Cg2p|dpa=Waow*v#KLT!y0o(0Mn zPror-Kpq|G643<05&KmgT~)!DD(zVqaMrJM+yiqK{_%bKPsU8zT3cxaU%3M--;)He zRqywShd(HACk4olK7gEm?3;t2=|BVj6l-^P{{c`<&svBgga-xanP|=ViMavWTFd$= z+o;*O30}0blQcFTdZsGqTWw5ZrMp4FC+~_UjUmAo3*}1e`^`BXWptr1fI|tuoQp=| zh6+2_%NQn_e(j$t9D%?hYRu#}A#H74ss+!P^+nq{a^b=a{cP z!VyUPLB`1CCPob6`Z)g61n;J`cey4!{7a}}`b>2Rmc5HZ-2A5hhd!ppZTn9~8;t}1 zN7GpcMfrYhd})yskWMLAx>;J0E(HN$Nr9!8?j;lulvuh$T2xRvB_)>zK{}RhSUTV5 z`_BAk_V1l%cAvS=xvz6wpX2s-;fV?!L0cL{psOHol=|3RQ~Q_#U%eTqFb+v-2xoZc zY4ydUjW7huL}6oPC1?@io91>$LEdV#`d&_?`kRf zbWfIYYc3+!_3TeH+e=4r+89BaSOsEf?ki#)GPu3ehhu^zT$(p($>XjQRCp3p8C63^ zDYp)Shl_>Ss*nu&eenA=Nw@dvU38ft!Th=J+MxLwm)>{DL&%*-vsr+tNp&Uz=FOu56(`%w4o!swVRpq;@~! zG-F)z6ysSeVxEi4b$)r7v-Uu4=@pCX6i6whfWerm_GLWH1Jkw;kt?}S6-q;gDhfZd zygjH%QUv(=%MW$pz|beVpp##b=`PHqO^ApEWINX%;xL)v_)|LLseIALSL9Wy>QL5; z5DP~B9Su)YmTdQ_&U|J4l+7mUrW^9D6w?ker|>Z)IpWQDTLMY6g$U7s4CyrvK=u_D zu??g8`mWf_tRo^)LhCE=e<&IJ`MWN}B4`n!^ohA-Gc1L`_dtjk2WY6P1HypjaE6qW z6z}0~KM`?gs1Vyih#$~5GgCtVV96$q41zcWcS$tMwIYfxLMxbsDd3L>a)x|(tY0(s z7CtN-E45nNT|T!wk+Ya|fw-9I@MuL#SwzkkKdTB7UvT6~X) z0VI|8Bh4fPZAbH|=b8Ds2dGFuWznADFo;Fq>whdb*$c{GX&@U(b^riKq{Ben_l`5K zf3b#Lr1!hgS~V2ib8cxPS5?y8+ANEXJwC#>sV#`dsBQd;|LoCgVqi(MPuE`aoS~(Hp>`_C)i#{$G|FfuO`>TTF7)j z91HXyt}N!#vp%h#or}Z{hC)E{isDoFCpuVS(4H5dX!Fyig(>@4uuE@QqT~i8!^LWi*2g+P;zGs1bw#M8}@NX`E4?33xAGuV;@S zI*qp4gW1cpXOCerpKK$oFOnXRHDQt~|CrsrlF?o<^LuV8l5H?GwseNzcloBg-Wa0& zCRCa zHEB|dJbtQbEkZ;T^})HbFq5kxNDZQS<5J#g!uq6%g1c4*gR%t9qMM6H!M8gS7s&gI zTPoHkzeNcOQ@oFWSw!#+ngtjn>JzshY0O=F{x#74xCA(_!v$9U_5|s2_&#IO{ zVcdV8qiYw_YR)%D(T|yvYC1w4gg3jK*PT*`qbuw(@PTGJv;V*Hpf6_rgS>9N!Oigi z5kyY*^}h#pp5@(SKKeY{FuZ}k5CD+Wfk`KCzbgG|L$ecmEql-Fs?-v_q`$u44~9#h zynvp5)a&R*nJ@Is6+wJ03bRv~+vfM_!!wbCnegV(w?$keH+fM{I2JHvt-@_C?KtR! zl8|)y=5ydUL0=X?)T@(fJJ-&buCIZ8B^8yhj$X(!w@T9Ue#j~c!1*m;7@;A#!$=uAx0%IOB3uvF# zYuT3DGil(?l5MND#wGt_=McEU-1G$B!24sh28%vgwi%k=J~j_L{adeuSP*8h=~_m> z0h-qhAuuLD}m224fTVh{NnZ&SgCf5c#Y10odv;WO?x z?r&Ow5V6Gfqa`vIovPfdh3|fOpPus_Fqycv)sKkr-QiOD@USwgS!l(YJ`R1OHQweI z;SsF7v;TpL1wy212OaH%DRF2~K$ZMUwUhcPqY%_W{X zG@n;P)KrAO1OH-l;}FfVZ?KEsE)>uKZ(p3hx`gZYb>dQhH8#St(mY5c_F9 zRA4?Lw9Hr9nE?}i*@F_>#Z42JtZQfMxXVh!fK!Ns$p#f6=Bh!H7tz<^GjoP=8N($u zI~qXLvK1xlp7Uci+e`ChOM$;}K2a(gi3!!BPP6w)ze>grY2An|E!27zi8@O5s(-O`&~l{_ zbLZJ6DCxNz&8R;&N%O7^-Etc_wl7%EmIH$^^84tx2Dd~I!sdkI+B1c$1{>@tVU|{c z#pkj>{eB?(t@(wtr&}gBBX54P~B|TU)>EX9AFuU6(vrD zQtxxhjG-P@o%9~ov`!Ea!|+ccEZ}yMjwNp0s};-k$3iEb#%}(R(O1DQoh{8F&prP% zx++^fBW`C?{5Sw}ZO+N^Jwy3vqZb*mXa1lM!|_(AsmY zQZGBthAWZNfR4{(42;Z7*Z5O)cPyhQPyDt2q4U%`!-H-N4!S=eXU(n$1AF&R;+X!0 z=Z9IgV@K0T%AWxjs+o7uQCHYK>yd#qDzmket&+s(%g^}XrH2%$fP`0bkyuWTpHy~9=W1%~tp9tS6^6ww z29tszNNy%Lz{+vWpdh?@7zkzh<+P9EI!X1!j7xL^Cb2|^n7SH;e=eFo)qbG%2~fdbqQ#(Y?F z5JxMQX^@72j*K4Z$pFCM0gTa$%NBr@0>I9NPxvow;p3%u@VZP_yIFX0yNcIWlLuHO zcOEK^Iksm}Z{6(k5 zyJ8p744VnDUp51IQJ> zC z%SeRBoGI3T-0RouVV9HV^|NhX_GarxoL8>-MW1RidA(v5>37LwcvGxwWH8D?e|037 zP3c~x0=)m;Dpcb8_0xs{k`hZ3iyhG$OOX1}^Uv@5pG9r#*obF(BTf{NL-TBHtUaVk zW^D~vviKJxd6g0A`0+}kNRhU`dJ(wdzS~#QdKZ^p zJpAuLqJg1l;j~DL$kPHBGkwn3d6nH`6}t%Ph^r7i4{YpikM4pYxpVF|+J6?WAG>Yz z`bn<5GFh4c2C@`fL>DWmbx->ZPHC!517;Fe*oWky9^;q66U#uT;p#vq`0Dm^&&8bZ z+K#<6wk{$&!*={SDYz(kgDy}eCI6IX$92AUNA>pEGFnoj5k6Q{#GJC%E5|%GTe+*~ zQ|D@nPdv zGw!r?{TOe(m&rJ1;9FI;5qx%iv)VH7^O#S}ANV-`&@+hw!K^qh-)osTE_<~=ji4Ed zhyFk)5%_%02h33RjTO-@H4h5dwQcY1`#FkC^s2`#Qtj8;gx{9c;DO8o_4Ar$V^Z}* z(QF+@FG(mV*Oxo!8s-bmZC4}d+)|uTz~RczLmaBOGYsMtw*IFt26WJdxFFIs=1>nI zjS)~&Wp{;iJ8qOrR67rmw01Y~F>hz7eEXBmmYL-VF?12b(HO|MsM%#75bmlK8JNsB6yG5JQsiaw$a5=TDc;^zqgi^R(FmmoquQM@mcNGP2PDZ$sZ6FZ2 zG?HW_>I^vMY%d8WSye3Gf#9?&XA2&|ALuSio<7XFg6>AC9P;N3Q*>AKI{)yQT8JLv z>1JhkmHIfNoavIkjiIelffIC+_Zb0FGNmRehL1c3`Cqw^ioY zx$%{{yNUH8VB`DrGAz{g^R#`Is7m5FQ!qNJedklHGCMPCVYHCi0q1TNDc6;TKSl}~ zM3I~*s(PvIj&-aT*yp!9C1>@S2F+LcQcrg2+3bvi9wwRNu9@+?hhw3%MO6NEVoX`z z*HyJU?SAtIxB|)9E`uqzt`IRU*j?A&@|AN=bMQlEjK+J8K}m!=n{5zFpw`02$=u17 zbqV#1<4;Y>P-p2?&0Hfx`4iqA#J&o2Ab-(1&|d{=om$yXBl&fR9^X03Iv31h8rzgq z;L=j==Ho*C;d%DnXnk599nItS{Gz?DEftVbv+Zw1uG)bM6j~;$hg}|jVtTEbsm09} zM4AlwLd0~|1t0J|6P#2wulTAQEF8fgva%xdY&6Hq?$Gy~R%_g8^VIT+E3Hct z!AuK-Kq8Lzc*6wF*(FwqWpm^pf#;^{({oAh3St|=6r)ey_}x63=>$%`hLF!PjaZtS ze0ioZ$0*;?w&Wh%cI5dYKKV#D@k!3q+}Y^j;zmH$M|R+gY>bxBTllGeIUC&`$qgUJ zcOM~^81cSUX4O8gvnu`~h95|)EXlO};}4DbLf+F#zJOiIqplLluVou zw}46`T#%p9$~0fY6hf(QO1HR1ylyvXV$?n7+jL8k?1bl67=hg1SchZYYqd+61nNrp zvfu`bORz`qx7No`lhMVO=1_FLY{p(3`fE+T_1?VeS$$eCDl26ue^ z+$bo@BIDguWFuacQvlIVz8+0s+T{3p`;+MowT=vmk9_D{hfsntU1yK0-t$UwX25x~@e?1u1~c}7l6 znnt(!8SPX-FAqp4R5&_T-;TUN1}#PdOWz{C>O4U5)-hinW>`3oGzk=vy_r; z8l)N)=p`;)rR9QCtJTe6-S#~;N(==1jz?E-3^VQQtiB%6Tv8VLh+REGVq4}*lYLNa zSrSxT_&aMR@XRg|Cq{=OhWXjgqu&N9i8RwCP9Aqm?3z?>Gzb_|Z#NU|Nmz{T|8vs( zC^MDF$mQn#o6(Y2D;AtSvxMNWOs&=$)%)JLQ;dMCQQG&^-}Ih?nNlC7IGibmDiXaJ z*@)Q9azX~@Aohi>a}inXRRiwEVedZ$&78o_K4tk>O$$Y`AY=|8xF_gX;*AJ<31tv@ zGg6w;3Cl`w!9U9FH6rb{Z1jAnXP&n`x^Da9CXp>WUlvj>E<#2B&E}Q&iI?D&K!E^+ zpA`o`z2eB=-4u4OvZVCeL?i}TA1#KcEa(t@HDw7D{FXRP zJQVPjas!W__~|hPAT=>Q3So;r5vK0OPx6Z5h1v?MnJrc-k!_Xf%)g^E?-{sljGfK} z#G!+*J7bi{c|moM?r|sT$iF$456Wt};_93{WtaFtV;etao$OMeSt|zLIMZao=9Y>S zDy90pWI5||s#D<9mHH(w0-<~8AZ0S%2|Y2g0m0e8j~i8g~4`fq}<83{GL{Yre0Ffma^Ohe%B(Yi-@lLktlq3QfOCoD(w;#ywQpZ z62(!N<$nkI^*pDC5J8OVes_JX36cvBhTP56_YTj{sv5&@?}07tVLK(lSR+^J<&m^i}nmldF`2 zsBfeWO9CJGI^%B1t0?gs9={cnY{6&Og%zJm?UlQ_HW^Ivjj4G^LSXSp%D{^#n_4e( zbsAN=ORC%9>$&_5gIuWh`*V$1UA^g;1b(V7CS#s_5gEj&w)}3zo64li-*9f->ZJp* zMrS-;`EZxonS2!#Xw~cDLj7%nv+DGtJMBb1u*ytq7}b2OUD}v=Wh~<&-(AvyZ)^9T zBV_A1Cn+<1?<8z#y8FhXzqt3#?<{wq8jZ-V>;$){jh?bK%s;!XyXjtYM+G4s!l80S z;w*8_&eMT?DEeF7+UKEbd78%d8_fN0*A`jw$0wVpoWRZUUgf_g70Czy3cgy8&Q?Sx z*K*M?)I&*28IUMi3pewRY6j?&&wRhLWD^v$8m6rI{(13H{&ws9yEvpAdfc{^-=63Y zArF<(uf2?OQkB!aI{(oKoREZO$$FQL3?*q<9Xl%aVdn(SdN7*=?!$R>2L(|ZmmTC*U_ENg% z({k{K;2TCK~+LKP>ULk zvM-zd9Y|$z-oa=*mjjE4D@DJOjY10;0yp|q@KZQgim9sb$5UR6Q&moqZkReFs)K;g zxO<9@`lX}b@wu?7=5zV}la*h`A+eM9DS2z3X-B-w9>U9<_jF>+dqfA!ivuYrlGrq83wcaU2mFEvMnSr2&NtYm({=H+9uTHeNC(cF$c&luI=( zgYODG#ZuY%(uVExMitPOG3VAya+Ag*0Vue`bMgMKt40+kMw0~4!_OC)c#H`P8OWEj zgPgKkyjxT;qQA3`4<=oIuIcw{e4cFHr_L?JuArCGHCOf3^JZ-8A5QYtTv0`oFF*0> zN)Q;6i~7T6qf+WJ6bueX&o}x^3bo3sVLweQWS2)}jjP7~-i20?flUW?Q1YcdMcIkJ zG-Q>JIeWCLMk&b53|cg{_(|Y*>D>7CH|YtK)8*nr2|9Xb_j)!Oaum#W+8tbLYTIJd zu?SruI(zxT=uun98U0*>fY|gBa-yR2g6trovtU|tuPF>!mzzPRPRkKfWR?_&x~Cuj zxIv>7B89CT%LzgFU*@oXfXTpLZ?fOe(m$#p3{eJ|saUxh1v!TJ29#>jl*N>}(-+wJ zI-ZJIF1b=V*Wu@;>W~QjL|Jl3^&VvCE>M_|xbU$ixoZMO190brOQp+|^If_09%5|B zKHi_>=W*@bYc7y+6SP~x=0{=tr4Sb=0m-3bDZ``GAvJzE&JCK8{)Ulv#QwFu^;K`Z zvsTZ!{~p|sL?&_999>OFp#rA?f{w9&&gJE?(#W*Q*fa@FBLsCoqBnY?8l#pPuo~~e z^6M=v(AY+klJETvH>lg9MmCk}7R+Mx@qC#OG`x~fJ$j*erYIG%M%}lnSJp)tE zNpbBPeu*i98;w2wnqt%?{23-4gun8Fv_03mf2$Qgm6xYSxhnBQ z_HPQKtz0=uJe97LV#tQ;kN-KyMW>%{iqJ&c8uqc9VJvsaUzNe!SCig%B^R zL^r5NSs)hrncCQo%olF0c0JP6JzTZ16M6Luk~dwM)tLTJ?gDB}h{z^iA$x zH_@}eWuY>Ct(bFRu-bOt#6`)))0)U1f2U5;CN>iIq3tz%x5FsaYc6{Z^dou_u^H72 zSLP|}u=~`#;?)-zs4nJ>KZhK>7RR2hTx|D7b8|Nhc)qo0Y68#|#?y2>o~+uER%d}! z!~0OcdM-8&0{w^Cf1)gw7g^{d%j9Y*PyBdxEKwmx;=aF=Dn@2fJMthbWXoy&%@eq+ zN|fceqDn($3vW|G}AI@CgS zLe**${U0c+F^sV%>GRG;?~U0?Z3Yjb6W|$$!ox%auXDr?og4Ph+6ixUe2Dgp3w_oY za@=CWCJPg_*CGQAfcyMrSBNdS`O&_U1+~6clN3wO7w04^c1`?sC=STfO zE?Kmy(*djmZ`G(@%`%D&HTk!Caj5bgwWVmI>xx+{jZGO9=y@@womi2?oFu4gl<+9F zbr%|H8mffvS?l=|Rvuf71NPF8)l;B>oO4`X6!D*0>}c*a=&xAL9_2A z2RBuH#TeHT-`$m6fkWFKH;5`^=zd-+dOmiYC>Z#eLRAaIk!$|~s5yOUZv?^r#EQ;< zP$d`MA!Qb*kgH%pdLS_ng2g(2Ql|x~jgB=yGCP~-)vLYrWw>eWj=Gr-_QqC_$8>IU zmf!!Q1T}6dNOkN;QHXy)`U(^kh-N{wDGu(pC_~62U4kA`hCu$EqqRYmT}^!RsKxje z&RL$iTswE>>$m-^%lSvOCNgno4nH2;ua!DBx(^6eBqf9+7C+7#0PLkTO*Zw0R9@vjQWE7E-Fmt>ap!?7)8d zFil6RpQr8D@!mIin#}&XgtSo6ctVye{saNNrYEBFrCa3AL#6HATkQ5v)?Q{pM+5A? za{%L_AqIM0-3Z4UHs`n-^ht6xy0Y*nVzQj;x>8%++Yg$NGj+mW*F`}F!3UdZ$3P-d zQ#A&ib&)V0j+Ts;6!e!-=yx36VeTZ)zt$#W24gSB&rdQnC&vy`{Phxb2q}-UPt-*J zT_&#ZP0RP_WulAa5F3{=ct}n<;o@l`oNNYebin6Y6D$NO zRwl&;VBCJba;RQ3fGYA;4VC4TDIK0s*HpI%IeDw*@5X*)r3tF-hUm+4E`c*{M6^LL zNE*{EAc5`KX{4> z%Qu`0Jw=y)?s<-OzuhK)FpH4AZiv`({S&-(?Zkzwd7m3*@xV%I6GD9YgANTQ_CojM$|eKN9cJzJ6^*aoI~) zW{{eSCQiUsKI48g?=I?VRQ|QdRh5=QW=6qjS*8ByD#2c?DBYb^6n6E-HuSurC{hd- zFS@$s2XP+b4HZ20Q>7~eVnx|YOAi&wzr+O$+1-X_XD`B zHZR5S3h5SFH*hU9&Ii13GC_x$?XAw(tX?0vR2bp*yw>wcZUMa`_TB89*9pub^3uKs z6aW7MYi{}PO?T)VGety9jV@ifae+MP)QPDCxSMwfLkdgfu-?u*_TOCBC7q&32_7H> zZ5eXSNN7m=#7zIzzJD&m$1kZe!R#Gssx4wPv@);FT`1 z9s~W|+Y*FPwf`#CuZ_6;7{aWkPNV#r;p*$F7yaU5nH<+~ts0CC!I{S*ER|T$HMy?3 ze-5d$&KAE#KGu~@^N?^ifCl6p0d$%)a0icGg*xZ|4&??O?W;_UcPHGFvoCm408UU*IFy!OL6p9D=>OUt+ikytbL<}v~@Ka zvF0rzlFY7l2h+ROuiZ~v9QkwLyou;>+LVCECt5w3T@ln^6!o_kRo(JiNSUko(ziWB zy(3p$Od|&54@XwjLyZD-#Zx-Lvl@L5f1-M{wzKSiTxt-;eGC)j1sPC+VwSppRHa&{ zC%s>4b?jHF1<&G5VrdMv*=uqvPtYpU@0QgTJsD+eOM0P02RAZ%Hc!<8w$+jHfl{h> zq<0(YJp?mK4qDUo5$QHKSQUcdWe0#(^-Bpu)k432|Ccg^YF^TrgE_Sl2^obdbKlp!@v<9IZ=4x6Irj1Pu05xEPvtT4$wB3=&CjGzJ^ z6k!|1LQUY6N*0LsbU%UlUX~K%*N5F+)EBo3iGgV}y84%i6jl?4)Y5Wo^|uNvkA%j6 zA$j5#XEZU~7m~f<^a|(0)(meVKA2Ptui-wi5h*p-YDHBPRn4z^PhySpqQr56=4{op z+;xSM=()9QQBpV2QiQW(3!8P(C7Z1^f_?WM4QjIPQ1YKD&VBM~ju4n}Ft|l^3wL@l zCAaH3%|?h}r^qtCQosw@d}`RQq)uSpYLDic9d*^Yq&DeZyH4U&yNioD21`G)9CyNx z(5rHEZ-+&xy!e6_z7_z%uaw{W{l~P5$vFRWb*k}t;hE7`A|1R@KVt&I} z=EPKja-}?p!6l^2{KW1(E1^K2Tq@BZmqv!et(s&_xTsugGv6h{6adJlD)YUEdOR59 zFIo-KAcMDa^r+V+Udbj~c2}Jdwk8p~zpW3-^M@izmiaGDkHsROa&y|RjW$mH5ZG7M zS(~8Qr(M*UMX%W`mw!1n^3_P@BoKWn;4*}Y!#lQWq$czCBUDP}j6!2m3p!T!RksE9^@8`N0Pf4$`FIG{yF zrmLFa4qIRIH6qn;XfDkyt1!Xr%BaPh-pf&jlo2ZoewtdEV*GF)j2#D1C#vN9WJ##O z0lEvHTE+0bfdjPmeRJh&2-}1e*K*yke`P&55_We#v8N1KlV-NSOF2pOyv`NDiW4lW zS_`J91U)>wI{}KU=>maIFK5sg7oUjMl*GtUV}^F!q&C#IhM3I$z&1!sQ2BU?!rTG5 zn9zbpnOa3Bw{S1K*+1;QO4gS+fd)5$d$?_MF6-@yazp}C4*&e{Xke|J<06TlFP)~} z)zO3P$3iWoL<1@hzytN5pkfQVX?LVgZ$`yTE={0x4 zedbG2uhdX4$1F7aemX%rjrt=PcXWyz)#04Y;5nP!u&G4R*%itw(`_)YZi?J#CRSze z&O@qKWlX6*$w?&qd*LUTh-gmIZP5vdY&AO@CuQluF#t$HeCL!qRJr0Y5kUFVvp8It zqs@)XuT97NyO=VbBoTLnKTH10olU82O~N+#UQMXL3CeELFA3m(ilX0kW-}b%>c3_9xYuK)0scw$=Ego?TgFb>|2~3v!AY zv$*bMC_xT}Xmd@^Ji_bACm)>{-j2Qhz+psPS9S|@SgWItO-j1&g)m#K-q;qJH;FdP zmFNt3P+GZtL-HYfD>CT^4#p@{_ou^|!T4atU}F8BR*1&ux}RI{yI`&0+j^Qi{vvLU zIgd=4P>pklpFwU?@F$VrAEr5A9vWdW*%rK=1Zr#aARs<;rO;6mE?z}={F>=THkXl)dmKZncX>+Ze5^J-RKAn2c4-SC z#f>4DGR?aaYwq?XCBcK|9&6=(UZ>Q|*A9MoR{; zeK}sz&J%r551(8OXKtyob!;~qf1IUKZ>Bk#7CdG5 z5a$B47Mh52slEMli@*^%5uY&GtOW_meJ4>@U=$Q0{t*39MPajEnd}yLbA}R%5)upgMfsF4hx%&O@kRzxTZX?5{;~cS>Cm zopzt-1gVgl19n_~1WZzFef7Bvguk@n@8*}~f>ArvVG(f=m1~*vv`%x(!GSc^Qmac* zsH5nzy29kOZ6-(+hu3R(?AH$_ED~z}+I~B)3u)3F9Utr^!?n8T^zKkFPOlsAOVS-A z9sPB^a^nV3hiFUmi|5yJMrQ=Y+Q4KxuJaY1;N9OaR$3rma-J3_ z!JE4(%8*NU;;JQe4cnY;_ORCgf{uU%=M(g^gdh2`pkkDWJ*U}Jl4n_`svhYl2mH##XN-+5`QMZo1_&UF+GW!W%d z-Pys{t!d&skisxl@pHGXjz@DOX(ey+vimn170g|I&^mI}CpMrzVj0OOvaJW~pvEjt zp1sSa@<)czZY|h(W~Beonoh!PFw)&(HmbszV|O`HE#Pf?MS~Txf$gy zI2yq+5b9|~`-y8cEu3aEvDs9N0M6@BRx|}MAVxoKYX(CR#GS+)I*3bj8B*91e*ajP zR76EQ1IIH`PW;Z-qK@~Ngyhkh4gHYBZav4H_Hm09=G!NSGBC(30dh;i5raZl1HaQ-XW+s1X zneH#ThGh&4Yyz#BCG73HKD$cPx%gBaM%qZE*m@YRH6xK9ViW=WtzKp$7&XvF7paLT{0`%BP1! zXDZ)Qt705{LD*)t`RhXWcwlAPsoa0(wtH418e^pmI5*M;F{o_#(6|cot{Qg#Go-BqE6SX1T#H#P z;Q8R_nqd;yCdZSU#fr}PFlh1UZ)|HdWc%38aO1Rc>-VYx-I^rqJS*bg@H$U_xRu@+ zwMsd2pgMiiO0e9SBYFl6@5#T!*fVq969Ra0nHZ(J1bj>&I{udTE>XEwD@R&-ZxV0I zh3P<9WP>d;py_S0N6DyDy(X!Qc%zj0pd+;kt-w>7eZln`>z038A5TmN8N?54GSgXX zbFH$Ze$w$y`nZ?;6q;P+VQFmmo*4k16&k|4rS{a#jb@|fc~I?`$#Rj|JbmMUNF(+O zRCZjkVCaS)+v?B`c7Kz!6zbTm$P|H9blUxr>~o}+mQIg$3sUc#JnIfH<^DZAwBos4 zo9H*A5p(`@h_cV3L#Fn(vAN-AU=XQ9 z+)Ai0HkjYe-Y4k=_ZNV~Eiy)kD>ay0s?ZETy!+*@ONd*MxFOY)i#t2c6Y>q-lxIF_ zAa}%FEgp)U(#Q7aykr&Y@1vV0PSEhM&H>VH$XBNkmgqa?D13oY2Yrikl{V$6pKsB? zb|q^L$aI#NK?-5{2BLSoWaL{JH)njWjyOS9s|T1B@YeQCh!iS2-PY8aB{x-SQOrzz z(rBVw(lu$+NUnjM*KhjNE$A7mAMZ_daE`{6BMsc}u;Q}6e9do`(23K{WY}9LavXuOMDizluyfSLF^U?OuBotVE!3H+YT#m8FygAuLYqjzM``_mi473pV|Ze56Ut2lxxo+#*a zs@v@3E;Y~Y$Kp$&+j-B~E{gtzbz*28ho@V@&0vtNeARS9M2uJzlWFFJO3Cnt?}Gvm zf-!OX)YWmjp%``8f%qc1js()Rh08fR*sEUeeo^}>?Qx%`8Xc<)%Y? zt7+*UUVSs{eYKqUvN_$)Q5&q(#xEosOyY#`5(UE_KHm=25lVWLcRhCi)xEXDjzbTBa2OLN%7?X1;IKJ=#rTaY z`edUg_LBqzu>K(yPK=bA3U}1In-H4RNcap+NJw{Xy>Stq`!2Y-56OcA|lIi8FgVghoIL3CimwSj7DPN*ib zc>K5%J#>ZPCtTTDiM_3r-YA5$Q?FkJ$Zrr`I~i8ID{-zXfS=nOw*!Xxycl=c7lc=EYmuO-eAb7nGM|W(5_c+sV(pIyZ3JTeSbu7Y8q%) z2ir;V8B=FW*Bm#q6@DU+We$^Y@F1S4?mFPfA^De@NhPU06TR26wVQ>>l~vMjb_>$7 z(5$#j$TaAdELU^lANKpZZi(?Z?iEVZPJCap(}qCG>59(8x>qqV41a!;ls)*kiZ<0( zN}A)I`hEcUbgIJ&kL@f_+JpA`(Y$Vol}W4d)6=mo-m{{6-F>>&AHC9yBiv)!iCsuX7S>MbmaUk#3GSQs{awsSK4pmX^a)VnhcH*gh$a4*0qBzjacdgW(@ z6s)g@BEK&RVM*#JXN$PW-0>R?eju|svcn#Mq)rQ7uK#&qtZ9}+=a;87Oabb23&$Xn zL2rVoH@q_&e;_2AT6<*9Z(Lt1)DXYVUpwkT>C!*7`weG7wNUo4tF81DW0Fn(lQkFv zh18`N#9&$dPPjagrm11@C{lXs3qNnlAOh9>MZi;B&3{|Er`IJjQB{M+P}iWZ^~kBV z1}%HdGdsTT#Cu&h=!L1n+DPI*TX%`tVj31VGb=HZUTE?QKbqeZV$hm1I^Tr<bTZCex-s^rt_LQsRDcnJdwDL^JaZ6biLlS)SBw zKZzHke|DPSn(%m@ve;YHg#5=z6BGY1%hC(_0tjzC zCm1_yoU@6R){rR_vV!L1?mcAUp}S=&um{YKHlF zWuk)ibq{nw?08ST<(HYaL5_=RdNZMe;8R=2>dfjLbTbC=xo8!&`Gt6F!_KyfRx_P8 zrV0}4n2_$AuE~ZSM|bCWCg|5K zyL&}n9y(j@G>`)X!MCsO`!NGOR5g}tu>JL8QN$?ohYS{NCq>9y{2$gv(_q2-BE3bhvWJVU-Fw)|kYcne&vZ z)a7h)HWg8q5M#q+3R_NFh}nk4u$B_ zL#@t!>QT`c{9N^+#(XUu!EHC;8gmN6bj|j3gLnxZ&5rg~C%>!V-6lz4mLAVdgrw>w zy&k%>9c;49i_COwMrmJ>A>25;IW+uHgAq$VKhsU-Krn!NkL~DJ z$xq*e7?UbG$q|~rw({2>uO!BTsSIOEcu@+cX6l3tP*?@I?IPG$1=FXQ%b99h_qZJm z2(DERJy#Ss0P*kW{eK3%UVCsxU~+r^`2ir}Mf8h`=1Z z5qL57+KLKM!(bsos69nC+gI~duGOC2`B^?y%ZN)*`NRl3deB%Q=Lj|a%AvEVloM!D z>Y;;qBPr&e5mS@(bJrv30SD)Po>kNDdRw61qh#X^vXaNR^vEgJRruEgx_L;qu*~+o z+21>fZunPG)(@n#K$3~Z{xX5&kf)QvE3s|DZj?@u0#!j#kh2D7t6q0glWg}f!oE7U zy&H5go>sFo+;wgo^A~+H%Q}vi8;g=Ve5IbABzOfQmGFXb3z`>C_f98*DH&tCxw`tY zl7DOC1aXJ2XahQFa0l@HuW4%ghIeKqGeqWB&dxxn1y(H0v22^BuZ(Aao1@RRlS{H3XjKY81-N3 zbYR4JOTi5Qc*g4@XJ>4{fI`p!-f#4AbI2zN{ERnz@32fc_>yB`Zye72*KoFSp51q3 z>T6%=Edt%XUgL{u6$RR;+wqA0+P#dD6rgcxIi~C1IA(JX3!dhO4t?;o1PdI!HVzDz_56M)($)x)Slf}JIB@u*vr%w=4pB-uD2!yv zt`_&84|zT@8fBo&4!4%*>*?;k6h%6l?W zo7NpgZ$AnX*K3lysy`tbvG_w(HMZQ5CzGB*v4;qDjBO~P( zrRG$9yB5i>MGD22sZ><{fj3P7`pt#QCy*F}mb9qqmMMaTbF?P{#yiNzH|DP2aK=<# zxVaI2J$SAljTY7Chbmm#d?}6?+^H|{ZVa~qGh*@}N6`TV?jMBn1~k&|`Dt@(L1k<` zooEoLqw4i`hzuLiHE~WpbCy@{#lM@4{YlK^ z_&p)qu-x|KCHu{2@YMYbRz6u}| zY-nK)WpWL$#mW$;zn1Ofdt%gXYk01{SuX;AAbD{4vE$>(X-$OAuC znCu&#zv$&)98hfLCHjMP?1E{DijO>O1HF6s1kqXaO5+{bnd0a@UP=90k-^D}9H${0OQF zId@{S*TIb?j>>|rT#qBDUAd^yb&>pexUiYgoKa)801hK5UMw>GV9&hWx_P5fp~$Mb zbNX=!p|F}XIn1vn7A7aI^Vej_U&NcO3)V4FCgOsV1p zMV}n7?1{9_D)gErX;OCz-5TU)I@w!qFDc%gDck>b5Xa7v-<8q zO4K8%IGnog^pd9I?Xl5;^suTip6$+PK=hp#K}&9!5Q@tBOY483{>8x=YvCEG$JbVQMftpjPYj*E1Y3(yy3fEwMN7|%}qbxh*ZtZ<4 z+{CdJq2+TEXk1ZHJSSyI`@ZtbPRq&o5|cc)9=G1I%<@J`l~nvm1UG-(+vsy-TWW>v zsH3H2?0?9-j@*B~$dubG`B)U0$xKQe;mmM_t6wkLu>;8UzV_=)R?%I-X2>*$^LNkI z6(`sqa&`Ianq+moMXi>tw!(0^wReZG@a&8Bm8>2-s%oR?NAjzzl9k}F5{(7@DRU#A zf@$mvGbYu~Fmlzfsr&MtRguwU;^<}+c;z~g!mF;X{tu0!M)X9b=CQ-0xyi&KT8SI28;lIPQ!uNH>hZV^scpXSIWcxN+FC+8Ryh|_oIYn(yFHarRN&M=ij=ZH|Fh) zdD6zJ913f|?ss+FfL}n%l`)^|g^7d!hVgFiR&UI!TcJ~np8>$#)`(A_x;1S|X;o7$ zx~7Jm!M!Yuv7%i@0K+ZrrrrI4cRgCTbV)|iZkeJNQT`Z+h+N+*+#fDl9U|kBbVa;j zT5kHMvG!*K#vFEV$|BIYPjd!!exJ_!8pQ-(PI_cfQmWkw_-tmJeRJo9?U0z$w{W^e zcd}(Zq{JPpcQMRRE+PA^g-0vG0Q>fs>P_{Vl12g8Yd`*c`%zBF%>A)|(jv%AT%vSVP@Yote zB9;(2m2u$LV+8?pfCv>0T(2>;o)`#yeZ}c{<*2`#9Vlak zG_6;loJMZ^%o?Lv5$BX1Li2`)J0w*umD4tE;dzvs$G2VuPlGkLp?r^)~+ zRkcCrv*b7P>W8}2&a!WM?{}SV{->glJr?({&sz-( zm8r5*T73>EVcyO&z3$QbOurxAl$%MDyZ$)3Y}?7k%J>i?CHJo%@@^+RI`G;e$j$G$ zhX?*nPY!FAQ+$OszWobmfepD^C{I)`k7NG*y~Z-cZK+UIvGRA7xTy z@OKWKG>EKwgH=Xt9Eh)d*K^YVlo#0V;W00&Ic1d>7XDaYuG-k!bU39*Phfg7-Y;7F z_uvYhcnpfciYbe06va+EqA-VBBWr~qCAM}nO=Dj}+Q`1#1|#KO_Kvo^y(->$;a&7; z{h8z?kVP<8b*X6KJWJi(t)!3uZVe?A6MaPkiF@D+A{O#xM{8N^!>#w`T55%yV+FQ=Eo<>`?X^>5V3XxA=7$db^KtI(U8x&SWg$Q6U>yrD&f9+^%3H zhk(p(W8@1eMopnhP|3SB|8Vh_UB}+&ofe|_P}&i-*l&+Kx!Gx^HCi02t{mM2&_Hi7 zIN-tjO&2CD(w5dyt-Ee`BThZ>Z{`9>DBQu6DiYIN<>dY(_w3m#sjF~{Yf1x$wTGGy zd%(gvKlWwn1LZ-2`7(%9biYRp>GAg(LZt5YgB_q7LgM|WN)z%&0VwTO)pT08me1Qu z$K6w{<ye zvo*XhtHb$Ex8O(5*`XsX&?ci^As=SGgKXrgRig_mn!qY6o_iII@3$$sz;Jm4AZgva z5UVStIc7gJ$&6ThT%~KXUPsrKC}_b%KKmgrNu_@q|MU3mD|e?=VpG=Xlj(?Dk@LIy zss8(Z*anUo&iG}ObPjILC%@TVEIdc9zY%9=2|Nv9SFwPxQ{UQ->;qJbH*wxFm+iSMfoZp z5B0mT>IphiAj0*rj*%uT1_9?jin+|V=)inyOv3FCM0uazoozOcjs2oH?JrY#Oz$8i zd~ql;Ns$CISaR(xf*bg#)r}iDKms*XbpJnkpIv@-G-t4C&r zHksBO%2wo%`Mvj35jAz5jLyQ4Q!|$C=ZGYHMepza?FJYJBN0Ojnc= zAzryB!5-QVJ{8+qb{eDXU%euj+K3!Y990LtuX)E1JGs78n9rTiE^RWk7KyOw0Lo1^ zp2nIg2A(WfabY!zbY0=SR0+IuPVfX~RA1RFRL8{4u{W$m^h83XAp2bo=DrqL6(8n_ zK5;)KGcVqLdTHgrnYT%1Yqka7YwR&Xl+&6yxquzt>^~XL!T+@#Hrc&_CediLAVO@; z0gtpx_2N%TVsoJ5)<){G1rT+Zb5;-Iy{$m^Wc>CnG)KfwjJ8d1>y+Yroh&cF<4yBK z3X|@%^S957+}nIdIZEvO;g^2}GO*|}^STN87YO48w_4AGM`19{=Xw)Z@_V*JS@P`7JXVQ~I8v7L zF|F##&`ieqUnax;VO+x!t(iye&pOZ2?ltEPbab^pq!}qr8)Fc8vR>O<1E!8gO}1Ev zcDAZ=5!LLZhGy!W;<|g3f@CHx&N4DjD@+fs`_Y-(5!uZ>F>tk?3W77&dVBZ5Il>}l z$r@B-4Cf;-&}P@8H^-#>jyfkg+MKh6D`Ok!ld!N10RGpL@(+FRV3knZ55(yjmyR8s znVAVfU!h>M&n{M;dKeVo$n*wLSgz&G=3jgM&;<;VMD1OHWO?=$Yit(3KzjRB%`QZs zakU_rK>lqg4}6n%mUh53wu$h;9J|u>C}|CU?%_VEc>iZLx<;-@?)gi?zMw8;Uju`3 zGQPA%CbP&*?vI5BqEuAz;dt98s}+Ex)qDzkea%%We$^c+5>swb>(ydyoOOYU+^wY+ zhlr-%AV%3-ChrO-AEvei@3wU*VqfhNnR0k^A#SDi)+WqSB=}HoA1zac6p6kN=8yZ? zIYJuQDyuTS`cZ(YIxGS^hWyEhP+a&KL~$NmY)fP>b}X6?sj@UTQxgDE78`O&baSrF zsM1<=sse65gj^@L`qHjJCU;y{iAU;IO&gs~1@X6()YhrD-8+-`Y73dqolEjS{WAs4 zPRdD_rmK_NysSq{;PM(FJ6T>Sc{^$>NO5(!BQ$S$gPc~ZALrWf*$ILjn7r^%=FrQ8 z8m%eoEg$O4Mpjx!b7_4Nc>S$brYYlu5A^gaHD=#plk3W=J7cluQj;Sr=G2%r&XZ7! zobbXtgh(N(-e_eC^0bgEDXS+h!QS=;0R|>La3lP?T^AzppwXap>hSfgWXU$~5KCNn z3l>E#pShUkgDqMbyj-;+kN1Y1&$aQ6!pm7kL0m>-Mp8PCi9AoJ`OJR5jR;jhy+WG~ z_W4Dil?Q@Ix!NQJD5$FQZD7dgj;Sdm9IYspL6radu&1$FH6TIiso1}dN;M{yhYxt# zz5bSe@53vi!hooYYxkVYC&R0~?3!x6R$}h~7e^b+!t70-Nmi|GYeb(HS2Yg)DXC3k`6t z7Si-}u+>+^gQkN^u0r3Eqi*1e@U4$ckkg)590%+6iS&-D-0 z%JYn$0HV1GL1&4)Y1e-179ZJ|u6E9sq8FKJG{@*-lOg|3*1~RKrMwMZIBjre_Y`XN zI@c3dtefAU1-B=y-#y@?QYD{WwMaUSh$R(t)XKZVWfe!WEI3K?_Rzj`0ib|KvZ)3t z>VfSPDt$+7$Dg!q`Um4L2W@?tN#`z1L|>DJMpR-=giXR+kOvec@2W2AT&}9URoCaY zsye*YwQ1`nZ;!o1J84y7VhiJ`tRU;k7hF~X8v5<-Y?QuNP(zM57xspO;agV>Hg1K# zDsKg)9hda_F9k|1fd@_T>9O5_vWMQ?rmTxHVq<7^cmaUXi2YSL2z$`BNu6zTHD zhycXZ8ZSoc?>kcjCP@PKS%OnmR#z{miCE;5Jap;e0iA8P6MZW1pFawl$REga6~F9G zXAXUXj+oO_4qs{U*4lg1_IPnxG!@_d@KW6AFLetCoUJ`aYFw+xMai6i*{$2|uw=uo zz9o>FB$)IX%5>dmF9M~nH453)sWA8TeutDzHjH)PuE4}#qc zh^jGy9Vb`~xhQAUI>UvGEiAM;eJ(eNE4m-s-f zC&s|*s=@_DnIzk#QlX~MjWF2UtHOfH6uu!5fw9Zi917=|dckP@94*PuHQ*LRS7!i8 zhNL%^{2q{mYlaJc@QoHekSYTPARLCBcGijQVe{h&s{@+Jx?_&S)2m5c)OWAr4!;;tMO6K)bi~M*dtK>G0ux<;kFJm6B870sMlf9<_gFn-PH}Me^l7R)DG6uk5n4n_z$!8_jtr7Fx=p=9jNq?(z$&~;Z%sNxsocPV{L zX4>UPdeyfMSid#%f}~aT3|SOELr_hoNQ%RePa0l+2q`sNQB}mbg3ngF&#+?Nx)~AI z%y_uIs4}W(Y&qV^_)J>+sF*Dl%BID9*Zg@js0Fgya}aPb$F<1B<)j0r*2T- zwy0@u`nn+rV{->n&-+Kus)4n%)ZwUrG;`pt=MM8-WVgLNOpToXqBlfVG7+a$lt{G- zHb5fo#vR5%_WiEQYxVWkBT7&>D3fTSx?~)Zs1`IejLr3pSunmZ%JxXR|5MlPjwzs= zR#BZGN2Q=VLj*hxY)FFt;&+-<@;FF;jyNzKg9Pce^@b;Jf5g{XF(xu_3u)>n9n^BR z;$mY>P8H5Z-w*ud^0PxKY08RFNzlxu2g!=}#v0tZQ zs3kC8FOTaoUSi8kRrO_c1g72ql)+|Ohfb5h$BdtTdIl%u&A>`&JOE-Y1N^kMHusS})sxnj4*l&Ejb7P} zQCs<$rwLH|2S4Ex6C@34c27nw(Di)<8Aif$Q+4ZBKR>(W!x5Wi@i*5@m3UP7eY zHp{xex7-0bT}U%mW7hQE3%vPYb~EF-^F+hxv@IQsp?a3hD`H@;s6*$P@LQ{s>tQ*K zEIgB58*!bR&(V7~e}r4(jy{3B87}pLzby3S`~7q0bpx-E@B4JrN;2Td&TqX@@w7_Et>p(a9 z3yw|s{9$TOV`cn00Y z!Cxr#zctA3QA+ z8hJk~?OU-ocpBpYmLvB{PHkB(X4c(O%`VQT*;!o888oS>1#g65#HdgH;s z+XsKT=13Lzg^cX<0&-|J7_9An^Xpw&bB7~a&hR?h(T)C?rQaXelIOdgX)Vd5Z_Zo) zes(RjPfX8x-M;lj+o`DfGuCGdp5AkBL8cjpAHm}M+TP^oGoP8DupWJ2;g&)>w6F;6 zYWs*zj4ph$bqC*0TL^q~W|^P~Enio4?oyYPR9tWsv1y7#)=g3%In%3(W7?Zjja3c4 zR|jRBT+{2n`SjmB-Q{qR(C(V%_8`8JoS3PE%@AV#KGkde&O2c=!~3zEh|Yj6{3P7e zyhUiYx6X7Ia9O)kGv2s``4js1NF23GzeWUR+By8dH zM%9p3?ZkzDPQD^@sXg|=M<=LF`$E$H_Lp_9Vylaz&3GrctvD>;9dkLo_M_PgK!bV~ zOOaZ(t?dnsdC|S|DBJgQ@%Ve&u(dz9CfMj}UH|BnyM{IT9(q+>;SgGDAm6jaWxPhX z_L-3Sygx}~Y}&^;6s*8QV?W1dzx;TIv+gUG%5Hh^FBF(vnTB zUq$7VH_7g3r}~=FjL`#+TH}2vHwzum`-?Jn(B%GoOZj=4hS_3QxYw^!aXymH1T4(- zNp;riQL%Z3YNcynjjsB2@%6%yCdK+fkImn%ok?lqF1AMjSTw9FzK;H`ZPID!d^ZSy z)(`oV7jQ?S(|vSdettNnZN7g#HPn+ygxW_w9{Tg8Hby;Y)TM(dDgBc*oj%=YJiub;l( zj(~&zTE~w(i)~mGHtUC0U#W$JFm-8_5Qx%jl*1dFX58VDUw^vK1`lL~%>v066?JH8 z5?%V+Kjk7vpX^T?HaAgEkE+{Y1gj6&PD{Z9@`#QY{)c07u9|@RET>{SPhZlD?pH5F*l$>TRlIAh=ynKT40Lbom}v9 zu%yr8e8*#Y*j!p&ftwF4?Z7PsGsS%LEm_CM%HhTX<8mB}Fk8FHPEUX2!hF?%6{fZW zAt5MhjlXE;uxZT?lfu|u3wMdhO13w@w_~j^KmTpMHC##cRFRLGuv>vg@d5?+n_)ccH|tdNt@OsfF1n=NfR@lKHaE2+4LoPQn(~r-qTz*^lY62 z8GXPQ!ka5ofy!r7T%=@EV1@49u*d;TizN~+7^-;AXDmL?;ouaI)q>TAUP{JMT@K8%k3RyPokvq9(6Q;h~pd$(|k!$rg48rnBy6>3n{-zZ&^8UnoxFG-(+nJ|EO4U$p)QR&0K}gGA$x>- zSBR6E6<|*z)?Ig;T9=e|De*s2+I+JRvJG;%@Tj-dUP2-5rB&E17ImBWd(pUfX`Sw= zUxF+vX!d`q7q((~bx>#{PjN$+5w|K(+j}k2d;czP49c+$R``j!Bw7H?^w=els%yW5 zY3V;#@hedTy5d?a2}>?c){R>q6e=_KvIGn6#GMZJ9q&CY8bUK`Sn5{2w$?8rFv__v zsnay1*k237dLDBBcxUt9?EBHvEu%1D3-noKf)y;sof1ygg$lRGKIn{?JLe3@6$4F& za~iD{TV`kf=(&NPqg=<~o8sxo(wR*z)e6*QNBCapMM0D; zv%EKqKYH(2!fLLI&5)IKrytyVbxymuE-q4g3LZB+<0F&A-8w|bJ)k2}^WoaF-V7~u z&?8O9{M*Oj3$qXIJ6C7fj)yaAo#y8s*DZ|6gnEmmX&-m7y~et5Ca-N74_=mAJl@U( zSA7X6!Bz-qV>&rn5eiivtEMkD(Mw;~IF1V;shQ{-F!S?3(vQKeVC6z#4 z4F2rX=P%le6hdkj=2v>17QLEX`drEP<1gw&y<+}zu2F#d=BGx}CZ9L4vflWaKPW=k zL^dH33#M+wOkyjX9E)13m{Q(ge_9Lnd8Tc7o1HoEflYQ~oSTff&{jJ0?{0GWVyeAt&rEyid-m(#xg)xyVmd+# zz-^vso9q&zB0S-6xdx@zvw!9r4v37)TMZmm?fidIWbwUb@{uD23EgfNHyi9eeB zs+=kPIL3a+^$b+dbY`SO75mecbi_k#DL|51b?c^PA6v_-Y)i8 z;Bf&gB?xA`4uHs}g%fC&C6khuXt(eK zLW5}g9iUQO^Tl=y>?WvcY1X&_zUw~Vg{zOa8i^pYLo3I2$(!j2p_8!Ber)H<^&etg z{(5C*Nc1T_)JZ4`9}vgm^Ej;3%Fi2X!$)HG;*wVkV9D;Ol_Hx+n8s1=3QPC@`A*ti zJosgj#@23S#cVI&-BH4yy*VmMkc28y)Rg=^RPMT%-OvO;`$86#*oOBbE`C7nIAI{s zis@6L;OrD%{=Sg2UFb%6KGp)hpa_3e-Qv{DmK#0ztOx2?IuX#VVecNp$)8flI^>1z zi%^C|#5p&I>RqNU10H50o#XBhZK*E^0~J%a(FmXt*I2on*i}M!@KsZ`H=sfx)TonP zQRx4oJJ30!p&}z4LopBbixy33;6@ceOho<62f&A4eg2x_1558nsygn`36A_NYC^8e zA;=7GPZ)VU*!T5W2nIE|m?3S-&4p2y?Uh^u?P7qOn}GX2E~_-Zd#Gw)=SSZ=!SBOh zFsVzQN{rEC767v#WSVT&r%x}RwCD^Ri`3fU8;UT$w6tLUiSgP7b;?#gFJNx)7=xu@ zlN$^R0-_HW_zNa^xTxxmDgXtlIbHm`+_~Y@F#AuTm&>48GGc>;|4-JU!8Ak!YfKI+ zEp~%dj>m1(9Ety*_xzdiARI#C|S zz)#e4&moR#G$jXRSNECkxKccEe_1*?F1+nF`4=&p(P%%h6u#a&`S7{#Ru=v3poU)Y zyBN)YI%D8eAK!N(CN6HM{I3e)ICSI{=TEhksCRuaxke!38F$rcV}}I^lxVP5PiRa? zoW`=fFbp*Ft%y9R8_ zUl8fJa(CxE#wlGl1{nMLD4!X6GcQB1g9{1{p7~8BIR3qK(>~6R*H_cbF8l3*a$LW7|O6MxYjL%!{>rlT!af3o^@Ii4*_QuS%P)^o(}Gt zn~A_#tkpdQ!C_UC@5}8N;wIcpwg~?}xcJXw0ZS;asYJSwm{OAe0U^c0Z01_^rJ)3# z9O8D5<9MKR>508gH`dQK4-x$3d*Rc${&pXP6^fRPI07-a6(@Gd-7wqFCpr?9LMZePw!b1NluCezyNti zRmng8%$W8b{Mi?K_OsKK@9ug%T3>U}a_X zk3fl^CJr{U6Q@z!(Yt%!)=O)$_pndY}2P1aSNmgo<7u zhE-Z$ag3_t?a~n8;DUH4kUy=`3sjg@HC94O{gL3Th(ybJc|Yx6d=t6_J#FLf(DBpX zKwV9okT7IhH|_0!d)V-}f=a!_jx!VRoMKr^>@S=6`UTd^x6T&^=Og^;fVlTP5Jh*o zuR{;i$zP+1>rv{ML%g?YhDc*1`Cqg{bbZ2UW#{%M*}3xg4;M5Z}kS%?1Ba<U6!y1l;3@t;(01BkDizo_daWo}FqM(oYYYSlGl1 zy$@8;x|FoCva^8|>U`i>_2R`_n6v|r#-w%H%14Y`sm~Hk{Cg}S(KLLYBs&}=q#q>F z&gIrdxqUrnhWY|_8+}tvAEA%)?V1SWaLAqw0My4U>7QhOADELX@mmW2h8O+;Dx^G1 z$mZ^E>9{y>IC5S!3s8b?oJnQ(Z;S=TDs8K@x~CyzJ$Bgv(tAS`;(w7uj_8K&7*aGY zCN_3=P>yqX)Gwtw3|sj$WZ{16G3m?xc=P#XPvU$4q^2nhmSgdAZA(hLd;c+f5gyR9 zX~}46Zekb5ya(hGyv-`C0(UZFt7?FUaMwH-Y5Nct$c!!JnY=-WjUe2wDSxURbiW@% zX5D~dqr|uM4mEXQE6ofdf^tst1Qro0El#nob_xoWUZWhA9yZs|%rj7Jc`#`mvoBp< zA@ke2rWo}hbuiG1W`V)a>t5cMq;mK4V9v7w%fdRblvx$s1iC zYR`1Mdf6c!lKmv$hBVOM&PHEvJ@$OMswvl0{BL90%=25#swu(^Gn}R>L)#i%U~7kM z^^!6}4QLx}1L;{+h;D#6ngX3hg}<&vj!LEW8bijlX$+fG!!cZZ~gV_tHE|N3y) z`dLbpBzUc3;!Kc}-QD!15S3z_s+w(Qf~!U$F7F#x6>BhkJBzLoSV8wEXtb?pR{JBO5slrr7|I@|SG)S9WocxHg zx=Ze-o^+{8)%5dy3wPO`uVcAiP)BbL;^Uv|b#*A4+tQ6PivYhgyk+JvJHP$Og+t}=I!d0*NW=!i#l6c>^FWM^6{WNs!yux z7S5wK7WBPNFX(Box-j)Ha=I4K_Y8)ru(lkA;@= z7s`PN28Z7FScWK3kJfp%Jv#LDNaXbKFpM2#LV`RaD&YkrNPT^E&g)0t2tA!{#tM3f z{_C17ptq*-QlwU7>Uf6(_uG|$FWCN_SK+=3wq>qIbLls6x&CMB&@gUjeyG&-5w#gerAOhz zb$TB!4kcx8Ooz$*lN+KMn{76=Wx6tH)SzMN6!cvG{HP{3sMpo7X*50?>lt^m1(;|P zWhEO%n^D`QZ;MJ@H0xgbF6Gml8P-4e2I1u%*rNVqwG?7tkX=%`fA%J*|D`K;!pbw~}vIiF8?^7O^EykkF42o(xb z&DvPf=jI;>5ATvsX>G)zctfANM@=PD8LMn>zp~DL}>MR>V>s`kE~I@&3B!<>kr8mc&}O?ygi* zswY_gB^j)rZ-m{dV$R)$c7wUd^)C-{IC8FT9zyZQ1g#Z=rdmWQtuNPiQ=a0&b5@x4 zY7{JhKBNzgoN3j~P0~G7<6!4B=CcI%7NDcfwDhnmicBiaO@R0dd!YLmHbM2H^=$mk z9S1A)+9gvTGLD_b4lZ0Ae4GsddN+0Hs=G%6n!2Z?Z0@hRcD*mTuo706Yf|8z-!s4c z@1h5XP7chYSh3#9WZbmb7ka64>80-3&zFkMF&QPz>dD$4Rqb7C5;ozNA}%MwS}*5) zKGQE2zlaAvk!`Px@2{U(R@kFcCUa=O&v#zix;MU7hh;s6AFDzx~lXCu=6Wd z#M-QKI{Q@<7pqd}Px+55U>k;h>v^5UwWXAc+uAydyNhf-e`-?v6%_|5pn&&nRh1`rv3+8B%Dus7pViMip7}lgz$6XfEyqidr<9i?a#WboL_Qe+w!1d1o#*bY z-L`k;jYJ;VdH3wzanEF)`N7#2JHxP!?CN~Q_c2Wm{<`KMXS=-^zW~V#T?IOne954- z>qZY|_qjyrp4Ke)cK3CT(4>0CdGDyjDLHEwBH+3m+^eQn8G`_B!A?f;C*9@dsRdZG ziD===>SvxxG({1;ClrsvhGKr-7LSC{IVWBKkLQ+zA1RRvTSYEy0TX(H97l9v?_v2N zA(`XFs2^8*@k-Lj#1B8H>vq0*m?XzeXt;-AjKzk?lcwXAlDY~%bDU+ zz5Fq}w3->|9h#xm@2r0s<6q|&C}5d`-^;O0#~zijz6GFSZa4J6 zrJ&;l+JP!Z*?Wj;) zcB1Y~I-*v@w(*{GH1w*hh~{VH)t8)qW84gV9# zn-gy}Y$kO>?3~M`bvW~GQXy-(HAT^-fthnOI-`)2%U*7-^yPa?7inrj^Q0j+r};%Y zbjWgqUzC^9;~U4iEf68X)d+>QRsr*jkGJC2i2A|{E5k5?q9ethtM6==Ux`rTY)z|b z^aHWgRiupOP(#g)%dEG_@VygP9z3o9?$wXzF!M$TTNeHKJ1(8WJ6(QXwwOyBJ1jfB zKQ4UD9=RijW0ticj)2aFK!R}CXNl_R#!kwt1OkM(@* z&2Ic*#qSX<5-VK1jbgsar=0{T&g*?b?qy_iIM@Z%ABQ4j$*L8nu}Ka;**)dG(|&qd z@~0HTIgw^#rVcIG|E7h{9*I3FO<^)2idF7X4F~6kCP$AkU80#=dA=syCAr(Gms|pZ zNAn_@glFVzdV`Td)~=?qpit-%*s*`?3uolWIli`;Gf`n7(&e(qdZ)`*?%9cRm6NX; zZ~;P8{St_+}RbA46@z*e97JYMx2p}(4t&g1nXitQ!q{u zbe2rzsEVgXQl!Zr6?X|(U_XeoqJArtw^+_kAemY_e)K%~bK%9=x1o3bY|mVBdN&5v zAiqzTT(dg}Qr%9+NCe=3#z$S?I?bl6yeaNS-$KVt6LD48CUH9S$}SzEmVA(Vm#yUU zF?@IEm;6#`!cOjJE;_>;gFSPX9CIq(qsg)`E1;j%=LhRiEuF{Cv@BW{Ay@tDQiToX zmEsmnlB1@c>Fn?`*DjJO9YEX)bDrx&$vOnrM8vpvMmiH#>i_S-9@5ZrbPFVm+CfVE zQka#oTIKnDZN}9tbE6U2?x!W6hu|bQ5o-ksS2Ppf6*lQ=d4G??4FqIcghn1=@8sZQRu)FEE^{=!i3CM|(_i#Z!XDHZu)B>}e-nHo__v zrrqwyywx#mVyDE7rG3Zw}Hmeu@gr{Pj-z|9>tnWN7Rdv~XI`cW%v)@D;`as-b z+?RFH=V|)$!>0clh+|aS&%Zcm4x1NMpyoa0MREJZ#zSZGN-`bnHPwzzyt&#FQR7j( zN$4c~x%}LBy`Q$IozdA|MblmSt}F86Z1u8Q&$CbCI*OhmzlzL49!(r&XxED9D$LNnbL{-#O(AUWhYVP87&GtUR6kOnzDcP0z zG&*MxCPw=&a(gCb@rwbbA(lEd1@jMIbPsV|m1qd_PSB|G>2z}iwGc@SRY&dH#L7SV z7oO>jrGT8#K#Rhu=j{*mKVQ7w*b}^|eM!x1)Tm%bw-~23^zWB1)IJgx(Dly%cI0Ph z$Y3J(JFBi(;-bYgst0Q$V@!T<{n zj?92B21IH{&SGlkH#H4UiBtn#yhh$v^Om^cai!~JjS}XZ?J;G(O)9 z!Y$zj@_FIGbN^C8Z+3aWJ!FnL*6Fk$yggDauFt;#PV_^R*>#7L^p6+ss{gSP{`9Wi z___bi0%)=%^J;qpVOlH`N5n~set)E?O`_8RRNgzoWJU*k!S3K8#xn%Ro4LB(R1sN5 zQ2J^Ly+)`^(IvSqB!N8BByI`nu=IAu7g)k`zIG+ASVNV}}baNku!E(oW z`JIML;F$*^Z)zT-LkmZTT~GW?)EZ9LPK5xM0qllj>uYx#W|zy2KY6s@_=^#MtC_eb zYnkbPu&v3Ty62!gOIF>oEAwOaWx?ptCU{l{4=0}f75{yNNUbaH>0Ojt?vZQ|GxoUv zC9(Y`dgkh0mGU+5uJB0N*B$-;H-aT_=5>X>$-IM7`!zg&)<_?GnPXThNm~J^Y&$MO z%=gHdjY_yMQv;x5RqIOiSdvh$VcY3zq6a&yLwe}gNz`=1`tPtVP&HPmwI-yRMVIj~K{E4=>W%LXl|mswXTjj(gUjPs0>htn{dQ&NDBo}DTH{l$3c4QCZKLmqsu zpda@#2OAr~)v(*K+X=UlF7=oZ$k_`;n}E5|CEL%eHHj+{KjnG%e%X{*tCatOcbp;Y z{~@0;esMfwQIirXC2{P1$h1@6L(tjV_a|dz4AFQ$@3gT@S#(YxI(TMGI%C(K6{9}i z)9770;i!2eY@cvHUa!<;lle?1%{DG8sJ^}xvop!}N5aP!aWe|LuUI>OGJM_LU~3Z*=djfH-v+&=W8ksu9}lV?rcFt^Tv!>ME1$2w zoQ+@UJQr<|J0%)6Ca_fT@nX3!!=ca%ElvA+T`n?pIPU;LGF{efI;rRrH)=Y*QzNnz zU;{e*%D~4H6L~M`jC=NW!I!+FN?%8(_FkzZ5&V3)1`nz|R3$NU!GlKRiE?Rao{>+T z+MmL``ZD;sH}%_MM7h(%n|C3}bT*|E>JO~q#cg;jS=_i2ceqhQGx7}4RpjiFA1p1N zI~-w&u}{UmDbVNH4XB{4`n{h1^vh=tob8d&yiy=xLs5mzzT6qY?#X0j%4jUVmT0_~ zOLuoAJh1u9ieQN@p|8}8^;yZ^&T%c)-psS>I*7G(c!L>TnHA;9kQ*fU({zTpu6TWI@{<8=FdHx!$DkGzAa9OTUy%4jCP za7o|{Xv9!Yhn$;+Do$SRzV{u~r9*YD^62QC^g4)*I%xL1pz&%>d1j(tcXRq`zl8UV zAcdSpIN2b?ZVuL1*J(d)fT|G4&npY^Y)1s-?r|DXrQaR@JCY%&NAi z)mCfoAVxw7A!g}Rd(?_ZTS|LuA!<`2WGQOKXa%uVV#WOOUhjL(`Tm6GzMki~*Kb(9 zUYVY&rH@YKWX1IFBBaF@fj>;|5hOD@ePhJ?>{%9L>sRm8^uF3#d?&+q7nJTbkh%)c zB?}~Cn)4zoNwcj~|MPqR@8AOh>nk?Rq%lAN+y!;Q0l!8Ic=Z>bhhh>M4(ieilz*Y#H}Ju_VtyH=MP@>u?l;5;N-)~zGSnz zbg|>wIQxZPt=@bquEVz*sEzB373PvB4>Oa=H5-k4Ltf3!E>pfZw@iJuE~{QZ)_gfx4(RXt~1q+bn>eGRw{rDk}~R09Vz?5CwF ztz6&%IB^dH0RN>g%D!N{q;QUe$-d3qtw@PV%m~Uq9Jera>#*F9eyu< z?&nXoRixG!ZOiE;2`k$F>Nh%K_a>^ye>B>*QZn`1VnHXO#Yl+BiuV0JRYAXdGtt~K zfsoM2l(_&(mXEDnJNJJ2Nm}A0o0rTJ!Wv8V9uSPtuX)tAZe5E-|8+7nT zlWVALgZ@($Dho@LOCJ1 z;5Ar@;f?(6u8FFDirGJ123fviVXy>fKM>RYA*yefHhKTDeSy^I{z;~!6=(|N>lOYf zF7UTqMprEE(o(R2LxJ*iRYZpuYVNyi=(9tTYJG3VFvS|+je7|%UKPeqtTWM{ou{#@ zw1)EY!GmLlxUoIUE8S43_)gGnBFWatY8t7Nb_@SC+uFAIDn#9TAy9=zf^91A{S|W2 z8kIu~$SbT`z;Rg{8)6Dt(_6tPm1-wY(9bPu65J${2p9O^+1t!k)R_t?<-c?K9#?$#JD((I2Y255~P9^|%g;ns)ji839#r2cU{gtah z%iih&{C$Ned#o0jxkLW-t+4mmJUpE;=G+%jS>3nn+sg0o-`zDR{|!BSqTVHUYvG(6 zK?oX|d9P73{}O6tqJ?{V2NlA`D|skVR?khu>NSQGRNd&%{v^Zso-=_Rr@1eVoYc%a z5Z9G?HVo{^98?A^ol}`m^{Hh7clKK=?WVF1*LEnVzk`c7`LEMsp`y zunfR9@`I4p#vH%(dI_HEqNB)lECSMl!&udQ@kJLmu0&+L2?>I=5J!Fz-3+XOA5or> zFCiQa$3daVA$(_g-b(aetme8C%g^cgQp%j;dw0U`-|p?cXuTVuVdKuf{5L(Gi61-O z{t)5WrJ4S@KZkv|cAYiWOg=6>{hrk67k(U?9^Eeat0ykp<5*S*0;KvG#i}~9AN-lpQI#C1V z3tHXDa_*$nKDGMD5e<6d{eRZXY#hRYhs25JZ4v#$q4iG7FuJX125>f@+;VkG@4kPT z0pLE(i{X^ip}0#v$A^~cQrhvDy642?o~6#s43W+$qnDYcN%Lzr=f`UhV}jG*<(}n7 z&YkZg3L|I{^Tj_e`HETxr`wj_6)b)IJu1@~U7iZ_ZOB<|k;^ZGxxztyD+{xbYI8ua z;wN3SCa;GpR#`-cN1cb+_}2BijA#r)u@AW>BxuGi+g19byGA7QKW`(E9KyQ4hKXm|4#wantH87psr_y*u&*B^g4Pa8jq+#V`ht*Ug2 z9PCc4^K;u)Byn)h7%4b^Fv~%@3x!iV;j!BL)7y<}Px?6a{tGBIhvAy{ z=`U=ZOb*k#!F>+$3=i|}iMREE!+*U^hg-~COImY`5+-k^ukw@!8sQSI`2Ahw7-ePs z!O^y5Vl1H-w{$&%Et6UXs<$ZzlsL{-{a)*?s%kMQx1Y|4OB~$jf#N)FYPiBqxA8zV z-zh%%(JV$hcR@Kfp0w5{WQ1VzJ4tyJO0Z=b%G7bF39vNu#@`2NwQ5Q&=Q@S@m~ z3w7Eh%LDuX|Y&SJmcV~H)$K}!|m!_FcUmUpUauMNFYF5$M&m~I81)GZSC&wW|ToSL$DCdlyf~~YR3#G0ymG+!= z(Fp1PVjA|%j>A65ayt3q<56tdJe5ifXq@Ce%xNSBwkswj%h^v2C;IwY^I10(m!}om ziayYULMDDMx6P(32OPBlpXlM&xl^<4in2udvi+m@%!j*i{F zd4|n zRxDyllpT80G}7u;I@BDUMr)17ufRv9O8ExnmP9OuCDr+Z>pkz}m*}}GwkkGd+S?`h z29h=anR9!SK!PLj(?X@;beWaDpb=BQa>{7^qs`sHa1ma{A7gRwJzg zHc3egPGpPoODOCMt

R;AShl022*PGU!l!CB!v-$%{YeiD=)Z7W68|PvB-q^}C9L zc^jlz6^boNCXi1juTm3a(mdMP`74iCkx~6BF3~`jMi#ZcTABS+#WqHH71KT4{UM^y zeyg_wtn@qJvZ3iwr!$8b9U0pco*kBBcK54RV+Ud*UWK}W$J0OF-fP@l`EM}5?x^@t zOMRby!k#|Qk5;wIUq5GDST~&idSsZ05hd1oTGxD~j3d1mtYnZpaCx)I&o^XV(*a8k zKg(-TK56Sx_1$GLv(3>w*fb|3xkM6@86N~UIkC*!IkJKJakyy0x)BVo|9#DQ3#meu zAy!9Y_4d=$(q+6A_g(XK=*vt1`<`pkQ|xAm?dr#Icdi#lz}k~b*OCQJ-r&twcCKkK z0EI}Dgd7$tC49SRo>ddV-4SDU^@#>sm!f8_(VNK=3a4lN8&BQ_UUx7vm(&~Z>>ETV z+TB*Cs1_?R=Bv!kIR43H`xs;d{h5?$ZVvbu6t*yh%?>pR`MoTvZ{7kTSvQnKZB@x_ z8UtxcgV#KOO$tV-uTRmRrZ4*?t8Vk}>@SB#HrE~+TMkT^H6SDC$&Yxf_e|LzhUeAO z8MzNbNt=FwgFRfYMmnuhqbLdL$mzNd377IGs3avwbNiSe~L%Jq+21ZS2C4KZ% zLT^Am)m(Mef308Q4$F9Yb_lVZ|XPP02U-36qYtz^$H^a|jIE(@B+#zhavHrux{y3ab)0f!JUm?_HjwsB4%_&*g~QydOsG@u^?ju`%Yp9r zNk~)DwrpuNyIbu$)|SD3*gPzlqx*%eAM$8m=yW!8@Qs-~T9B(fXzYY9uN8`)QpVyH zD^X>9H_|>WZ?~FRs+Zn&)#_f+33KfknnRkp)A+~&xth>_x}q>#bnVlCtj@jWzzJsO8C@jxd0ej?(BO2a_%qXDCwQGM^g?^L^(W9#i<|Y z8%)Uo?NO)0x9raIVOnB{9NCZ^2kff13z&elXKexfm0X z4SNqHhfANW_m!V}-$W2Sv^b`OZkwCWzY_^~d6^L7);Nv%epar=>S%2)f)KWo?K$Yxer%|}KD{J;sn ziuJ}xQ&Gp~Cbr7Ya~*>M5xxE35oY*d8*7`Nao$;0h?*epwvi3=IKhEIrnIAN>EUJ zy?(89-u766&Bi;etK!n-}mE0C|R*ecq+tIa%p^ zv@}Jmm!vuEI8QIl<)$K=dt=BAes*&nuSodm=d4S@>6?$etWqjxZeJFT>+=F?ajb|q zJAUv`xYpdg&QHZY=+&D3jQv|P1Og*H#%B17kneUYLarAHgX6>QNEJ6^Y8U6dUB{IJ z*k9b|tKC&{+6H~7nv4}D2N9pAVeoBkN5J+lU+Y6BEdQb26JmrCIiy8(Fnn7XLDKbn z;ULaGS%YPr(l5vGU7_1G@At)OF53OuZ2d~{Z7UB=jr${Zw(-!_Agf}2FVA-wC$}3W zjhAjLehcOzTxW;!H`+$kMv)@Wc(#V%zc1atk-TELnI@GK{61a6#iR|61zy6J?eGbq+9a<<>I~7KQrRf-dFLs#N@Q^TRQ5?{rBxWz>4T zq0%r?>$EV?`C_({hHEe+@ZbPa?WUk6P$UeOBadouvhY0|Q{S+^Dz?7Qm|0#3pM~sq z#G~^YL+{i}DTGRlF0*(}J6xP)y|E~**?=9RkM~ETEFkM4bvb+aW`6&@|M?$f`=ap4 zG-Ta$Jq)j%+<@2fAs7+hs z%+0>_l`;zU;3`~U4@BdqI2@?Mi&`Knq&3hHDOS^YKa-N0#YEaj^@L?E{z0-EJZY1| zyZ_CRA~8!cx?$uCiYe!K05;SQepSU99vvG4;EunMcjg;eJ|MUiqEva^Bnj0{S|GKc zwUqN%G)_oFcIt%d=JTfYD$e~}99ijPoob_GalUM_qMADY+_;n-v2rLJH+Vq6xLc#v zbP~MJOBXbC#}(4oSNDaV)orXZr!5-8D@oV9S5^{~)+A+?kfDIM5OO&Ywqi#EbVoL| zOmVNiyEo(VVVW}e&*V_nM&X3XHmE*#YjJqZdifWDYgE_&D!CwaC979sq!um@eOxXf z*O%8T?QI?wIu%%IZY8|aIQ!I5QH*|O@ZPp!v-tV@mWhu7S9VLPoSmG^tKHT*71M_s ztoGFQtD>k5za4@eOrVdf8LD(gU(hkog((a$F!$7|q*t+bWJS7vMw*T@^gs6(E$(MY zMCyScDl?uOTKeAo*bj`m>U$sAmvrrz6&wfPFk*kw0(m5VJ)z!RmN%qhD3Qo&qA3#c zSMV*5Sv5P{3@+R22In@I4EXajRg&!SY{3h6WR>y-w&I_>r1V^ps~gcj83VY$P__eY zw`Z}0@Mf7kl-ybIZBI`Z+!!Ba=%yM5c^@dB85cKmXoBT|yZI>^!^^(%HXZzkWDqw;>1XV125VU zSu(QySMEY{ zr_t=px?r{Tu=Z7$FN)=QpK(PQoiW*uqvxA!R#;vC!G~RNwjCNe-w~1F`=b=ZJGn6klOW?+}dK>ykBs1IK6&$YjM&0 zm^bBMjon22{s#e@tV$v7#*=No{Pc%n8~T54jGrA8)yhlsj`{YiI+swz%g>*j?BHaL zhCD8mHEjXJjcMIl_%a_c%Xnuskdppob%GH0_d-E|e;5BPtH&*pb%IhMPjdWi->@Pbo0Z*WX=`&Y3M)mRmK)Lffd^@j2uQ3&fAk-*ei)2 z>m2O&2_o+O17zlteYU{kQ@*nj`TM=ePr%wIJS<$H(*W8Ll#G^dVFy*vxsA(aXDJm+?2`vmqq zhmuxKmitn~LRWu3E&w^#B=iDeOfO*9=};6ZmU$xX{yAr}5B52gFUkKNw@jGLGo^`F z>9nO;lJU^m->MWPOBr(EGDfBQ>Ux{Ens=37R(`AWaDGYsl-%E&R^>)Xo_z1?*q)S=y)vokeO8O|83 zgR@5Gvb0d8?<}q{XH{GkeW&tMaJ9^30xjS{k`AvC`|t1ir&ls=AHfZKXEU^O2eaFQ zUK2OYN`t~Ds+JAmbN($QpPmJgiCmuT(+fTH$d53;=%FkK`1+j9*IOJblgLkoCpAL4 zb0DLq@Yq_ptF!O{58kuue;!()d&QI&U;fUhXQ;L6RmK0HHGqh@%qk$05CnZ zFdRmA|L+T6cR&Z~^r@bKq`q9Sf=&eHNbZv*Or3nC~e-Z8d4* zWwk_72^4vZ(0SUp`PDDrePm-?6?z@wroH}2HX=9+9dG+zNg(`fyCh_5Zaj0j!eLN( zX9-p&L2B@et7*=?L8gYvJ`4ifPa<-iLQnW%(6aQOemXkjtxzTdVEtar!Kdπ;Ya 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

yS*zoQ;8fVa%G5oRHq_qaigRDjZh9aHx$3&>;l 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

Vq~}DbKp)G@1iDYej`v^G4@T+8J^; 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
g7o@Q^<~;%mkEdS0+^I( z81r#CN!h%uF9cS^W8QZ*?U!Y~q%!MdV({OPn^IG~|`s$EL zCk^1S7S5Y_%+%ZCRw4rL?gIQEVeqmBjlvQd9;2t<`V#~427kFWX=IXV0@DoR&T=g( z+KB;OELMAY$!)+{zrTa0;S{m=^!6*KX>&Iv+_JZOo`1p!I8RFl^Sj3n%v21FMyMWOy$hh^+nb8j-P)cgYlbWNF+RcvmxHr~H)+wTEV6 zb_2zS@3o2>l+PF6ynpP!wxj$a%-}29Ni?C#f}lHa?oYpUi2bi z0&uhwoaV4E9XRtfsz55kPE$03wAJb2efHvyC2&`6wbhUT72h&q>fQjNXOwGh5fJaA z)(6f%(7W0BdQF@s(gCb-YLutVn-HZN@$TLJqI0j^!%_-eEh=T`m}-Lkw}2OtcrSq* zLu%ixzVfsNSj&rehs%WUzHQL~HTu3NZwnsP+4=Jm}l?YvEaJ5*fEI*oOvcCPr~1 zblEqWPG0N{ObD{1UXP4QP$KHVdzw|O4gS1#?)$Jf`fo@ov>qny-TV=fO80(i@``(Y z&yAfMO~Fqrl@=BscntZz+k&H>MGthD&~-a3$#tZ-VX9B*kRBneu6oHq@qse1h@RnSJL<)pir-g5 z9U)lY7ypKX484a9h>X`7iW7*ED1Y8j2i^G(jnqJ_ar)GpAC=9O4ATuB7uVsBtS1`A zWY@wPnK(6bReLM_Zv$)FJirhIGHQOPcD9KNND!8o5$e6)xeEGzu|q#H5b*d8e@1~% zD|2D@23E(n_i(($>NI9^NCRj{5Ws~)LU->AlIcYR8{VGh7#bL0u&j%Sv7!oujV8ed zv_nWTqWAAFgl$u>GIku*{|yLn|Jmv4^%@$~B;QeEQ86!M*}Sj~Z;K3GlQ??DQ`;72 z8JC!(-)o_ZYOJns0-{l022X+k){k}3czDX-zey)Ju^B}RYYz9L^gCEueJ=A0;!A9o@q%j1Ln z^jO@^C#U9|C>1HI>gDX4qARH24o`|Xj8%j3&W|YVeCdk*P8l@*ZKw7;vFm}nTfUb- ztKj+it}Om;>iB6KI>EK~)g{2#b98k<@TND-$4#29jLpZK8mCDe`pbdne4AFuK$s;{ zabDpugL`oncei3`S_j8x7_N+$qxC;5K=(2@fJ^QYFw;yo6LzNTfZ9`5M$aORrgB1F z^R6!$P9EsA*;$?Xy-mu@Z=SFP?_u(|0Vc|H(kkBkB_n8oHM-K_<0@tdmrVmxt{}&D+h~ zhstYDxTaWJ`^;Zh!@n>-QflFg@p%_az*Q7Gjn%{lDvCk1WeQM*KEZdhKvg0amR?C^ z^X5h_Ek%y{#v=aJDrP1Rc^Xu-L#~$|yXyBx$)p7M3x-qLSJ7QSohSrFenw>kob-jf zAiIGS1OzR;T#2Yp8S@xy_q>Lmh!uFkxql1#G z={Bpg`Du?_^tElr8&?;btcFYCwN>Q;^1FAlzh1#!!LxGi zESV~JO-@##VAWz-2V|c7W9$oXP2-9NUAyDe{*}2I>zHY%r1!>RGOr;MYddFd<`o48QaxJz1S=+LgaXfGyt_k>d zHWmi2_dY!FSvm+1z5C>a+k*o{hAb!tXp;AnIQvoMKl6e^lk7K&qUlD2LNxagPI-59 zTOE1kMO~1hDr=1jZL<;#%7|XCWjw5?Ta_Q57)>H@wlV*Wf(ol_;zU{^d;)uP)HiUn9gRZO(403Hm>M;nH{x*Jd z_A~0_8Ur@8jLXKOZ7&R35aafym3BR$^LpnZkUt#c>#s~if;x2rt1)$+G5@}Tvaift;gX5ku&yRUt*-#vf#vuShflenyjZ^zkiPH>Rw zcSesKF;LMr<|U6w5OD~%B z%nA+!i}N;aO8S4(akwi+r|bFR0dcTHu9>2TJB74y5G?f%k zgsp3{cGD>~YCeHZt}*aO!+ez?efPL0L)JkR#Z+W+{|S@NbHimzh+aD_B*`Bl7Q$@* z_Im}ZR4_95X!&jh_bI{ZT;GXhwvF;ClvaS7y=v}o3;q`p0h*TScxva?u| zWgPMXyci7bkjD;2>s?`R9x?V8dE#=D_bzbkys5Xc7Ual|2y3V*DFG?)(4g?UDY4}N z?k(1~*OY_gCV9G~7}HqB3Ftpga6P@&#vLWdN27r67nj$Qekm+kE+Z>Y#e}|=c$cv$ zeTN-en;ese!nh>}BHtB#vUkU#e@{8Jk@pCB^)LBQ2lwr)SfnC-I5q1%*lGLPvYCxc zWU1bZ@PHm-LfjVpUt|K*$q<)cXWmy^aD#uEJdtGBrRSfE%csL|TpGvF&2euwj zsa_P)f-Bt=dRHSz3f8jT=nNZX6S57*3b5P_B5L6G4xd60Ftau8tY}h&U|GE}?AJG2czw93Xt=e}!r>Z!XgiYaDo{7nB_mgY# z6H#_9yPn9dFlmgf64Pbs8lO1#otQ!TrUJn3me7>pN4uyx{gGFVw zh4;U=8lRha`Rz{uKlz=e$dEUDO;YL4#)MgYE#nEr`@5@1>M~}E(^NV!>O+I%Vv7EP zv*1?pfybI((|&&|^+_rVOp^;VO)Iz4UYx23_-Q$K@L^LxDc3}%k`e0fVF7AtH3Po( zC2MbM9qg$}wJ&{mu@mXbDB{%~OD75Vw3ch|&ZESGfysX4)7Q$mSan>8P| z4Qk11y%JdM^&-1zn!FFfc&kk-1`Hw^o?K)dAI5EhLS%mBlRr$r5zU~d`M)Wo+Vloq z3z~2?8WvqbPte@ITqGT5iQ}oR9{nFs##fKd&4X1jN^OG zF$d}y5}^-G=+Kzio|{)bp~BmFQ(`P{lN^@Ln|?~_jxRrD<%#AuIfpLn3eNHXB@|Qr zwJS?X7+=)@AaJLDz83yB9c>wn@hp6va%T_)7+rox6Y24HTy%sGy480zKJI znlx`!gR{gJEHjuZ2@9w%TDe1~DgBp$Z4BnOEMES2yYcm7n0nlkGFl#3$?!ScvZBqh zxo0I_=j6X-cj)97g*THGMx*Zs+b|ZaMT^<>=!4+*@LR+v&@A2SKvchHFwlYM0{6nt6BG2l{<= z{@cGJ?umw0>iaL{itG|jX%15?liRf;50E0X5Fjk(L}T5ij{8SJP0q60=|X zVIT18HnL5OfI>TX%;!a|atm;LCJyamUymCZ+}E(ZytxHX#kh> zz(>8~FFb>|k|qWe>3L1U%vQPvNYA#0uG@pPWrxGx0ABEtRMBhBx+l7gV8NAHk9Q4} z<%c@{-l@;7hmEbw-ZruFo^Q@2hz6NlFTqC(C1!E`(Oyc8a82%diO2j->~o`gr9_!? z^A+>U5K3bs^VOi{#Zr-1(yfo0$NrL=Z1OC$#kF;pX5Ot?3O?muIZTNe|d9O z;C-9=zc(nsZ$XmnJmdj&xJZLW=`aKPJ^g9;R;dCzcI8X+R<%gcqnMQ;a(VPK1vjkY z3Mhc#qzR)3$o3DsZ#>z@Y@qfnYS+K3NJTJV_lqy02erc*pyJJ!dY&}2<;Xy z8t8Nc<3wK9Rl1)#UOA=m?1mGr6a(iIFduCv5r>WBY)-)Kq?W4I(Fk~Bs2aA5OS1_| z4TH9jtRj+02TuEKbzd{?7Itn07Z7rDlwu$D-3M#V^w#w)x+vrDW4uV+vb+noDqKr4 z+P@WRiE;$jiB-YZwiL`p7nw)Ry!n1zbXb}5#-;ydIpO2EPoLw9%3)*a`CCd?x$2J# zNq0-ZmyO!X(?h%*Wi1M+T7u3b+uQ~>n@1h!joN{@LBn669>10hkTEwN_hX8+&)n{q+c4-$5B&6MI^1FH19qBQY4#4jfmDz` zy{$Qc9MIfr?h221`7u3VOX$F>jS^|KdqRw0vRzCd9sFK13TtGWk&|qfo#p(}_0i5= z$8~pR_8wz<;i&${UtYq_){g>@@B3ElPd!Vv2c(CMXOSA{_BO3Zz4djO17Is=9rLwW zwYj9>Vvn>f@_qJUgaRHuuL3g97J~tXpkB6kb1@g4LF{GADhC{iZXMP;3^Iv^duzy^ z+{YbCMnU9QPL&&F=sEdV;oBlD2~ig1>#J3{f7Cz8is)N%T@ZXN_WHTB&f$8S5})PU zwA4(pfhS$(TWbY8&Y&0-uMolXc?$9Vb@AUL+EjnMRWiHEGc+`O@~RA)MWr;O^Rq_> z8i?GwrDb&FWjEQnYeukp5Mwm^?GD2ZBk(3e&-`T}pV-M}YvF;cp`wGY!9ia9+Hdmt zY4=aZJZQTyDk;i>2Bv2P+<7WW78SiK!V*+{W#Sqzfjb=$xE5ANI+*aQ@Zed=EC1R6 zX=Xnvk7#3t)Mi0v2^UOu)Kq?VyQlgU-n^J)lv;p~>wUWa*!bY9U*Kdow_}h_q?0TD zY4qI1rTKRxXVACRKU=9=U%GHa)*E_!=E_mMXr6q*dD9kGNJh`s?pSWzd%+B0*5UQo zpJ2D}0A=oKSI=_uo?2KkeU`Ug_2MQc8|_;y0L&a>eASI4L8)kr`JsId1Oyv0+;19# zBaW|B(K`!@Vw!@abNYHuLR%&b0*X2 zW6;u5sFD<+bJC{q6H$fu^NaT{Nv`KF8u@hrOrh>9!|NL{)5EU}J(EGD3fzcAn*v#x z>k1{&>D*k-va&>}|0WF10wBi`j`;_(iH#i$YdAIRBMFEds1gxb$Ej;>c*XxTN`d z=Avnr&z}zU(0;`VqMo!wtf=Ir8Q|m7)YD8YxgbZnn*?}uw(fHul!~DjK_?ebbjJKnxF5DR-!#6fstYR_>Xer=rDf5E7JA< zAPFaYO6ni?ggB;&`Pdj7R-7V17xR>Hb11t@JElc8w|x1 z&@6VOib?=tv~&$v&&uLToQpBOGRyxnY-+-d4{Qd_1`+6P2~W$<={m&IS(SL@7rF-z z;gK)r$JoDHh=t|{svva5;765d|Ab6hK*Tw|5y$U!Un|rp*cT zYNjxi{1mos8mlOQ_D(qcP0mXEZCgf|ZG-;ZEYkS&p|d#Rx+d+xLH2DBv?ul~CZx?c znoq0lIWb9u-!(_ZQH;IhXr*;*GWS=E#aquSlKWRC?EPKJw=iDPC|`kqg|B}5Kzpre zvFX$JZkIpA0wm0N&GSV>9J4kn#k=l9>d6IlCF0h00VO9whQDk!TR6H+;N7@eaMu-T z`W~L$QhfAE%RjT6ZE+8YIa7Bh-E}fuUB#nXY9zw$WBRq%s|vAYe7Ka=^BsnBjD@Jy^mv)K6P6n4UxAE**~Fo z(T5BLgsi%_SfMcwIE<<(dnfN@$W&?vMpw-LmpQJtRu=iO)}l=Rw_u#-#Lm{&VGKcJ zYQ9B=cma)2w>0Elw#`+U zjA4)&m!Y7GhKA>mrj_N6WZ*aOAQY9B{hD4K48D{`=yZQm;XBM3;%ejRrZy%>c|cnN zk%=$mHFutBp&FkwztRtP45fv32Br&jw^10y-cryOp>a<<{WH35nE+L6v6hNkk{mjdq2oATW!nn4er+K>78MaqdAThyKB7rA47%tHG2m@Lc2 z2KY|d7$~V8{fM7c_&|6{81C16H8fXy;dNSj?~!s-<>i&Uu3&>xAOlpw$rp^(o0Au> zZuM2c*^54H3IcXzQGh$qIGkU=le%tiRrQY*w86NKyY1|4yF`OMF?wwaab_wTHMPNf2r=b1xhG*k8p`pzY#%2?=q zD(_XJF@QH@ew8;I_DHrWfx6f~t#h&9{7by`-2wmtvj3(24u9)$gD!caglY;9NR+xu zd|;wul`xHV;gE$nZ>j1q>)Lw!QmL&qRL3{!>URQUxcaPSo7AQPM|qsRBN zPR^#jZhJZTxo(Sdddz)t!U%UMj_0Q9Ma4HOn3bL(i-)JN1dS2*;Wd%1U&UExLC(v= z{z?G9UD66eL!nwOaR{Wolk!NBD}`NDws3k4t1xKXBg&p1(032gIAqSey^^BREtqWr zO#M*O;D9gcXo7ut^(vzzOe}LjBB{p&wBn`}g|oHz(<#WW-Bzd-?oe5M*njIBF4@y0 zJZ-!UM%ekj*My%RutJLT`mcV_cRA63--GV1Jxd)50yq2hZ9EMPywcK9cUwgH zpNmMlfb_~Q?;<+soW1v?_;tf>NhK36PGJY>h6Vj{Kd>aXAx+xytdojS6l}~(a9~SD z-m^eBjQmX|fU2jfaS=?!=qrz!DIHM4Y+}V-2y}CW)yjubd6Egco}HM>NWQ(v(B*`5X&&|GY|3R0<+?^}WJu#qqUyDq{#7;$z4j zXoBYw`@WYb^1@Km8V4xo<8o=IH$1tt9Wh#AH7RxkccXkA%1mXc+$saFeSgARi_7)UkTvvnCpy55 zdDxc0XujPRpTiI8rFO|6$q6e+~K01+r#|1wqD#7caSJz+U)CtL86P z+*?o9kQpv+mlsXrq4L37+JDky6Z__Nb-^iFd0O+o@BJ#0euZAG`bxEF4q_i;Mzt5r8 zbZy-yTgO_(06Y`kYT@<6;2yfZCP=T$?Bj=YDYNekldwNe!L~n@DRN13dH%~z{d5)m zhmV%U1AZWU`oDfF_Cm0~<9pUxejWSk%bZ;q`gYoY!zNZO0`v->Z&dADsFu!&Io9hT zeHu_>nhgg9zp$^>(Mleh^v($RuLMbrmlJA=Qhre<$+FIgB-+_$RT^SK_iy%7Y-kU( z$38qCCyB;bWuFHuuUy_~cDN}Ntx;zHKKH`36^pv~a68L0sGHA+gIZ#`i~64Ppg(-!IOj?4_3D^STT z&j>t))0~z4e8T5eG%63nD>cy)86F>S)0s&bDZAkqkk`BM&C{aOVVNm1_ylG;>=(^Y zU&^YLpha{{qZB%S{l; zw36>%F#Fx{Jhipya_>ldOGvz{o$ub_3%+-ckuNOYA5~tHRpN3xDf~EKD?SM2{%p7< z`^kzkIKZRDri;Sq~ZquQLz9wOnotI9mP00-|-s58JlbpCS zkf)hYJH>7I89{f*gl7iDzv5qa#4!(kMKQOoqN+q^XgBu@`m*{4>$e0Bf7jE~hDKKCc5s6U8FQ2cHgt7!pbIfg;XMfIiFT1TtFCzs67XzML!eV10=HE4xJWd_$haU|K$ zy>DI<&$k1%^%ooZ?#?SZ7YuywIY~Uso&ao9AKUdn9Y>;8*g?P9>v<^-(W= zPh0TP2T6n|0C1A{Sms>ei8VFb#xe3nv$)4XUn2B0`2Z@{op56xoufKUp&R-C8#cdR z45>S6!c-N4+n#s@14i`=L-t;2tQ=Q+ir(zK$k8=7gUj(v#{4mXdyh2`LrX0Xf8_7= zXp^!u7q$l_9lK^f=f3J2vz65--NC`% z$JS|KTBisA0lOe?4n17r{OMb~r$*%DZ&5mVhr_OxDcFe4=9r`$h zn#i=e{8%TQ2jFA#$fe(1G*BeSbwlmh?pZeaC+)z%7fP zMgGO)Mx>X^H(~Rh{0$uYk0#*rHMhqlANudNVaQF116$X2I3gQtD#vBDU*`78neA4r zl=o(4o?dwKyWSw@HC}aOblE%WxzqPzzO|y0qN3l@$gi3nYe-M&iz>-cgeUJnj*eF% zLf_H9H%vTrz<&kwy)&1Xdl*XWU**iw95!eA)p;XpV?D;9FpO7eNId)IT*EX1*QGun4LhoB_yosc){<*0EOi!*BSwg`!cDB>T(!?Vht!0}T0EOUggu*vU5YiqmIKFWKK{ zR}0Rr_5}d{8$?8!HyE_M!4gy(Y$9W)KqjU0ubbKBk4GYTuorV!2B7R3EPS6gRyY2d zcum#0pXqCg1nZa^IDxR*6%`7=OawiElFPq~)d#e3=aLl~4%@ z7=cUZNIMu!<5>CTndXr?2hRBuiVR z&%(Sa^0(`nVQ`UyE!H1jmA1w<_^O%#({@E8oxRd>qnP%KGlsrI_O_a$Jz)E2^lGfgu~d6s6EYXG?#I=e-gC_UBs59p z1X@lEX|TB?8c~3&n4RVrJ=aW7b*mwJF*M*wQ~TZdsE!VO%!@UN*nar@L>x3yp+}$Y zex@|hdC-+0vkIN!7U=!2Lpo-bOxg`?Rfuc+wP{@Gs!4m&F_Ls)P54vf3hbUu54~-{ zX=b;iT@Jln5|%Ucsh~5s60J3!%S_PI72c6A)|6`|7+k(b3&dwGy5`oXnh^bq$*AWi zr>}HtjD#&2Sm>YiQ(jyFTM?gMb1DI-+Z8@{@3r-sDEEfj+E^9DB0N@F&DJimb?j(H zh2RO((D2L;I1DXC7pJt5xf(`Ap6*djGlP204-YQBJF@0Won-AU*$vxEJN~8_(%(B; zt_G#uQzM}!R7a->{IGS#Dn9%^<43p+SLJi>8P7|YVFu?Rj` z?TPfnc~_+J)@XmECYz_rC~>A*E=`9oaCKH)F1e?;EZ1j>MeBd>^i6kVvmQ~IV{;Z3 zHY4c}i^dX*kREKSSaN?5RgL_q!R4WrtwBen)%ygGs=;-k!YRLQju0|wWW}COTl3i! zv7hg^XKy`NNMW{S^|GEOuTJTI7rg~EFwI+*3Fx^z<@04)#yOl+c44IfMITRJTzk$Io zY3Ij9KniY(?KyVYsD)aK;zGk*TfJ~Y8$CT2m5MbFYYSUYJ`VZo!EFGgppV|UDlES> zS8P7-{?PB?$rttvSnQ0|5()M@c!JP+;vs5^0CAuJsTe_*N?vin`1;#Fg8wpInmlWq;7(ERb7{J0)aHL#(epEF^>mHF3JUtW zWy8rvS{v0^toZ9%)PC^k?`C42T49#UmLxCmlzAX~p3>Ak9y9%m!=Yy%oAX(=VocgnV4ssR8kp*Q zsjJD?4Gzq=?-?hjKc|UVa4Q*ZzoPfuZjOY}n8DY9BD(9$RXd|D(De)MD0 zs>dwIDoT376#woMv5x(gIHWvS@;8=RuydTcG!>=0M+W~4G`<6!C`qofj#^#FpV^d$ z2{aqn->{(7#UFPKXkbsh#zcaM)4bk-z$f;96a|h~kmTO2#L3Y&GAv55qu)T<{$RUI zhQyWv2JPn|PA!A?MH;v#c~nh%U;RVd|Fd>WRQvS*IiS?mZydpjYIM_1h5el|prQ_4 zRH(5s!C19qmZCa9(`EdI7Yh~4ojhI4`z_*U+fcFCnwamJLIZZCdB$8jSLL0O-5t@s z+{NG?wn<6(tnJ_gF52IwG^pWVQ;_3(S6QJwhO=hz)SKMW(~C;?7WK=VtmNlEA?N0f@hCL zxY6BEF0B&0N_=ckq~wRrOBfVdTfOkax=4w!K&Y@~lXB@9`2;>=@bVl#(};^pTRaO8 zJ%?`+0gU3?{9s$`4+TjZ;UZJ8u?xQYXfR}d-Bgte``(J?mtZ{ zA8dNCEZ$tLUk0{JyZ!D@+jloOAH$IK*o9}&J4~DS!7cAxB1_3nR%04PjU`z)Rcy8C zJ$lE0FWJ&I{lKYeS5)p1lmA!Pyb#%}VrB>U-H5=}TeJLXG*r%5s+y z?`*D)!Z3KAuy~<}*T-34!mm6%Oi7!cT4(yg8<~L4SGACvm4IFFGohBtXfst)G~c)M ztY_qV~SBe5t8nRQG&&?$2;75oM5~1YS_uCquV4=RoHJ$9})Y2IT^NI;gRv5fjC& z0kKyb@S9D_s`#s&Aq9vzwqbJ5f?EC8{kE2sIG+9c>4VYw(o-I!RDeGy?MxCkb%W+tkZT}AJWS;S%oBhPXfGJ>%D6@FsJdmL z?)dlIg-PCE$eGTc^uFcU^8Kj^sop=@?9RGg!kh0(o^wALa<8+&P|QkGo^N~HFK-1^ zcMY!`Y=tgwKjg<6GNZc$YPO#q^R#D{r7puf%`O^P*uEvf>5qeYp##{og?VN(J#B71 z+Cq%`#S44JkBo+x8Naa}Bc%XeaTH6rao`d+n+9Fy<8{_;KP}U&BF>zW6iQJlAj;y5 z;-7`vglk-ob2oxAyvQYoL`}a_q=NKmt9go<1k6_0RmTLWD&hQCi2?);HU7Dq7qWdM%OAOB50^|e-rjDaZc)cFHSyXt`>PtZ13CBvYPnZ8x@^N zsAsB#WX~<2d{>jM1zq2}&Lj^YLlm8r+DK>Lis@i!-6&{QJQ>yPBvi zE1(QN4m&U9Nc?g>3!nUlmgKnEH|I7~KQ9O0dll(4`=}Bfk=6H!%2%y^q%C4FU62LD zNCQQ!EkHja2yMUVAw+%_SEW>!yRevRlG(?UAxn=`ue*V@);(sxd-BaZqhI-sGPTY+ zH%E}bk2!(%hdrCo9x;XjX7KgRX-#i(E#_+}K#U(hpBMB*LwkoA1wGUjgRtlRjnWk( zV(&Xej>>@|#4XE~!-wsVR!qI}gCaZyW$|>i**H02{)st8kR=(g=y(Y|uq#mmT~Fa> zBIy&aNxgc(<+qE%^GgI1>Vk0kw32=CJrhyy^0&; z3_V1P7)70iHlO$we>_R*0>?W4_DJp2gU4+4bC_L8Q!S%zIGusDhdl^5Ed%taCaPtZ zB?PIrRu5|`nZUEs6G$1tZ&mq1W30I<@9YI+`6A`Tq_nrfmw7Yk$~JdfQVUUJ8jUm4 zKArP~|6V$vaBk!E%`o)~7EUeC{ScsjM*9YMQ)RUD8sBLq`C)`*%S4y;MiUPNz$TiG$W;a6T%jZ_)g}rP&4ma3< zapvTY%To~wcP&C1$*9Huq9`(zSnjnvYSYFi6^YYVQMfHVpD*;Lxty0`H_35A{Nza~ z!T?2M;&haw;#YOj7dT(rTf^m0C(!MHjS$(7Lg=Ndv`AI3DyEwXIjqyAKGI|hoq{b70a-J$q_3K+)V?uC>TWZUWU6)gN z2aY#i!^pGj16c_h0l-HV*EVREV86Rhr^-7&<#sZ0)8c>axtrw9nA{LFG{g_?86gJ< zL{gYWzZ#M#gq*at8C?}5}yHll1Mc|J z*90+VkYT{@LXdUl6`SYAblF0n@InUo310+Bv@Oe=oSs<7*|M46*Q~m0n`S2RZXO>o zG57!-`<~j=fLmM8!gcBEMFBMMp%e3&z>T_^w*2(Wa4G7pMd^(8$x*IXe;f!)I|ox^ z%%}^7a5FdxT;t;hO@K&A7(6sEPNao${M_>E=9h+xoF7K!qb&#Ct*C_H=}jGVF0J()GQ$1u zl+|kQskw3c1Jso;FCca%sg-n`GQ^X%dG5k2u)!z^f(xBz9y3gLhN8lN&%*XpzZ>zK zOEa$XgNNH(I9<>ag8MpRi~ZqdXWV zJp;&MJni{ZN8eQ-AFEpLlju8qCfZh^u|t-?nzkW-iH=_`-X@$2j<~k9JXWEU3lqHw zn+%VY`sce;<~fu;&&`ePYIc;B^Y~h<<$kgDSegP@`bI7}u8C{9MYROaQq$Xpm}}D6 zF;S_Rc-#Q4w4KjTl5=V zoCWo&WOw>dQQG_6i;u*nnC5;lkt=;m`J$|n^F+6tn>-6K+&q0@e4JtzzvyRqZ@$Vr zq))^{Y$g`ESx?ah9UrbI752?`exw&@gbV-HPE0W4jiVXXc{D3;Lo{Ukh5teXo{(S3 zzc0@s-yJ=gbUN|E z36j{GK!`;Kd{1liKxKSBs;Wl|0L74PZ9;tSB76yOvW^+3s?x_^r?b6rX_EDxQ6#Kv zD`4ZAXD^pE#EBf^*_#fc;CY*OWhZWk_I*a3TY zQ#fZEKPs^w6^2pUuDl7DpZPZmB@hPUAD)4|)JyaJ5&d{J{DCyTM%VSd9!B{0;ZPuo zr&OqQRuTGgw|4WfZg3Cf?D$)6o|b}1b{3~-L8=%`i2gQ=j0c*REwgaYH-djde=o|l zTz_6f4j)!3&=~qK*f34_^pa^hsqnMzoIuepquw$pb;a2oaCW*azmQ>Q3;nkV-Y@6} zWn!OOdi^jh@GMnmfNOXIvQASw@;?Gk2rPZPDHVWSP?!~}#9UX`;G9LOF+SsR5zbAR}O}M`m=MR*4ha3=$N~#rNb4dR7?MZRlQ3bxrA~5ay7d{ zK<@o4g#7{XtmLs-vbiUNDsP}E9$`&<7wzVR_M@JkYb4abDo19#vF>+Me_>9iqlc%pov+0eJxX&;rOBWs$ zB@4(#n-CSnd!ME;h@n68#sfw<`TUP?_-<9)AO_ugCmZxVAR&WT@aYe#^5nm?bKX8> zGXsnwVa#~$g5#xbM~$`*#s`xih)Z=?H_ZE;beQm!pFh!rOly%2y>B>SlB#aEQ|OyG z$9LWDPY`q#{jX+S9=2?4hZ;|(UtlaZq_7j=yPxUl`wMHj*b(eM@3!H7X*8@ z9v1p5!pcNf7wlKA_x{0g1&FIW!NHd3g8nl>$aaR_&9cb&QK!er9Wcsau{U$bNJV(Z zFg)%}(k%e^hJ44K|F|3wnk|TD#jgm8!)mg!Zf}IGx@ZG8SAkVPl`>V$E?8pVBjcE) z;#8fPR2gY5jdR;$j;w!euG5VR?rco6*J8t*#jO`~$YsUgW_-jKNH&m*_e(9Pq81s`T?M}y*J5qu@gPgvDv&)GkrIMru6 z^-Z*zmDaeJ;k5}>gs-+gDtEFK%v3-^tVbK;={<(2K`Rs_5Qy>1L+#sI;5As8Rv zc&mj~|B3_38}2Zci(k5=)@U2wDsaP)`k*fb4~eW^*DoM;)qFJ4U$+64VtS(id@3CO z6jpN&to31cx;}a5zDFGfe}Aw~%kQy*-gmaRJL)4;xc#n<_}`hfN=>Gp=-GB@&E8aw zzqWo~yQVSnY~E`vC1l!K-$OUCgL##AL#6%qJBLsw&)HdB$~QpC5i|`Qvo2+7`iR^( zJ5#>Do%DVR9e95u^2;>VK&ODKluA1BE_qWP`Zh}eLTE$GlF|fBUr--33G|$4P;jDL zrTACpHenB6QcQM#g-U{jfk)gAXtxML&RjarY%oj|u*dVR1{%mS8!Dyo?hXGyd}?*oG>W4CB6yP>13HJop7Lri6z z_v6@Wr4uG3wU4m*otTB4aw;rU>PBA~3NwsvoJrM>~kZL5Pp>YlS#HFlq z&9@3kw?<8}bUQYxo>6P;zh=49cRBF8TaSnkny_~V=dcm%lUgRC=4SE~-8+F=3$C6G zlf5aT940ovSgJx*cF=?Q5p(U;r$x#u4F8kP=^L4xpjVOq3K}|NDJENEA(}OCzM0=z zxByWbw+i;5dHGo06HO<7y;WuN7?Jaiqql9-ABIib9x?hJje}j-S$x@!$e1NCx13G9 zh0=b;K3pCjndWZN*#7#0K)hDC@O>q}6MGP)`-fAp!x}X;czvQB>+F?K@QVBT&B_Fh z>%Xo}h#B$8=vt&jY(9@dLNl>DD-(U%w8Nh-w48gqYXbS29#Tobr&+%It!Bea03IBb zXW%kgj9}QgfC79Y5tZ#t@Ir?wC9H!>R%3gUtu6u)ZCfnj@GD0e-umAFK>2TO$?ZWY=;d10^CoS*C(Sob3dd)N z8IaCS%bGeT^>CkMN$dZG=&X~hAW7j0c*zCLtnt~119MH7{K4lsBUM|xC zp=nMm32bFA95tQ(xruM9Qs$r5*g;Vif5a_P7ps@2X48J16R&g1_=yHAvIoa;Z7firR2gL^<};DS<0^qG+f-j&6;;I$^;Da}X#rX{o#V#CdAT5uxDX zQzvg?Q{}@LQrz}5Y3=NTuyTzg(rmPimxXPUeN*JY z@-Ou!cJo(Td-KYFFw#@r>{)B#Le32!Un{z@pHQeN{<|1`l8lYO>vez-_(`%(W9~Sm zE7{wRQBmpOIE}g%Fth7~9f2ckkZ?#79Fz+mMXcE{a?2n#_?Rx+(It3kBOJtje%!VZ z?t=71*oK-Hk&nEwEYcz8q$8V3@qRUM-oFIF6sV1;b3V#wKceC57g#by0({GS*xDDr z(>zU0sKwTeSX=c!i6S>U$AL|ZOn@o>QT~$_Ivv?qpS=+{e=R1YjbM(4db^q&xo0;t zW(09N1esLPn0__;RF+IUEBEs=l=rimEF`@dN+?w65uiXx^L*jvN0TOvucDLsCvKDo zNnf^_0n$zte|V^=Ul)!6av5-sBQRpz5!d(nRxE>4*yHAYnh&D9Cq-5GD6{`)cX)|Q zvq;B=a&Ld0BKVif*F0YpE94$FjMxtAG2J$OUI7SwZQ|)ReN=tAQslWitgNG4{@meg zIIDIfrUT+E(|%Zw(|o<)NmIcEOXig6%z|;k%}#oW3x=Pk%i!C+jNMZnbFSaN-WE*! z@Fsfg)UON77-|CneXNL_bv-Jag z$Kr$r6U|dYCG(6z&YW)g()qCF(YFO7fF5`f7ss6daS3!BKs5HN_auKCLc>2qP~0(3 zyU?rXei%nYfKYU`%}P&B#POqSj108d0wI(%s8j|V>4zxHEIq6k+b#A)Oe>lk4AS7b zm5ovM^O51oW zR@UvJ;(L$r@^G2<1PgS1giO+r`JZF){`9`NKZ)})m|$u7*!|M)Ck}Mf0yrX;P8A!O zD||y`XHIJ1%jjl_*dESOec%)O?GNsw&g^5yuNkDaQZvt6QNrc!yx8B5?JdQBpIZL; zKDn#S+qG)y&oI?m{e*%c)p%TDbh*g;?%z|Ubn{%DuMUSHF`A^~J z?{0uktx!Iz*1ppJp;?$kz_3}hCa`|G^VkdlFYCveIcil6#3c|n&e)lk_6;t3L zizh@%70MeTMNbwVIyM$sk@)VOsC@RfO{Xt{yPDgn#2-U>Fo{`trU^Ohv)HXRM7ND! zUrCZEWY^g5cg&ITCGXc2XcZjeGdk=aL4U#P+KY(h2AkteZ%t=^7w!CIHBqHt!_3)|R$^!w(T^Gpi2dt`EHQ2Dj(!%ENJPW-enU26*ld>r}1&yXon*VR6)^ zWy5LBc(lmJe3GBzRk~X^@M7GE@V9#Z=k?r}>iKsEl&*?{WcYzF_ts zY4%>W06(b4gkKe!fAeI?c3S*Kb2aI@^k{O{VDxdNCgX{Nk+c^mC{UYPfCKcS)1(0* zW;gRR4-rc{f8D~{2t?JD_JCbK%6wNc+}ryu0-1|<*vcjQ`hpzCcU$1c9e}QdmG&5j zKIxdbOZ%c7?vL$wjyXijnm1|x?H2A@)UTHToPwK~i(3_V7L1#~5Ic20L%^Vq~)vd^S zLK`U|Jfd}Zz|U1IavqqlP)Gw8pb7fkR)!ikPhd*-*~CY%rIeHXYz#7^>=L0~e? zOv{Lqy8@J>aVBg1gigJfJs+||^`@8BP1u52&h>=TY*}o^HcA279Z6!*g{=1v%{^bR z+?e>j59_SNJzodrD$;T5tcTQCnyv$|hXoQOICkqsQ=A8`R9U3k*fR*98Y++NQW=`p zrwRZ+_ARRA%$1qEb6QG5wya*FMxD`fm6c4jwHPWQ6CvljtVxfUDnwuUjI3OKjK%@; zr2>}Lt~M*WbPai*!;u5Avdc$0Uh^*HN_g~7(RqD!@L5~U(A4|6sb9+LAO6AefNxnu zN_X(3Viy0Yqk`&)MHvgL;06u;>)Ni=k1$qm4x-`PFj_GQfew%&_8Y_ibDb(AZi=?{ z*AEA?1<&Mox{TY>BRD(PwhTm`H({?QfjZRB)!6usx=;Ea9Nfk+tg2cOz6aJeE}4x{ z^o^rK$e6o5xxL*72xL4%_~QcZYIoS|9b$kumzAiF(RpkDTrAngC8}nTS+N+39H-b$ zXWAy`t_0<+v=4xgjsA3N`lL@Tyd9C}H51V>j`FO`U2@P3Kfm4cHASFW0H6dv{(+va zcT)Ylw`#R&Ldl7`0n(15BK%%DvW`7X55K4OCC)ujSG$or+N974(n-%f)t!S{;r98L zT5G9!@z2o237^NRNR7CdO_31jC?>Fi#~2kRF`(`Jz-b0X+6iRB;;gjs@2MP9gRsv% zL?{orN0aTtRr18h!_varyqW#6t>47`q+Uv)J-$);;TkcS?<|0qV2rfqPML2(8Ob_JLMm$wl;r)a3+gE9R>bI)Ap&M*4ffsFwTT`(Rd#w!20);uHbk!nJC`onHjYO`Fp zAz`^*zX)!QkIL{mjnyySHDditu*bjak$j2RdR}v;!%X=TilM-U+;Xs5ombi zT&}J-f3{+y_dO-IQ$k&s{Uymz5@i*FiO-n!szvxa_TI@|Xi5v($gZ zVQY*`bU1KAv@7~X9zQ9-&MRNgevytKA@?RSB`Is|JH7!KO?)!|L*8W8N9_N&wsSc7MDxL z@4~^ksJtNEzNV&r-!1I?V=P4LO?F&1GC!D6LVAoYeN1irGo%BfKDJS@RHTv)5<6PT zmeu~QpflsVK-Bd^xqQ0Z^44FFw2f~QKQKBO=4jl&AcXh z9~|{6=l>s5@BPpA|9+1fMNzax)mGYCHLLb)Yt&Y=wxU)eHnC!LsoB~iwDyduh!H}y zW=ri7#0n*iSV1J@>+{3+^?cuMkN@Ctzu&KOo$FlZu-`UP{nQ;8<&)?<*s>r%km{de zaq_w$bExoCm5g7$t0O<(94k_XI=FY=b0{PxHw!znvrt8L|_kWA>< z`kLpCo0_;f@l)5%k(c2J&g6(!Cj5g^moD2)i=LuCY1e_>H&>cHA?gS6)7N_YZtGWq zMQJ^0T>ByBwaa~_45dSou8_?{hEg!)njBl^x=tT7pd5iFc8lkK!>aT|8FOp~?fA$Ge>ACnnrP1>zU~IAtPXu zub%-rBerXk={Zfca{PXNU1AZr)_&2Sq;f41iD_TF@{j22i981*akF3i_+A6wo@{TK8dW;BCgfM7VLyV z7v+L#Yc^_p8`>ca+cLSxYVesCrS{xJV_S(bj&3N4C1MF}i*RPGd8-Fw52hQoTWuVw z?EPw>$E1PO@4;R6b-6w2mPL`06(2fh>)8H&Rw$KADe3)V|5WT~da4%FBtiC9@)d-^ zZb@*zRD;ge?Z5#)U@28g9?~Cz$N&fMqc@!SN(dpYY0-_9Yofu4(Wl|>q|{;w=3JN2$?r$+Uc)K z;kx(t+4Dl#1`^MB=ji~l)4}s!FdeG#{H=6AtxG&}nvsM$ylt2|+GTE5eC$&FmlWx> zq|PS6+nQQyXH1fY2sJI+QtQ>l$>&`vY^MHYM+nzvFA_E`VIFUpQa{~)XzXb-ck(YH ze)n>JRl`5et7iLG9CJK7FWnBk&6MlP%)I;)MEwC(eI88L)7$7%(5n8+Qjd!9AjA!O zodsm|3yvbG_tZwx#=TKs(RP?6M6kMCtz?GTeq!LB6Z)HN8M@%?D5bOzK4)=b1J6}l zK2%m~8s`fA+A?E`N*x-gS?K?mTezamQZ+@K4Ew93)vz6gYITKT_hy==Ru&g+Rwh}j z7(Zz>D)NoBxkDV(+WAkc^{ob$E^5wAt6Ja2no7@_s5&;89@{g=;25Wz(;EA;mPP`G zP!GK*Ig~oEJ(4s)i8|XFgP$J9w$B19Yq}d7{GqT)m~{gT@T{RB#`wSr3#h$#bk2@q z>%g7$1R2UW#Su(AaH&I|SAl^eQ3ZaGs)Csc-;P;TSglW^OKyd|^{;f6%k`m)(l_%j zdKN&Tm)eSNT^3EG%hP`SIp9)O6sl-D7CrW4#jreG&M>MDyR}$hg&ZC0Wxq<0ij2~1 z{k3KhV?tXeDROVX3lQ^PO)B|t%!h{0ETNva*HzWBb~w>E-2EHU$hFh4zUM>}Nv`kt ze^Cp`^$OKxhG46?%Ny;*Phtrg{AzvjAoYqlS{lyLUe28*5p-6?M5X`E=>zN!tU2f_ zgmV-W9G6EK;)-{h`D)-M{%D&(K58Y*ysR=xV{8*9P_;VqXzeeeMSl;W!1MW2eGKYm z!1vOL-}}-BlL0G+u^PWe_au&PZN7?8%)YPEqO5rl69D{0$5fc^7~6OB}OxU*0QQziF0NEW_$hQmnA+-SX#96=PkF|UwD#ML=|pE z`s`Z{w$3b6cEA85cy}jkRl)YiX)W4n+U$bP?grP%i~(WiM6FsPn*8xJ9o#-Eb6|Br zdXs`{h_D&lw68Nf7(cHteFi-DSp*XSCN9XSQ;fv{Hfj-qoXMSq5)P2(?@w)!lv#qz z`7Gs2EGe9VEkKeT3HA2CWBaNK=ZmAJI;}bevziWm=3C%TXhUlusHzG!&vJwr4kJcO zJbJ7x`cby>>5?H1w)w2IxXKjohv+^5ka8MJ3Kn&__9#%gSngx1iWngK5iYf^$+~kw z_WwLS`@#t9vUMi|A6F=UOVA@!sM1+g+Ro;{ol>K6vWKJrI0U6bRJQwZ*f=_|2Hb8Y z_ecMw4*wHsRp>8`dL!?q@+@rr$ByUK^`30iQ`$jTVK8T zYZK#DXt33^*inRF`+_??dDxABFkX#BAILjpzXB*No|=H}&XvES$;~`ben|~^8Srqs z$`BQwzJ^l)ewqrrgAt10IFyQxAP>Da6Ly%zeTe54cv=(0|2T@->Ra<@;MK_K_=|BQ zw+u%#G!b-%K#!-TghH+ymY{0bmgn>rBLu{Om=*abv*()C5pAmB+B8`j`Nl^$wruNv z)lXt2M&@fP-ASwK0sG27z%CW;RY%hjrsqs$h3$?if!teKa3S@bW8979qm_!;%1C1r z9pC>WP8z1otO=n`SZwpu8tM3SKY9i`cAkEUgHr0xXMp~M!rFpvDOj}2_K_pDwWUL* zVTZDUt|4lX#{AAvU@ys$W8idmOdW>UHG@a{I+cVvbWZ~*XSOkCi!M`R6tc@q2}OqT z=xqP^9ObKZRyp5das&;l3-yJyz`B3JePJ$SIWtQszq(L+KLBZtmoGp}YdDqtfd(yn z^I-k%v*7pr&3pqwOXYXX_ruhdF6(=aqv)_DxNwN(L^VJ8nE4R`7m#9%(*Do3Munfc zyH@pY#9?Hn=Ce?G8gKU9m&!D>Q(K&Gv~N;N!Z$Bpzp5>?To%#7QXQpA6&my*{wob2 z^U_4ymA2oe&W9yF6YmEnEB{&B4F3QaZT4?q#4GjtUSo;qiQ~Ex)~9kyUe3`qCT$A_jFMX`)c3+AfXTD8OkLn3 zbvo`@65{mrcBZM0&y|3y4iuH{6XkD|$S~AL_m9Ui6`PQ6H7xx7I&$F7i@|h_joRcr z&+_jJIK|MT^}D~mA(7y?%P)n2Ydk`IsL5ZKG{;DQqOU9=Zx~&pl&wzH_$2g{h^;fG zD_tvyNvQjqmknKTGf~$O&wr`QQdPeVI*Z+xfI_ClI~n>_w3YiR8M&&#G#j=2yrI^* zvLCljJ@O+AiNL`0F(#~YY%D#WXtzRd#CdY3iK!nfY{B_wSkvNVgxQQEx7D9eCqG}_ zYE@f+(yq<4*@5Hn1)twMQ+83j>Io5D+k25SWSR58GcpNm13o=yi1oL|!YgKgM!&{j z^Ap=gN|ct^a}uT0AB;8g16X4Zo=xJx4O=95!NoI%K|x`f$k_v8Lk{NIMN<<4Ac%s= zsDjFxb2RuwYg&-PMJdhkX~YX|o?RRspkLiUu7id{9mqGdE~)_#LkqCB257kKinL$* zyH;vQ=l{{YPU0xE9G&KHuk|!~I*fW`3E~fr+In~u@8yHqh0FvA{G7D`EDc=Bc|xq{ zu2HW>{HL(p{z&_XT%!F(;HpmH^w`c0i0z3>c+7pAYnfDUNc1cNz#k+r@nSu-+i)_y zHqasINO43`wy$e4^?bIy7l8mi zyFt0|$}WD5UZ_Vnnnn*Cu(LNk>U`yu)@eL5)h;S^csw`ew7ii{amO|EHl#1%*8$0*5EBh2o+32U2M45`>VK zdkW~!W^5u!t)2ApKQ?i(HH!!OjZ?wyORPchZY%MO^R3WNz|Eu#C+X zGaWkMFDp+($;b0L@`Ybb>UarMlOEX$Q|-O{qsl}t>b<9%Ky#m6dhAl!zx!|#C)+Ci zhia*~gbqaFWB=I>sTevT!jfF^63L_R_SKA_P*l6u$K$0E*;Hn-=w9}>a-j9VV&y4* z3-a=7?Z+!Ob1()m@_QJ}QFxbp-IZ<8i?Ze%x+`5_RHX0OCcGL^qwy1BzD>me;T?NN z&6UMVmPlgjNHdkVr`Ehg!l~_CkC~PeH!u@<#Ulu@pOeT5=6HnVee7r{ZZ{es$@aEGPIpyhXfRDc8fivo4WRtHE2)pM0W zAY>C>CyT0`2vVY;5Fn$`Nk>4;G@$lEa1)bXD*!;9lY;9yw2-szpc(u*^kV#j9<`o4 zuE+rzNsYlOi56fo`s|qZLl58^u zCi!WAkNq?#t1{Rlk_*;s#~Kbk^&%9`!cWUkR$8$CH(elg%mAFQawgNx(1NO3k^%q{ zW_~?Vvd&SxbpKncoXJvbWg<3oIxxW6PJ;GgQTnF!z^PeJdUCm>>7>Fm?^8W~%lNgM z<}e`EHOe67KNjbAzCE+)wcowf7rT6Lc;jZ|ImB5l4(va0`L@W_%zt;!D!;f`i}Fw6 znCCezwGO^f|9Sc8UpOA||Ez8FHB-}C<9BKgyH58+lL~;UuTv! zXU;WIfGhp4TkHKD=o#bfec!#m+7hu6?-i@~kcLs9!-ofE4!e>pXY?R+Ud;DvMV2D($iL?Rugu~l+FuKrZ<}Zt;0pprcpk;o zu`f5-xUvU8AU5>d-Rod3(1+7wftwqcShF4DN4N(v2Xg|c*k_abk)d&B#X2FzZzHTp zPkSQ-fh}x=CK0^SsXF#iDhEs2uvq?VZ-4%Hh)BUY8QNwMHC@h0;9GWVhGKeujgxq%JQ2gEq}jnGAO>1BWnD>?ctB2i7-ZkhCE*# zXItYE@HaNh{aAdCoD}C)gAkgz^206zg$(Y2gZHcQHj{klgY3;qD0eO#Wwg&SGP<7( zqN(7y$=qx|)75r~%-hfsbMRS8h|8`VEs_%W4NKWWuA+RtDOE>^_b}XE@O>yvC!^wS z$PH7sWv_>{6n|koln8}Jh30RRKEt-7;lusOo<2aAd4Jg@X|Hz+XHH)xI%d6KGXN~~ z%CPEbsE=J}syo^QsmnoaPGySk zq_5wX!svv$Y{z9f)t0Q^+QgClG}a2#J8jGM8(EnC3U%tp$JNCeJ3kuA%rE%&g$gv0W8R2VRZw8|aCAH3fF!qx2Vi02}M~ptnbmCp% zJe?a6^)(X^T@@Lg)wwN`K0r_x=B*NC0Q42S82e(3y|>y6O8<8v7CUuA*g^I*Wq9cP z6J}!X{n*qCD`y2MtwwE-a7m`pmvo(ufSx0*gLuJV$p5be_#_NTL9ji9DRKqLQb)?^ zEY*A|wnS+kv$izmC6Eh-Gs8{16ys}_B}*y}h8g3|K4)4!YC)@baj>sK(pc7i-5){| z*9@sKPyGO+3?Wp;82YGLt0ogW9?H~s!V~YYk!_tmC7+vMi0St#Hm1?KnZB(>-Tcqg zOpGk9Wm{O+(RVhJQ%57=(L1(FKz>-)?Z?^d#Z7-|w&ur7yFllj^&`!+xivPWH_Dkx zZ>+WXg{+E zo|E2;7#j3^sH>~{u){0*LQ-te2$Kkq zL*S!cqv41;&WN1wVeL64)RdZMFSP}!B61T}SJikEHoy|mwNXP znX^4ugKgOd0uNfTYd8elDIZuH7t>QOyluboKTi&xDN!Zo8l~-D9UZ)h<@%j%ZuOBD zQs14Lfn#3=Dx8hoYl|53vG?u~vs^Lb&$tGxXS?Qu>M#V|7j#3y&oa%1Uqx4^t}Yk7 z_Kb*qs^?4joB!HZv<9*8=w0h|IH8s-LZz$2qG6e7h25B|+N76=t3$nB^dH}s&<+W; z${3kMlI{a?GgHfu8qnjo8p-7buXJUq&HcYWLSv(dAktO^|B%bxb-J0UH2hr1sRIDC z`GhE}dzQMV0Pc^0{ybkQc0n{Q9@yg0-YB)nu$KudM&fzd`Sz_S|Cp;!3UyhjL~oBv z`az9p=?nGzo!>;cgXFsbP76I9mE$?rX{^;vU6xd1TLq!7}b7nWN9|$lMaJP_AMRjqimmoaBiZBql3$$x|H>&wbUMlo`@;0 za@jAY*3Zpp*2JkW&IZHl99Ed1|3RnU4|J)}Lo1Kt_!D%aE0;o8_4d#j zfm1o}QbHJRh@8pG&!2r`mP-7PU|Ar5t~uXQt)jghyA_uxEv-){HQi|-gWP3ie;{LG zsdFEeICaC^HC=w3S!3$Ogfi<-IrQb8VC|1vEvEbpmT9e=E{DhDp{Pr-1Z^RP~=iqli@Y+JebdMLR}cKZg|6jM`P~LW5tfM@5^}>Cz%JqQ45-9cV${-tfiwrq|uYsz7?^& zEukv6m#s)<U0lIfmc_Z3#7vWw0+_|-306oe*LOGM!UBS== z*9>yzH35jlR37TUutq|ATn10NEkCcJcxTY3prB)KYnm2+1chYMH^43A_pwpJq4tuT z%*-eM*+CUNGwWQx!bU@kuC4Hcl*ELN36=lxLSmKnC}vsm3#ZswKz%K`X74AUH=3bH zW6vr#I3vz&YNmW=m|v4gPh7intJbSfmC+l-=WXSnpN8 zoOO@r&Xb$YQlpDlV~#H z+l__F<2H>T)X8=y3X&Ov-w*8;(bUj_N^UAeRuO`;ZIXB+<{{|paJNfBk;;O+-8XoH z;*=$5!G0x&@+z@Cnk(+FX1@-P^FxkeFFYMso|~jFo|Ix)Of(#$WrK7g^pBJAoW_!O zuh)JqX5Ec|2+YRkSKrzOUor;0X{YHH4yev8`7n%?s8?z=I5Ko*kQM>jIUhO4bPuFk zTD_K3v3n_Wr``|cAM%`bR7s6sbAa&o1&p1#>ub?}xoPgvaRq4x>4ZDz)%u{$nW;Fd zN0J?xDw&Kq#Y({a;lbamBr9Rhr8&`LjEmd(Q721YlzJSAHvmkRqg0OJBhpO3?a>)tK7w^*ht~-$+}FV*%c&dKGG5O zVrCvv^H-8BGk4*r6Q@nfOn>TyfCp1)!eT(rRN#NIV9Nn zOV)l(j%p@;`-(zelS4!e)D)w?+AiexVy>eMyv!2=7feGtN53!-RLk#)&w?Od?iqaz zeow4R;o}R@znxt?Qxo}6uN5@P4ceCZi}XVJMQR8c5~t9o+;iInRVYPUSF7~g%a?*l z{e6)LfwZeDtk+5_qWuI`c7~@StMuf@Bhz2Pj@L&Kivl6q2eoM`^p95}mDvwc_rn~A zMjDV`X|9h8l^2W96inT;d5xHW1=v%uu!rV&H~m&7??7~%-9*=xcpRb4!f`vb77;3C z;hE9GLjP*-*G7Lf<%l_sSKTICFf8M}g@W^I)ytZ?!Y$4o@^fbt&O2n z;&v44@N@msv{F0>YSv5oCF2p@@-}{S(aj6-NT#d=MJd@;rP(|r9{o_o zSwduMBdWc&uWo4=-H7a1)H`$T;+VeQ#1P#!D?pgJz#)sR+YT9i8fi*FLXUOWUDl8G z9YM3i=g7#1zA7OXGt0@_i##UIhuR8Yu7a(WSpWl_>%{DT# zG0Zf<-Zb{ejkI_9=zrMFHH$&_sV&R|UFjiBa6*@k9+Zdya}#HLZazT;_Q)?sipQA)0&3+U#% zxeLhUF`e8~I3Y8&B`4w0B8f}9VHeIC-`Z(TBa54qv>o@Nv%RLa$i?9^2L4^tBHJ9! zn)qrLk-ABI(1LIj-SU=4#mDQY4;}A;Zu5Q{)C%luC2DUms8#D1lUZ_R2dxAp23n7K z1dU~b-IBAM=s)BnF!uf7*|9-7!vt1x`{FxeiCD0}1I3PQ7hLcsgjt!BtpS(4PC@XG zTo*0(F0@6int7t8%a`~}Pg?QGNwolmE0&A!6MupCh42Lnr5Mk_Ejr=j(nQw0HV_3?8ju9G2~)YPJ!a&lzb=u zr!irYvu9<{jN*oCM)&)FF1cl>m21ltpyPQ&6)*J@2sC$KGUbF25`{^dZ-MuTl^i#{ z7s%n5tD!Q*&0}>?;G|pP8$XVhMisz-+$(iwaVv|&+sSLl7{@shf_{po`nOfUXdA0S zK?HDjw||@NZAz3>)>6-wbjGREB<{goN(1{V=IK7)B5%4LwTy$S7_9uEPLIxOs8sr7 zR3O1+q|7rAqFxlfdbw$DbBS96`8O)df0WmIgT1`*G4b(oXeq$2aQ%QWZh}^|MDF;g zXIlC?sv&VY3i)tR=BM)T_n;gc4HFf+#w29R6nt7$Ju-QKCxl)QCZ|jY4WyRF*~C7T z0I=uu&v`CG+^Mlx9s+WueDnB{5C#y7D;xwn$5Jome=&pBV~zBcq=Rirr|;b>uR zk$3t1+tW5wj5Z2#Se)oLKH~t8vHg?#W>&6#)*sf;%&!lyBvrN^{A6(Hq$#DpU(zo3 z&-FQ*aZqWh4`{%G`lzSva?e)0DXW!Ax~=;0#9x+L0sXZ|ZbC8JTW3u{p+;3t=#{P~ z+LW^6r5m5)MOJ4gaoK7-<)25f#D6&7R2|DuZc*Z;PwaGT^NzEeBhA8hN-r{hBA201 z4qx8G>^m&TS5cB^; z+jUGl8_LeV#pawW7b-3d)_J68cvGFopo%vXP| zQ5yAe_WUJ>8d3<5sf%twpc(kVnT<4>JKL%Wo9Lvfcq zLNo5Ij*Rq2?gyPdJkJ&obYsr!y6(n$y5zaF*X3xz;I(4x_#UoE)|u+kY5N53Bj<-IIa^(vn> zaL4u%!+?iR81JkMk@_8;p?F~-vcYBsxT?Z?Y?$S0#MTOkHA@#`0c5tsgh&DrzW;N?QmDSOZNoHNeQaVlbR!v6?9=nb zZtR$KM`|RfW6PQ=02zHaZp+y?&6Ew_%KqitA6lBtgz_%jVzV zYaAB#JflOC_*YvP?0yJD!x74d-}{R`%ZKX@$W65#wE5-|zYe;IerQmG>0-hIkfI_3 zcM(OI^?5n?8wcmyKW0z8v@G%;?@t68PR_J#YZOtCcGPcwN5#$tj05y7dU-P*->ec+ zKqykBLf2{IDMt|nNTxr1VoneKN>X9F)Fb!DgCffI)T616<@L#q@dBgzx7l)6qG-(y zNq(zh>A$>GTeG*-T;eC6+}`&{ov#~tQLxcZ=R{mvfeF0v$BN%s-@I+>r>mn2xtnDl zpVc&#aEF>X?gM+JU~CWe>6gkR)jL@}-#XNr5M6FD3wv!quDGdL+o@SxR3u`hRejgQ zY4?`3G3>J@({_w*7gs4q*3&OGu5?WsNe@J`ip<$}#k7ey!Ov4EFdHim*I_ZU-Nw76 z!T{HbK~t!NS3BXTHB{rYajEskt~~>46VxoN_;pQN=* z${Oh0QyOlEJ(~;;NJWd&E&{$CI*mzJEQfU#d(@m(q0+P1p2#ei7dvZkTSINTY~oeu z?r@NQuf;f`MZsB_`*mA&xT_#`Ro805KLTdSiuHPCOY!3{=**)eaYr|10nO&V?9ZD{ zg*Uw%dx$%G?3rt7*ZP02;ky(>UWyp@k^E%%KfoKH7NdQB$RHKnn<;Sj z`5p@*ha-W!sKcr(`!4JH3*54}mxtu~;U$sg%a#nLr4Qx{>En-@%<-a%=L7s~7#o!goFk-+?0 zXNPAwMRl^1$lxRIf`6QaJzv;AJWZviXGrvI7@XXz=UDoVYGro`eZG141ef;~)v%p; zPuSeBPfZvpDbjP$otm5#2Ya~`en&KmW-9B;4Cfuuda4b<*u)YFG=Vg5LDKKpq2um+ z(ro=o*+1iiEy;D=vlC#R@T1=70Ngs?cpW0s<3Oi*ulmj>@*y4Jfc6-+9G{d0KTV)n)cYIyC0{_z> znj2>};>T)6q(&y<+%DBu13UFIDlZHQmxf!cz`@H`w9D{EH*#u7q^M8>*Ny_n_GtIw zbk|{YuLA(Mqxab#r`n!l1b?U&P%U%^6tL)ksm83{pUK@2RJlpKBiN0}5=k$__`W$SFQ3d3ync%pEw`PW9RetRYv0I6hZUd$fb2 zp?Zd>ys0;K{jG#O^}R|MIzs{Qx;1Rc$y)_zqfvg1I`6FqefBDCR<}&WKc$?VY@Rsl zpE8E%nm6BfntSFf<#_mtW{bhlmZI?Aqcuv}j}cq<)43j;h-uw1o9%Ts!FG8;HaJTw zeH3u1dx{>{R74l>l9gND?vWqs;8Dfp(Ld5a-V`D4DcVp4HkSwPqMn`76+&7lFkMq4 zr_o{$jIQT{{ESckQPx%Y-)LM- zddfJ~iS+A9$xKZy>ZEg?dXMcex?GC}&I<^T`v!Jpm;A&1I(_BVzZ;G2A0+SB{(cbC zY<1N)yyDfzZ|Y;6Txe<@0VV-#p86?Mm4w@W+Y*h{PTCBL#Q@0Wi#9uVG*-gf!ZyoD{%@0keXiNBVrPiJ7eu3h#9w)NR1 zh)>B=Qqyc>WV4%n7hqqyP5{C_^qcf$B+Y%bo;obx-;-Zq27XD-gO}g^lQRISNFiQZ zTy5mOL}T8M-V7;f2(y2-9B0cW(;h>U(OkmQ+K}OW^L*57xp}68wo_esY9v@pXX_{`7&cYlCM5PESyu5|$rM0HN?%7M4r%`$gs@WW*A)CQ|Ao=)#+C zSN@JMJO$(VP2o;-w=LpqrKB{P%nH>yPrBo|;HNvpZb)PE(jmcUZlB7Y&63}aSSSfD zWDx4Q#oXrUKx&zl8@S@1SPjElR2de)b@`)ObrZZ|O6l+lE;BXzn+!(S$ECyRt?(tg z|42e_k=pRih8gOJYLunfWMRy-+pG2dZd&o$dNe-=!2B1 z73Paw1e5f@lSKgBX5(xPdE&g*AytpqV%0G#RL8yo?{t;7mZR(-5OmPLwLlFqrv4xHwM8!z&#EzqP?Vx5B#bT^tdGpcxd7a>Q(|lzClKT=wyfb#icA)nm1{ zP>CG9W?Nb?TbQt_q2Bl9o(rGy+#8z5e&^0+nfIdHzgxE}q_ukHX6HD0UY~yBehp^x zQ+4pSLt1fDyFH4D(;Cug7e&pdJY}e3SS??jGq31@PFV0$zeK#;-+sIxUDq_Ny*lr>}gu^Mle-MmY96>j{WogSMDgXkO>}81nvQ zQ2wA%y6-2HvgkYaQqi01Z$_TR+8WY`zAB^T-&tkdCeR14D4DR!i+*SU%~#r6`1U3z zhaRA#68t51#NG4n)@zY9oe$tAo}eEin(wL^m9rV4Db5&+Wr+y3wd_*}x!_2eK+G!tnI+)I>y+c53bfJ^e5@4+eAk;oNw6j@X?GJB%u0_ejupnvLo)vMAT(h zhFw~M>)u?;jMmSC1EfA`9Vl)$k83u9{sNEq1qF}j5+sH6t_8<5zSA#t2>DZ+DCisr zNe`Q^-WTq+ZnFO)Ahr>G$OC1owh$#KMES@$PR$9M8%^%(eBy$O7DE1sEJgb0ZGi@6 zRS#7E?oCE*kRzgY+bZ}VCAUovFHDiS|AzL2&$A9KoXjxpQhlCBwTHyH3NTUC@T&Ap zMLHII8Bz0`A|uYYPyi$pwwjhiQdoIF4Lo3R(Tq(;m5}MqkE+ZfNQW0A#$EY_wrmD} z%okjL@%5*%2^lJGhA6NhuR%f3H+50OPi{dVH#)j#cV+F8F*o!$!A0wwo~T9fI@vnl zBJZERHiNAiiAR(tMTy%@^ovfk06Q6Q|CgumX&flq`y;Oo{9rEpMRwW$uLa;Q z{C8nIPx1m1zN37^>0m{+Gts|aEUC^^ge)lYHTX-w>N?i0XZ-JY9M>#rtS!Bq5~VH* z`8OC=CSA$=i_FrJYf#+{FL47pM^b%5U%|phC4TFn;>I{nEFZaqjyyG7%daAed2djC z&Oz(YcN>X6$o2UhYavR%p_BeNrwSfbJJTWfrhK_^LkWzW& zOXVq>&4=#|!l2DPH@xz*88$D{aTeN{P^2B7Hm6a%?NM|VaWES#-45vXM2&D_py=sOk4MS^&$`kACBOs@8wWda z>?6FLhqJ9=R=l^T4)^Z_$AR~Drvq|}l~&3H$Sk3`igsV$oUYhdlb??6svmWME)_-x(fI004de$g(fD-IxI&&u znU`OVM!m2H`3zWT#y?^d$0%#15hL?2cDv~E@yQ7;B{!X2 z_D*y=7x{2-ka9*zD#_*40-q? zp}h2>O}OKpWRU4EWsXz^9^0|#J)QBcWGA^KmWg^W)TsZ{!@icXcaPb`XCBoizEJz$ zaMIwf`S?@XZR!RFwmAB>C*rsZlr>Wy*Yn3Hos+6e7iph_soh-kgMddWHO zW2Tyu81kC)r{+79+OLvSYhDR>Q$g_~ChXbH3WG*x=NtFOK^?;bNTgS=Bq1PEpz+$= z&Z$~6DnI>TvCl~zXg2vJzgni2PaToC(Jf*!(yNIJy-uAuip1N$_t+#70^|hm3#(Vn z%<#%aiSCaMu~ze|?}tq6-qw8*Gp$EgfnS7?y87pMe`>_=b0DrMXln~GFr=O=@p@Su z9n;fZq>Z^np`-XGkjM0N*_o5p1IbIIp6eBu;(^JXuJ;}d(X;jzM!JwcIipI?Ku%EX zd|MQd-=kLnmUuBowV_hJ`gc2C}zntYvB- zcz=I@aT0#tA3aKHMZ2JxVhz!^&eAFOV{3ZSkt8}Tt1uupQOsPPujX(JG}pk)9?rheVM+UHHERp2lqKs%Ri{C(US1~+mnvE+98!^<+m96 z@Ob-OkAl+a;th9*1TEZ?|L1u0;)}gSl@ztHgDpG0vnpe&+!s7qoFh+wLmy*aP#W+1 zEg3uDfbjMQsh1_qNj*9y@Q)$^gI(IhSS`cqdTkBVc4qMy;&YJm+_C?_@i&nD1t3M} z`smv|^r+Iuqy{8iW`3)!wAn}9cG35mfZp!ovdv1=svG1(QbrDv_k%at8w7zLB^U-W z1}&#dMT|`b;0E0)n-?1dF|HE0UxuvnAkTKxt+juNFTG^3jIz(%q5=)NUS}9*bnZ@U z@aI5EAU1RlMY;n=6d>0FI%vfN$-J2gmji*_`5@#=#HmZEkb87VJe)#zC6~^3$1*5b za2i^Q4tzX`-<>>*9}{0;j)Q0I4YKdRos@))k+nJ0vWqTd3yMuH`mWa0%2ap^;?HpM5sIrf%#{=!xb)jL;=e5h znAK0kJ3ZgSr_j~8;>%@vT`19O5ucVbP~S4)1=|f%#~g1%s&bt0Ee)@YnZ0Ft0+vU+ z1Vn@qkKW=#-m9l&DgFA`{2P^0bKrZCmbBnFZ|k?XCKgxelL4kPw|*Vj-!U-WbfL`C zrxwYMu^L1X9PLy9bJCAJ1#Tq`d8*4l?c@eptM~-DS5d{joKPlH-3| zCNhy1N-8%_f02#_^>pWU4M2kt(02Ia0q=Af3TC19c9-f5cO*O+ysYXwkolAQwY#>* zfc(#Ty8O*{>P7^0hEBsxL4&YQnmV$ANm)x#@B=-80Dr4ru0oy`8GubT-rp6T$@{4j zM~zm)VI=5A9saJ5M^(H%Mj{)9{f8K`8)1KS5CkG#KEZ?txH{TgL5@gom-qJQ#Fq7g zhDSy|_W)9DZ#`8_Y_ur+t%w>FDqdVd1rVm(P@~obPZaF09UwlZ;n)^`q?Ol>AT^Seei$`m_%8I3*No3(mql4 z{AsCcs9n4K3XWpwgRKH;PC{Jvup`H9XG#>Q8Ld-y@?w=O`EZL}Q$yecW)n>xfczCf z8vy0>EZDWPt*@@03^wlzw!XL7RkAJh92NGj%-Qf=ms)zq`+527^n9O5# z*lPw(*5aa2SA2XnpT`41LAG=>9Tm!mLXZ6)KG7-6|HOQBiNbMHBA%bF#kG)UJ-SjY z?63$f8TT;sM=J7u>0c@u;;g%e!Y|KfM_>DE)GTF+D}9jGe{i*z%b#j~4mu!(jS`9V z_oqvyUsq^C<=ykew6YoE=pD;`F6O@t%nq0G^8l;9Wn7+8TsYcqTG#1)O6QyPq$ytUz(biivIREw3GU5(T>?7Sv{MKg!sVExVuh}# zWeOy7H&g;#tyN4kUml=xrrn=fust)a952<4@51$<5eueVK3=REnw7} z`yrE(s6~6eS|UW*D_PwfNOp-m5yvq&2O|##C?dH&FWsYm^iIvzq^y1 z#@Le~E2@C*3-`&{b6pJ-uqf+Nr1Mj~@!OwPoNCsn+F+Q?<&?-;Fn>Uexh$Y^yfEv5 zS(grvE7IRq|G)SJ!V?`O4N)2S3}RXbL4E8OMrfS%S|qN9t6-jeim1T9k5QBcxjCMP z1!!x8_`^}GX}F`}Kg!Og;nJVDAR8-@5^Lk<;LkI@;6{(nq1Wb)&Wl#Mq;%U} z#YQ??#6t9BAgD!KqB7pTwc6!z*eRzj;d7Wuz@I|<66YLelxqZ?E{solvl{qO3t!a{ zpp%TqELOsdp#qZLgYx;7XZIfJ^!3wbXj@tBUQ(ca!z_J4l#6pdo}!+5pN_Oh)bq@q zv%121)uO};`WVY$l6WN|eEy)KC?PojWUPW$qUYTB)cg&k9cRpQ?N5Jmc?eaRJ=nr2 zqVFIGdq3M<`8T&rRDR-NsL*fu;|Rk3V-D6AjAH;O_A7h+pXBg**TCzW9s|~8KEu@y zoT>lxbcF3jstZJQ5+plSYJ7pjt7xM4TSY_sQAf# zr_1ivc@Okh%~^7nu1CWwTJPHj`2EW+e!T_vZ%}y-i#e1noas z`mEE*kQuZazo!X>Ae*|5^fYndu)2Kw-*Y{p>1)=1HI zhyVGVV0fWy`Y=8m^$ zvhv#}QbDk@fzUW6d4jF#uaOYd42&-5wAKX%2&bdJA{pzHT?4zkm#KX~AhaeFU z4p+KHys=k?=kvg3hIb^j(kd2T>-pMLMc&ebN+vS6vO}q;idyF1&FTPfgU&YArW`F3 zr+-GNUuq~Co5~E7& zJxUNOV#SITtG|4n-}C+4-{N-f{(uoxzG*fi$cd1@v;X;>MK6MJ%#snUyD6yx8y8&XW%OyytqYrg7i8~;5Z z_bP`TuFyE-?hH(;3eWCGAq1(38mgY}ps;B2NNld4c!f?yT@Tz`zn%CHxtQPn8NyHc zzjculuS{lnO1TURy~5p%Um_u}MQq2HtpM7L7Ny?P%eVleeI5MHgX7lTD!4NtgRe`W zSw%r(!0WLE75}9U03A_vS+y;w$E4A=HCFacX!W#%yZaH`a;@8++?f-6l=Str>eJJF z9}A-}HjJSvD}qV<*Ilr5?SL4OV=hT{DkY+;fsfzWy1BH~eY$TAigve4ytiD z0u#~vioi75LG_(J>NcF=*`kt) zwgb+Ax}((^zvXNBF`_i=AviIBTXpnZme-p$MY$7s4JiTX4mRkOLciPBPqr3XPPVvfDzCnIX2fT^{>dnBdHR{`f(^9sts83UW=rJw| z?)P?ZP$y>BuF+fu<`)#j+;b-9at#V5n_#rG*kMOh4`Lp9lR@XKrTsBOu#qseR!I$+ zSW@H-0ET*?73A;bRdRXi##`1aAQMY(T%>2aUAxo?u#Dc&ofZk%3B-DH{EKCC`Z^Oi zGm2t65#HxzfeeFlK<}WBAQf0zqO%Ro%bRx*_hySY?CkP?bjTHUbFEK|wd#1E+b1Vw z8E%;@^RTOSFf|rv5qIdH6n{m+C)WyRscqlz7o?COcnQ!;$aX^+wN4KKhJJ9Ndnk5NVvs?E%^>%5b=;B%TC@~ziex|f^7dDiC-{|MIpnE9D8m3 zDR64kO7q4&4yV~J0KVvS`FehQ%{IW>rO^-Ee;J129(~}ZmRbF@2=0MD= z2d-{mwVGc`FFgWy+E8O3@&RtuyKC6GQ9!-$_51`X@9k`TR}}0~vx5w)@tjH4{iJBi z=rk%W7C%t0U|yrYUWt4sSBmFANV&epozl{stwK|GkOSq;bNMBf6wR@`~T4q-7>Zam%{%J>5X- zQ8bUa;X~Q-TV0(K(~Xla>YD^5|NHuvJ$}})5QULMV>v`N_K`!mR4qT}A{w*7LuhM8NgQCDne) zXje#6G;fExZ^+!s-G(ym+`~R8f`yp&n3p=X2KG7v&tS`#h_n-{%w5K*d|#zJ*Xc@T z{~i5d|7Ne}tTp2FsKAjp_=OOWLe)P2=!H;jp;XR1E$mjQFVxdlc;73K9W&+z##{-~ ziCNGw9~=smGyiBa+cV)3s@FMJAiLHUK;B<6>JN@;r~5J3OJxH5Go(<-BqAKvn)|Mx zf0yRX*lCI9tIX!IPaCrWA`FY7OO7BW`0a`3s6TofeP?^cj0cq@tVgg^MQu(!1S$EK zyucf6GNWe~5m-Hf)PnGyV$P9pX;XBy8;&#!QkW3Xj6*U9e8ADg|MMMi&OP3vFju2D zuCqn2jH1}xS6&zOb^gm;akIgOf7*ruDt#lRu>#5? z>e&V^s;YCt52`5svomo2QPt}nj**`f-oK2(o;|Lj*7T|7%ivpj+%#AjXRP{W#*JhJ z*#Ek-4!;KCf2QPN7_q0zT2!Y5#ECi(FTl(tV+O8eTUHZJu&Q>~ngoI}7xTlc)1=L#ZUxGa{x5_b5B-7s#f>n_-b|ny9ap);z9l|ABq`Xm=M%(Vk;Ahw-w{$|9E`x`QSE9 zrhYHod$IGrI~q@>{!z3+I@f%s1GaDV#;eR#FS3cNvo=b(xMX>Keyw`RWVoeeO4fzn zu=wI(*+_?5z!2Y-&$I^{XFV@M(m=}j&z?4cWqq_XnU8XglfK=bK1u1a(aR2LQkQK;m^Y!qU5AOy ztK0S70PN>?B5qMk#O2L{ZWDR6CUKANgcds=+!?8&DCMlQ-XuqLC znQk;9nvDv)66etC<*_uEl}MUb>;n*X?vb{;eg2t=jq#1`W^0hpoYs5iTRLC=txId& zN|rKMf8R))Bsr1Hy6R2e_(C;xTxg}Fn4jGG5b+zbU9%OptBCYDYis)atnOJ^rTj*| z8ePjYrCeUOhC<$EGxi~d1;o1Lx0*U0O#YKxCPqw6nmgwSi>Vv1$J1jV?A}aYUnP0$ z94%83M&Y>4{`!MmmZT~?A5ETNxjweX*^99)@Hg|__KMzd0#+v29j$;D6@@!MClKD; zR3LT)6u09}!-grnddzzJaw1HJ1`1ch_$WzLeMJrw;83W$7me%7sDuVIeqnGJ4ntFN zYgacM%o(lOD5v#hWA4(-k~J|aX(pmKiwl=B{NcT^CFN@>p=LBj1bzJuhr~SdrftS% zCy1qQV`YMct0HLcX-I$F=A*-$gN%rXi65Df_!J|TwcXI~>AD!kzA1(Hb?8W;-(-5Vlv3!M3naL?1af1dYz{0QpTd`3#0k(7jGTTeCEx?eKM*Dm+n^qs&+t2VWB z?!n2Mq!Q{xqfjixqi2dhs2=sePaBsI?onue=aY)UV1bb76d|>_aN2L~imoYUa($K4 ztwPL@l77wCjtbYgtiiqpYu~~u=+*L-@3EI4o5N0@2O|WZ5x~OvR=ye#R)b$#io>&rz+J!b z&Q@@&o+JPp{0J!;qV=)n4D;K5kC!;ca*3A z$kYclJU*ZCA^vy9i~Da%_z~8Qo6nTQ3L|GCRwYhl_nx)g)QLJv3?1EoVebWPg`_r> zFcjnJ@DRj9jZKYrtGN-KwOa|pe!oN7D;5WCE=j#p6K$HSJ%XKZV7ymXA%>syy&9&w zU^%a`ZEZgL$^@q&rZs?fb)vZ~UF`c# zk9sD2sF$3T?dI>^`Eu(_UF+^@g;$BQpbd^hTfL5gw&C*M<(z-KR6e178O)A-WcscA z{jVT1blP&WKi%uML+n>yTAZ9^!__zg+%-l=%>w(5b)T(Iy_XYZ7XHpT>%-%d2J0Ft>VB7A-h1nSf>``S#Afp$BS`_Dr6S9}^pI1lr+nWJz2}-{p@H>ik zx@uFVDS>W*>9A9a2;T=!s}vHC`pY&q&IXB7v4mmNy z(#d)&_v?9u2>(WFsuOsi@AN8EhTk&zFwf}uFF#MUejKhXn}qfU_D{qs=3_q-cX^r` zVg|L!DO(u&Ix?5m0Vd;mJvYB-HQjJ1+z|(G!;-E$&kb*AcbMl{_$U8ZkMq^yZ=&`m z*_K+ZHU=EV1!nG>-)gJ6XEPo1SU;eMh96S&=`n_HBi+y_xFl%HP;R#IMfxRv=h z(6|hr&|pQnhZHRHPoe=xAJ~tt_x|{JUin|-5jK-$&3CPhX2nv2n4xV?O6P^V0 z1+?w&oskksb~a>5>T~1Ve^ylghk%{*n5Vfe>)ZQ89te-t2IxRVP@1UR&{D>?5Vv(ibivO1%JZ=tI(75MWA51ERG?L@Q zaMrBVrhXixFgHVI4m(Ars7N`cO_i z-U97xZSBlDt>B$nDl=DR7Z4z(KY0c*I5@So-b)?x*Pmc>1sZrBViBtO3e8G|+ajaM zALiL;WJ5cA-GH-WO3(j69aE>IdbW-U~IR8ctR8ovG& zWMvr2aYtBg)mo@O)e|c8)wp(@TAPw+6dU$YeuUo{hVfUR@__A!TZ9gHd%Bv;I9J9x zK}P-CTuP4>bX&e@B5F7u`HrY^@#&?|8<)G9y}##U>`+Xk!%$6oTb>P@v80)aT%2&7 z=2@e-{yV4gNg|V_RVv@zKz1}^Gv{vY+CLZ9JT|yK`SEBATu<6-GxC*kn3n3&N8>?L z;WK41*jDGRQ~~VRuM557TB5qw>1*W)Tk!k#(ytz0)R?<{oUFTX7BU@vgMs>KLG+iD9tttw=Ttg#vRbpNF-+$N}N!Z@h|gmY?oU-RYK;t)uD$+@r@$~ugn4v)f>{G=1q7Ft%YF``!^JCeFr|m^t>r%7k>F# zgeSbf!>x{zjbIzgw;q$O{tL|ZhJi)2g-a3f~DJO{V(j+u&eKvdf)rJ3u~2C#2g_$`nW4U4WXb$z*&{%#w!8j zNFF%q&JBSnzgTuD9)-6AlhDy^-AUFjM;~F(GXOF{yX>9X7XY>j zJ|{dDPE7RNdUIn*mfV2G>B*YRxp){SXw`?lVy4%4)TPX(#oUHeE4SoUH$@Fx{W3_G zNPo-pgBq&CPs(QK1L1+-#U-ivd+Ib7g29u`?N1godqkm{>$Xa4?i59zoLvxCmd;V8 z(~}oa8PXYZ{dXjDbufI0r7uDxs zkb6Qu(3ciQ&&xZ^1x*i5x+F)Cb?ooBhpp@T)9IeWK}7!s%P%7F_?E2VNlGabsC~}7 ziD*Ch_G4^Zb|Zjs4s4+QuyySPXdLWdiN5O*my9LPyNZw!oA?(>Wf;Za^xDf*kA-GN zm<%Rz1l%putYz8g+%hV2get_o06A^C&H$znevRmxRam1G$FKTLtzY!5s@}`fp0(%> z`8-SbSlBx7a^N?Ig!{nB{icP&Xv{>nPa4#^w^Y7KX_e2Rf*?=(-M7rG14rk6aN<{3 z7xUqaQ*+IYCkD@%ROB%F!w}}puAZmC^0}1xbD~OVS(VwJ&~+>(x_>Sua?X%pw0aZ# zH@+9Qr8%q;0)x#VtP?hz1cxMJpsQxa8kzS&MoY>S-X+CB)&tq!${bgkE;khZnsqwA zgm8VYMNn3u1@ad!dQHYDd?_@`^V4kNnZxwWax5vJpd;1_{2#V=U|Ylv0s^Ist(0&+ zE4wqMfWcSnm`NmTRgrechwBF~dJI_jHlzUmI{wh)(;U(m^L2}5$S4GOe4H7E>)IpT zP!@3VoAz^UWJ^Ik4xQelo3%~QC)422kAFfDx87x9X_f{+3Kshyl-TM%y#09gl;a1n zm)vB(p|%4T{4v8;Mgkt63UWwTJ|0Z8&hkonT3nyTjC=b~OKI8Z!fV7Z2lA$Lpbmhq z%s)k+h~i>$gy{dpO*Q4y*C(wWf8!Om$C!Klet1<1q zb+0yM<)fq{_NvGe)PX~JjV&mBLt<)Tz#Af_-E`BV=d@^@$`Aw9t*Lo?mgDt2Ns)hV zyzGk=&DZb?CsVCwFjk@!t)MFJSMZ`gI5%5rXpn>M(M2t8UTBKC^SR2#?;YZsb4&Y& zYbl_Kob3$iC++LL4ow$<#Qq0GzB68Nwi&<^r-_qOGD{lla^*BsJQnAUXSOwqxu@p# zV&K#(Z?_CYY)~%Y;Vz zg^a1PZXO?p#pap6$}KsZj4gBq7n%}Xz0#DnX}%6?OD(ApoZwEOM|+0wG8(lUp-gr- z#0+BgK_~+C4oChv>pp2V@6hyi0?7OM81)0ErlFKSU(+3Cfj!6INhLoLO=6OT-f^;A za;glryRS(8dRS8qnE$SN=+xxbfft?DOFq+~#7lmD4W(({SyE{A;#^wmPcN@3wefB) z%~5TOj7Giv)UcYb{VGpxjX&kzivKNdDlVd|BkR@qesSy#u~bvh2B7i;Y3@J)|JpsZ z7EJFNEa`@^JYifU--Hi4W!2V-r}b&rs6755&Jy~xW5I=7VIJYNiV#AL zBJP4A3iWfAJ$6$rvTP@nIf%1?Aw71k>~a`lWonp}uvm)|0M3>0eu(j!!<*Uuptts1 ze0!8bYe^fY7C%cR;g}kyPQxRSU3j{?yK(9A=3Xw{OT_SOmN;NBFlU^~z-?(b9iP7k zCkIo-u=+{WI&mUM%QVb57V+Dkqx)AN>Y(iLu7?^x4JD^q-1Hoo_ExU`xHL^R-NjTw zjl-Ohh1sgFNNMz2DhiCvb}wn5AcOo<0sUM2WFq-9VBSVYhzqB&sn3!udOnac$v5!V z_dAo01iHuW7ayp+sm$&rO@5B}5$`d0>pXn=c4&%3@1A9}J;K#ec^~8|_JJ8oJ*29G z9{!iD)?5Cp&i5cozE$k-CAbP@lspDKul=a$Vp&;TaZ<6~Ro$w1Wj*D>c@Xw-cmjby^$la)lxO8Fu7FF=1dIT?z#{qpAuk`W_&?p&wh=|aNm zF)~dDfq!0n;#1pv=~su^V32#_@p(_}Pm-O?aQHxZH`%b=aGDNrs3 zj@VsDnK~iV! zJ;y=eWFTkXEXMztCJ1|$skfjlBN#Gi!22!G@%W4eT1*!0wv=Ho<142tJoli0tz$A= zS5>~`XP%6sN^Y)3Z83=duDrlkqs;1?b7o-jD)7?g@86e*k+YZ%XA15n6yBuGoD-~- zyNxf))8%~K3(NcVr&X@W@ri-b*kks=EL->jX7XcZ%~>ann@V{A>CR-~%Pwn;i2`e%T-8{9^+lZhQBqV5{?e zKUMNS`9AzK!Ld0zFi7xJP)nixmJZc(=6bpeMFS*NYngX|gRAxKLNVDfV4nUIt_a89 zZJ|^c#f$_3Kxa{Ce)xddcGpDonb+GB%0#E7EmA`ScFvY}5pJsiKf?-l~$_o%=c zK~-49RyKSgr>W%T6dxJmg?L3vSKnHQQXmWD_peLb%+pfLWfE1Y$SwuwdCwev_AHaBPmUCPYzZINb$N3Dh~O$ z$5@{^qve$1z~ujGbkN8%9zU6C;a!kFHy$5APtrTSp+N8;P;Pgra>0Jd;AFzCtZpSX zG#?DMN1l)neJ3+{6E4p<8#b?`4Kb1OUTfvQn{^@`^U&^1>v1pAokvXlc0xUkPqwT! zeK|>At|cGqi@$NGl8zU>gh__Y$dMRB7VeLgoB}Js$G_|+YC^}Z{Ycx zc~Rs0dy2uS{>UV$tFql$)5*3;iDtxBo!0{mXGlD59qxQSCcARd0xmmOXtT6XUYrD#zL3(+Db@IDZef*jcSWkFzWJcO`17OH;+APM+PdbG%lt# zhEUn~kd2)bF_I}nH@+A$qk5ae?~4Iu&WYfHUq!4>WjXnF>oh5Bd~aekMMd_{QPJ?( z5RN*HQF%2g>?!`R%=MHLfIhPS1uxbQZU`L6#s_~bXktA4StF#S*wNomZ^1qvWMk%D z*!hL%uPGy#XLlP&(P<}A+8?o*!Ys)AFAO;^Ixn!E$67-wej3i4EGW2qdi{6ON+pxa z!_UPtJUh>ws(klVqQX`}t0q*wO#ZQ&Jb>W&qbn>vm)Yn>f_U6k`7UYcNi2%@()exj zb*017H;gD>!?!cx3fCd+fx=-D7c75L5iL!!TgOqL^|u7_q{S}Uqlxgo0}>l6X#$9hN$KU5OE9Sx1lAHJ{wwz-Tm$Nm@2(;K<1Z7wpl|8VF7n^ zv+%&Po3!($##o)2ga01$^=``bXwL9i!d-m4%AI>9*C#zp z)g&zjfqMmz`r1H^W7$RSD+C?SIXvBLvKH*ioW{4ZK*06&VaC|9Yx+wMq}osAqnr8w z4ygq-2h_#v?kGoS-H8tM&pJYiWJS8IG<{LssIQAKj##{5xJz|G%XNr?&dS1ZXq~(Dx21+D&@&pt|4$Ee+ zK@uD$5mHGSubXhi+q<@u?CuA&f^tbiM-Z<`@%|KOvs=4d z%YnzDvl->hN1&Xo-xv#uBe=>Jo5N*i5G)GdQy7*=c)3`Y&61{JrD&|KhP=(UI61%V z3RzF7rK>Wh>Ru}&FX+#*os9i5!Vx;zs&uHtB+$?QCAL2f6Z53>-x8Z@3hXCq5E>1B z@Jey>3>tf3dDGNGqn+^%nfb-15fdyf2V2#sZ*P-QD#ZO-Y{dIrD53ItSHXn;wttx+ zM=EDbg{12P&8^4ftxaDCaMUx)4~9oH9cM2CxOKa>dB!&p))`MG46m#RWTUcyPJ!cf z6@1?hSKeRrJyCasX`BSx12y~_Bjd%x$`DqwnB=PC*|e)&T;Bl8XINbb&z-KPWKFB! zvpD?LQr17FkiABq$y|cfMC@GawV#0==+sjeNu~5Um&iqu283LE%aV7u=i)X_T6|Ct z!59W;1uxN{NEyGNGuGbS_|8}?~L;~643~bw)nQjPV;oP08 z^1O+dq4!Fw6u$QCD_YECgu%RaWQ9cTo*!Fs<5t5)R7MbJGMx zF~R;lwIHp{H&K2Fxw=TAT8Tq`$N^FZW2>A993Ryy1;|taFrYH zzVIk6PW*=vf6?i{6vho1IhuDT9sR>6$QH7G_*&7@fqiqwyl11z{c5+);G&m_+_14aMW-o`HHjeH9qQt3*Fu_Jl^$f;h7<*U|(^bM+;d? z5%2%G(8)?d1TBYcEC~VswY4yVSzRP5q&Qjld~@OQxky1z`S~gpoR1xhmLm6ls?aE0f9f1L(EQIdeoS zAI1QCtY>iRXurBFJ;oMV&R~_=#e58kn&WZ^Waywmrtx(r3Wqx6nC^6A? z-&V!&T#JB+S@l=McI1HqI6i@OoaV+zYVIvNp9u0)sEFm=?wmNNI|>z|3YDrN?hF;^ zVK>`mo?iJwbr7B0TM$EQbJ2LV;*cqU_V=SP^1;7>(Es4G+q`*W%A%iG=Cu~)V`knpixUYv96TF%HWiw{x z-&U2Y)+Pzu8103aVV*I80>#!{{b3|jDnw>Bq@=ZFm(?@KVwLc*neBK?+WgvdF~B}K zki~h?Iyhf3JnrOExJ?_cW|%bQt^WZ3XbGf3bciirs6pW31w3M|p$#@Y43Ib<4?fp9`g1U5*U72b^u+ zF`Kg)X3bHk?`D`7c6+Iuo35U-n}3!u3FD(9nkSqZII|%Q#baY>ux(UekswQ1ZeN13 z07=c?Zw$uV=C&?T7u<|ij=MCdJoTl-^9eV3+J0gwN~_c$I|f77!3pVi9OYu#3JftC5zGS*nyf1F$9r}8dI{*1Iu z)ceAINnx&5=+dafuJ`*MwI0I#ZyqjkYO607xiLzEjt(`nZmg=yNL3cpDk=;|zx}G= zU-15014IrpbODuo^}nEe3YmD@ZS_vME$jKA!UGe!1ixzW?5*Ystfz&@C@a3gtTA>? zc5|xcA|*ZdAymVD)4Tmo5`^6GDqUh+LV`;XH6r$-aB+ z7MC{32sX~;kL!PdKL8Yj<+i7d+zgGjFLGAT;oDL%UN%`8Aip&2!8*R3FTUaRYX~tO_GK>hS>kq<^icm1G>~h z#{>OfbzWlH}r`JZrz;Sw`TZ_9w2E%4j^Z|hYlI|{bL=#!Q^OkqX_g&nWTDk4n z`&vB3nvPO|A%CPH*cVBNA!4%r5;*RMM2*} zI4iuxh97g|X4SvPPj#5k>W;YKDgwK^Lhe@WtDOFWRC?PN{oub7w|c{BT<2L$3i-j~ zgk6C`u)7a6RWu3Rv5Rixc_~@!Zuk8#S(heGjQj_R;|}f3H%CApt+8T4+tScY@hbj=0~8ME77$QC9o5CvhcQeZ+ZRty+qPG38(Q)&>HODEu3Q zkD7ZfRpvaqxQbMW95=Z@f%-MTA3kR9v-Ft3j&`Vmy8gTF;c@OINuS75rzdj>7*%g(M!*zoy>Dt1!vz zE7oiyT{2QKB3Uu+aWF~hW9JfFtIryyt2tNSUZ$C5sM-AfLe4LrW8oKw(LzVGxGvQ@ z;~G}JL%$dwC#<2W^qi#ojBAh_)MYOqcyBgOkXey8*)P6d+X3PQA!^sY!E8u}p~m{r zfdRkLs;f7ha+7rzS6}0=SnqVLo}9(@ckLxNEu`hV^n#j|Ff?#srv@&bNgPVm)2QKw zFQm|t35h1VZnv|aQelP2DAMYOobncMZ#iUnA__mkRE{T9*&Tm9h^BOD+ir2QF5Y~8 zOv$2qS5#aqOW9lhB~2-aKQA|U@>`+aMqXw@x}2bfREFANGk97kywu->GTjggP?A+U zX6sw+rBdiH+FlMj9xNuUmnHRNt8NUzM2;Na7fd%4*cN~{iJY>mE)~h>6L9T<)TnLM}ku+k_WP|nBOWV3IBt}OT= zJm5^Uh0PsS=&HA)BaC|%TD?*P>6g4vDrTx0_^C(kkN@|GM9M|CIw(C@mWbsrr)}Gh z;d*07_<}p1_^V@wCe;n!5=Xpetr>za?Yp4ZGijl(dP~s`1&Z}sd@4r4$xk=qe4Onr z0`2cp9X{PzyUBj=*&DsQO8i30m|iI&eLOKo()tPXcF^ANUD|&BywuO&w-us$UIu|G z13ytROaiP#-9e-+Bsy;S4s;V*8$-!jqmp0-ms^vujFyCU(S~ zNZx?Omd09ov|v>&a!d(j>s7dcj2D@QI)cCu(e`mSJXD@^9b zy(+p2`9Gl56S8f`HNy?ii6+%^C^wfA{7!Bg^d*R>UE&cuyfpCluPI5Y4Od11){G!u ze4|Qe#7~xqJYRj05OjOSoobZY5^uEVGd|g=sw#n?9vHyp&(JbO|5C9o7}h&9>G=tm zOOre-i;2W{O+m9Q_AG1=lUR+}1h4HiTu`R7ljU^+t)A)IWYbp)M)pVIc4_JBD2sA{ zkgRX|t9rqmpwGBSi%i7ezgJRC^m!Ur@r#OMxb~-IUhWRXn?asAYq4WGS+S#;N}zX~ z$!@(K;3~Q<+0p#QEYZ2w8hipk@HIzX%Mi}5h-e~l+B#GLZvLv_cE{hGJ4BF_BM zN4}8d?=Cfm=)>LFv)r~2aE6c^QOuiy&o<&PDd^%ju`cErTQVAxV9XJgQ9&CUIn zrs{^`EuvxVnkXdW${Zs-zv={AxbM zl~!P-qT)Iro54h?*I+vK(_%E-wl51j<@~1U!1t7{Q#`&mB^8&#@x=Gi`L zzPQShv^lHGy)fa{aIG8?9xTn)y17`rGJj&P>CtVQOy0zgU^9?YkcJ-=#n2D@6sES6 z7_RN^+8&8M`mhtlhg2^3VVu!HPY<)p<@w5FWg-}o^*V0e&XLQqp6HysjpPCik#a7IbP1(6n zQayY#Jhv%2c=kKXx7WmjCg5gm+cMs$gj}XdSv28f&S_eepP7SjEfIFo+*DH91tibP z)8QJokN|yFN(n1CgzWnW+nn3AgeB<99WVIkE~xELLGe>26h;lSnZ~*6s4P1B)z)tI_l(!lH=-E^L zE0rJ<>5K8$5CgJsjyydIikt8uonAj9V4w$=-2-Qr_{7!Dp`l+B%k-9G(i z$YGzx!P!`$!=TP<9Xxv}?DhQOVmF>y%r0|1!!EE8570j#IOcVSQ^|}STfrd&?aQNy z*o8l)=TtJtv$d4O6%Uqwve(a6Vxh6u>nQF?I%#rey?Cy?54S^sordYx-kVJ`v`%i5 zWrl?><5{1%)C+G-@cD)$=!v>PNM#rtQnT6L<9y^e6B%lidFKjg7MvXwtCY#hTsq?I zm%bW(WF$NLUD@lViM$q)=U%vUy_D@wmgS3nx;lOKbA-4U6|nX&3O>)26-@%+R5%KCR9|>CD{mPTMJg zRXSyvy5LSyDf@X2VfzTlVNls%LbB^DNv%lCwtAm(?PNK)UzJT)Uk^x{#CEQii8U0wkt} ztzeI5c!I^>zx3?9vb`r!`O5ec!rOQF#U3wDE&#-y$fX?T$Q48{7IIzur(c_(bba=A zexBW|aLGgV_a-FfJJ&z#BTw(7qr2$wQpkb4kmwO5f@}iw54}2lJd+GEiv{^quM|d% zGEdGCPoMPDQi1FJ$dT1;Xgl$3I1|vrK3zH7Z&S!wnb6Pc?uw*a&EeBu z!3@|KS@~Kqhn!`hkrQ<2#3;Eo!pVgXjQm(y*G|nN>xjv!N#+T~AF$N2>2PCIr#vy( z{%_P_>YH6L?%7d_`Kku0((a_wB>SFAVN0V%*b|Uap1;FpE{VYPd$j}wH0Qz#P6_&W z>0)v&(a3Rn``#UMEIRCVUs2!#5)6D37M@d=sQ5+SIpFf{0VS2PB@m7U8|UoGoCDJ^ zFt90l%HBH{FkZLLJX15J(lGefF<1C`JVs8rL3(iiGi$rq)99ia;SHhH#}l7Vxn|
?=#Bgiv%xO6|ogr@9Z82+xC^_f@~Myu*PJ3Pg*)INHvzcCNlTA zVc*VDwk4r&+d4t;IAUbW4)H)RGYz+tt3Ut1^B+CZ)*3b7+cxD7{LIP%uBOO_PTa8} z)pgD}^uS8etuW~{Fwtjl0nsSh_`K+?Ar?Ty~4?FTHEy-Ue0DB_RSD_3F@i^8& z+5IGKNNw7?*g2IF?(vM1ThG7>5YLP$vg__WKNi}9T?PG>_Ujqto)o@zi|v)r<5%y$ z<)5FOtrC-hY|q7B8}lCG;?ZwPzE(Vesi~>yV0|b{Jz_&NAMJ3Vf<|uEhladR{te1D z-QNY|+GRF*h5&@m;V=dDPp0cUPX@{9H~~@4@?sX{BdD*RRu7((fMW0g2^s4wAL=Hy z9Msgftl*%lC+jt_HG3=T>ntIctLWe8%b`6xmPRT(KF|6$4ktkT-H~)$zlkZ;XNr*z z>%T~_0tB8fI~e7yT7M7RyQwCbI3tT3{NRn{O17^3f2(o7>+?a1wALO2aBzFf ziL*~_Ul5C$!k7V2KNt%29S4Nbxb_F^9!}+78Qi9C22TE`QUbIq*T9d~D8=Y-WQF2bK0NYx5-kMEOd7NppY(-9}w-{PhZQ1b@$a^)Ac(IO{mSr>}*eq90>&oU7qh)jE`*`znr@kkE^PNuW_ser(%2Qc&WuJpCI_2)X zzpJqU`%9{jvrgE-(dL9Kd&Jp9-nI1gX5RHPz0wH@6*27OL6`v8{^gvIRi6=~t8c$Tp^+DR?QFz!^Y>agB*7+_;D$MXaIX5ucPn2{ zw6A=Z|DAVzCUY>X@FE-e^mit!kkA ze4;*1GGfHF+fNP&jQe}R^;d2kl)$GS%$&%jnBX|Fm`IG%T%{}Vwu@^dQSJYBJHr7{ z=pU(kdD@;>vrWus$_aZRZ+01zF0b~KW1U$Gxe^X=P3Z0{6s*Br{q1;%AlEz0!_J*m zSJcSs-|}fzjm$pj{J%gC0^ddj{r@-Uf1)w2hU?y=tii(HEX6NXG*8OL87J|96wJ|z zy9of*j>XHzQ~K>4VZG)CAN#$nt3(#%WOZ=gn(LA(FRt zhiFwP%<%@>*YwZEKSjUdIM!H!);4aT)&r}c9J=5cATaWSIGSqGp>(`ZKL#+f*RGPbYHUr6Al((dqkK= zXZC>L0Xg3ConKt&t~7(L4rQSnKDP9puMZJZlQ(RU4e6~j!2-2ukCp+t6F-GDBM?@c zNmjpYS-t|A{5}2siCam)6(940{nj^)R@ySeN8b(vU7hQ~gRh?K?(VMa`ov6Z);E~7 zXJ5>m1`&f)uhe^fA!ntO%jS2wO)v*K=+y4$if4cr<`!zC*C(j$v+Kw_Q8&r%(!Ah$ zR+p|(WF!~-KZ#h+$BMcA`rH+Q$DOJNj{j*sDl+ilrD5J{x>iYA9{06kr{tKM*PtVh ziFosGps}W*-tbC?M#9FMITEB5I=K?r3m5Jiw#mJ2%vD(3WhP{~^yM8^>Mg7SXEW;F ze(M2YXql*%Z}=r^%t7ZHGtxxlE+2o=(r6=CwVvRT9=U!0+IG`R_N3$F5Kq}BIbayf zH@B9mkssg0Ht=wipDWpUhWY0aA>sFhNAh6ga4_tzs^u!H_3|c1UYRY~^;=#ps+k`* z`jgWFxhPdggu6)U{HhLiSkke5J)8%mNW>(w+`8JS?c3p4jbUPjn$tydygq1A!PuO8 zhcvv)gO}0Qyl)=2e0NLp^A|YYo}+#G+s{iLo8?~lW_v`B0)F3i>GJ)h0|^J-s!}oq zEihs7^~ppQ+J7M>^3J~ZH_5hd?b2tvZ1Aeczk-3U3N_(!>vA^F-hqg@@1UQW{~zTt z=1}16hgiP&XixUl_4Ow_Jmy5Wl;ssT!vfaxb@FEWX2r4ti^g2;TTA$m>T|eB?Ouh}oiuUujiZ-Tc zx5w(lNoDjch$^bI&t?7xHa+Wq^&YlkHaiu| zVZJ*)d-y?5F6hnNDA}zA>nAGfq2Fs99HShsDcsb^sC;@Q#U*cR=I3aMYt3Mk?HzXs z_f?8tgBaK}HEjMIS9&SlHIznN=zr-(>*?eP;}15QWJ!LC?9#ywkFuN}#C<<(Zq6fh zPgVVUXT6M2VV!#+J7_^($3Ec!_#R<1d3o(R^VTt~3#9qx0cpx0S4$Ucp9nVL74=|*j+2rh9{T=Rm77Q0HA6YmqAn4Pvi+ubq34e*CW(Vj)i`kUQ30hNw(R}{ zXNTyAp!1KTi>Je^_^M>K#V)TJ|39YQJDkn-{R6g2hf&oQwP{Ohmf8_ot1UIEHENgC zWA71?pxV+Ju{Tj#wD#ViReQu%GYEp1i52s``+MK-^Spn>A93V3a$h;m&pOYGMg4B` zL5S0W*_qZ^V+rv~+RjtzAowdLbgT9G3&vX*$H0!Zvk1U7n_A|W$YCyxCVebnOgbU?IRi*8oXg* z_JYG4-i_%WYF2y#5)>kX(FEMj5IV=}Hh*Y}D$UAlo7ay4Z+!W5e-(ItnAid+(?>YX zb#}Vl$TE-vI8zTJ|BnvdGC&zqU4}k zdl?n8hXzxDgbtZ_U|3yu&+j`%5op%O=Pm?6sia;T#Lijn?D!h;FA$i443okc0&V|zhYp338SN(s4AAl$7;f+XS9+Tjvj6!S4_^ngy%X^9mTEw7qW zONQ$uvD4V%Qu8hzXDj04()Zrcc4D6!O0+m8;jbpTH<2t~t?L+P%jiXGN$b*Uy2NlS z{mQo}ul;PzOR>7j_w%=o_of4DcD7n?N@m?B;b-u>XA6+}!1Zw@_{T?bJQjwcN?Ycw z-i=WrLA`rM0<_lml;Fnut|%5zX?sUb62aeHDWBT{v&_?--gmEGRjrOILt#w0qo#9< zEY<=bgt;#tm1rS@gJLKu1yF1oduFjWC(EB38`Q}xZ39W6d~f+sKh9sw6&FJ@$7S1! z$+`F5WY(}k*>vkOpKlhJISlmtp5yw`x~P%KncxHO`-EsHzT(p~Ikyn5=r-#escdDzYBrpa5Jc7JoJ9;HUnXi?>X%l{es|?PWed`o% zpSmEiyQ6&Gq5PW+5);>A&#P@1k*5zm#0Q?$_yLW^F|&24w-q;k6^{MO;}_;zLjg!n zx3k-Nki+v4z(V18jAe0aDlrnrhJ_uQpX|5>@|;R^*rDK!pp#=h^vN2*kF>n!vhMD^ z1?WtvhcBWTrb%I{*t`6y&+CUz@XYBhK@b1!SCettGBp*I6vB#8)wgO|j!fL|_rPPr zL>(|2^56C(Z=Q9F!pme^bTel(Ux!nI>JC z9%6n3S_?0iPZp}nwVy~W=v2eXwdWdt< z!TeCiTXt#XHSqS+MgMv4Z;60qyAVwbR&}#|b$B7dG{gJ31r4F_480Xz!xi2Eoec?YN~pMxrixhQ ze%g{rc>Vpe&f7h6>fTN)|%Z4OTZ>e77ZRvVKt z$kM2{_C@uo%iy@j+ZnSF+4)-x??|hS%S*|YMDHF;!O}f8{0^tqZS&vPJ*TIq&F-Q+ zBZkkuG_1V&9C)~OzER$1O=%qZ1v%AV06QMvTIfrY9Xwbv4S@XlD_0&K=H%@xcHvfz z&xjte_t2-y$LfZlZF|nu!sepqJ#_Cv>SIlvJ>@vxWQu7lywHDNr1L$n@?y)s0d8ieB&oOn4mhB9>Aw$tsCNJdiJ z&I-J%EcSKE_{qLD9Vdr0bcH&uxv;O3?x($SYzw}i(0O+XFQ(CZGpJHjZ)CH`-Z)sd z{DRz{q+=q~CyCk(=yKc7E6u7u*;bG+~FjEEJoMUccfY*#uGGQ`ywr3EYz+hNN+H~j`FBrT}fL` z3%4=kU0eYxs6X%>^#!ABQuDk=SNb*p(&f8zv{wKqiQHiStAKX1h0{G>a`lM|ZO2yR z@%#pw7PC1kHt^i0?9N^XDpT_}@m(}fpsL@^754zJ36Mj#aFrie73J=n?wa#3dvZpF zj#5|!6f)_uY2^*yvj7FME1zr|oa{Ah;ToC|JXjcMeCgO%xybs2-W8nD&&tlNrdEg- z1qbd({>5Gk4O@taFd~E1$ud)6eTjn6bFPQqntyGyii9*aAXi}zvin)*nmB_4 z3tP$fl(`8*y+m>DPL`=S6^olfw|R6S{xA7+xSLA40(*jl=&ZVGdQ3_7QlOSopAPC| z^m2t=GnaPv&=|~Vwqz%6FYlIaF%ROvJzC!oP5KouD>hOV;?8-#*pag%H`e5IzJa)1 zQo&>p>Lj?8mhNe$JKMi`;A758cX#s`5xG{M>x32+BKTd;yzE^n&e6gef5-W@g^j#= zNbm7K<(t{H^KQlh?DBsMf`0HP3F|fIY0==iOT4ykQX6;}Fnw@|^;xYKi~JfchWe*V z7Sd~LZBmada4zl~XhRR%)f1|DAbAhD6$>h4Ca$yStI-oEViDb;LUbZL3xzhwZr#<- z+{ehCjg~_n(Mea zrCy)s`jBtZMhkr0(vYgB%a-ltoQN2nFAB%zsdmy~iH;avZCndK^|#~vU0sC3qb%Di z?0A4i*q$cqyW@JkkFRY|yuoB@SsG@%=y!Vb>SVvib!Tx#(EZ@;r^_RHU-?>Ym{uK> zCp4HHZp*hbG(u+U3J;Cnqau{>HUFI^@9fjIqGqZX&XaJV(}!onj5sYx$>Rt{C@tHk z73?*&&qCDybPE4eq|y^<6&QKR+Vg5ALd{l!dda6*-TNtcochsKq_Ib4eX;PmL(>DJ z)r-V3Q7N~_#MRgPZ`4=YSVy=-x`V{9T`LHV;qsEF*mYKT4U^;#$~Uv(QkE@S<3r@8 zntMs)a!?ePEvzx}oQR6)>(ElWe%eOf?ySBwml(N}YEe1P2tZ(Ngnhwn&&a*S>V+dzTv?m zn#v-=8I!Z62{meT4vckxsWI59>h++*PYf&BPFK2kt<+xu#lN5r98*i!&MQDI`s#d zdPguQvRcB~1}Su%XBX=j6hy~C&`=On5Ehn( zbC1-Ha8b^zJ4!5C?k92L-6McLBV*Bw;9_R}d+282_zeDClizv{RXK|wl#V)JXKAr} z?w;!u za#lTEwo@w%$BKl^C2G>vM`|}n@Lw*~t1fLG`SnP&q+`QkYzZN`bsoc&Ay^~v1F}prNBFw}pp=SXl4eKKBl*O&S zUv$>a47<02))XqotlXm3HWReakjYKwIX54+d_cPzA6Fh_=4p|^ZkQUZ=|mxp>>Zk4 z=Iy(+2JTQGlok&ZdO|X=964jF#&2m8^{So9w;#o>hC?hkE}9$_7CZ6hQ?m7Y%1}0M zG&z>Xly`|WY!L}RztG(`3dt{7pVw8jCW{*(%jtr;Z)X8!d{Sov_>CA-b_QPls2G`+ zhWnSnc0AN466R&)?>}o%>zIzv3kDHd4iG93QIL2 z+eH24-GB;RViOfcCo8+-8+dLBcw5F4P;md}uF{4TIR`u8!$WZ<_uSwwB;^r9JPB$) z)w53&>wY?mSA-9#{7Z%$;^U@#8x!S!RZe-$$Vt zx~<~5rzEmLX(b;8!t#3xne=@ZkoaekO@XM~CD4KVvj8-0r|lW+qorJD+!COfQV5ff z4&HA)-uk^imXhXa%$3qTkU2!+ySjHI{ghg{%Y$UZL!31tdZ`_ZtB-D%K))6h>(eog zK`rNu=cebqA+?M-ubY%P9fT>O!29O%!EU9;YVO~go+NpzZM_7{ov*{f&1cro@XcWW|BhRpOXsc@N0$&1 zSzo2=;ul~Hx)ti;`+#W%AfRGbk=e;=GfMf4es_?MI~(KRfvVTc{)@;~>lW2OV^wlp z>L2f(n@eF~tl}2!OxW|QKwAk1%mD1^3~C|pv?MUn{yvY#@WUIf(9Qa#$TnG7*#~{! zb}F3RTYEYc` zfbjF`VNK{tGdU3(=6r=XYt&i8(4ad<|k-zo|V%^>06tvTi<$^xn0sN_)1Gs#rHOuU@jT#g!dalw|_{C66jmydNg*>>6| zrQg<21~OiLK1|GJK#drGG{CyrT`6a-V63NK*2?_D#D*bcD5Z&zkDa^cs@A{pXVmoE z(Jd;b>a6TfCiXpKqnSmJ%rdo%N9?J^hI4uv8(iSaueqCL_>f1b2dbHTF(2?QbiRpk z=MtQsLrav+K2>Y&?@CcIfRA_SsM*2$9xuOptc=v z)Lc;pvO(7Y1$ky>W)cCs0)jGYa{#fy?_@>4@pv=t5U?0Yf73e6nvLTbv&yS0}Cn%2)GCpUQB^uqJK7cOgYGWj?29J4}(^pKkd@&h%E z+OCSrg49Z!xA*qHBG;@wQ3LbE&H04-1x3=;d|T5Po}=FmzDGW!#thATs|$IKh`_}5 zQ%AZGFHA6&KF|GXAGA{<>=ss9MHDyQ(-|bWbs#+hk$Z>#M$cGGY8c1Y{{T3446hsQ zHq<=b?xNn?daGM|>RgwyKs1+LiEU}di!+R}?a04`6uDB4slN*}xp?==PFI^E7oCux zX`X#*cFilKV`NADbQzdll{vaWgUKVC`y>CG{yWzX+luS%!^tt-4etys499Q8yldN| zS@baBx+<)Y@qAsqlE0+myyiww*b{-9N?4a)pN)f;BFaBGWXihjpo7;>)O;y*t|%SY zD^ZoJ-4eR2Z25Wqy#cqG)|rw>rV4xH2LQwlsyCAQU5waGWZThCYFvo`z7<>SxIOsu@sb{yA!GmyNM%n`m%=1E&D}GH8j-L zL9a4f{xwO(C|(!Z-R5?6`5a9cFR|j8@*+- zBHI)WTXM;)k>ziQX$cLc_UTFYfW|x=qj2ykk@FA6t^X?<}QIiB>nNP7KlB z%_=@+p7<3#q{EtjakdoF{3RH6Tf`;=b()y zzRvYtfHbwWq~)Wf3Qj6V#xb(eIFg!+y|k6}W36)EzRyW8CrLRD6%%z)8)p}!OMB#IfsJeqa2+MevD*TFy6eBA0^HQQ_+`j zY3rfI!#~e$XXQtX!(}yX6{E=)@zpSTSbZq%+u2=XpELzL+qy6=|CL(0aoQOI9@Kf z{oe8_(P#2Xiyv6LARup89)Tb`p5T;EJz>Wi2f}&>hdVeq&QLkvNgwq&pB&=C6U2kD z>F(-uP_1I5I``iL<5 z&p@hZ***%etX4w#qB?8&Xx zM~bx-8??wVulhQ%uIKx4X5Keicxtojgi%9%oi)z;`T0aRND>w1qd4q;J9^E|3%T~y z08wDEM{h23|%a&yv`8DH<_jHS^Q@vQ?3ZqoS4$gy7&(?28yuDGst2ErRt z1ttqihJbBHMmM|it4Mzi%ZQ_%$q4T<X!_z&QXsizXFq-eRj16SBXW_ zXXxbG$wA<`me-)V7c&q#`?B)5>#$E2+W}-+#p~Yj!JR$ zMG**uBA=f5ma%yaMV%uy8P6tG&;;iGit?E9nmU{Mp98upv*^>f?n>8u9g5G2caoS~ ztL$4Xc?%W~tgwLlE4-thru^mc4^utz@hsO!4o}fVb)i&t=wa(QKx+&qvF6dOG!Ix2c5h; zeQ z61PlGO`Db+Y<|<;TD{e?RBiUoR^0OJ1^v)Eg}Ft5Qq<1!e)T{o#{=$!A4mU}csZr# zmbKa%Ef{A_(V~D;UzN2oV8Ih)T^IT`oVABJL9zozPXkXkM*D-Zm|OLZYUACxJAmBj zcpH?qEjcaeNpr)n4>;@Kl7<@Ef3JRkH0FwD)4cUMEjU@p>7;aJfo~|`@_{0 zWTa7!{qK>F{G(egwfazeTx*~eo2ZqRJYH+l-qTr)8FU|O3M0boYD`m%#LsNtj2dqn z75>~kPTW^;4&3Yy|Kp0>&!Rc7p}9L2Md@j3c}^quU5hAz@uUQmBNDzBjqMi1qhi93 zc4cxRH(&#JJ&w0W+07bOAAWMLn=&(#DzV*bh@u(@txp|x4qb!qTkAQQq*vSqn+pSD z1247W$ou`RQ}I3f_jVcURs!p0K}>-K)2}lMTTfpk&3LzW>hJqT`6d#U20ISQ?#z(u zi1Aa8oH}ZOKxAf$G+&*>br4}in-Jk~ZKrg#P}`^x?KlU$C_r|L9)yy98WvQvo941w zlrVfPjPsjepL4ei?K!M%56NrNn4oD30N2T3`guz1;tUKmoU^~0^|F>xM8U_+t7{Xd zBrlB&T(zo|gU0JWpbx!aj#oB1^D-7Rsy*RrljN_y^v>?)Hld{1IX*bqm-r zV70T+qy?Yyi(#%XOX6NOhmso8cQnyvv#CF`948SD~ zT+ynA@*~aeV1EQCos9O!6{<@UP|Vr0~TqzD+|1# z<2=0baJt<~Iex!@`i4vE8ux|~l|JJW$jKmbS?BIS_`QnkkDQ=yed~`d#SRKwX}dD@ zUQ(a+8D2k-omR!F-x=nrMF(++@kB(P-Ujyd@n7NKiLs@*yQ+H~?a)l;Hm&JN|83bQ z4)mP%pEA*=b^5sNhX-V`bYsiuVrnyjp`mlJhX{cjOOJ=+7}zOtVKj?s>xA9$MMp(t zaOR)TCT^aBl-XK|Iq|ITKS^6PM9MGd%m~&>?T1pI@4XW1OMP zA0Qr3l!2F?bWY7(fL#hajK_b9pDPIo1M}I&eJm!|T|;oE-=(IqTEqKaZFulA)JUz6 zHX3U*LBo>dFM~MTzA4J`tjWCbyugK9qPN<+^_P+RN9!>A*;x?{fyaA0UwTK4iVt6~ zE(8~p-}lX|`emH?D5fYYpT4`Px+e0=`h1}-WvdoEz^3S5_!cw#7I{=Rv#SI(->)vV z!?zC3zT`&u)98p!wzIBt>1FjjJANTkG)vSnO;m{sJ5wL`PO7NWvW%$)!#{m&> zDc&x7)|a$DQR`apQR+d40WhIpM#nT`E^GzJ@xj_0gW~<>Zo1LEy{PR!NguE+;|*%@ zUIySj!5$PST7&>Bv|i=nc}eN+6I^PE&dl4rIvul3dQ8`@8-r!%8ngVLjD)@&j3jJ2 zDY=EagXmFyY@*!nl}5RDgb(*A2QS*$y|CzRqP+--yKW?JTzh4O`Z+Y65+%{){xU2@L`*96^H*~=ukZQP>A$lZ`so!MMZXzJu|RkYL_t~0%PIGzM1 zm%~gZ5Pf_6rQvhHy)(?Fi&K*M)rcR#Uqh*SfU$`--n|=qRpP1>7akL>pOQO$)vmiT zja>oc?V7`|W=W3{GfFEp?6p2k3D55xSPCDxi(CpoR)a{neqXj50&QYemey<2dg)I^=O`p3%_Evr( z<6NyGnr*(`avdH)f7LDE^}z+P&OEpC4$5Z<&lOW3&u*S3o(rUU1vBG)m}x zj2s~z`JVPufX_3?8MAb1(lZ4-{>@+L!7?Ue@Qqx|YrXVMPqTpzND8;{Z%L)1wGqx? zmRe7Zl&SclF(iJ`>$V2-{4gD&CB7 zq-koLd8y+ZJFMDo!~*BMCwfe0BvSP`an*v!U6zV}mqHZ77baA5S4}MfN0sP)a`gG0 zcebS2%|y&6yVTq;s8ox88l9h>1pY1pPa_+JtAE!m-#VpnkW}tDQ}?sgCpGWr&__>S zfwaMV*7DE)OS*yT7$3KOPjuzl*EsV&E{W;xd%S&*I1iu@14p~aHSdO09}wk(gB-5> zZ5yXU@w(*MN3t$G-W>5L5JngBR2PBZJ#|a?;?-Y*Am#H-b}cHAOePHLH3Ks2vU*(5 zOxs_SqsdiH%4qWhkUrS*x7`$!tUje1VB*-qa!Qlb2CqNvj*f`>Vhi4dqZk6w*FzfME_=2+C0ndPqUKSM{~Q1Qk-G%=_TU6m3ePR*bF_Zz&ZcsJ6y6? z6I9tG#4w)*{XI-O;9|vPNc_uOw)5Q^G?&%C#&z=!%I8U#e2w;1@S){#8mGMjg-mMq z7YfXb+h>T!GTjxI8gBBvirG3LQ|vODYbA|(TV^`4bXS3YW5HSG)nQ@wlcdg9k1VCl zhE@ZqG1u$9q1$SF?nQF&%*tjcgWn%%-8RWJn!&HJ8MWkVsb5^HCw2aVR$sn$xO++8 zBe7+asA2vNd8R_TsI{Y|8m`ePmw;#W^QS6`s2=vE3UD!Yb20WxM_u|77=zJoNEm-y zvh=Lb&u}8N)!KY7J-4iL{9go;uS4^3T62jpIqY=jeq~23ua;o)*&{Wm6NB@kO^|yt z=F!jMDgIfuK0JP2{kMzVRY(?=Kl4=yselkW;ae({F?D)CPCk0hF(nXnTMAA`h1v~0 zxx-aCd}_?YTt=IeA$jeh^;G%BiemmuZB8iq3#v|x{R&UXH3Qt4@ZM{Zd5SE_d*-0$ zKy#TWPYXc_6B-qW>z4cV=|@+-6@7`ckmnc>WMvixZ`#0zc_AT$a{ zJz>yrFOH9=DU8!%w_;qeP4U&#Lu`m*!kJ1pcRl#2`?SPM6chB;^@mT)LN6yF!+vE= zc$G(f|5ofVC1u1Wz@KYB)nBjV)gyJyjBetqW(KRU|1d&YwSEr`Y#$N_Jy)ENw|Et* ze6{9NqANmJ&{uYH*Yf>q%#s|5?tMs{1CSX1oM7_}vz+x`MZ8m|)MqYKUIIG$Se;0% zw|imQ&ck$eLqVe$0>0+#O=(*BGvOmb^JZ{j@U_h=pYxLnBShpLo$m(2WUuu2D1T~f z0RN*IkTx(b=n9D3t6tA)L<^eO+#V^#v5BtQDJ!&ecIpvt=%XLV4bv^vYozFIjh`YI zEZvm9EeDLdF(%Gqxx}|Ispp&ZZs1PSYMf~6HMR8sc6s!izW)dd*^{%N9aD95v0oTP z=z|9ya8-0#jpSDmm*OA5)`lt>duo?Qo6Cyayen; zglxMMbfKq9B_*|DOTqnHJ$FT8RaE9uU-$l_Ev}ip=+U$pyC#bo68@<7E~Bfb?$+K& zw_9Dh(YTTF?%)Sv(nsp0xe!0L?obP?Ysib!cdiMeA&aM?p75w_h-@&&f^(BSD^b|MA!88 zKQz&@L`+#>5`6a*$hb!DYgQ-tP4}-)Rcrd1v)UETeoiVZ>O3E^IHuG7PY_TT1O`O# z;)`xmirE0gP72fPUv1EYyW^2gWG7Q0XJ5)#cHShiCHi8K<0h)1NxK8JG~BT-^mxpG z+Kj)u^LM#YwWCNJntsFSNNJPxY4dN&^c71rwH^NVw}P@gX22Mq+hrTO87)`fa{Dzm za4ScZk&Uj0TdC)1P?(D4R6U`+xwV9zHUb&^cI>gD(8_XBvR*tqQH}p#s zhB0(iYfB+vkhK=m?s7}YKa1vP2OIMA5kVq3K?$1e+WUG7pYw+fIX)RpEW8j4LUgTs zWW+Ni;_5rOV`DY5u)liB8In%NTeCwELPwnspFfCXZKW6PMH5>+raOu1kxumg(~WOQ z-~Ue72PR0xCl4wutHKH@>9yTWV<@KIN+qsBZ$~;I6t*Tmsp2#6H~KxvzvL!Q7q9~G z>A^hnb#z%6xKEnL1g)yJKHJ@JNUQpVX;ghG3FLoWV97nO+nqvVp-c=L`DA7o^QP$t zp^)LDNHf#yA+I!vJj)!Hr&pyvy*k`TSJi!%Mz^t&iSIcHaYU>3`R*U5&|92I`*YC$ zCe*eE7J+%vj{3lxjdpU65;exTRJ$Z@bg!awlTbTsF`9gy=tLL+6#y&-}D`MxIXg%E~dJr7f{-Gkcr+1k*m)x~~~ zbM%1P^(Z{0b&-f9#Xi4UEliW_KEqr;NDsaGa#!VpA{gtSC1v=h27TU?k%m< zUwePsJ^NMj>amC7lYKX*f3e5QYt9an=xJKb!!~s2|FQt*@Ahx}l$peMWmUzgL*X&< z;m^XuGT{9+D?b=D(#sGU%tJE$6yjZc=G&3K>NT*6qzWlz70D+_y8)b5Zf7RdYUWS>`T6)`={eX zZ`2{Wyxb?B^0_q6Yv`%(a*|?m6%oV$t-U){Rqs$9CK(;EBq!7A&*`{R4~u}xPY9B| z;BV!$M7ImuOFDB*R;N79+`*S;zQ;*@M*bRa;kTsJvv|h=t}|!(7#AkoS~AXGly9Zu zP}Oc^(VcRy>k$LKkI=v7rq>E7V30^mSbYa|q!!`Ov(R;R8||)ZcO9FMJagO|r6_QO zPISmbJ7HbpeeHes22U>sQ5$ocYs$;h9uDXs65G&(IX)g2|9r9`_0pZvTns(Ml%GhA zN`7Y1RuWyRm^V*0p?iPsGvD6aVBme5)2(XKL*vl1rc)u)-?VZbkl!7QId_1>q`Qc> zaX6=!QZfGAyxvXbN4^#n3`8TJ4Z?od`)?BD2aB_XScF|i`#>fsDP+K+$LaaR0x&%Q zCk>fWDAb3dz=a6bRmdV4OZep=TkjKR}17SmJUvRfW!+Fa=oOHl+0fE>HKd ziE4l*1iaIC>DMQw8>m_#tweF$43yuMovocv6$~#bbdn?iwhLq_Ak@yTV5z|{Gp~#G zylU6PT>5IMSjgREp~*izv%6mJ2K(+!b=^z) ziz(d1`$^EA2NlW%dcqFe>RNy_yf$~U!>E@T2RU|T%27EvdIYTXS00cLX5KY;?Q&|q zmNNEg*a;$=VVA2^nx@2So1CvyPJ~&QBIDU-#JVSV2*>oxRh(Hm`2-)3AB;7?V8 zWH^RBHB*jhPkc*t?Y%OHSEp0)&W<7kE4_C^YU{q=Yx}gYsy@OSrUyzOKTVj29WQd- zBk*B>2_2koXYLG6`;h2gqezcfmYx;$O8 z!|G6pl%(Wpm`Hk_QEoPiIU(Otw#Xfaie?_fo6YXA3afw za^Ar|5}B=D@1SXH0+w||S?|GU+Hp9tc| zfVUe5o4$M(K@D^X_H-(|l6kU4*w!Y5^pWgB%I@0vh&JFoY^f7r=st?#=YGWoj3evw z<{XD9vo{7=^7F00jWH)_V$P3j9G<9X@5e0ppMp9kjsGi+mC?OU z2dIRt(^Ftkco6%d0pwPYR?=RFqXNefIM-Hq%}3^fpx({|tDSnj2--PGs4)b}$x%#a zjt_~1t=4EJcj?Wm#xn6?sY*|h3LJ2?mV3Nza?igpSBzLD@}Vo9s8hLf4llUg(n|4R z(xb?lc#rpFAk2|@!LH6KIOFv5Cn2G6ijj8$KRtbG?A|DsFZ9OL{l*wW$Nvx5d(VI+ z?o_Bk@Z_i)lUw|gz073O$0i>`-k5dzl!haiu*O;lTPa0Lm)3ezU%qlp-G!Tcya#!m!9aa|pFWqJ)`<^L|@$FSvf zoKK@|jH}AoqHaAldHz-kHuD>%G>qP0Te3oC*JHW__Px^CYpN(B=(s!U%N@Hu( zNecD$GZ(Xao|u{rtS}EW^eO5U34G2}^|RaK^QVW)S~N!MUKP7F47DboXZdm6PwI_% zBw%3;Wpi*Tj{KcP-~u9M*B-IW)i1?B;|4IYkxte zHwpFEnyctc|3mlb|F9nQGg3aa6m(?(dAz3_pusOxXmcVLpAKGhj&FP?upSYv?yGGA7bQ}s53EL(q z#aqX;RW(JHg2)l0BJH(zs}=Rho0GR+=A?p{%QO!ANZ{0$)X|XP!Op1XSCYB`%=oE&{;zRTLNKiLMl|0{l4SQ;ms}`!<*jd>5g1+ZIg>% z6ZT!XC-UkAvIk-aspu!m0k*-6yKxTA_f&vn_Vbip=nTq*n$LS;fd(!5JuMK z@oBM-n;4Ione__=B)6>+^AeedQAOQJBZ6m5`1I7ykfOX|Uykf$4mO-n-c7XC;YQs3 zop87`YPLn#MO zlxC4(H|RajhkWS%Dg${4`?a#5o0szxtMv*59H)*Cdu&M_utN8BTmJ+3mZ{%UyvG|5{q{*%>}q_Y-!1bTrY`dB z@HNQ!zEur+e;?~O7i%ft{;sds^VjkmsgswEO-g;_){`auFCrm}8GLb~)c54(EjUyb zg{gPTAH_3BY*APk(Js{XnxwsDdF7m)-_==PPS;w6Sn#%GDt>KA^5^FVauzEXM)q6w%83@7f7(T-fmelLw)KMTu9VU~&tO9J)%;lDs^lnsXoVsYL79Z0; znc@C^C}D=!7}L-TQER@y@Gy4=8^x_y!8I%sUeJkUdR1&yBmS5y>wlPP;O)V0kU8}5_3UP%8k zZsRUd-DAS760=m`5gzPEZ+LtBXY{WHU0c1&xpWs;)B*Ss@pZe-rk{qDO*+2;)~ zr)*&(sl1)?JJz?Z;DS!0X(^6FCx=TKK?p@QVWqd@_tK6ZAog?ojIeGLou_!{Y!vjqWwJ4?YME=97!f@ZbG*c! zY(RpvneJySH8K3bA$${yHBtgm^Y=v35Ecx9dK2+&!w|oVUBUj#aMScVaiYQk0Tq=t zRA*b|Wm|TKNlB~8!34Q0YB}`jo}AR3yI_pxu1HvCo$gzw-Pav@>{U^#e8cG~$x%=f zU77Czg81Kym-mA=GRAHIcLSD}&%U(^uz?;;&J{Bx7P{cEz;5O8PlG)L@Ug|dyP$n` zymB1wbxJ0fXPX&EZglA|n^X{E4&pen3`izgw=|K#Pp_&h$P7At!%(_|fAd#A(739* zByY92@wKykV-j2*gPIuouyib=@6J&;L=FLR#7_=W0HW;GCxo;8yjvr{M6kW8P`V!}RilM@Ggh}X=*=S60Cr|9K1&Dc{3&g_5P zO#O`MEw8C4<~J_7LoOs%1TaP$CWNI}S20mzuj}xiA=~Y8Dc=dvyi?a#;*kM-?v=pb zSbu^{HDL5J9;A^oz-2>rS2k&6Ojx0Jbor0CK+S319v#<9NGp6}tEar-PF{7>sDWl5 z@l}Pr%qm|7yH1$>3sEH6QdoR=Li)$IiDRWZAAiAILk4Z}`4DN%$o zGcLO>zy8H$-J}S~qHh=pTBcjX6PjO+HVO8X7w6!iilb)DN>|3``l}_!z)d*6uLE!u z+7Aof_j^7Z=*%A!Gk}f62wiurliEt^M0)YiE!-!_2(W5KU^s_xTgylw@X5+B)Mf(Q z;wTAi{@!IdtZ$guGr{Uy6DZeLakTm(kw>K99Jfx_-l6O(kUG?|U&9=oJg?&dHaHc17XQvTHBug&rq}{`S8Y z5LJ9-#qYEAiol!MrmkMRK=%)+%XQ@hQ@Vd{KQrw2Mk_37gbr!rDn;%86E*6eRen-> z79}I=>@)Ehh&=HQfy9H5KK7+BmkZv320r&#hh}cRR6->3Zn2yUE0HfUmUdV+z32Sm+U^dvDOAp>aD?)UOK>Twn|JlqjkYsz{QRLDVB`UEFC>G zc->8CJhEd*>ujg!>Fv%cfko1x3OEa_$(*{2pKzUU4{}Oj=$QyKCHJ1c;aRmXMG6Vy z0pq_m`k1YW9!dXlmfnmgDe1<~ahtua5Ew6~H799!st6HAszB12r&wr%M%Baqw4Q|! z0Ybh-HPbT;Zo?ohq@ENUvzoJVLTU^OGG`?f%0Sqe;msK=KmQ-5-oug2KJ5E8iVljl zE}OPm6t(wAs99U>nnkL%QacH%s;#}L5v8^F-mzMQ+QgoT*s&vt@w%Vqy|3%}7tZ5% z9Op4V-w1J^ZQ7DAghePo~K&o^y%2?8@~*ALDkZ z06fpV++-~VzT^0RD#P7I{~KEx@q9F?4O=)ZfOYJaYOXmFCc!#0O*c-B$`L=<)rIv# z9tS-3$1LX_p1IRcVW6-*{*R-(W-~4G@09^;jZa|Bd!ug03h!8hda}aUP{W<^0-PtE z;>Xb&$S)pQLK?8Ik+?mrw=IFKcX6qri`RUE&JV`q#f6b9F&*F-5C8V4YJ%8ORx1b% zGW$y0MQ*`U>bYH1+9js&rTwY>o}7TB&4yEAd(&t8zJQ;!8E;sd_b$ajrJLNuvi5=J zd&eLV%yBr~UA2Q2a?{Hu<=*>>p{PP2yd^gs$-|>-x0j=3n*wpucc96n`CiIpwLL9i zp6Q&mfcIV8+n$(kk<`el(B@&Tuol9%a~B}ZS^Mg|GJ)0^Cd^uRnVZrYX{NN&x|fUa zGetC>!~KE(oaf0)HRXEeA9@_$wKyb&htacVXqC!IR!o8@CT-=U-_xZD2>HOk`)Ytme=9Dd9+t% zuy@os)6TWWJPw(08 zSjh6HhThnN5$?+WdisSs{bsR@@Q>;u(*{SMrQz#w8gejo|MbW6Va8qjN20`%ltrfB zlIGIOu{J9Ccs+OGQ!MqYC-9vpd~$9Hk2uDvFk1>`51~u($9n}1XHi6LbGbl;>rGdz z=OH-ecOx)kh3`gv4Z*pc`9dbuV66jWx6qoh@((nt+Fv;S2FO%?_k)KWPJ^Kg` zR%Y|d^*vCz5!H=rHAHF2pMJu(SE5sW0H$9OX;auWLi+^_=z0_o$AT7JSNpk3h=_e9*g-1I>g()wiy>0Wz0{CMj&JlYd8LMamXHoy zo?6?G($Q_udQA3)fonpAF3orbeq0`}#=2GW*$6se#Osgpdt%%kEX-t5gJ|HUeF#3x4leuSZwg$)zhZMf8mSlwQ}CC2xnfm278 zNys@@is&EqSu*4Q=IDiLzi6<&DLYNnH@{62Are~ZPk*&e zKQBZvUgQhC2xtW$ie!s20<`)>U`?Umk0jrzY=pgD zA`AI(17-!YU0*M$mE`N;vvFuX82P7GJs9tL+fo)D?#g(22WL>dd9>gnt@2sv z%ny!*zR-amo; ztv{*v3u%NglRhgXaj8K%jN02-m9kGk?>YCxc zaQoFe9KKAhMG_r>tl4wbKT_(x6>bm~NXPelnAC{H#^>1W&W+zG@9Lh<#?s<+^yUVX zB-`9EoP4X#GajCGpt`f}J2PrEcYA)JUrw3b1_Q9U4yxs}TVv5=bx%zdQfomiMNtB) z{=4cMDcAR9^2K+{>-ji`nUBB1+_)=EPwrmOjqcLa|JNh*dEB9#VeFd|CU?z>lyS-V zLFB2GIeDx|MJEdExwzRrD0Gx8Y9rvi2zg{JKPL6#dGX-_?(`vRL$ufoD#*V{o-^J@ zSVOVC@whj&pb}8`i-_W|T@g|=g6=KTdl39a)Rj1%xaYkEzWK>JERVs*mXtToWB-CZ zF)(Be5$Q>BWyL=pfH)WS@Wad<1zAbBDuKjoKASf#*$iOiCxqFoF=QdB>HSzz>2f_n zK+G+xZXqK{h$?0>AWuk-T?|Heel#V_b$ariEwzCph|-3%kDK#$_s3h{4cQ}+V`ON7 zE6LfD-+HD|hEs18$_n})Ja6{!1Uc1wedOX#_3YKi<5PC|#F_2C+&3{NuiHy4v0~;; z*+@C8M0$0zOY_{ebnf;OQ%mkkWtPib@B!$-jDu?S`O3iIG?v&dG<0;-|HoAB7#ost z7;BIBG@h}nG6HNW(T6?lXz1VM_nl!X0IM>!a%9qv&XJ#9_j^hrT)oM@y0r(h!)B!~0U(#e_pi zV!$Eo*i=T{p(df>`m#wS^99V`%G=Ncw%+#&vW-c2ojpUxG{v$@mc;`}bkNnwp))jl zVDHkJ#-r~;(wi5k?mU+^j?|1sMU@ATCDK3C+aqV=Oz)Rw@cHM(*Ry0q0lplk_Wo^k zpEc98!4A&8=38NKL=ae*F~<44b-GYwjE@GwyQ$jkZs==;(4Neh?Q*H+gB zxI8FJa{JTe9M5>eWbAgWWaxsFV$Cgx)YsFeiqg~;@FVX9`L0OXr%2^f#e?T0Gv7kC zzZwJs=qGaDIcW@fGsh!+Kwkg>gU5sNn4?D4lEuYl>pMSU1J(?1OwTYEok}7Q0;1r! ztgkh?*A3*g0uejp6&gOUwX#C~7AG{tS!A50ki^^}En7A8x`lGco*daCoa_J(ymlYW z{2L$NJ;EtHwxh6{M?S!_3ctL&!TVSZHxG|n_+uqji&Q971Z^AYwyJlC#O4n4h=tPQ ztVG)!+C}hOqqrYCd|Jyq5a^UT;{2b6AGgwE3twc7M#NoUE!fhhPCD~qZ#MI0IlPC* zUm*N~4E!`})F{+`(uW{2@LlN@R!7KdX*d@esYW$s!8izyjYO0ZQWWX}2+Y4z$BZB6 znTy0Nz)yqB&9i$0yyU;yKPegZK|!yJObWOHw8aH^$edrh`lCyQjm^}pM0uF=f)J|%l3W+@9edcKb0acuP+6>?mxM z9tQKe#o+`=IWd<63w>N38D*2&w%wdo5D@J`PD0Dm`a+; z{hG7Ms~lUpCXuaF&>YdZ*gTiapW7@5Ew3Q?AVSTmzju*ftH49UBBpAi6~%qH=C*tE zZBMSlU!EiJW=|bDvOmVlL2bo-Fqal|lob|g!Rk)gd76;y1!~@Iz9s^R#2fzkFAO4I zo-%eas|7W+>Dp-2SE~PdmbKIJhUs>Tg`D5J3NJ?1PEtym5kzNG&;RZM=Qv7o zzN@y0j77+O?rTB*2!3vNWGHJ0oyn44)j(a6E+uS_ri?LEG|AU?FG&4TC_QB7w0-gz z!ZeFI#`M7JZ^)IeKvmaMc^5W6@HzZ|t6qrNOi3>C)O^sDxKiLpLh4!c>WJyX*`)7~ zhc?}mt!$Wv^;8+_gh{l&B8^_3ucM6K6A$l?`x2Ey0ps)Wb?^cZzBmjCE^Ty|`A5Ml zc9U&@PN?nEF#`$bG17#@nLYg@eU3gspfo+Pp1bn(!s1KgxA`~tfY&-;GB($U@|Wxm zCEDidWjZ(0-D?Pt!vftJrA?IlWP4%-k<#&x2jxu}&dUz&;8HQxor&;5tPn2$-q|Zo zqoq|v9BF@Q=vi1434OqU@LPqX2pFD3NY*|KvaP7e6N|Cvja(=6^e6&4JBVDH^N=y4j? zM|c*XkEcg}qdTgEn9h`92`Qidv!P5A`CdKWuv6aOV)1lNWmYpM2N=TFha~c}tgqoH zVZG^pxU#i|ZQ#jAb1382IA0dFf+PV6TuaSpEK=D&UJ8ZoPllFy00!$gl+sK(Msl zP^!bpW%uckOUw^{$aI(W=e1Xgu*_<;)6Vs*UW1pCCc9DtKJDPgMzhpk-rMpRenJ+! zj1aAk`F?&rNb(>hF*)@Bb>cu9RVt4u@&&RM&XBaGEP?tcRZPm4j;i-c_%kf8`M=i+ zk?;5`t)V}ZP@t(O$`iTMg6md#sp3~@X=84#Zm{iP=kG~bHDuEx{S4Q};zs$#r+Q7_ z)w1gl>CvW#nC4_ldipiylIT=7Ce7}5(y&G|sel4`*VJD_7kA8#|A3YV+7QFj_HE_4 zWX$vj8;eJFu>JOwvU@KVCGQOd@E$|-wr@+{G89R`N^|=O?Yy_KXj|hw@C#j zmG%4ZD;ELTenNSk!8#c4ZK+TN977~yUpi1xKdxF$C0-A#sdn#zqM_j#<56G_=Y{9i z%TqWkK&|~LkDDEVrZiPHx3qWd{iFDh%f2Qz<|2-$L`m*t}c75|gdhBg3_JO)sb) zYooS2T}~9x(~(MVP1nWGU3`cQ{JV9KlfP(6A{~&x_Hac4n`ZQ}V#5DHk`yJ6C6*~F z#E!hsU3U>R%sS4Xa@i9LeCQlDjeoj?v_+ixWQjmbtRH`Z4qKl@qo0niEV6|eBv z=I5}hzu;{oBG0Xlov&7Afn(U0q{*X19NM1aOW%K)PrKK#pzFOK?PFv63t|Q`GNdc2~O!Sjeh*h?3&wA9zm`C zgVXBBitAK8P=+>>OEjmPI}y2=rvA5Ly%ilFxBMPXwj37L)i{>)hey>kL9b7syI~xp zY0FHHHfb(hsTs0ieJH4>Gt;UUU{y}ta~LSb{uWm4(B|!McnEdN^`wrd%nH=)78!wQWoZ!ofr9Kqkgwzhlg4UN4nA)&*;pvnnL)@nnqz_kF(WELFmE-BRK6Mj-Dce{VcT060MvMMra{nKPlyGf33yE zG)skzZ^a=9@Qe8N2C(t(ROjR5e%UM_Ij3*$^Ml{tju(=Uoqq;XQiM7?NC=Dqkrq)i zlBKEf#&;X9sZ&R_xH_?{seQ^}b%3Q{{s5vFAFGXVTStn4A9vr+6w(`B;wUpooSA#3 zwT*W03J`ZqssC)?&{LIqur2FpRS70cPsENn9Fb$5BDR<)#)Y?1p!}HFMdtT8YRGCg z_d!EtU`;3nVUH=4SvHE2Vmkt{s|U1Z&)Sywka@7J|E2umm(=hG`>C83tBpK6m9M+? zd)u?!>TLmaD+1-K;CTOA!+Xifa$Obg9_hc=mtX9h7Mv*m?gM6JC&f(kK)<^aWQ|KDYR%(_yyzh-pn!$STmsJW zpLPoKQ%SCS#tm@#RKVQ<@1{k<{cPSeEJJUw*+NcEM2V z^#~-&p1B;xlCQ+UCgs%@pitL}djrVTHbJ)B7ZLpEXMXj5{`nn;eoyg3O!e?lYwL|3 zxg`GNyHy@FpuEP%)%x!|=s2hE=APXqxoX?d?lfO4E!CDex7yz4m`qMy$yy5FGLQ;- zxN!yNC#h3fK6lt%ak{YXyn1?w1p|7e_d2^>>4?fa+dS=mC!+6A_1(&+PdeI=qt9D4 z>b)0WT269&@fOvnJwWcX%_v*r8PJi9Y$ia(oNIH{ub1Us`IN#juhdxH&Y-y31AJHI zQ$1d!RQ;wp@y%a;>nVU?b*HtXQs~#Crkl9VrN^sD8w-LkUf#OQKc^ zVC^s33s7@6==sH*wrFNlxz0E9wz_j-zXyJZR4Fb!q?-20ukmgb$hC586R3l8{!;X| zjrnn(5h9mCn1vCb-(+P9|5dQ76mWGrWII6!nW{v?makYA%dBD!lV6pfJ%wUf4!ZDlBTZ&(yVJ6=SuhTpE@@>7VV8hC-G3j@TODU4II{?bsk%pXIE4gj+9#uyiYfpx&5rOS4 z-@&{*F4U;~s1Q5*V-5Eqt98uO+hU2aoPF?vjas1XMAp^Oyyx@w`-OBudxrOG^{oQ6 zYPL>lZWReF;$%0x`)LoYWHm8_8GMc}pv90TvTy9{gxcPggDNSh_aKzId%s#84*j5srRJ%ZoU zBU&Pt8p!lrN?j$w!c3w9t#2v+sF|dPF_}^E7#!A6g&lgn7g}P)v=?$?uO&{sC#FtN z;J0Bl+_9+{zmBSF?kW{0qYteTo7BpKtXd==$zapxXGnH)BLf!6(*oo6qoQ_5@6%H- z6%cojfrVa*gk`(nV+M+Tn9f}^!s-^`Uyf_1A4#+}MCY~Rtl$>?eItV;h`@wCMMV}QdP$y`Iq zMpOS$aJ5hZyOu&c{%A&JJ>@bNRrr5~Ub^nv_eSpLa1l)&CJL1gs2%^dYq--Crs7*f zGC3TA?J{!k*7aT%I1xxg~O^Yk=pry$wl8~>zfq*wRx@cmVizAK4Fe)=xKvHdj9)yR}B*f9+E z8pXgPD7%aE$t6-!VP$}VH3j{MBATezRE|7o$0_&n)F|xh1qrVUJgziK8*BYmvZzX@ zx%|FbU4{dgy1?vOrA;PI$1{?a33e?1x836cxRbTuRVz;mqFG2M!WUn% ztcSRoS@)p=hV!>-iWBxIullN8f4a>Gu-h<8&D4)<@6?U?E7-b>d?)BCM_7=_)0Yj@ z>6}elUu^D;FKe(v4Ps4i7LkkJE)-*Y=x-x(fPd1^_j@V~KE-up!k(iIok?ZySUM$V zOO6^>e{wnX=v^__P z4gSdu-t^B)?B=~WOvKn@1+QqKTCFB7&XIV{Dj<}HmyW^IRuziz)+^`PQnj?~D~HpLSrq^PvrC^}TF`AGUN%rEMphQ6)^7taP} zn$7UT=WYRjNsC`Wgv(E)QG_aIqK2eL0)i@Smd>Rw^!a&!fqoJ|Ov+7~a{X`Eve@+VU>%x(Gp*Eb*pY8l#`rQ~x`k?h?O% zEBKah{QE^LnR?{QMT?qM{EMYg>n$vv?SSu%YLF}Br&V8I|2X*KggEjQozGcjWufnM zGp<5@q_hNVdwgQKZ1z+S(fSSSvMVbTHm92!-Z2ji+A#5XAMU<%l(KMeJEZsB76!rQ zbBsaK?WbUzi7(2%RmDO1=ctuWzI|uo0GM13XZs9r({M=Ha^?wdX8Q@#lVMZyHr>Nk zCN=(7sm$5CZuDYgp8v-<*H+rJ+1xWS?c}SX3dkCLr#=39o1}m)5A({sKC8OCKx#8E zh{Mf_&{j+1G(0PH=tueNQ==zVtZc@e=vii^L>~1*GoXI_8P#m-pWF9%Jj; z1oE=#bumaA>U=bLeTWy@Ek&GQM^%jf&%*#D)Qp>+#6`rrmb;LC3$z`y(8tHwvTKXY zu4_KdL2p!9mYjX4oj-~5YHq1g>WC__NIk#zw4vUIy@I5&OdNWaGpHqAs3l%HZC#Nd z%9jA?_!?RLjXrUhOXunzhw?4s3aKUBg&+T!0$K80xJ;_?k#_qyi32>m7c!@Je=^7R zY!Fdw8p!jn_e`qDC7(L((d*kKF+yJN`Bq&Fe-Q9kiuEq0k;VU}uRXD7A%A+~ezDcV zyW)i*&xrG`B^O*ouT!6m`(qJ(CpaP`GHSrD{gI55c`6zf?zu_@ribC5!fw1X|GfK- ziaF}sdGF5~cqR75JmBS0X#2H}uiIRZ728Q@zpQWNfQZk#KZl+g6sU zptQfQk121%{U^iV$J_V0Fqv5nq^1b7TT_}2k6yo<{M4t1bW@c~>sVrFN>n4Stb^XG z&dlBl(p;-I`X-iJY&D4zMaU&Yf&i~v2Li-j;@hb#7k%embCO~r8aVe>IxF(8C7_@s zo)=qh^wzp)f$sLp9TN_cx_`tSUiH?y?P6Mj$C;Pt z*fi6@<46A!-Ttqkc(!&OU=nVyPos90Id{vp17~NW_%vrxn8$KT56QiZg{j?wXY=L_ zx^qa$9`@_Oi5enQxAcXr*0e$Y;mC;u z{E4v=ECep)aLuGH4qa1wyKG|nz?38b29oX>!#}sYo3Hsu9e+lA`BmUp^VxYzacV0- zhM4EeS|}1c*|CasrZWLIE?K4ce01YDI6|V<`awn}lYk>@9oK%p^M!__qaVGs;4^e{ z-ip~U{dKl?B7u}qy!bpT-}BnVN@ZR|cdA~X&AQDRJ4Dy0=jF#`Z)H=M2M|lN@K%`d zg`5SY)0&(b*Qq|-d@kp%r$NO2xos*M1K-a&4TeB`)WRARN(a6RkLbSL@eX@`@pE>& zd0=BJu&o($MZDNUtf#F@hW~4@m-eqyT$BK?#giBMu>hXkmg#S`+l?f;o-v>i#xnvz z7N4t=1)S?RT}g<|QAA_WiH@jIO3>o|cQEQV)ME&%D;wrsTVn{YN$6C(eUD3Q3G0Vp zj6N4{m;(fqkLpzeo%KKM;@lq{?tc=}XWU^`|Ho;qTA-nU#1wGS=fQCj^bTbhd;IOB znZsHN$UvzdKj3?jlvnk%AfQW%ty1j(4dWq=M zH%Z9JyXD`FM}GpO!os5P@-NLz#C2Z{U4Ksw-$}m71KUknR2lbYX9|(l1A>HLP?Ov& zZu3XSHs{2)KIkwx$g*fa;`6!VtGDU#o5RELsTLmQ1q~K{Cp()&XvPb~LB_PJv{@>1 z+qbE7YWUS(5a8~aMW_9 z29n<%ZRfT*Uwj?B_;5Q1YrFpt-z5h$^h4|q(5yv1aoZ{c_xBaoK~1$lNHxJG+|kiE zx(en1Pl!*&58^5+Dl%f<z&3Y z(AE5Eg=@XrO$zvjKW!K#VuVjX)pd~-*Utru)*JP6pX&>CQC(OaDQ8J|q%?^gzVwBvk7JuQ+DPP(={5V_~Kh5VL!+| ztA$V=$v?CAf%(XR#}mJDa&vix?^c|ZCXEDG_7-x`jyNx0sp{Pi0Mv>&jgG-&s%=M<@tw}DV6~kmH6kOt<;9Fi6HaNbDd@mSH@uQL(Z^3Hyaz% zpEGr2mGwB{YtqL0+Iqp~JY=lAFB?2$)^efB^}RwgEI7!?)UtNhGwjK03m2_kAZQEA z!748PdYh5itin`eJVqH<9u_&Hh8VnGb&bJ*HCG8Jgvk77wtNWoA|z8!-D2R>%;iLo zd)D(5*&05j+r|!_ZLsX{ZL0;*uo<0xps=f*Lgab8dRuNK+M=kB6|WZB==eg1Ht7Ey z!shmYsCq+~TE$-pHX4-V2u^nc41u#w&*bjdHH6vx)xu1R7h0P_$uYT?5k$(jRCKT^w#5#Mn02;R{GIXnJFN-y(+Fe9Y&FKB19&z?gvYT!+@fPN&Cb-;ZAgP5Oj_RzlIEW?Lr4 zIBUjnXpCdSZ-Ur2>UHHebM^HeL378IwIW@oocP1HTkz1+e*@taDEB#2v8z{bY}Px^ z@KXTeCpaALF}KA>@>qrL*`__vWG=!<4j4)z5Q(Nbt5slYKZRgPLTl@)yVWo4PP*>S z4zK(ry}xMez!~ATHXzZMvj_ckb#K3n42pNMnOnY%?z-fHQ_^ip8F1=0x%$E7m((vC zv0^Zy(@&ytP)T(O0p|aN(pDg+OT{vOz@MeXUC-F$_xSzcC$aSTW&W{Hv5J$aKn9>B zNFQj$2|*gby`y*_XYVK+vZ&-Q3ouL|CXywfQ?0%@6o4bP_3F}6+)7I!iMM{~FEaHQ8e!?Cf1 zp-tWFhBgSmVh#YS7r0<8N{Hcy%F}YS9{o^c4y+7sElZMTc_P02LE)TOMzT$4K4G7` zXMO$IB$O-@X?dtwDCOZF711*7EGEE*SMtK_s_FIj=%|57%ry7H;sXw-c;kTBK$-y%w9>#OfiH{Mxa8Oi)_ z%aLsXf~$LwxSM{JKeNHJLqsrO!F-}0hQ0g!rOdHTcggT%zQW)7>E6QY{n}6Qp`Fx+ z+BT>o{0GU_i@OA^lwiag{qT!&%aXnECCzjj8=EY6{8|!kSTScbXB^K!+NCDCWE>kC zCA&moWedj(fqU>fJo2QTT)-{>H{3MPWJUIJ&ns=Q{pzNa=S8dafu1c`CE3+X>WVk) z+fqTb|59VpoP1z94XGnBy}Wx@1M1;|F)KbE67~H)NnPrdU2+$W8rKc8%TK)NQ zRjgoa&Y-89ec$RNp?YQ(B{F*c8q=`i+s+ zF9|N8_5;!!)Eic41Ie*0IT*Ng&6lngDBHzFyg3XG4sHOM4|T`gzlVKqQC14Fe#8`5 zTgHhgTR?B(JAI%~fEA&yD-dP;SG%}XH$;fi7>Xs*J58q$)As#+n}QVv|EqefR9e0P zocHQ{clWCPrX54+LoQyCsV5JwDKZmo-{56dVr-|rVI=hI2b}rR+cyBzTXX4LB?Dr) zkwcvh|MuD;NZC9NSI$DrJyxBTIz}_Ir+YCc_iJdJh7LH&MD;j8`g=Ekvl#0go+_dH zH*Bx5#yVE`Qm}0zWZ8g)ID`6e*uZZY>a#x#AQ~%A6#J8x>`P(|HZ8(@Xpi*~j&K6hIQ@T^j9YYK1OZF`h<>Mx(4xhU+?07(1)n-e#!p*7>2oeRRD7QT2gGb26rVRv$KU9G#WVgim_lu)z-#}`&C~Sz z|GNv|*E%h<>=VXO+ET~=`dRz8P>GM=m+HXJ^&aQxHz?wG)PV+n0Fesk1vK&lLg@YI zp(J*Q8jb-S@2eto^IPR0%6{?q;I|<s?egW5R7-sgyUIi_N>>b+KkZ7jH4NX!eajRP`O;lrh;vsT^D#JZj?uYrZaN zsKL~xp z1e0Y8ifZH5jMBKBEBIjyqU5Y(_WCyrj@^=K^f_F}>h+9ex^rOpm6~OXg@$T7*K}V% z>T|z$co|uRbp=O=-V;vZ&)__Bc(Esw67iNGz3re`?whrPm1M-P1!6d4nF=_dV^MNM z_qrv5$SLpYW`(ubkuf*%IMKXb38~+$sT)3(8Actcur9|Y0x`KNMt>?bE<~!&)*IaB zUR$KpLjai5ZFzxK-qi-7_g>lm+V5Dq7G}}n+KAkqghHY2%O*QPR5i6GM24!cTc4uY z90gtHDh5}9_$WwUv%URnYAqH~s2XNR`9S?r3PMlBp%PEVIdKrO_fCecggyj-^J0Sj zVHe<$$0__K>J`V1`uf1hvGRwn(C|49JK!j0o1k&_<>HcOX@0jHjN=LZL6*;_Uwl|s zB3|zO>Fe~BuZ^+2eNPaDT~$=PU^v@*se~p{Uo~*dv1d;~uWLB@htOwQoOl-nEkbRC zy)bS@_ecXaza+!m+7?{Km+L8mM>Vj&)6<<)v|~2;IeI&URW~F=KI1Ar&a#3B$nQ1T z&y`&&ucrwlGd-L0F}<(!Ysc8)syH@yGNgptu0Sj}cv5C{*eyuYM)$5u{RBrm=u!4u zoF0&O`jSL3Tl__GwkbrnBLd@%5`yFZDR!n<9yvgp{0sGH;V(QxnHCeR2df(FvpOp-C5YDq{4x6ckrn>7Bq)#CVC*a^< zzl)L6DQmc`orR$NFeYDr2zmb6BLeoXv5X9Nil!55fxEyzZ)>eQI--2N#%A8=&Z>N! zfksDX5zb$=&ST19mU=h1c3-GXhjYR=$DvB#cZ&nqcpRv>?Fjh}PR zfZRcJiTc?j2p!3E@tOgTqR#_}{d-!t7Q7UU!K3U1@O<3FtxPy%KdtHwtnCoD+we*< ziE7{{Ow&r285&tPe7kHG_50)eKpM)j4ohSp-JtYZwJR`TFwOEOe|sC_CtjHz+w-*t z9at?I{UDO|v-891!Qw=&57sr>Rt<9~QsYU5+))Ry)n5pUlVmJDNW#oKpLkdSc*8#V z1a!&QE@)MpXLJ;z4TJ^TGKl-ni9T(=St z$~T|v5ZB>`jucCSg{T~gRDTshl!W|=r@iXz#;GJjVc$WLbs4=r^BGwf2N|1{=iZY8Q_M0j40{O7e z-;bD02}i#H6u<0qduU?}dpgTU?>+e>;HO0kl`$YuGTsUZ1TOGzl=x0-c*60dx|IhS zLBZZ;@U6xM+#ElNi(LKH<=pKKQqgvg<=N))-YFX<0Jpnp&fO7>Z<((I^RDEbI1bV0 z@5@GvBP1LX&^~H=uddicn3@dzVq7kMW*#!L41Ia2e*1nQ`nH3~KRC#h)o2@`>YG~T zzmE2yU>a1_%>;QXH-di$923+9kXbzUo6phYNA&ET!Y>Kj_lZ(!FO+k@V7)Pi+Wt$*IkpWe$yx4>!m0Rs2yKaVGW!-JVDF^ zU+`&kz-u3UHVRSQM!H-m^qJCP_jjdyMhm6OC#kr+xBVJczlNpG07t3T;fQ%TIuY={ z-Cdo)T;kM7yp_A-Og-oB#Lp(z&BdntV5PVbp|4!;P={Tdcx~&$!DTWmOHuAx*LdHQ zpIn!{qLI-0944RosK4Rt-n7HRuz|m;jSyLN{in}KsmY%oJiqzky56u&z~=ufSW*(M zuk$6Cx!)P^wkQcHp#R4y`ibvVqzu|%PffGn<8%*_AA zKIdGTX`#wfQeG&RFe!^%U#-18c1-Z(&YT^s$(>{C%F6( z+HZ0a$EiN_v`oo=E8s9T#3mL!RbD0gcomdX$L0Q&-jnS&W7%;URBYQU1x-exe%q9$ zTsTvY?4jNZUve`T)!&;MtDoK~_Alw|ybE?z7j8p$Z{G+>D<^9bxZf}edcC3!^4B-5 z?(@JDQSQPgBoc6i;QTVehY627K%C$=C2i zH7Id%VG5MmO|{f+^N@=s+Ko8>n90z(3vIJq$KGkd?l1Y$rR>5sQq|!_*r#gEcIVKX z@A@y**_)f=N;--Y|qg^S#+hvTxYu6U9aTmYEt0og04nbsTXu{1WZ)CJHns4Qb(C%ufcZFkk zV0DM%G<-eQ>vz;%xx22T?6ZsK5wM28*oJ>B@=1lef_K0~Lx$|<&U4)-8s}HN&)T}aZaa~L*14!G#Ubjxkz8B|)ORc8W66WU$LnHro#G6fCcLQ@lU6>}MTqNm`++zU&9r_@ zUc{VXP;q@UcLGmNA37F=pYR1#Qrl5HcpRrr{&DHn!-G(>{%1}z^{t)`OGK&7^`}fz zyA$tS4;IAt?(PrslaOA>t}RPphllkTXMAIDyU@7eyfx|5VkkPDhtj}&k)qm~lI~;~ z#cbf;%GeGB!VRFyk9>l1BL$e+kh4}o;~wrVE@jV!)27uhvDN{to{`6iF?#k@WcDz}tPSZRiywQ@-VUU|sy$`37M3Xlp|Z;P*R4W3zw4mAS!qrHz7Z?1U; zFnBOXOLR%|fpeW%gO|WH!SA*;>Q7}#LQ;!q2C-7sazX>1FxhVtKG7(>h2XA;!Xwgt zF+ove>7=BFJLDK8?1fOM`YuxOp)r(_T3*KNOZJ4?ava5mxSl5VeDXr`<-(q(wQ+Cs z*=0$&LHnp}8TY`qtN2yGfhCP|ih40620mqw9CZ3d3ue7}aeH@)5b+2*ZdRB(l3Q>i zBMm!CHVZE*t|RPr8h;NP-d?=_a6Q853+{F;!4`&6AS-#VP=kiTGm)Mdv1 zCJ_Y2;?9O?`}yz$Ju+qamhY1GB#%ETEq>GtO7*pI{cBm!CQD|#qcuwVl2FS7y+Nv* z;vzSJuB0im@))7vyrJ`K7=?~JqvjQ52Wjo^RpTmDq2xZN&;3!u?bw3hR}@bwvAc}) zA-9I*`FKH}Oa;#qO;;bCO3mn{G(jGb%W}aM-Rv_iyL8oH44m3)OQ)**rMX?Yd{DmN z_5@X|R5a<(6roTy<)zK2nLfqX_uzq&z%}=$R0Bl`(Q~h&NslrQQY0gG*1YFUl-?Ib zgz6s0o9acqck?RAfKBX)f`zo*5*OXMeS7#v7!nKl&Zjm$3QHuw;Vp9h@L z(P={hq|=d*r535B^=uo0XQ-1xNd=N9dCEtgD*^ag%A82z9h7u5|y8E5Ku&UFVQ>37zKo)Fz`@C^pJ zMCiS_yj3hp!UYB~-Ve~)54*@b=N9g_hpcjDVLrQb0)3%~yUQBcT&(IA_oS^-iL5{W zu5AFur+JDFS-lI-{fJk_aAR~VIA}4ri^TG@59bS6kA+A7l2=8VoP}L%YrbvAT76*P zu-6~;PbG#PX@nEwXjA_-g&*Asvn|BBip^ak$1h4vN#^63ZSTr`xbcWbM!mIB8!DT? z>yr+T+xG4irQsw?CNl|%qoV)%ZS|OvL5+OmdRpleVv5g9`JX2wmhk%>ooRJILW$Fp zJ4cp~iZd~rfk4-I1!#kNf)pp4t1DH*4Sk`Rr6P|9zqVZ3k+YB%f!;3CxD#6k7p)+; zO+z(%itggOk)DTVV1U~aVM9TeTT)&+9mNsNU%!pPVCtLusA@w+;P?ictc_uiYfvz^ zrc0T{q%FH;^3wpoDz2P%ZVYP2rWheFa=-Pbk}`=X?zPJ<=4gCU?%(0brY>=D=w|tJ z3T(Il%&flm`)(ckKfw=A?RHk@BO$o!-e#6+FC%C_$OU;#XDqXz=1~0-(EII~q}ZQ>;>;gir$J%2vnmm7;D<6qlRISH*rs zj$DBeS1PFA_~+ND+8;YJN}r`1*6|vv@(6&?#XkL&aT@~%2)^LxncWO{UFAtJd0UaC zQ&irQU&%Ds-SV(@N>4Xg{~8d*NwH(h=KFZ=)w9%XTSp^uho3u>kb%W8ckwfUJk5V} zT`sLIZNiGaCuwsW=iOQnl8HL2pe)^PA!LsF;a+~DjS8_ZvluMS8=z}?je;Ms)n}~`qTuknkf9sg@sh#^r)J{o4noIde4D~zm&a@UgE?D9~%~*vOal~ zrqvX+xV0^%Q*gPHlnbj7JTZ4=Fa}g?7gkad?Tyo0t=~u(2NLTTtc8n*&tog&irLoK zN-M@7cG`KO{QGAwIT$|MW_I|eRNW_zGc2yiZeHEbV2T#o;?8?zeobkn+ImkP1_1|F zun9Xv(fb=ani?3e`E&eC{unLGtHLwKZcmXr?#`2yXbo*y>uZ@auIt<_q722CcN99u zrPGq#UN2)gH@+}#rytG>%6mEBW7J`O{aVapN|&0YeqP|(KMV)5A;?2+28;!01s*>Q zlnnImDeUX^oNK)uAYaQIpDNi8SwNN>2!b(S&G?k6SXT{uX!rt)j6=J;fmtmVj>kv!fu(-X)fDS6-%U4z|ao0CC zJ4It}$fV1<>DQ_4u+N?lmtTZ`#C`%}rDeH(K3*^mzjTW`i0CdNgaLKn6xBa`T7fty z6PhH74p7XGfzXK=5u2`HXmx~<9pS^E$?+09kfIp_oCH3(9De`|dcS|^Pymiv?w)2t zl->lBb|{iKd8W@xSygd;?1TlQU%G)R)O+ws3NM*etAf7CU$4IJ=cG={Qw?PlZF0R; z*cL=M%6D=x@iWh{#XY!xfr|i_ZrP^KTQ2 z44z6Pv&KxFdHGhY249K@83dKLY1s}m-K6;49n6~d!c$2kfflhJtmc)RAP7JWe(ae# znb~oy09}+9bIvC@A|sc_ak!ShM+er-&a zpM3RL+LRTFY_!Q#)xd)tTP5U zC%4hP6={#@Ed>{q&`#*ol=l0{-#@jyv-45wfGlAUSK2eLX|ba|irI3{FCT}Yt1dra zx~@L=BapVik~WTt>REsKs}?<13BuzGO)Koy*4B0Av|+L!-q9iTXfZ=HKK-TF3*Y&z zmYnF(s}%ZYa-Lh=i}XKhz*M%BH>};~ufKmHTgVrrXzw1_4%naujI2Fwyr``GE-k*$ z{3GZI=Yr6c=B6cIs^*w&&bASXCA7DhQ~0V5`W!NLu7B}gR_z?=W_k8IX!fYShN@+h zr9SRi=mKMp?xQsoSLUl(%iapj2E6xSMR|LFRZic(#pfG#>$CwRz~c*RqYqM|5ieUU zJ_zx;<(a`WA}8}*pFeiKesNRv?(>K?FFKBX2*BRsx#Uk1$Q$;~7rSFE_$TWsTJ$ZR z9UUDl6@P^Qljm*ta<4=<@o>OX2J!$O=S8*E$6ojX(9w0L^gxSP!$;d=8l>|+v^q>^ z2B>;E+!p8jd`UTci47>9gK(IMy}W9%7^HYT(I@Gp-?a!#8rl^gqgk*wdCQnS75|Ku z;bHudH{OszC38J1y3PBC2swMpFo3+15Kbb=>z-yF5@vPw)o!$883pGJi!_@@m2Z+m zgr&+~hYyyDL|{`aA6+feV8jkpq0yIl(bfuyHS@tI2y1(VOqyKAF&unip^ zE$Jal>pt!e{UV7WZ`A=>q3%$ua)ONY6DF_PoUJNk5floQDy_j{X=KX!L;jcibQ^m@ z`|^dWOK25&5ro-*yM8I?r9YorTBm5%G=@fiekg8}9uNy&#s`!nC@NsFd;7=7{&l_m z;(70y$lpT(#|pcPacG8|k6xtS&bFLl9{pZny5b z_BZU2*A5odLDz;G< zu9sr)dF*!q(~QoKu1;1$;DW<4M(~F-5QQ3k{bJm_%31yI@6R`ATKH|ZU>>M|#}qub z9P>UlnN!^oP1;>Jc(o_#A2g<5$<|lKYvP~7F~wlVoFrx(eeC@ZL;V}m1fH^<2QaUX z=xm5T$IQJG=I@92KAwq|ZJ zGL*7}rETY=JW>=)x=>B__QaAx8rzRYgXKj}y$rv#$94J}-zyfHd$A~LM3qAdh}#Tuixfk5zzWT)LNkr}(XKf3V726z23 zlIH9mRk{)K?erP8Vh43g7LeT(w62-Ge_d2*wxLbSdOGZZ-Ly2*)!a6E@M^Lrm#_{G z_ragxR46t#X734p|0CcWpQW%lTx;|BV&#*M1}Qgkr`l$%X7|a(AR5c5GF+^V<35}= z)VCt&3IQPR;;Q3~@OcL|X<>6>;g?u48(+V%-r*?L61cCWO>)+lSbh&@KKm*{=xnol zGGGSBHd@1#L@I^6;;5ld+19xzZyF97YcfSBfiN=W{5l<$g^$u^mI8LPyN&`YyG$3~ zq7JX^2hm1nFGC3_WFnHMOvtWSI#WR?mTIuRsw{^O{GmuAgyF0mIkEt;C@-AbK>X>OtOGUpAz{-hhE*th-55If}P|d>_(}Elk>4I6D zi}Z?KM)P4DUu7L4Pnf#6iX6USS#SAF2!8heb#PfakvpG+4i1w{9Ig6pYk1(l%80K2J)^PXiWuS2ao6_hGN$pg5SiB+fF00@ z0a^|kwEeAeQp26$C1OQl!>YA$Ky_sQ){buyYS_nWD=dU?TsaK++ZXO1svYK#U3oU< z6tV2}uKn?vwgY?(8ngD=;4c;JVTJSTSKAVmfvE0v7k8}U$NS&aC^g&GbVsO`$%CX+ zg0|)gy52vy{Y_Jc+bopC-j@y(#7ep!-p_noUTqk&qiD)LX&)?Bx?=i_D*RdIh4C8w zP!?+;fjahAw?BW)Ylm1?wS?#haQcpYSjdF+7OFwEAyC{^d$yq6&K-3kbWtn84_~tY zwKLIM2ou9>d&DVhMj6V$s=H$6b zy8aG2WhLz%l`z>YB6}31=2Fs8#Md;|ge48+n?LvudI+l}lltB)6~Nul!{=^qUY@;M z$kd}#g}H3^PQ4bqNi3+Op{iD;@~m&LG}uOFeJ6_r#-rbhm@|v}2JD}n^?k-JtD(w0 zk~^7b)iaXPA=gk3E}~rWS%b{%MM+wK_u#vtc`+3EvD`D5bC>)(gdqr_BaXB^dd#5x zorrBU$HWi#s^k#e3%N188>-``ZRYB5f9M9OUseqI=?t5$uv*99MGpX4i*oKVV2F% zPBd1Eqx-@!c2atveNr}5|K{0tzENlyWe+;7G5EX;ly@-bG{A=`I|Zou=}b}&vM={r zo4X1Wl74m5)jaw=uf@YKncG;?Sq(ANQ&bMQ1`q$t%KRmd@0~pCoDvSQMp;({mLPhD zS}Nz2LcXgygnbZ1kq7TETr-90>apSaE&Z`!)gWv4RsmsOluS@p~!M(Q0dKxotm3Ap220D;>KaH+{lozsjD`|CrY;6Hn+k?Ptl%-`<6F zahak0o^S=2yWKDC)~X|=G>DNp5v&gN=nO)^zJ>h}Rgkh7PxrbKM@hd>^z2*h>BBD* zGgg2n{VijKM)`c5BkteZ(WCMQ$NijPFQs9qs!}irc2Bm*hMZ^@4W<&fAQIW6{VfC7d_H(K6SBP!Mm3c?!VIgdocml5fxl7>#Znrooo}i zo$0E*{pMzZ<7Z!RUw_LBs(z1Gx}mnuZzsW;4rI1jJ@#kKFC8aVmmHX4_8VPH3IgYc z*4&5gCAGWQO(Kqf;a2zNKO{G%v^T;)l#7+sp;gcKK?W6*o}X5^DPv{xY8-+q-8F*c zJAzME8tp*q1exWsd0`5w{iRRg8Dq&*K>H}=pA4mWuQ0Wgl5Q6(?n1r#$R8(@KOL~~`+>X>osd3^K8h>1G zFDDY8PG}$6U4ki54GVfrhIgd-+=tFcR~_vfVQ=Iyz>8OD4x2(`2cY6NPnY@x#XA2l z$@-HFRQPThVRGAsajNYuGir%m16zE$=a0nO2Un(e%THGf3bjzO>1}B~Q7?-e!o{Ub zQ^&i+_qmuDNS&0lB{vf7(s9awb>yRL@erWBu|1!r_H$8IQM2D5KDhXHE)yw3m_2%C)e4=- z-ktQgb+9Z*ORMyb4mLjOhf`n{7EVe6vsYJpu0f71Uu{R9DyJZ}jyD&Cw;MIBbA%i| zhGAdn;PB+Vq;sD>IN0x^a*s0I(vg0s`{>-G0~%C5P!Z%5o~h+;&c(bH#L!fFDz~oi zx6@}ufv(l`K3!GOJd;_ii=4%1n(_kpntOpQQ)iPu$Om{rhvxlvo6y?S zNxR4`S!bsF+ppt(8W&qp>Rg)x$r8gN!WgKFGPlJX=E~UkmQU!xo`^B(*TFKO1S%25 zsYWSnYjspu!PMigc85>lFLYnPSJnOFlf4_nLNLv|HWdvxtMJZQ(yMWDYvQ!9^Iy5a z?I{5g`8qXuem0Ev&Gl@j6W`B8oB?i#o}4nf%Q|bV4QI^l_5IIq+T3@vLs5};>YJUm z#_8l_em~iTtQi3w|JC1smzLkAMF+|Bi1xzH??j(?Ooy0H3aGRMzacY2?rwBI`Oo&Qmg@fW|$~Byc zQ_!D9N?tSiJN{l*{U7PP0dKB2>&Vm^zhvxbQ&scIT97?;-y;Mnh*q@iIH&K^>@@AX z9x+=9NDxjRbygIUgHF;MR3$$Kva&k2&yPRSK$ESDD9|rYchXWL&0-~-@HITgf~&#x zXLW;qrRux1`?A`j=vC-DLlEZh3`OoBvu^flMpUXjF7e4dr$e+F3QW1igu z9=yz?zI;;j+NF?mT|1UUG!suXNdT3gSPWW=2&Ta&_2R&l;|UGY0v%fC<@TAKz7!kd zUeRoz8P+#{_xf}?2khmfWNN#=Mzdw7P?L1EK($P;yZ*BmwOQ-SUarr<2@K+bxjObG z)UQxz^`pxlmq>|HsPJm&#XGrbB7>@sCr5zH>qo$x+AXHR^TBYLHAs3b2uMt(xaI)4d;WF|?M_FAb zUfD{Y<{LVHEBX$iqUSeWM#>qXqtTe`#-*TJ9VZ@H9%?JMgwu+`8??vzsk+p9g2wY- zW;d;1K8~2-8iUb|?G=dGec2J z^Ip3(52%EL2y3M5*#V6}e?k<^IwD`PCQ&?hLK?p(l`$YP5coDHMV#`AbZsalG^`UM zV_zwb<#D`JRNiRluFr2_64nSE3NYG9HMCp0W*8Jn!sw+v)en;m=YVvD3SFR&_h#7* z?us=g^%s+9XT&a=8_wSt9i|g*ocT#aMflwI+^nl%TV{#hJOr=g-bQ>}Ry+36yroJU zVkU8i1N*S{;uQBrD8nZmE*}m#d5!2Lp|5qQ{CW#u=1JR%_p&pb$m>)vHj84MBpE>t zm8djxX!U+q14*8@_ z&5mtdVXmtW{U4ri8apKkU)FVdwx@Oo5}dnxG6&?;Z$i40qr)R zMI^$xJr%-bUhJ%vbkD`K;$kWowFZKid_}~62R>2r% z!%B%?RF2e^>%}Gq*^XZalaeP11xTo#g{0{9b0Z_52)~r_!{SokfV0TaRVuyG*LF8EjSEn zYspn~?z#Ytf%M%8q`|k9{5($Nwg3lEGM>iLQ@0A%Od$=sH!|_d zirzOIE8g+^eWw-iGhUV3@jXx^?&h&^d}=58!Q!ST*i(q5W8p@4!($-z=ZCIV;@?w$ zMn$9N>?TL3Y%NY^h@C&x{K_vsLe3-%wWlXzIkaX6B;u^nwO8>({6|7kc(?k4;%c zsiLcpTi`FNH|iv4OLxAnYoFDx{oTmC%<^=TFJQSXf z@YBS=6Ag3Ccz43gs(lSQHm9$LNRIfz_~{O%PJn4#JX7q2)<^>HTk-j#N*SAPZ9cMw zq=_f-*@uCxD?8DN$Dn`T6uN$w^Yr%<;7;*kJ29S_GorF#-wYYH+gM}pt!Z`8O43`>aPdPQf#7{t5`DY_IL!K&m7SMev1PdO<;dOYl^W`)*Yj z_rcn_*wpay+rOWi(Y^@|#Tx`dYa3^Hgse+2&T$wfslTkLk24I;#%JYp@QU+|}IAVDC$y)LG0G$GQH436$!Z7g3V@x`)vZZ1rby*d^VVzJdgg|0% zN(*H#hfz%yGBgD$xnHd|GVEF`eaoBEWm%|lsvFEK@7xs|mE*_q307S$T3(iUI{)%; zxwiaQc*Ad1psM+bYAP{jc8kb?mKX;Gv=p7G?v>#Zgd0k24KC!r`(Z$#sJpib^?cyENHLlJL)tkSR%4BJY0mWfIi~W+~ye8 z*CIv!%Cx6#nNvFDZ1Yate9KZ9m;=z(LV zD(jlI)2C|y%1g!HexgTlJacy=zVNHlz{z{g0u36^00=>M7=?)$(Ez37(xa^xwxV!Q z96*qHcIooLN8tmD)J_MM1Gky!-DOWL%a9@}d< z_ew8^R4|%=C9`HA@>FJ7%=IJd!vrMw zf?VOoEPje!+G9D?h=r19WabT<(}0>)O;37?RPS=b(Yrg(Y_p)#AN;ZA7x%Tm?0l-i7bxzi54Ra-zv$-DvVTEE&BmcVLkF>r|U#rU7f+cxk$0tIu2n zcz$;`4(z!sVPLXEY2e=OhZoYw3NBM55H3G*1hh!<0Y*EGS~ChugQ*=X~IqVr|K_z@y&ql|E2j$QcL-5?o^-l=?&dA^NWBeLaYpQqR zGXmCtE~ZA1%GOc@J2Rq;R_FHOXhcJ~D!$HcwMQ)IC-HMrGnD%VGG^hfS%~0#FuP_?zlWvSewe*&vA_g= zq2FIS|J$tJ9$|BUxeAR&XY)1d^+m7S8cI7H7ay*rlrXb;zVB<8g7lh=8VqTyL?+Ks zs>68iW_qC$f<{iZ=F^U6TYl2dKXBVb?56Z`MrDnLVP&(LuBwGt0Kd=v^N^pK*PCt2 z%r>eX4nv+o#%Zy7A0#dK3wP&bX)9hy`6%c)M|^20&O}^YOFi)YsH&rI`5}Ftw@T@* z6tW}F#SD+(_-bf(55`_f+=1^2t=$&>sVemKHY+E+1RWfU>}X%Rsr4|l(t$jcr~#w! z{qg}{F6t$VWoa|7k5%b+oG~1DL0QMgSa0lMw|r}`wjyhX>+ngA*0J$A@Z1P5Y^c*= z-ama(8j?dh_R&6FgNI_!`q_)gcV^F6CL??ZrF3V{K2&5IIol-a3RDTe0>Yn!Eu{Sh zio@y}rqt$04|LV!Z^5uqWqbZMa5I7|+lWPp+1f!wKs))>6Rnr-06$sI9t4DwBP08B8;T`R7D>1t%tN&(nWF;b_)CSLtA=zO9#^yvLx!z*u`LZj$LE|!|XM^!M83W5<$qbm9NNb~o- zeVT!9=Mg9arU==9Z_|dBbN4d3h)147>aU7;O>n8l;~~yrr9_)3jVVG3eg#=qKENq5 zQxzBqz++YBlz2jNErJI2vCJJmh{>Kjd0JwwPfKv>-2=*4_xFsLj%wUg?f< zKg#Cczok(a$|FD7F4EjOq(__A`B!tdzwfw(2zQptSo_{QQ_Pvd%aV*J(yRhO%fw<;Ld} z4?gUkB5Nv~t*t@r0!@a?w~iqf;Ku*g$#diF!IPuFft7k@l)hEFy@qr#A?3zqWL0Bk zXYGNO@Kn2ytp@VB>om+H0FGqhK~=9`^ZyTw80!)i974mDzbPo%a73o<#>%)?oP281 z8Ilb~Z*0qjBCqGIy)sOuBizW#zLC0%eS)Jffi=3J;)xFkfMzJnTT_*&eLiWe%TLOX zJv(oMXS}0i1`_bH4`{Wo4EA|?a0bHP1GMRDHL`QgujUC`6E1O}_}}p0u@eZkfX*|# zCB7q7`uyE*({nfmgr22Ht7?`^gQDyl8HUVLmtbaYeci7(%?h?2J$2mJ=SEB#!91MC zOhJ6dMU;>sxzWz`TT!Wf;%m$V^t{E(N3!>e*J&grF0=UDON;8bs#p1~U(b8oP3U%s zG9r9CNZcFfIk}YgQLM0nHlJK^Q9kPjn;o|>Pu{XmJw`r$fZ@LLMnSL)f}^Msj?uGg z)7aeFImzXhKs(k2@5P^m+al$}Mxs87Kki=>B?rb(Ta!_!*c~$No3f{lObKkD`Vv&@ zVmWJe#MsN)D@%}N{iDZv(w;!PZ4spErGY&z9hQu3yZo2m@eq!+uk081)jDN0ls71) zqdWdg^4oN@o*kCHSfG;S${Pn;jZnL#)-t51~{ zR`nd>kS5Vlm%G9_lw1Ub6~n-y2%+FpREGxPTlf+4*98@?riR&C=Ubw~&tq+h%~O~; zj}mOnK{~i4ad_xEYg7E4^a0nG!BUM~>J~X$honS}9D-q@+v+ez-I0T6=Lo2n4^u&6 zm3=BuUkfR&#v4uD+teluH{;%^aBn+V{^Fe$-aNd#VrU7jVZAU2N3%0t>ZJ`H@saiZ zo%N=K>-u$GqXNg7fM3bT0c^ite)086I)*ABwOhVKp8I4jhEys<+MxU!Dj;DP74&#A zqT$6^Cd#;fIN4fZv5da3#U7U&Y=Ok#=Nf~g5XW6io39lvm(i_uc-q>N=W7mcbdC6K zwwn)ISkxI&g~8vcf;t>Xn7A>RHepps3Y;;)d^%^34^`nJLZH3OtSdC9}RNWyOS z-h!dpf4`G%kMC}!yC{J)3F&RxsH%o3NssXxBBOz4#J<|yuU(`MAZF=EnnVJ*&Ht_f~BtK z-ZUnD_BsCImeV6(i_wuZIkR}VV|@%`cKB`!&_9OMBFVhYTcd}Zb-2iMg<13}^~%^N z-pd#@g3vNO?XY_fBoN?Y)&)VrVksim#V=oIeMb-V5`orQ2gSn{Z-#^VivQ;Z!+DQ%sL}LGkU^Rmz`}1_i)0@k>kGaJv^~=Z0{!Zd zCw!R^7RUzdZ<>F9um79&)y^NyDa_V=5CgMzKM^e$@POI(%9`B6dJ-6M$spFT4#WAC zNW9Y_k6;bIJ8CAtYe#8pbPc-36I@2YHiZ#NzG*-Et30_@*V*wb0gPh(Sk;xzZVcN! z30>E(z2Lr*hzmGR0b3jdZ2Vn_9Qi%~2!P+sCWS21Ur-4Grz1##h;9stG0iD_LAGw8 z_03iQ(DQg6vwzP1GNsMHx?d6OC9r?L!r7QqIcwHXK!yH_juc_4FFU%~0^$LUK`#eXh7JBOzwd%ZMR6IU$eT_d@s1`h@SK$V#W)xh*YR!~f^2E5PioEyG}O zOvSY!cv&Y_U4S`vl*YM3HMioG$G8scLKYtf38Zf3m!?!&_z;Q|p^_hsUY7;zNTfS1 z^)_S!h|Vg5CoPo~9LkH{_8X&#J7+_{DLEe>jiGBR&IZ9F_jT0B zjdT|*bJRayML`nbqCp2%s!Rw}n1R5khc4|+Rf1~k|FkvSYqcRBd@*2CQTtyOV8XFg z1*Z_j)Mc&Ser1?QbG+VoKV*mzwZPWRuaV07%Hb`WZ@s4zBm47MJ~5e?#E&avB^^i3 zRvie;aJhO}){si5S46CX+w){#DnfE508rqWUgE`NuA9?sSkgClC=t)#S^_>I7Cse6 zJJJ*bJ8&i~B53e0&#~Bpc%o$b@NQaO@8jR%$1|8%nM-Hrix^GQjee)e-3h=8TiSlx z>%G)#(PBEH=o#V7H$9+}g@{vVaBTrZ;G9J2tqS;zGb?NudR=B>#59FY9+K+*B&p`-bomJ2Mntc zW^PQcC!Xh3?k(B#TYWQx-!A*|;k1orqtslv!d+#tT8tA z8u8P<4{YxY zvx}P3!+9PXMog{?^hXVDTo^aK7L2E87=3(K?_Ls#9j+@kVBL>wYsIG8XornW7Af;Z zVp{OmMR^$cZmmR7=YV}>mCmi)@2|xzPVCP>@AOL2N{B38L;dw`#9F)eZAE+cJgxNo zCe_;*S3<5^8FY|OG)5j<`zoDxsQ|WVY3#}Sbj)8zAv;0?p_UE~sEftvx+sPUPl&4e)ckj>|CC&Av_muGQd-Ps0%)|8q@HDl`V)5LR*yz3?R zZoP$8kj@;(zUxJoh~&8sIl)^G*04wm5mJ8(-mUHXnO!Py->9Lci@h`?4jo&`UB}&D z)%CPAAg-sbw@~O!SwO2z{3ETwTB*V{Py4dI(2H<`uV`}o4q=kH34?ie{$ zjh~@B-#LR`%Wxj)VWl(x>-NfuU-Gr66B*Zw>^D4iD4Es5$OQiku8!@CLY=6Vn1br< zhzccfXM@<_n_JQNdsXuaHugxe^5`(927lBe_w`T(5Fd=dHoOSf-=ucqhX~BVgv4Z6 zuW1SS)b0o6N@b%@0bdyKX6UQ8sPEMK5BJUX@pM> zAsx4`8Jf-=*U`R@5lX>ZYPUXkWB}gQHwKzjx_o|Elx(dgth#0tP9~s@=dh`k)ZhPp zD4l*}>uM|GDzO$xoEdf1Iqo&dZqhJCocs1f??Rzu&Xym{En2x+7&_N)(rytiO`Y$F zXbhW07hv58shC@26ipplaeS`lkIT834!m=ZtlcN8gW+h~`oH80a!RX54aV0S#pF&q zDOpydRIj%AUCf9mO393wY&jOB56V%643-`L#w6@f9sE{3_ZTev+fEjjR*PBIDoz`r zc9iy-2wav( zaan2Vx|rMw0V;Fu(FVD3Bg- z3A09%_HnLGvOt0u^xKM0+3rs0g73&z4gSlf{c+PA)S$NK4?0R6+F1Bb-XWDbo)qo3 zirg!zq6I2M%Gvs-eYJn_+&^Ut=g(dhdUcre`bzAzh-_m@Ga-tbKIOtJtGxY_mYaA3g zWheEu=^@PJP{(5egil$#*>dgbypAPM{PR*W_%_zNszKZSstBpEbRFmNmhizt+JTX5G{~ZT0y~tOM6tyMBUVm=Nv!t!X-A>-tIMZt)y@i z4z@dqPY(W4E=GvyD-)1!HduaPE7g6I^%wYHNnb$x!91({$#0GsZNZ(>XF^e!X$$4x zX>03Qf0l*YRcAqw^-4}8Q3B6!3Ns-beS)*Huh8_6_-0LMK^w=w>(d<1vdeOvg_SZ; zDN_3XC8|PO6PCn?;D6eOVU46)cn=FB@chX(M0;^sOSlg?+hCg(Ai(J(zLt$SDDamU zhG~RRNHOs~{#!)N!L{^Cuv_yIJ=3DKXM5fqbn`2aO#FFL6vsL`+SS8$^@ZA2e!|~Z z287Ey%i!U!3lr~OHztxkZay1$(+y9G%w)Ul++H$pS8eGIkuOz4Y`iHJ!82(z30%64 zFOPVs?P=Cwgh>X1x$3;nMDR*UDIK%yAG%cS{Bjq}YB8sa$FF;>CZp%>q=S2un2N_w z?9wpjSFgx!(vOeIU;ilzz4VtOLeGMYLWDDq8d)r?wrdTKr^OQc*=9#~+uR_wF z8}$~u|3er##pu*WfU1V`_u=&jrj!OV72HwX`aN2%70W4@qeHEV5Zb*w68FYm>vsJ0+B;5kO!@YF$Gr~#v$&ecWyHv^ z55DcCMj{u*e&iRF06Zoa=w6`$t!|i_a@in0BV25+>Dh0?4+!j#=j7Smvp#c7f;kv? zl0)2wpDs_!!^;ywe&b@v5PL#9&HVViiz$9C$1`Ws6T9P7SILmzV|(OU=56xFn)qk& z8lC(lcL#1VXKC;W5f{8gt@ys>t%}Ylv_U&}S=!Y9RxaCJz@x}{M=5mfm+@M5+bMSG z9MLjjiuo}`NoDX)%THzW`NoiRyfk%)-@LzNXPJ6I*M&mUp!uq=Qvg}l1 z_XJM&TxU)uyB8L{c>AaUV^d%IKC;gH+oD_vHdRHv0oLmIR%PZCV|E>b@5Cw6=m?vK z{ZSQkMrxhhmqXj_dSUk5&buds>-)TRa+rIR}e10pWXPa8qjjaLjWGEixMits+6AkHGGvl}Uz;JgVC_x?S& z`5OMvMWhN@M(x*4jWNNJN4ROcmwCA*YNUhC%svY6;Rht#$wXS9ZNzg$zx55l_>Bp0 zC>g3YVD5NJ=v+)=&ZV`ybh{MXINFv#B(e?N?b2b2O%&t%NmP0uiBu9kf9*7hG}v12 zVsQ5kEjtrsWDk^Tu_enJ))C!Lfj=+b$Ln{lpPHYDzMI-19GTE{r;0x>_}iSRBMvEF ze8YJOm!FlU+abr)oVi#=7mKJ!age7s#f#kz;Qf9*s)$z0qisbykf#HVhvf7K>8yjYSPfL8VmQ%mL+~&OdSP4`TrTs;$f~jIHGC~9ri#JW3lO`x40gB} z^)+!PB~l%Q{^=IoOh+>}jo%BDm%(VB^SQMe<2SB_zHJzp(P1dvye5_-@`T~eG4Fn3 z7ce`c$9O|2S6gq(;3W5MjYRsE;@t#96>X+SkX_m4VS`aeQKWhQ_auUjR9@{xW_@Yo zDmah4j`XUc0a-?ew|L3&Q-SMu=Y&RVRiy6TE;%Az-B_`^<==h?ckPT`s!p~95rX|Tn#-Lbule_vhG_N43|OBK zb~i?N;q}w2gK*~{jUS67NTUlD-Jv=rH%=}zsrm28+Eq4VAq#*1=^B|-#tl;{Z8bA( z)w@oww|}8_R_z-O^BWLphcjN2LrSx#R9k-g^u!ok73XwPo543_q_GIeARPYY%-ofe zy$_*)8a<*kX6=mK1m)$Ivd$^e0;kPuSk0ffu|4L-dJKdCqJOD7K;zZ#3^Q0?=C;n2 z&|aKL-aW4}O~uG!MSyL|@KRe~_N2lVuGq6o6&FtS!9pvM$4%e_pb3ZW=2=p_U=zGm zomRvf;`HnL8Vh`KPSvc*q%zy6s>1e0Q`Q&JTMU8MG&x?}2EKcC+k%B9DiTOXyp#`A zRWe2-vzXr~)pat(jYm{n^Ox@{)6LaWX|ZdV$(?^iRXP?+yUqU?f8l+}!IPQPH`%sM z6})rYN*CMo`uB7Hg*qk{fq3OMsxQ$AfOYlW{N&O751->b)hV>aDdZpeB#2YAg~x48 zS(O23ZEhcay|FVq6+d|wrXej>BHUEA3xic6gCRD5j_#knfmVjk)1{84hwu!o=iT)h z@YHyBS9WvyWHhdz0ahNk92xRx+511>H1gzcgDc6{>9K^Mxi>r)~O6Nm7td6PW!8`k=maq8#iEB3~pxNV#M1#gnd)g0IkKG zyrxTW8N!YBtfsw64ikeP2hzL(8l@bKYMq0DFw!5kEB6i}%Lqc-5gT!LxE=|5rZS1m zIjmHfLo|YG;n)D6f9xqe@ImN+pZ#5pEvE>bF>j`tbB2|GmYB7o4iV{;OZXRG49HiH zOlw7c?$*>u=v#~T^fU1$J}e)Z{Mq=n+WQ)xNRr;D*ugE5`FW`%N6=vvKL%&&Q|gT8 z3^z>f4=*T{NOyaW*UtgAmMWLILvl@7S2oEqX-bQ~%l#cnioeu#A%gbF4=$?1+7}uX z$BU<7hDf+}j`%=aad-rPhb~tBsqo!vAfX>U)N2{;rPXq-O=T}hc%njj>+NjY)`Fc%!^8m6>;f%`G9VbA; zD99Nq>yLlxy<5yZlYB=*F<`+)KeXwBY2NPPZ_v|f_t1oua&z( zd6vI2 z8FsisY5R=osr|G2lMQUeYm`>UhsBZ-u721O$->chbw!dob(JLUFfi9`C>@=DD$4av z6eDp{Bq?flDsv%JU+_y*2I!ckO+p`qt7xAxN8t!dT{e^sDub+Xv|3k$`8E67zT=t} zv`>A;7T>KvEYlmv+1**63WxiH8X!ldbURSCdM)%JbeJ;67;60T2h&Wid{g|z6A`4`aJ6_LtkbR|%jaB%6+7~%v>yRIK1?I6O84bvX0*qW7` z*ZX>1*Ynz3#Sb70SSSE_k2TM0l#c4IbL-Hd7i%uo*yi{v%@)pT9KTk)e#waQQ36B1 z_TTELA6PpBGP;cF@~o6~Kq$b=+iBp<;P0*;T@&b1EyJO2G;o{5d(F&G23FqG)&}hP z^%X8vOjK_`pHa(%Jbx9VF6J0~Q`*FIvAk964)Y}YFAu-at6aqa+!-rYvG{2!CxRtp za_O+(d&G^QLr<+*yR5%E8`!^U=XO)!*~d6iEY*BdN25l0Xc*rA!(~KyGgU*<>1L>q z%{1$3AxbxN-uLb%{9u_=p#5$)u;6Uk4Tza;`yB5vF;i3e`i5(b_-aJK)J`J|QKHHA zhk*+Fj$yFnPR$v-oQk#OxwUake|!D$x@Sg`YAuFHEqlFSja&PIK-pbxNW&`B%L`gk zsp1vw#(oQjgm8a&Wb^+v$Rcm_+cg?9Jay};1qw1MbknSEbAH3?#Q1X+hpbeGJ|>L&4;pHf9jd%1UEcW76S>D| z?A1?~@+Wj#%sT1tGh4{i-$$bA>ydSoMBW6$#(|+iSw=Y}IW*t}5AR3}xK_?+eme<* zO3HfW^b;FxyBbo%%0Ts2TKbq>`9d`X zUxYOG7MMv&v9FS=?BUw}#nikCnR3aGg+8i6megx1++3j-MrHrai;zD&wLr0pJkMX~ z>=@#j^y->-seVbj?mge5YBcX|VKSNY!=Q|EX^_q=1sr4DuZ`2;_Eio6A@eH+FhAOsyDp+XAxTz9bYp$zzEkPuXIsVY~ z@xk6m9XLN7g$?zyjH1LYAvR_TOyKI3wr#b;$CoNbsT5J?^j!CnDoOX%hA`!`_>K-# zkWeznVaY_ZbT^Fc&#RyBLw_F8;5$e(?xgEhZ0b?ZC7a}AaI|Nux7<6{@uRm^qM%3F ztzDgqKona+tgW@}4mKtF$zgzx^5!M=9Kr_7poF_JOXO$s_v4!&V3*SuQBxj4OJrJ= zEFYfqp0Clw(ieOLK7w`(aW=H0s&UXR!$Oz;J+!fp&%T|qW5cHwM41&YM zl*T|!Q5h`zv7C$+GEo{=0}P&x!T7jeKxQ{U2QMICtSDHPXI7YV4nSk)#yP_urkh2^ z^9c=-(<+fSXg$2^(VmP>kIBdE;0grO4;8e34rBnTz~n9Xi~OANV+F}JiPDl}bIv;a zNJF^n>`c7lfXw^b<9ZRShVIX%JL|&tkBN`y6=D@#b7%fraUjC(Gs=g`Z5t zpNBFIH%?Kij^YNr&KD!^$!yn-9Ka8`ChF!!P2TO@qBV$*cHZ<``ZQ|@SZQl%hp|Z zNG{IFIJBksGwf))wLY!C9{lR)Oes|3Tsv9VS$Ty%IU|!hsZE8+o~@{qx>d$+o;FVXErq=FAMvg+^dhNgptGRO*7lOU+52C4p1HzLlCf z(%1ImaUN7=B?-nm9tv}{h4xyHf@oWX*mTd$bOBZ|Xjs<^N1^Fq_h2kmoMyNic$;FQ ziDeO|ik2;V?Sa~(RyBpT-lGZ+vKfAoVF?N9gy)MeSuJ19Ks=f3Q+?`S$vLPx*pOJ` zN+fAmEE`w!tC~66C7!xMgw+SstyJ||YRFe$54!3b!>+C9kNo;V^0c55w6 zMnvP?BZf;-vR|Xus4>5+;GSBgpX7(FZ%>FWlN1WXp*dAw4K@m6(ler`%fOku#8>i> z7Hp49moiv%fr1DBiNWR-!8`l$pq7#7)t6b;$%#Foxr`pO4T01PYf)6o3R*iybcY3N zeIH$gmx6^lO@+kS2t}n1YgeBC;1_(szryA)1@a_zlJX$0I!fc%)M>04egrq~Q}WD# zb|se(HrU<%Ia2&%Uf-Oj9hNg@aBzepxM^=uEXuLF37y57f=}1(mJO$DFp;)wb#n## zQ64Bf%#iV4sROn_vXb^|q8C1()OLsZzS>+%=IRSwfH)*2eZBsC*LPNLBhWs}wE9xm zv;TSl!fIF2wCMTIC41|0sC;S_XdjQ|*Hl{*SYfrl1J(sq!ZEhTdiXUpgke!GFuy$& z7)&G({?28~jx`Mq4Gc{5GZ}sJMbn5~;Igq|z5FbzxU%}x`w@KdSX#*V_QgZ@NHSebnvF z$QYu0F0FITFG;3xH1P;=-8NF6gwO!8uKOS`W$!e7@ma#8-HQdtEOg!M9D}yB6<4XA2|&WZ$N*OY6mO zTOwbsF3$1FN)X=q-R)f>*8JgO+~Wz{48AWBa8Z)E~)N( z@UhvTeAqWXu@Uq5n!MS@m1hQIjd@Kl^ZZ`#N_niX&;B-3TnD*d91+8$djH5s@2b*boTjysx7{Bz$ zRzh?HCDeK~-T)fqu&HIH(t>*Cm2Y|za|*0k9!-gnXXRQCJgk#kfD0he``FQ26LXEA zY&MNWO_pfHU>m3`w&+NC7(d!G>`g1oBF*j1ACb8O-P*XZGilz`rT8Wjxh*jCA8sO& zs03@AYVC_v>7qnj9F_&$ZwnCc*M&X?AWQXz#^xaJ|4oqM15Rw5gGc@!W|9M6qqDGa zCmLHiVfo=W&la7xSS#e?3#uVsa&XEdD&)}Q2oDX*ajj>0tKAguA4$Srxd&1i`L2#h zoeA0<;HysMyTL@op0S3b|iyyP`bfuXv8^oV7A3jLe|N6l7Hap1MsulcS6@x$$l&kOwYr4UQ0k1eTDt`l zMX6gDVElFr23eHjues5ATT(qJ{%%SrKhFHAuV|UQkw95c_Q)P9WFE+m#vg_rmY+BS z#_PyFcu4_qaPnRoXh-1cupgz9Ne7oi9q3IeuDz_WQbx^K2->k*pF4#G)cmTk$%L+d zV5B}e@}yr94Y zBIUp{$pdGqSL9BGHnycBSAM|QidwTmRhUyOqVfka6=lcw<99c)tV|3g?7xV1<# zjY|t@aS(@L*6v;y(o|bfDOKH-;1zv2WCbiYdyfRoSKlBGaJtRX<(J**D7(~><^SC4 zToX6qqY-E^{dFcI2Oo~gs6)JyL-*A96;~^5`+}~17Q8{1DMItq`XnI%aS=z8GaLRJ z!(c0HizLlIm>2X@1HMMc;fbtP>5LMh{6d=cuB z^<%|wJcxTD!8BNVJ;vGwTZvG5k z=av+oit({hB}=e1lR`-KT)uqXEqlg%YxQLJAZT&3kz->ArM}~HzuD|$#9A2nh%wop z_mX-^2+xFN_QgeX7;%9Hob>Bf{uGebXXfX>3Es_OCG+(9^rl!;7Kz zaL=X~OPrj%NFfoP?3(^WDEED8c-bo>{%zQ`1}|P2&3yvo8g}49y5J0D70?xa?t`Wj z9lqSD%ky6r&jl^9w!)_7G_F?fB*9*fhSQz5Z*xa&6)PUIhoh#I_#L*HQ2%b?oL9bo z?V5YmWmwX9F{k!uVNL^%P%Imd@h}`$lJU4~`^OdpjOia44w=ai{H<8R2T&5qEc9VX zY|WWDa429quibQsNz-Fgl#zDRvpMAw#@mj)+lncY#K+vbNZdJ=*bP#tldE%*cVAq$ zq4y7TlOl2ZZZ!7t&--jPNyU$a-<;N@naazXl`dMeh_ItKND<6@6iz7Z5Z25i2*3b9zuxBb>%DruJ6Fr5ZY_mc%WZJ-C_pKaKUnHtS{lhJtB~@@QZGpk%PIt((;Ff{;NO&~ zG1~a&rP?ut3D_V=sVGy6coWx&V{_rWnsbWBpnjVw?EgI448B5t{!S@xA){5oF+)*! zkP}hNC-tMB6+wtTzRSX}A&Rzh@Z-$0RlB};DfqD!-Q4|#$ytVP3QR+FcNpge4vJYe zMq%zh1cBHh1jhc@VL6NaaTWMr;Iq&O3vFvr4Al(X3>810Bj{4i zZDCRz_W=Bj&J%dB3FP~s#^4OV?Y*iAf0YdPidBZ=HlcfldXsTzL~Ae7y15*;Xh-KtfuupSM1uu;s3smdEz zm-Kxe{=dC+c)?<=FWUdt1)3Q}m}bvUdvacT1Lvij%ND{U?erb1d~?{raM@17n!HxHjGG1Y1lBT~{jvyCnZ=rNebHusDF?KS zbl8rlc9lVB&gQK1@UeT#83hu=I%}U<48-JxA3e(RIN?KHuL@8z=Pdj@y`HQ>XwY80 zGx8s?A1m$+4^&HpIw0g|C1{=gUB`2`BvgXmLOsVCrlh|zzV+t@T&!s%8p9r0KkWaB zD>OEN@_)GQa4E2u^;^I*ny}-RzqB9OhN1$cdMe#)T9;zZMvjdlCS-YFbzry5errQc*Gxl+ z>l%+ULq0fg%9+3F!3Wxxc!C%vlPb?8GBg zlhz*`c2@?6f1*3faZP?vG?V8iPL^nCshnIhJ8)UxHnuZeSI%{-#dNt-kpXbGi#wr% zdsH4^2qfXFBP}-eLEACzJ+nI8u`Pe%70rW;&V#L58v0?dnOxM45Lg~JSr&IazK zwGsziZYvXkK8XXNKf9Ho2#l zBU3z&Ir;W`{6iF-z0FIoKRM5`Q7!AUWbOA(_S?m#`Ekb{)f*Z;7pAT>Rt%p~ z>~!a3k_74PXJ2Y?Hy~g7*olWyt9q0F?c?RkICduWIcc}N0r1+;Tz}Qs_9!Mj=%Mg= zWQe%ntfwAXdMcyl>q@J?7V28;*z~)g(xYy;%UXepJ$kU-I@;Bsadtm|3 zx&7Ze5U`YF^Y4s3bHz>d2QMzT`bh|jGMms;%=F?h?gP#}4<;jXKHe!1kKMVTRp<1v z^J<-F>*AoJ4?kLcqvVupKSbg3JnUsEw}#-Q7t_DPtCB*>aMnV)#U~ssmkKY`td#QH zDFWF)LsrMh<2t&U`yw1)ck(1_vy%?=9~2;;C4AV=tA8l&@|@y^Vkm$%uAkm<&q%qW zDJuOYRA6ZNNLKyu%A!y7TWhP1)~At+d^-1(52e7ii5Pra+6{sl0%4nI8}8EmSdscL zm|=)|!a+&hy1>gz@7hLd#b!vHCjyVh4@wj7Amy$%3@$C!9Tx~AaoEtt4*t!z7OMZy zm!)56)mIW4=$1XAjy$;c;7cQk@GJOQ+4mGAx4*k^4MDwz<`i3FMnuigwq|q0?{W_}U z*QSfDNsPsteJ;oQSl>pLsl!WB!zQoe&1Pe|%$@;JwmwZ7iVv`u z81BW&Kn{CfZ5@P9*i`?h={%yjzVPQol!PwxB}tn0^oLC}I<)gK=@k?=kFM3$d1LJw>KwX~FVt;l0K;fel@Y;Pt)+=bNLRCy+k zOm3GvRx(j`Qu%P%xSGeHCnm(&H71*V%TYvpx}WvA0INj_$lZe9<5uv4yoS5;C66LN zt$VSKCA`IhZDtErK25LWoh=Mp$$IQMw@XsI&t+d(MeR(H*B;qIwE;VqHAT*v@y;j+ zG6{_T{-{dimE}k|J)bZV)(Al&k(<Pot)OiH|t}cj3!}CF4eub4;uJiOBbN+fX#Vs@{OscUQbkH`YSdx>ySn zS=uJy9gZ3C?f>sFd9Km^*juf-w6{`&Vt0z^6d0eGsyc&vyBD+PbzN9_=TR;K^uo>} z1Go8SQeh+_9s{e71~8&W(~ZwR3t8>D6T^=A2ZTdfi2BnbT=|54KtVhAwUp3~K9Mt9 zU51A5%wOTqet>t$mfzJ%C z3xj(+%j?ABOJ44LhaNo}3_Z@ls-(GfeO`}1Hei25H~3_jD_-Ri^meOy9hHMB zxYIN0HLm*5s|V8y#RpEix%9fuxLTSP=LqO;OiNH%#zcpwGUCRycp>U#kKSX|y2dS| zyeAyk93&+3QT^2?DNE^ z2E|7TYchI=E82C<>2pU4x)XTC|q`gLT~V~7}B@;$Bj|HRPnmTr=#g_J~E zb+xr9CvDc+ru+#7C$}SO=ka*<&%d?y1UtXAlvIC}NV03&yrNRB+gxtLxNVzs?D(vE z9^BV$VX{{JQGfkGuUzS~JBe&Mes9id65{obuP>YB;y|=zs%6?Ex)%Ie%eE@{>7}6*>j(IA z4g$pEy5DxCTlUjq@x|O}LRpg4!##Jl*Wq*$D)9`pJ6xCMOJI2+Q|s|`6xboGvT=3F z7KSkhKc|wst7Qq`>PHADzmR_hcwKU()^YRTfHrt4L%(;5HdHJt=BnPNXM2&l=_iNV z7tdR2*2L@CLJ;CMWBV>)WJ(jd%Xa10;6cXmFtFvSyG`O&7wkACnzhfT5@f3=i+BvM zgY0flJ(M~0bDjdhzWl+j*=B~lEe2(T`WKh?&;FZ3;xL{@ znwpq-8=qd7e_zYTB5$We)7UT3ObZY#@;Bi6*Q3!*lhz5r%MpQ~ldq89fhuqWr(Yf* zDe&Sm9G$Zb1(&~IlelO4CS6RL>I)~PBRQN+tNFCIvz(;0816(EN2#rM9yh-qJYg8@ zq|d)sOihP)X@jU$T!W_lB?$Tv&%*g=R%%BED41`1fOO8;^asd)$NInF2_E_5qQJ`BiyM!u?Vn{I zcW9vW&T`#Nz3|2Z?r*I-iy#T;9yU*4yW!m~(Us8@9l%%7Gi9D++oBeYPe7j8uk)|^ zTDL_1>=herJt62Wz#YFyQtT>_+cdFjk=?f<0S>PBHN`=-(9Vbp5HRR5@dBTV zbQt{BYr!?K3bTykD}>(jaCG*a_vsQbX_9(e2TQ4PW`%b$ot!m!QkUbncA;CR7`AD#b7FPJL|V1o_XAOa5W~(Z z^_O-bc6tsiCxx;PQWr-H%0*mwjPx|HQ;GjiiL%Fqv5Cxz1X3BSPmHrtHhX*C%`*#P zI}|k73u*TB)v7DVur;+cVA0~BPX2RLn9O)PGUzZxB?Du$twn{dsJG8)JsL;wb3a|s zHxhgYgj+c<;^KEf&zV`Q^tGsvS2PpIpQO))@4)f9j&OMlSbjoO@KarYD*WXdaf76f zFK@{Fe6A?9428TLO6zjOI*!$y>#m{COf8(Rg7<2Bp{{KbEfzq5^;Nl{%)_$az_3D> zO6=-Hs3BjxKj_-sA<>ZvA2U-|Dq#C&J}x z$`W}ZuT8poLGNmsD||`qdilq~mAj_W2cwl8FL)+4^lp&F)dLVCFe zpUZ4%dmXhr!oq1sczn?R2j)P!^qPJ!D185Qr$*QpBPj~J`8!oKP!SD(>`hMR zryA(I0yNkd!o&*|CTUT+Wrx>(0*WC=1AS0F?Z|!ZFnPeG^%eDver)KC9L3PvqH|m7 z5l(1L6RZ{l(#Y60{W*Hg2YJ=LLijxT)+*|E&R}csBD7FrIH)mn|>;V zV2;Jd%QO_A;vq-*8E$hSU$|4(Eq-lP-4ZE5NUC{vWzWfR)GZk549L_;MsnGV1=uy` zy!=x5GF;)Ctl;x_^=c~h3#s(Df<6+MUbfey5_b6Pm7OD8R%R>ku@;@axX=)~B0Y=J zHbHYWWB4RU!NVpd|8vaCf`qX;BRs~VjwG*a2Q3Eg1!Nu+)fnOBzv}__@>X45u{4n9 zLZG{qS<_S+RzWjW?S|YFI$6lS?zYcHngWP@*7Qyql~fj5^VoZUubf?-4hvfo$IE&@G=mzYz~U1WTXG9Kz*XLL^^MUU)hxnwkCMdsWBZlSfSuUz#8h! zHT57{6N381j)qwXfmirKpD| zs`eSDh~#z16-665;5iWYOnDuv`=)Qy7!nTJj|P&-mZ#HAjCv+Gn-Q|3mu7bRf$z=+ z`=ab&u^uS7%TyWuWG+^;qc8?=W0 z6XPiS(guOd1cLnl%E($^C5a|DC%;N@LJ%=PX_3m9hYs7Z?>{*q{(E>)G_XI>#e%T#C9VkuqIxkckPF37+`Fir3eRvK5H9|cKTev=o`IN=Z4`|~>a{2tjeO%(7!+*Lkj zYB5ddFDAwlI(TjMql|p-u8$zDO|A_52R#7q!HY$S_yM$AmzAuu%C2b1DoR)~LS1gG zKK2EL7-zcR=$!@ePl~%@(gzDwr(B8e_G?+1%$-iZ&e@ro+OEIA#1cv$kyb7$76jw{ z^`Vl{ZjXvFBc5iNF=Ab{XqJENy+BZ2Bp(}U>7 zcal_}dcqpEG;!1kG`CGllD`t~HukK~<&C%Hnn=Qj#fat|L1Hq=M`P(BpJ+9(1;SFF zy8bu>hQQVstLO-~SMH3#&=BSbHwy_WcY6;B!kn#!m}q7HGPZUPvG^UZn4W~}56XF+ zRyD>xB7uZPd_v=WQM*5n>8L3?wV~G65>Ywwnfk;R|MdbmRxb)EBe6uys))pm^#8qa zj}X_0&2_mR;XGPpZwz;xc$W@tN=0@t4-_OB{c*L)JZ$Dh_V{r2$e%i;P@@Nc$T`aL zrWH4C{U!VX66Jne>_BV;!1_V;xg6g&piU0(_)a#oJA8H&yoM}bgM4L<63Sm&$A)HX zR@dhZ+y-?v;nCNfh(OZ_4pcqARMc8Sp?^Y>h38%NqxHHn)sL`VK0xHbBv+}QaMp4= z13}q=|KoajBQ|I#(WSH3G+sC)$1F3%U9zf?SfwqM__1G(COP9>^PING z$vERH9W7ks{l+i%ibqHR<*YAG`^-ON74hTZ@5m-lHY*{9-m2r3LQ_rZAq~7gN&I zgMxgkr=jc9n321ObyZ%R-uJVu+$^wd(&Ak)>qI;}MoA^VA2EQcmJw_^`VeCx6gANwT=UgX6WnXu*y0Uu|xl6g^>a&=4f{4GD$~^25W! zZK$1e2JT2;nY9=dcf(X3eHMQRHnyVKkE35aSb$nEN3|!W6xk@^4VF=CQGVs5^{j@Pvv)VD;K?l zGlTj|{Ot72J@|3ZS>@$L#PkdyHJFoDn_>@t>!~X71jxFbH+Fz*!&`nvXsTE@kXVl$ zbS*lV{6_36v-GU4LH3HUzW*KNJ;!pN$00R~&@<0=cEwLk7qP29w}%4vAeW_+1Ion- z`#5bH#}E^txGO3ln=niAGf?D1t%!Y_#(d~oO7xHJV!huUzfOkqU-J7L@g-l1GDfT> zeI7_Slq={V$Jvu!+uSEt(J0LLPFy)O$-i;xW^@Z=9o(CyX&$1W@(_?18ki58P zPe_@r{baL4^0G%D!w08}89PSy|4jY+Br1$1R$kA%bc>s%PB{Op0q8ki$Cs%cF{~&X z@*&^3WFhd?A@TZi;#@^ZW1!EI$~j&YOR@tvCz+P!sbG`PrpC?%s{VGnX1o+Xk-Ah9 zBjGsJ32l1fj!r_C!k-h-ax!T!kSq!D8G;UkAC|LV z$7S^lU(H@x@$hhq4W{{1X^VA8Y8(l52Ii4C-mK)zl{eQhL2jlpRe0_oe$pUrywyeDYN{;Z49Tu> zWF=T!a$5G`i+I5C{CeW)hj3!Z?XaUY)Phx$=R|&ZN*v>#l1H&X&5#Gv)n1w(*oTpL zbbP#_O8mFN_QRfatz#;eHWbCQwrGn)R*zCIcF=U+k%LYIGraD6-^kX%S<08Jrt}Qt1$Uq;d6R7gw z9P(D;jNawT{IDaob1Xb_^IorPPJf8RVi~>)LGB{q%pU(>5-vNb@cU#CozYGj2G-?S zU+Jq{Kom9DeKm~dSyz|i(HXQ|Hlk36gBzg50;_K28L}1+Q8IG5o9%e!2$Zd-@&_vm zP^a1m*y?^zHhG~JU*z4X$GmD%+Fex=r-RYL0(z}n0=+~cX&h2O`cnS-W|L2GJJ@cJP5TLt zRXX;<*&b=e=|^tU``6Krc63V^r6&E zmD@Ha$8-%_oR(w_q(>Mtte)EaPK8? z$y=J`?;j5#-4gdjcGyvn)R-Q9SO#G0`?*Tz@3z9r_MHdK@DfLrgJ4j>&FemqD!Cam zZz>nZM_@qBy*>sYR6ON@>?%7 z{;UICMPxzY-MH+qU!DKVK`8VqTYwJ=<@iyb+{diNlDZD%eWt)LBbBIhxcW#uy4Q1N zcN)&))>r$W@GZ6x78G%Vx;-u5in3FY?%ipv+T`w>6kkV}c8#&OSm^N`*QrPq*7nr; z+Ip?}{`%kSQRMjbeE(Xho{Ws50LhXjt9b)*4;j&z3eX_l5L04pb$s6;o zfSN6Z`AFbiN)XnA1*!e*_=in578Ws5D1GV@?}+WIJ~uK2+mhWalFsgJ zCUux}y-}=g!i-Isa;sbCpoi3?dXYiZQh>EY9#}us`~YVI#BQO&=yN{RHv}Sae%$Ac z&@SiR+6}=;H}H>ZyD098iZ|)IB}r7mo8_+V3-x?9ztS8XHC$9O4U6-=pFG@v{P6vG zzQw)6yL@%S*CNJkE%2&QJwkt9Y5f&nTmI2-0PFaZehur#iN`KBS=hABZT7q$2WPf{ z)%&+N<+qEN_PQ#lo_^nxH)+;A&mOt)Ymbg?#UN!~_hMXEy^93ZPi(M^tpI~V<;M^o zdYP7RaR>5TR-v}$r$6G)9qaj~*9ZTWO6#s~;6e7mbWWlO30brcQ^ijC`Y$^l9b%Vm z8HpiVvT*+@XRpdikN$se7Q(gr`(c+qYYy65t+ye?hM`AC4`ErLL;mJC;17jDeMWUQ zdI}0iGCmi+E&P_v^Pz#Eeb0Y%dY>Gy<_yFE%Y$K+_S9VI0TIupj8&qiy(djH+kBZ$ zz9k0q2&BXw|Lsjf4tJJmGpaFwvg44Vq^Z&} zdkPcyoXeTp6l{sL)O;lDkezqQ~Igbm4~nL#~#S;%rs=AdMPaDK*E?QfHzk(w3j|HL@! zDj10GP1)v0G>oQ{O zX{L)?Yy*n*%QWxhJ@qbjd4=X*{(4SP(s2ES zhJ-$MOIEZy&KS;=3|~#VPsi>O7K3Sc*ZK4;f{rI1EKOWZ+*02`VYDbDyvDPmrh6aY z`PHYDz3Rh;88OG4dD+zlzJjH_0^%g{+kp6!sxe!4!aVs%G`<(ewX9+J$BtuWMKMe? zFQiOsK(rk`W5_W&6l%f}8Q*fiiU8fLlfns-<^b{_Z|7ZrfBdRJ9 z_HfT`=unz}V>9Fa)9a?-dk}>$C$#XOv#<$AOH?z9giA(enftBsQB;MOZ)Ia~F4E|c z01KpHVUb5FVo5Jr)w8>VIoDTDX5rFf_{%5op=Rf&s+!OP;Q|o_gxP>E7jQwa$_x>>65c z&ZmLYPM>wLp@F*GQ0^oRYU8bg{4}y^|MEYRYhngp(-YuyF=BF#{`B6Gkm7elYrUxr zK^qt5nSXVnuwq8>n{aX;`lrM2W}-N;&y$f9|G-67nt0dEvMnMtY2EBwC-9@{{n<4Y zwXo2NwAV#IJ7o6)QVLcF6KOg7^$tdl?y2PxfEJT7;BJybV|hs>XO?aQu&PXyBb zDFj!=gh+tjx2C8&2<^`Z30j8n&6^)QiHyteHR3m39LI-uA>kKN?<)mAxq&z8>#;Ld z7hbPO|KY^Z6JwCQpdV$ufnY~D_J~OYPd=I~aw=oUV*Iea3I=1sH;Un_fsmDKLfP@2 z5*w~;!CQ{8^DjH<3rJ<8FYJOJ0C2fW%bK%gI{eRBt#CyDy`JwAN2{=Nlgk+Vh1Z}g zi>e0TLe_O?lrb8k69c7uaka5obHexjU#hqc?O28NrkE9!@ zSA9w*b~NVahx7jl(DG-#Yz@Qwc% z3M7%O_sKS#;Z{8?N`Fcw$zb?vqAH3ibR{$gGpJV;A>B2E$P2fSZ>=aLqp_woL^Ui~F8)ZY)>Exx7fmbSf7!cjJ+W9I!8dK`E?DoL%(tTl)@X|$sfb_a)wl%-E)5TT>oKW_EsYL z7evr6XUyqkC4UyM=xoZ-S0IF-wIO^Cg2jju3!PrybX6Yv`Q&<~8RIZ}oojH#Ith=F^q- zI^)gyBc|kajS%7P#EO3fwz~O!xh)+FN&EC zy#;_l?X2UiM#RH(dWiJgaSCJPPiA!kM=o1^lHraob=CeGW-U3^$IAk{ecK)3r$L+i z#pP$doxFr-VZc_Q4GQ2)$B}5UOwZx7u9)Qaw#?X)>ND}Z>eInwY7ya9K_KYBjDFJM zgd<9S#zflW@%5@Bz9;b&0Sro0_m8?=`nk+NEeww&^_fS_Lies^YJ7^9h^#efs@?Vj zR8!T)#*Aw58eg{L9Y%=?C2IbT61~wBhqY#RnS23n`1HVt<6Iy;GYtuE*c<9_JJc6+ zz*G;OiA#K0NyI%5(^cASn40TcV9Qva(dSoZlL>_~rc}MRW(!T~zgV*^I+Wg5uU;{< zQ@40?QdhQdIO#DlO!L*lszxujT~fe5)TF)&p>1x&s4aD*gLGl8W9@^`^OFk)EbZxnn%`PwqWoVFGP;%m zn9!Va0MogFZr~S8H}2Wu@$4N@xa_Ii;lm3Pm-U~knK-(&I2vrh63=|#k$-n>6Tpjb z1kBX4EA&_?-x6@netrL~(nmeL3ajQAP>y`Bh`35~C1C*|Jsx6b?IPY@%g^ym2QY9X zD*2B37LHfqvCJvg0>AUU%zk)eE*yM4QmrSAidS#t$BQqvOag1dJsP9>A!(>9W`&34 zk+x!2$NkK|1GpsPLQdulJOy+OY(ah*LFtM92p$P|?L^uLi&Zj>PjIHX_aWevCHwq2EO`iAwCq3zgy79`Gx$g7hHjVndrJ$~=&c zi|M_x_&p4h?o$EW!5v|rg{td#V3t}(k3FtYSUSOUMsO)?$}~R^i66(fgxCL`av6%m zl)FnIf*;bGaJ!VkZzO;p5)Vz)tpN6xc_cyjJm_&rxuW$<0;Qmwm{!R2d_;})>A_QX zUR|*IvgnA?AyS8KvwXmMD070IruLQRwTy){H?C5?5IIAq8whc&7)1Pjz1_tUnm0L9 zSZjV@S$fm9I@_JY-NVWVDdb<>SaRutWOXX%k%e2lNNNeHT#*6;IVm4g15P$IDX#I4 z@d>^m>r7B=N~bTYt;3T=G@p_^2wKhn-!L_50Vo$KMG-NnwOPa&bqj1S5iAgfkJItb zeh4o+b+O4jvIA5{D{8p6vG#4Yip6h&_Ki|~K*njPalOiIJeNwk=B4iw{M`E@GT%Ha z8{N?T3ZmyAG(t@sHQ2nO9gXZ?DLb^hm$deF-F;m`HquR&fK&Fdaob3T<= zHHdfE;nj=CT#D@D2I@$F&aUEsM~QknKXBOWFw3{j5U zo1W)gL85V0$zc;ZAl@%hRI=oVmk}`hK1q~C7*UR1A=^y4oxhrp+HfXO@WjD3FSr>; ztIIS$eBpL4JE`BZMzi@!ArCJ){2x>29Z&WDzki!#Bq=gWQOM4AP#Kkxy*D9yJ2;M! zsO&8nh3vieD(e)HeQ=25;5ZKFSjRbs-+BM>`}FeiUJ(B|n?hP)N18^kl8tNY@Yz~9U-l$|ZS>W{KI&mzAcd#~z1Br# z=dZp(<%eOjOjrX(K)OnF_`WnhPt7v8rtEL7bMn%%vfjC;x4T4qg(-OtFvo+&qQ$|a zh70aEzeKvd`1OShQRWV7?jF-BlK`dHyEYpMwQp@)Fo()f-$Xyu{5RmTK~}v)_inKJ zmvBbaId=$X-ZpmG{2M{u=plx9`(HK6BL`YNOBWBbWElFCgE-Pix#p+qj>@sK6?fVv z`hy5VhGmmTP@eQ;%qF^wshRkC+sOa_V2%`l!SVb9e(7FhMXAX-k7~0Sp}e+F1sC;g z8?fOvA>)tboC+LYV!kR;I=KBo9xFfxwC=|g1`u$;)U9$~Cn93VQ=4-ysM?N~G?@BY z=gpIdGUoyea&};2I~}L*#d+O-;(Jp;+77pltc6nI0M|e%B!Y0E!&`GD+%kB8qoBWf zT<`Tt?fm3kaWVlj1tX25AL_9&yzUDzI*muu58X*N?#i8CV=pXAI8uoU%FUQ zR=)Xcxu5;nE_~r&VSFL@TAK4u-!@OE?-e@UP=~KWyKIq_lyWS-(@t^qtSS$+9{W6! z#;DSETacG$EYNRaD#vC}wGo~BEXVyLms|Axwwo5Sf#aRrw<1N5el}E?&|}tNeLawk zb9{JXM05mVq{!NS4LF?44uu#$W?J}7vS2Kh5j8#Cb}Tr>q$4f5ydRz1YjZPLmpj$z zUPp|AIqq8NYjaqQ)fcD>$al-_^kBB+-z$(hL@bx4=im`}rXlv0U5!htQ5~OO8D^2s z&Ld}6Exort^IpzZq3|FG38Id=588RU=)L>To&CI-L^35si-6{FAl)TcGps%4Tgxhq z&h4cS3gC5i;8?tMkaQn5V>z1{{(OjAJKXEqeNa>Fy!;^>S`SlB zFhAcusS)lj!gN&m3Gdmz)y#>@>$^v^Qz)wosXR((PeTUv=qV*G8E3k$b=>}#1&q~s zhFE@=v9YZ*FoZhpoDA6wI26WQQWOQ&# z@m-K&pW>=&lwfP+#?Ne=KwWW^_o4}^PT&gGs7F@M%XZf5vRdFp881;eZNPT?pahrQ zsTpo*n@rbF>AK!;IUhDEqvA1FN}qXoaRDgsB+|1?Ub{m#>e*1U;{9_%&(_nM1F_)` zs@_jOB$+kZ9tW{4bo8Kw$$GhSJ%7bzVuCEEC!kdAyxLwL_Fv`~zkr_ zlMgx@|A>v|BZPQ%Earn#ZApU;$n;oL>L;{p@tr!{Yc~`Xqo+}VN#wtyeQIb|>PbY) zani-Jy-|^rwz-METZ=)NypEiIpf4Sv4G9_fO0%`CDQ$N~G;}Zaj4*oWpNDY1>W@M0 z1%D8Bo1Ab&zR)lQMx>8(yZmeEHaG-wG+J2grRxmSk2rcvn45kIn0H0zDZcyw2Qcvl&?V5kgtHP!1z7?>ZvvCe2-rMm>@q@wNbl|&%UU8(1 zhI0?sx~{Q`p_uZwa_G-Vzclm_2#jkGb1T>ePpb$ryO#!V@R6o_bPIk%%BjZmsz2Bt z8W;n}<31Fo{Mc{;NNDAf=gtpu8|9b(<2|bi(JF{!o zbXKG(l4Mruob)dLYy3N%BVm)w46>Mp1TIMyf_JPV-x4bf+fIl|Fo}$pR_w$DxLaR# zVY55Do|pIdWdGl#x&-pAc!l$F2B8N1R&4zeu}DV2jhZ{>cXxe?{fQhO@i#I*`=ysX zLK3atx`;}$ChT$nBU5@a-uB+aePKke1Q7CAlB=uk;zN&O9WKkb57o?G6Uv|Q-ChgK zV2zp*Qb_hZ(d8P?n_Ng4SB7g4co4^7RvCk_3Clu&OBiWBX&Q+nQ-$AWCCE1} zuwz^2{#X*Hl%%T+OUi4|NM|XeeWe((Jqa)J^6}U-2TTJs?6UlqvM2P`#$DX!?^JH3 z5A%&!9zCSdak_*oD1SJZNxpdce+r-@XdejoG;+ zZnZRh@{KJru&3sGLtSXhRvHH*t?n*zy0B}9Oj*|QRo=xpfWA<6V{OE*;Yo#aK}r!8G?69Q9IPZUbFr;Y{%D2fxuxx1O5*HGyJHd zd0l0(m|T$V&AaxO;+Ng(i;=gGSL-=n^m=8pMJy%N9#BRr%+9%tXM#5JRWs^h6emXe zgU&t=^T$6*An2q?BnZ{PMr-cJg1y~AmmX~O$V19LSz*)!cdh8r8Xgb1;hgo2&3 zCQ{w7mIK*vqGVP=W+?-bFK{HaYA$u|Tvcg8_A`2v84DLI1OiH!3gKP$nW}~lX`esl zdq_v|K#z}QpjQcd^5kmu?N@r>WSTqBv84LO9A@UUN~LW5hn=*4;!pe1a2WI~)t*d} zlTw=g4}_~jkgd|;`jz7f=DIi(mFFO~)f?5me$2x?XTiMcaI(vGifew&))*dMOerc%p!h07 z%{f8(#c!FcUk}Dd-=XMUX%v5FiTkW&I82Iv(5S%yRCOPy#(h1y}=jm`pW%&Yq+yU2y{15%eOs<;CaIYe9XG90c zDJFFDhgpnsnr~)!uhyn48pK&MM&TSwrI(hK9?SWL`s9TcMjn%lE*xcjYigc09G*Zk zU%vWcr;_~G%_qHVH)bvBnawXnNa|F`D_SCTO<)l-GJ zmQA}9^}LLODk`);$PZvJSZ`8F?#XU6;PqS;>J%x;M5*Hynz_xv9D1cHbEAd%DbO_3gRkPn>6Nf@CuE}#*O%LZ)k7eQo;rfL0o!92y9I&?+_*gk$!pIx z;oe~+M+-J-e-(>0!W{VbkyQ2gWkKz?e$@vbUWhR^*WrGA`1?d-964^TMlETa-p-$0 zpwM+)l5-f$-~WL%Ts`v%`{-R2{z#-)OqEa<#lo^ER$oWSSm9#g$QW8c(*sr6RhfG% z)V4d>x9MmNZ1S$@Y3u3fwdpH@u?(CX2ZpazzT~VVA7LIeA8Bnv5xpRxo_aN#qs)(; zzh{ctMx-i{Lad5^s*%$X5w+KXyq~T`b?)QI^l<%Nc$-?X5Xqy>&t9A6po_BtHz?>M z*lB-T{kD+(!;R_l31|YbfVj;zaU2+{=Wm=s1WRRExI;o|Pf0nlFr*3PB(SVyBIU(J z3~a;2N$ykdzawYteyR-V#+z#-lf@r&mO#b>`J4KP$>;f|o$B2SPuu%$1}>{C;p2)i zvR*E5)|B3XlY=v4T0Bi4pFwKjRPj=g2`H~s#nl>EffAD zfTpLac|vM8xe~?CFdU9cn`ANWP9SUuCO8>+xu4qI$u?B)|E6Qi#{{epXFp*bfs(jj zqz=xnp%j4{Yd=`UH|SL8hwNvJf+!e2lN1$_<^H~N7~5z}r-7*6yMlm+QrV9U=H8Hn zIr!R|MHqj2K@MOP(u>^ZM;zh>b4|nB_ddV`L6u9>V-6h!ro0d8v_gI)dn(gH8hP3# zKU6AZMm@as=lWE zV@Fswi}XxteYG8l^%cvK0_`;~ERpxSV&Q0f^w~7`?9;r=J}?*@9RBu}CfavicbCug zIX=(X*YrBd40@^!32GNDMChcXT&Ph$!)4hm5i(eSUvzXYctBl2@Qgt*K&Me1${3fGsP)MY3*V?!YBnj#M>-|g*^ctXnsv~R( zaR<%<9zajtHW?Av^VY)uN}p^PisGdDj57*|fsVYnoTG|uG?phKRcU32Y_IOO`d_zc zdP4cWmZe7frEOq80E1E#=e~3VRazIsqJDb@H@ivORmzysZ}n9@_npz#KD`$Ww1OV-->Je@S$tsH&V@O_4mu3zu~Dt z3uapK?_YG2H7hNv9R>|alEKU zz69_{2PC}wZzuccVL4q;9j#^21&hw}!z7&e7r1C@1+sd(-y)k`YJkh0@PKYXk29@b zDlS944U@<|&_w|=p-mSY7 zE}d26Pgow#TcDbZQSh@D0Icm{0n9oXWVj)F$0man!?hW2ieyBz>vIf$-%ICYsGb;7 zYM|*Y>Sr%FqY`hBxFM1&@!-k2Vbn_MMSgc;#yp%O(msE7q~9fg=qzqArrDnimAoxC zVSDHes0=pF_fSOEZT~6xB`LhBl4+{*rZ`}$>(jj~cze;t?Hj>7@=@3g(q1KXC+nn( zXeu1cAzLxYOZ0?xKKjPBfIA53Iyg*jv*W(JUTdSi>qVkdxqH+3-o5((F0mI}^P{{| zlPpXfOA5N6>(D2h)UX|qksE@guUeh3TsJgtw#{{3Rj>5b<(cd?3mX!E_u9CJ_4IZk zGFb6htjDQa(?2$0tu>E#e8$&c=57~9YX1h50V${lO96Mzl>zg)lfr$8C$hIXb}mf- zB%NI7O+5wF0vXJc>L92vo``bdrh*BH$2d0vmS$)khkW#Q%2Y}PwOT+|AFI#^|GWzS zwc)?L!4mNJGNVE*eRt0BJSZu&MEjvTrEmo@?d7~WuLSvc26|;O!o@b&Xns_-cK0^U zxL85+*!b+l{bYJ@`7Wouj@Q#zv=O{%zf!byC_)T($Oy|6$@wNU=~#eGq)buzRy_2* z!hk2r6Qc!``x?Scu0bPfmMTbl^;5JXoNd97Xnkn((4qW^;V*umtRCCai&Y`GM4>Tz zQ>Lf1tM=?Y{jtgLj_x;P#vthz_!;Kn0leGY%5h%ee)wz&y7m4FXLe-B*S;vZn#)n~ zUC|wq>qapGQS=gMb^kA|;EqMt#Gkd?&@X}3-fc4$ZD~ooq|sEM7m4Hah6LF|TkbEDq9kM1D_Ag>)hcp2+u=3aVqNs6w8}X^{3wdR<0i(BQuu>zv#xn; zOHg|%;)e6Ko}atvsr+uW8%BhSk~6e{yvPgwzeaQZtktt)<6g#T!w`3_W@wKM;%jJ2 zUJ1q#E2SUQjCG?F0K>OOzTNA;h0hvzL?dodmE3XH=SQmz!hIef@9B!U&5_jF9YOkN z`XzGzlDST1uSy+EznG0}^=yNlsGyDr#VWVLR`_0@dz;s~szmp>J)M4KBZ}U%H}?jq zeANrN^2ZohI4(fUQQ zmlWQlx|CuNqfEL>On5Pw;-q`lPNT@keZB%$$p>-+i-)qRER_O=l;)zs(Z?ScIgV9N z(8gsU4h|sT)=7sIrC}jWG<4J@bMT_&5t~?XXXW!!q2zE0?!t})ebAQ63__&%_6#^x z47&E-33}R!9;r+?&h_MfWysi!wMJf^BpNZS>zR`TNNdssU}}8HcVlMB;%ek#+f#S;g$de+p&-Jl zrnukrY7??7_(J99AW|TPrx2It7;pK&&y6-}kUt=VWD+F*kio4oTwNz?5IXd*%Gc#` zKkjFbWKO1KGSt~Ti8Fi_mVI#q?edOX4b>UWy<~^yp6AD5zdEZuT_-(7l*P*bMC(t| z-y#E>D>}N~O|omJg=Z#fg=Jolp;{MKAC@T~gn@M7KQw+ifT*7sMM>dyM!WUjUL(5q zepDWpy6%>~gwT_>YG?L&-uDhu!l;{)j*>ci?lTMEz$b##c!UabfzvKOdHWIvDCQef z>uMun^qFqj6`qMa8!yG^2=mUJ8`!f<7?LYYASD%4o_mJ>CHZ?QC4aeOmQ_|!>}fa~ zADb6y8-v;FFj89^ImMH%%Ywi?sidQaD2dTuCw^Q8x-?gMkSX1Gvq#u&ix8SKGuK(w zI1fLEBs);f1GcXpe%{sNIpBKB)Dlk7C3nb@!~U>MaI{R#(Omy#1bSetnN4hKjF?W) zOV?1>LysZ^&5gQEK?Vt?~%YNk7{5{NPiIvcf{OMk2SB# zyN_MUpT*0|)}!uh+33iPFHLwB7pOj9-K{abG6_ga>QYg9Zxi{~7}n~Ec*F6Om<>-k zY!o3`cV=bsOKOB8;N(5hr0wPCYLy&m!DV?ca;7-x)4} zX25XRDY28BiI?fNC#_fwiM`oE8eVqQ)B&u*{=IxTT-EE=d^Igh)lDEC&Q#jJfA%+} zphqmGT+dcR(|>1)46>+DWK%) zMx&6m;P#3|*9wPSW%Q2Or4VRyS+np=ds0QRqW-$%0HySbJ(pHNd-t?jR7fM1zP}t> z#U!Pw`UQL28MDR45}cD6H_0VnrL%SqW5f6a^4;j+g%*o74bYFXFvMTJpj!h~jWG%| z_T$Yoo(*p8v0j@!-e>yVe4;pNQO8RjKA|>S3wex5KwzEi%(EC0y-^pbryp_#e0^Z* zRrK!j zvA2r^4P~H$Bzt1Q7MKb7?2*nI-TfDmByFc1tl57R+&qNA^v{#4&&+nj_Q#?Ft zP@d*<`@;(v>KE;dvd*;-bjdY-GW`}3lIB)YyEnJM=PMs@z@q(LTbJdnb6kNICP zTJ&l8&t^E)HfiyFM!s(=eAdSQ!F$Ivj+qZlA1mO~LE-%Zc@d#mPs()TGk|E2fbI4`aK-4Aof>L zFTPcfghRCP`fI7W_!{7Nn=*rj%j1s%MnXo(x$w05&s6Ra>>3+9_sv)^zGsLY) z@o(Biv6^~}8fk<|cJCH?Opg#xUs8RZhPh*`su!y$*GIe{9I4E&Oa6k5qAxz$+U{J3 zG@=2654rSR0hY)Z^-4PlNNPlNAO!eGYTo`rh&O*n{`Dw0cIQ=r7bOI<(4?evF$N_a zhg91$WA(*JSgPF{lHO75bPZ|Zk62y^_q(Q;e-RpJ+@B(I;N;SH9-%DX!AOeH_&nbJ zmF@i4U?!E}QCO?5wAL@I>tN;igkSCX1i=Js>fE*B_0rTtQIu>9ezlt^E3S7RA3?cT zOV?@Jf#g!I}%n|FO2=`iQ zY7TT0HnIBvN?u5BSTP5~PyGh+yHH%_uM03@r~{6*JLgw23tz(|Te}9RV+6(u8?Ssd zISGm{;z6Bmmg=$DEKX+l5^fe$X!R)&Ue6m~PGruxk#@Xk$(xCyXM^d^=1gFBPW(V& zJp193A3q5+`zHAD&6>$G^W4h} z_?6DIDj-QVaM~asLv6|9S4r8=NYf7@RRONhR_yf;gkQ;(@SkcUzKtR;gXQW?$3%0V z0ZuI=UCp{-XsIRCW|K9UMStZKDd!k47`fDX;RAmYO?q=wEqDd$=gy(YLs;*Z3NdlS zpz*7$h2At+dKkIJ$rqxPy$5PH>}2EcTYmqtt8*NvRisZ?{-w85gYKj!sd7)?>6)9! zzcy6`R~VY*4L@h1e(-a|c4Nt@m$azSAC*x&p;_lm9DWUm-gDdk`UM5?8*M5+-^)7> zTBmw^=5PZqTk+>a7Hao<=XXk?_3CQaEEt4SxoZbc3?1GqX&N7$DY!+t$QwK?CcJVyfD)r zWi?=%cAd$fjOF7kcFkF(XpJ^~AQ8K(RYOm}Ru5xt80W%bt&%inL9OwT&qGQuuOKja9YGMLEtiVEOBhczyNukba)LBW;|@eOq(ExT>#qF$r9vr|a7 zvrhd-x2E&0))Biq*ANYZfK#ru_j$tp+Cvbl1?G-l#!3|4UFjmQJDY(}t=HxaCNTHXRoGG;_WH)q? zO++88qY`Ocrv*f_x_+%cMo;k3MaCUb3-vv4#yK#a&(|Ec@ngB+V@ErEUcT0-roN1m z;W&HHUfCPjYy4vTF$5j3umXJT-ieNT4VI{(?~sW$vM1YzrB1>l?Bz3gy@>W;1#TR- z{q5?yL9R+ab0(6L{2c%!LGwBIt@Cfa8lU^LiBn=S2b_{cBffj;RO#@Su+NThghhnl z_Cy$kmT{5A^nq(%CbemwVam-~TG#UA!4CdH;}RZ@Kx-2o-HD*l^f+PVo4TcI;iilX z81K?r64lY%M7>yYSu|_?yvB;(Prev%T5|aP@=s(9=3qszKzWQ&FmsM1N7aV>HTMyX zvjoE^RwaLH#7H{-XVtA1ufNOX3v%C{=f8}@io z-xe1yp~%nbGw;mloJqJ`$N0@&QmNeJIbNI)Y+43y@Q(Z0Q5vH#P($s)Y3Ytet*n>? z)m$74Cn>c#lHP6&8;Y`2F{B$x_G<$P!AXo(4fsmm2Us%V-L|S>|L1k>bRD30991AB zG;%?Y{r+z2t^{bTLsW%Uj_&o31sUP&)9il3eFn~|Lj*xVMJ!K$`KA8(!|EFO)^ zg3}4%Hecdb1i|NZy_citS~7)cTh*4b@WRz(@l3t;w|^`mwgx;Oe|rk+PU~x6B8@1+ z?p=j+jCnR16AUEdHXr z08gvCLy-P57S&)iy?vm*nVQTFg!O$(2dVJfs zIg=7qJ6Egq3_8OkUO)MS7M7}UB-Qg_l;jZ&J0 zog4~ZB*M;CiuEqYk#xob;u#!;oPv_Za)z;iMrTRTzl5V-RjyAkd-*mqKm_m3Gbcxn zq>aSXa$_JBg>pfbvwSNV!g!=JLc4tnY z%?p5zT|yU{#|LF&tgW;TnU@ue-})lo=-~i8vbM!z{ecQ7*Axk2FPiqOjkhY6bpDzO zf0!PFIq_Yp?dwUL;g!=X+83VBQ=(e5sk`8Bs}24=<6N5bCw>787Q1_$<8MJ|+7_%2 zoPTG?cO*G%ceNE3;{`@UejXTjp9*>sDfxYtc1vF1%eiZ$eqqbplEUv)$A|?eX%X-* z{C>HZkYJS+_Q}~ir0}Qbv7dF_ta0=^azVEeYd^1lQ5?WE;&ahWPP)4bL!RwlL=vRv z-$gi&>c=#zI}TyXIW;C@M-DtMXZTFcUWDSWdpJgzz@fD9kAB5>j%T$dJ6tNrNQym@ z&})VAm(3uk10lkFoL1WS71}+;@r<1Z*%`*_791%OJoeml>TxGBfM}%H1vpkON2srJ zkoR)|nA5hxm6UOl0!Iw86zoO}N}B0XSDSj)ZMuS&;fA)O$!dO>!JsbNc02tZM7O>@ z{|v~H?LxDE*}tEax26So{hF@so{`3dTv|DW)AAMLjp`dtzh8Lz*atrmqrj+ez5+v~4_M0_Rkjme-Q19N#WJg1?T_G}z6`a#9})J{6SoD+FU*4uj}z|yX0}-JLl*Z% zTkzY$l#Dyq8_m$HNd~z0dO27B0N`~_;)Apcw1m7+yVXi9!#3g--U{)Xr1%bAp68L{ z23v8jtT%`039ES)?q01ks3L?%oxcz*tftVNT2wS3E%{1kkmeDlEA>V8fP%&gVu>BU zQ(!a2E5lHi{O|X@@llwJ2OK&BgV2^w zZ>(7-U91ICb{uPUt6UUVk)B&r%T(N#^HE#ggPFFAXvfpp(t|bZvk5S6yZ_pOry6kh zJu+?VK4(ns*rcDoz}-a3Q+d^c;m5+Z+Y35lFNX@%WoNLIjG7D|yv zjPZ3AE>17uSG>dGZ6s{Z1uzP9NCz)E5qt;HZ% zJU#k(p2)3vy=C_qQ)89a+GU=zwE$$)@QiYaq%i#rliO&v7{TGH=aJfm2eXmBamM3- zP?s-=(<$tm-{1D=x10XvX1|FvAtYyX{~a6OXsn#znMD>BH&0+QNDb%s?8b7MX~EUX z*0vzBrz0}6w!dFjkUQDftv{&!T#O)}SvqE!)Qs&u+|b{V!P+)jfSH?#JCQPNEw?{H z@fTCI0*T?(%5ICQlCB}Gm#2Nl#|ly6um{88He{}-UW(MCrTEHw0rTy5QjYc#uw3`LtKa`QW&BcO}PzVQF61fQe@ zpbpIq3}%TF>9u6v=9YflteyBifu{NKxsT!wHh6l;1|2+M)hcz#(^43S;6`oF)z);^ z7++|Caqr+x<_JV!$yDH20gwTmK?`D`MII>QBPHv?>&9IKywv15tl-qVo7te9m6t~x zx!E8)l^nNG{>xfSQ=+!%jy}A~H0OKz&q~6u`d)H!ee#P-?&p?c#c77KtMsy8U=z|z zM->Dj3(eow4wP+oD z4Ntvso=`_?P-KC5&0l(6wO>L`^4WgBUF~{DMY5f{!4XT1tCPe(N1PLMsnwR25gJ)J z{C{AaA4KcNP6FYaTSS38fJ`n(Mw3-is2ZbU;l5(Bz~a*neLEBeuTOWOaBXu?#UUKXuN0^)s1(~&>C^fy`oBMP(kT@>C*vOa#gubaU z#~n4YYK&_Qn6f-!D}SPvK$Al4RA2Pw>Fyoifq`pgbXR)yXAO{f(EaQ;uK*AC1y`+^ zAXPM;nP6#OBc-N-H+BFW-C4d`z=?IQ)XHHWiWuhq=LA4&a&*Kc%^8_Tu`R(o+g~T} znpultl}N8joH~K6Bw9m>G26z?&Dk4EN)px~fW#!*+!kUAyt3Rj+OI&w(lWw%<MaF6xXu3i8{hbTEHXsK84-cUuDSwXPpU{mVs@o<&2iDQy`b}V#y%{>8x(8}KdvODh{Z&c{zQ^G zQFgyd5AkBJ{akN&k;GKf$_CY|4cHj7)$80XtH8tv+X$(&Ok1DW$NDFT$Bm1DG5!VP z6(N;NKL~TYN!De)#LR9?7gU^LzpC66PvnZ*{CM1+%s%7Tn_Ks3UM`D{!k`w?$i)(w zY4G}P^Rub};DK!GVhK&HJVv{svXPv>q%X2Hk5SJn*RS1EEj^(0L@5*+gmSC^(CV?_=D z(NL;J>jjO0!@XK4vhj1|myxOY`Ct`6f<4#&h9tzgbP$b3rf-?no|33sQvykTuW6u4 zwWtDVYySCth(IUFCFqPxH^ky(2k4`zl@t|wWs`4JPKY~k9L+AuEG-|gUOAHZH9tR( z60pKIwe}71JFBV=j@(-u5nw)%prDidnoh2i2~N3asw>|hN&*WT;0Vgk_%+xw62Q%sUFT65}Pq+l|_l%ggN>1%`dQ5s* zUS%Ox$S*18g`&dlk8s;NmkpXo9*32E`7A^Y9(VcbXC`V~80G_vwDhVSnbbHk(*0pL zE4pP%GAmFyL7|P!SubUBhBcl*(QRrjuYAPyy$A=sMVKrLifHnBiVwbgwMc!Jz;A1A zp9va&|GSK@m3~p7Kgd@Y8;WT2bhovw+qZ+3BuCILL*y*8uSzFK=qE0Q7d)rIvpv-J`_x>YOAgk?W3Tn^3bOU!PVNDZ$MWIND_5dIklE)1QZ=bkl{Kjvw^ zqpR(-Buwe_+wG6Iten!@Z7WmC^6Pd5=DCFtbu=^O1eT&#jDIUZwIeTHb9AoiD|>YT z!GAX@K;b4j?8d|k(9He^m2be?B8tOV14Q4A8=8SeyzpiezT;7LXc~B##|IQJKeq(3`cp3lho1iqp5OREmNYVVE~P9Iv+*?x zzj*H=uhHCsM55Dcqu%&iHP7vJc{WHsC>?;o5_`R!&E{J?!@yow)Vk@PdDhfr2ll{- zFaDnICVu}v9!ZO=h>`4DSd^5+xM<{U&w3&HxRX6PZ4cD`$fj-JcSexQQVtFEHg;)( zVcX1;vINBaS2wTwC6)DPL<)+KQRugG%Q&KwD1xrXILJBc^8DE!&;FJB5#r~$D1biU z4(FGIZoBF`UfsuM{DP+H*}`jaS&>CmI(7vL+Gydtb*LLCp+wH%%i!v$8X7ESD$qhV$_YaUO!l%YptA)py-b zDK*<^WCevytgIh>R=Vjl>MBU)h(5+YgMDt3UcR+C5Yh zri1WJ>Y?uN77rlRY+787(0{%=;5ryfDiicOS*{uE443a$G6DR{@$SSPP*4Y1d&%jD zpb{0s1}*gbXD4=`_sLPV)Sfa~ z5ZP-}hmFzZ|FKbdel3+DI>=uY*(QCk$GG)H$@W3RJ3+Y-8flxz*2E8-$M^}WK)7_xHUu2zux02gn zjb4<&&B;To-t(nkHO`f*hi?8(>S5V-1!`mC!8PGdbA`b)$7ZJESow|ADv*@pwS>R? z^`{00Ps3AERW_kv++#bvdN7L-lFoQ%AH{T_9A!1zlqzPMx!&u$VrnU!iOI6JFvQ%#wmTy z8_?GLD!t|2apoXQs^-`8k*?-GSXw7~p6!UMKR@AQL#hA8H><-9&E}SfFo^+?+W>;A z7{o8Km_E5J$@iryU{o`&4p?Ln>x#eQf2wkv)a?QFjS*9s=vfu9&gTf5-yL2Vd6x!CALfc4y3^DdYIU;VVb?3PEw*3FfB`dy02y&p1bD?0@=5442Sl8N} zs8fsM7)P6bcLtGfg}g2Rk)6}7=kDwk*Lwnz;yjC0Tz!7)dnXV+Ccd!`;K-%VFdtSc;l>c$q(39h9F$tJB@>Ao_(9b1X*AvNVA*}b-;a5Ln?vB@e) zAutrZhe+5B7y1ZKs3&*4S?jXtxTxaCVZ6xS-M_KiX?TbV73LYmYKb!4euLtXf3qCT z&M=}8YnXUYA+-I|*#s?=yXg{qMQgS}w8(>sjvO?if+yNJj4g_JeP*T^rw*gVe#0uELdqon5-sD zmx#!X<>9osQv)!%@JU+gXtvRlKLmbMop(VR^FTundrx<=OIwKXw>QV_r!W0}kDW-r zlTN~qbGv z^9L1|q@!mOVoz$*+je}U)i~Sp-Gata4oS1k&Xv19%Ho*`%j^TK-vOo2-{3yvaJZ&D zJ}P>rESXUGK=)e>;R%h@nYMcCeYm`MG_)#xE<1ezVFym6$kVvE2IH)*n9k84ONN;S za-;*t=W(9kemafgPF{_6YN+KpEkDD3EcwV=h)i$4q)>;^LITki)9>;VNoO@@n8<(r zb!+7#?{H51eRgKa-`s;=H5o$)&eW0G24vm1k-;EJLsHdpI&QhoztM5^1rR4eifNeE z*}W>?^rZ4gt#;Cjd1IvUcvM5lIHu{%Q2aveZZ2&Ol0%29_3g}l!%WV9TVE3{354b# zD$XF@^^%I==PElVpyBtIgh+R$awh40e4mPBWOjaYYldS19QQfr>DH++3Gd(E?TIE| zwpW~%MS=?28740_no*~jWB>N6$5VRMqVe_o+<6e^d!BppJP64T4?IvGsv*&e0mjp8i$&j(ZMSdEOisUIpXR5F3N046}k;eR`Jn# zAA6$cjkF4zJX2$Wos0*b^B=_B05*lw0NB?`nYH$!JI&T9GcSK$G@$_)_ne7{e9+#w zw}0pb>Y~PntoIbX*)(m8B>U4>7mfG>q8Mi;Ceq%ReU$WWr z2D_b0yCO(^M~v-Y{lrv~lTm>+Gd$zl?EwB&VQ%(WOCl${VK3)f8a1?4gm`l;a3?So zVM78`SlSPHB-4tjDMZW|UOuS&ui`H_Oz1c`{EIGN7y$D!&*Cq!2{ZsuwePbovBc(# z{z&o0kK=BV(1&~RBFkIuNY%bKS>a_-E!JziLuh_kWPc;qVYF=>at)SXdeOw>1r1tl z%v0#T4T+zu?QO}n9S0N~vtoPEBQ<}98fLw3y>?pvXFl#@0VyqY(qyndG9*`jD2%r3 z+Eay|l6T)+sLlK}!go7{?u4zJZnt_@ z%O)!yCLau(I8-vlb?92cOGR=DvGXL1_v5wMCAhR=XYGg8Dyq$~#F%P|Kq04$58Ii^ z`UulOzcS--(<=+A%9lBkVDtp7m#ozn9?GLJw|^A)Oc zoufCguMsx^ULkyECgcozZKR<8zGM=p&s#Yu5xltC<2@kbGJl=es#L~15&v@hb6|>h zuhiKHMwqw!D~X#$@K9;fbHt}fUO zI}b4mOmIqd0pCI19>Z{!y5l3BSv~5}o?zaNu$709ZI*IOsTVX2Fn@&p5(e_esl@`*eSH5J~u`P!H9R& zk=1>7m97*@PqsT?^JTx+HG5xohKl+jo6kcu ziM%v=a}sdg8u5U7skh7Y`wz(cW$u;%zEsdaI#j*Z8@xg-R1;{IxB2w`1hcMJ4NCT@ zX&^$e@h8BwuH0WJE(}0?Gdowi`VH{D#^EUajuqPkqH#Ph6ZBqv+&Gy0zK%dE;OfL?C{W)7O*iP2e(@m@OZYk!mXE?>kZOQ+~)Or82+5Yd} zDpj?sYHO`(6-AB2yxZEN_KeX|wDyV&K^4{7TM=5D+MC4Q)E*`FXb^pEZKc^t}|N+f2^MPJ;K1jbJ00rRtkHAW9pf9T)fSpl>o0LEK|pQQm59*AXAVY_Kenql#i-(D9r=+KzzU)?Q~he zQ~9+Og4Ti@H6E@xMUkn?B0JZpgZC}i&s)ekitdZE)$^9__fxFYAMCFfKbqgX$rf=C zVLkcgzIESN`;L0Q@jZ00QNeZ9hvLmsS>P}JXY;!`lD`r}w0*SfC!DdiokuToUiPV% z-gQdq{X@a3{rN@mfr$v2Ok7ftZ=B|I2}&n&b`w)Gv5$kKrKsr0=V0y2s(jFDDMi_^ zc{FxS*9r&qWgTtz(8;nYcPgGZKLoUB6@NHm;alFe3EFiar2IR29*-O6t9=e9J{lg8 z52>~iRYIpyo&Tgac_?@DqZ?O(Ha6>FtRpdsj_Ov%?BK`I2%!M|p}DJQc@4kO{@1C> zkup`{7x(r1+ML;DfHZ)|bE_Tg67|)I8|v~E3A4F2mWZxLc7GoP0iU~-TW*K8h&ey% zmf~gP%!{viBhUzY6)93C8wvJh+rtkQ?R(jSheOzc!RJ@CYv<-CZyt1N*@5Nt{WT!c zqFaCBW}-+BBNNKlonWiK*M=l>z1ZKqW79sRPulgG$eYdO*O~V>`&fMznBGL9=XR;?bbV3=?WZhqJf!YCcYk}M-rRk2KrvGdCF&P&PAD|DkUpu7;{%QpHkY*KqM=AgnoR zp9Gx_10E=)Bg|a?=L;~NAU*+>VlmiBLh#J|ce`p*uDX+=HpkZr>>K2q%Z~y-X#i-=-RrG?X9dq*<=)7z9@f5K=cONEi~csTJhv9NWd>m9g`o?ZPp6z2 zbC>MK#G5UG6>~^YnxT;Zixy+fs%NWy`B=iMi<{Z!i92i(cXbH$X3nXzP(Jc#mLG;f`=<$jClrVAqK3Nk$=)#k%JG<062W;fGe;jqu}6;Y{KO;_~Y>9Nb=|o zFvhGnYK@4L>d~KJHOei)CZlc%dWiXAJ=7^rPgVP7USC+moMrTP_M_otAjh#u@NK&T zCZZ=#ZZruQWyYoTg=1Q0htP?4Xry92VDLdS zZx+aw3-=W)P=5uy9ZBBD%k5`tUi^}udErtS%{&#BVq|z@$t2|7``UX;Tb4$M{`Oz( zqIg7`DC+Xd(4dQXWqZ`gF248ul&9-QK@LKPZwJ?`q`T02G6x82*0HAelI%upx5ml0 zZk>~!{4L6BwKX+@7NqhLYVwxkN&jPK{0fg#=eCO+I8%N?1hP`ccNJG@{;}AIe@j^` zh42cUH5~K>FDJ)bLpWfH%m}D9&@G5X>(ae2tiNsH%LC>#Fp{)%jV{QN&bS(Eu5@C5 zpx3P_*3_S|0in{ieG#0Ny%VW% z)fr56wF`I2^2CJ(eNG*Xy-SFAPu&>aaWUNHqgB-YC9AS}h?vmRcs4n7FBFSBfgsP2 zXZsB$H_^oAN%d#Bi2V!Sw`a*esLV{5)hjm(%Y^#%@Iz0KqcTR4krS!1q0)>`1Tv?`=9Lm%2dCypCu9HdX(9#q&afOaP5f9a>X` z)M{0S`!xyw>sgkS8dCqKE;G5QTTavJJ8nvdS2Pv;u(Q0mSjx~{0)L~l4XdW-=V#e) zIrP2xa&qjLvv!Eq(1l#{f(_T!w|V6hNd?OHKzgYk7J48tuH$8W+1g9=R#*>=Vt$kd>4iWdQIGWyL?Y5AN*>aAShiCa^@@0T_M~$EUI&D9r z(`gC)_B>Mk^f3#KG#ic)00WZ0ddTeYX%*`E{Ras#a6WlucwXzX%c}xZ)`eakD*p1e zf0tZfDuOTSsofwWkk&Z$4`lrP?Xzv`B}#yBf3@ZKUm5qX$+ax6FSX=~zg;N!Z?D;L zH-q? zVP;`Jj5C+FF`efLZ$gfryHgd(L9K$zwK&7LI`!d>j~utLd;fO&8_nQYZ7tID01V4c zLwh*jeCd!xM`R;-+%B$Lb7CU!Rl^V0mxi*?ojo6O&Y_p-qY`!w5H*n=T|+br0{y~*=8PZ~)p3W}ke^YVHr49%L& z3x^4TgSs;vWus^kORIvks!B*2^Epv}+UP2R2tJ@}aT)9RXaw|2Vzl5*zHynYY<6o`pPGbwe!OTe{osBRO|@(w;??v&koM%RAt z_(Gmlac3TQT_9&MS~Rr3&0Z&yQh1pQ@L095x$yZTtNQ*PvX59mN077o)o2aWuX(VQ zjIoH8!SIshzA&jV!eU;9t-J6MMTdcuJ@gz{k`Fn-?te5fKFemitPlzXb5JzJ~-B}jmIdx z9fcn^ZZ9^}-j4)j2?l0Awo-ysKh!_Y}PDFOUa9h44q;hNm!+svDt14+9uS z!I&?W%(1Usiw-=DAoZ6?gahco0pt^HZ&P&Z&JH8CekcC(DwSi$Bza zqCnr=6EkinMuPWaSNDx>;}vo?;5_o{vl+jdMo?Om+>K^s&_xWTr2}%7+6Yx>`g$oF z^(Y$^>K3+lA53VXee+novvrY_Us$});#HvXg^YbY{psWkTtdnbZt=qH{JU@Ct)8f` za$m?P-~-|!n};f$as3h=p*d2VkmbCYV1hZv$i3Wo1{my=Hv4)@!RY)FdwK7yvqxT5;Q{ATnj`tQcQoG33o zIfeVoCpe|bhiLx03TlY;lD2G8e1pB2K#2a#DfQ4u#~abhMCZJIyVmO2lutXBoI9Vk zMXjJPt5g}2m(jPavRlXes6XdKb8P#=Jc&B!7}~qwZA{n7Fcbx-!jK~@zbD09xIGoc zwW8ZEjNUCw=Xi1Kz5`Sh+}?GF$vEN$TjR1NRHXE{liWODv#8DXg%*cY~Z#vHvUi}HAr&&IQ!cNp& z?x-k!Z@ID=`i|YTqbgG==?nUvmG%`IlwL{{jUui11n2f5KDiS>B}^H^F?$OeA0XnI zDZ~hr7-J(g*YqTtjqts=`P#wjgjDP_PxJ6d=Kg;g`Y|g|d7*BHfX&g)5tuoqRRS6g zVH^3pj&%C4uSe%w!!8gnH+!V3dB#NKBD3gP10hx$>aMiJPpyr&7`*=!X83*hY~nRk z;Rt2vs;JM3_$In<4A-tnBCZ7`FlLOiT(5cp+kAoQq`ND7`Dd%f-Yx>UB#*5lw+pK0 zvZ9LO*l82(wr#V0XKH>({ITpP8a11$CKc4Fw;a;^w=nr0ueKR`-+2goX*8K#dn#N+ zCM)=i^~6jzcW|efNhF;~TP``I7B?{7>1e-Sdq1|hxfw_oX_I_kiMkd%%M;^a%f4CI z)FWal>IZ6C=8X8NQ$HL@*Id4M5Z}=kSg&80Zj>p*(L~`)nYpBRFx|w%sHB~pR zaht$%O+v$%LaWQ)73W8~ZF#ZXOAbO=`*&TLkL7)2?E`0-rdaqrl3DKuZ`@d=c|<4c z+~OCZ2^r4%+V(@#fAbB`55VG5L^rT@EdQZiE;3{P`PU4Gj;Q{vNM$1P*h?K7h71L2 zx`Mj}S9&UD_k4iu`Qq+5J($=Qj+%EgTR6D)ts7p|=EB zD(BwFAN(9!?NW0e+SkQ9<4*Gad5H9N={3FDT>Z=F_;LG>(J%iedO}G$nFb7l@_x5I z0_|+&_T7#h`?eljB(3cZzXQg-P2or7-1Hj8Ca1IYc|UbEK&Y!U#CM|qOfwAm#)8gL zF|nhU7Ai@W{h~!1MPH}PaKgVm)6E;!E7BT$XUDn&MK=GIP~>9Adz02se{|rZ7+uI0 zF1cfTL%>kr-OXuucc;hkV~;55B-(}YK?l!aBOB8MDZ2sRUqDx8At{`N*gFtki?U=8 z^0a1mEYS>XUI-F#b`#ZDb^g89cIE|d3EMt1hVbh;tS8*cp>#5=%$ z7^(}2yG*s^{)uH<`(DORahihcm+k$woou6g3W0x`vm_7M-;2Zv?FW8!-Ky+T3 z5>BtF8YJ2dC=>0&iDv2!+lB*OY1VzaJ?7!D4?5Wbg%rHwM*;>H1~K`Xyh(<4u#ARJ zn!DYnWvsFQZY+@}+H33+Do?D`{dq~(P>2#+SHte&iZsPhrPQ<=B8P2S2Rz|>4-jNq6zugUg=?4I02C)4TOTKTB~S8Y-i7KL|ZF+sBmDvWg|!$ z?Js-w+`YP239@xDT~B4x`TxnY)bx5|pKWARInMrFYC~auktLm^0r-{pYHbb%z(;O* zRLljCuv;sQ2u%TItJR&M5_xA=VxrmVY_O0@1+aQo2dE5zLDuP3#oo!uWG>evVP2g* zV+$c1)M@kRyh)1j*{Gw)CGdUWk=eT$an{eZ0CM1Qzjq}0?G{aXUB`4hw2#nDQM**R zN^j){v#yUWR4VlT+_N`8#E`xl1e1&_Ulwmd9k;(2N3v*+t+kXptd`|UDi8+v1P6Kw z!h9O~JG+M`DD)}J{*?WrK5tsxyjsC z=lt`03ts9S2}Z>yE{oqCQx{VsZO+?R&<6~*gZ#pm=YkIbYVbz(+G37Oy=m@D%3yPa z`o6pi-@z}~iQ1GahCAgyd#51>5=B0X1DG&!q2d!kYL^#u*YZk+bH9kH3Tuhu;=|U- zq=@s){Fk`fCV&fsp+MEAj;tuJR`OakxnXbrTNfoK<_JSeNam2m|s zq#|ggP7_N{d|P(MRAXe-RT^ZU-`QKMVI$T8A8|*o(rEMsI+`AF{Ij#A!~z2~{zlH{ zlw}>D=jxuF$2sHO$H3jZ3{6W9I&bT+RPWO#KCehPL3}0CPi6k8~fVssdHa1yC%)cl<6?v*k+T+T4d!L}4Ms5v0K7=Q8KJDGt zwDF@mBo2m0j=s-{02Cz27@|Utd!OyOB{fNX(Um!nqn1FD_u_t!?Gmq)Jo9bHk_N}O zx!e7fwx~taZ8SmjxjwD1aK04mEV=G*YZUWobr*sD;FrcIiRMSAJsGMHGK_w1 ztSiG`&#>z&TWIK?%EAQX61eHZy*GyVA+nr{^yV1~&R-9UWsmIbfpT4CHX8q0Hhhoo z89HK&*7xS5dL1Q2BJIMh-<@SCq>gkPe^}r13{iJmd+3Fn{&$HZ7L^PaeLjH)NUdU> z&8&m<6>4-7PcVFg1h}VT{b_H`u{-d7vlDM`IDCIgE=L3Q#r+=AyZbeG#+QObv%mR8M&n*-05PojuB}aV{grYc^72BTA94YY&BPlHK~kJj7!o!P5ka zG@Lk;>ZW`!p8?~tL424BqwN+}PF6Ksh?28x%ZleZe;rG|znvagQb%)6doFdp5hDP6 zM)B$MtOoDcB#g$16B$Hs1yV$K$#K2N=3STAg}n3elI{(NAGXq& zg6wvsvBF|Qr3M@E!fYb`9~QH;6`(gdpOn6#U1TV#e;t}Z&PEsrlhG2TK{$&2u`AER z-3cNm(;g2!PWcnaj{aRHQa`(ZH_m%dcKxAZ)0SiAmeOYn^uyIO>ghEdnv*hP4ZC!saqtVBKhxcxPBzyl3@(ZTM+uV(Em+x1AN7nCW@^R@( zcZ2L~VVM{C8F_PnUYk`1W)0U$8JFcXck|1g%i9u!GI(NJ1VSLK-PsM#mQ}%@3P^}q zV3d!Y0iJp}wVexLNLK(u^O5Mm!ji_99L)Q0Myp=u5ZES%Uy+ zB7q>(NVhS+G~LDO)%w6GQCry+l4EXc%+(70BNH8KO8$3^$d+{x6`z6Z=Zv(QF$ni&=z_eo zkaPBJC1UOJhAhJVeQ;D$v1@PhwX(*IcqK>N$^7vs#T51w)ea5sXC%xO(0s~6VM z_wErYQ?Pue-lom9;A6}fZ)tJ0S(04?(Z4H&OU2QN0{q7G{^^#N`eh!6l;P#423&Hl zQ9<8PfTECGTuIS4Ne8Rp`@5Zv#}@^KgY}AvDWka&Cvn@^a9o(Gm2c0xp5Z z=fv;6;yL5uf2&%4eQ900Zy{Ft8XMZp_gtq`gF+YL_yc2F#YQRG+myL=*|?ufls$eV zThcE-eS9}*>msIDUR`|8!~S^TCZpERU!G(V5%fZuX4R)@MSMpK`yiCd6FVrjI@kJ7 z;+nw4XM8VDm?e5O#cyKU3w^BN6M3~xs%O~jH|#3v?baWhgg9RmXoUsm(1`Z6Q)G|l z_t$BPr)phlSFccEnaW%0eXvI6%!F~Ye{P$(EN zv?3PmQk-b^!L-`%5c(x|S>{bguVQwB*jl+x$oZtURm{Nzv9`y6zT?ebPvxtDHKEJL zQG7$_J(7tw-oCN>Vtj18ES;Zrr~U8|!;{+$)xKmX{oGZ1(7F5PxD8};x@m>q;Pgk> zT<*SFopa#3_OC}PMeUf$TC6vy=*Dy!$pz7a{{REOqz?K18N;>eL}nGp{d;g)n_-Ju zV#tD(y>t;|-fN5FpZb=XanPK$v8;$j%h73zgMU0>-xWy@)hN<^>qCL>YoVipbY9+aiBYM@RF>gaQqAZGjfl^>s)}%D@+3XTSxYTmk z2LFZqy&Yk>VDFnKhiQh8QQ%y-vuxtGcO)5k{x$AhJVq+A0g>`f-EF+{_+toF8C4&( z6)Pr-T#i9#rG6@tT+)aLqEI?0 zH=;(Z#eOz|mpcWXM`etv#u-A90K5)_b1(7gCzbbm~)dZhk|2!I+LXR0ji^qy#b7ArQzj>21A*T z$26ZjMD=EGm|KmxZLuPk7J#q*_4S2&v^nvCN44_eLIu(;=hM##!^xtW*t%on`sEG< z&J1BB0n90_Ug2N<512T9#Sz&h?k&iQIxDV|)tT9*q-`$2xl7ixWZDYob?42Sc$0v} zu?bR;SmCX+tkFz)k*qoIZ8GUiahWMP3AgB#Kes$b%FW4I80y*%9J+yusH@I1jj_K?PeWn;qgm3u@f)5N9+tOhD!3||%dOTI zqImS7k!rqjzOvU=bHy{ktu)ykmzpo`11LLz$x^)FX)pBvRo1Oow?A*#;Rkrfw`xoq zq#2|OysCBko`gtDuRs?#Xe)KfBr z>eNr+N9JTGS0{Y2*`fNEjDkm3G&#$cC6hJp^t`RD#8z2&4ZVHWj5hdYr^5If@SPyH77f7Olhw9<({@ZSu|Kk9e$ z`VN&>7DK7W0PZS!Kh{TC9s8BK6gCv9~luQtFJ zY&k~Tq>T_QIp(%L@}99X^?{dwTJ3^Y0`L{~6hPwU%hMY~q4=YJQPLlRhZ|-Wh70WQ z-XI2R%Wvfy2$MZ-2>o&8_YVMPQ~cr=(Qf1QM?FoVm4`TT9R7ORJ77cQtQ`@{UpHxnwhZE-nQQ{-FD*aoobbUbJaKgl*JUlP9_kHQX_Eez z_S;Y=%N_k)V~C#XS{TQ2So~y;JTQc2*CVy&beH1Nd4|<8W7^a+@{k&f-vA{rS^ys2 zjVjvw^B1!*%q5pd(1$0silBJvHY9Uk@?RAeoYz)4Lw7jV7Oh+{2bo1H6gx{jvZi?z zV6%_q>@+_K$vNUi?7Levf7(Sg9y#)$;E{=V3>;Cz2DxROi! zS9?$)VeAye#;s?6ttErrK|J~Rfd}+O=ivAp3X(4Mn_BIQT(+xwLb;5Oe^^WD#xyeb z=fw|Kj1kVh;>XAGvlM>&nrU$~XQo9W;@09HWaBTxo9*_BmWqy*u@`)Jd`)oPC4Q>L zxmyy)q#n+%i?_#}$%x?HUCQ4#ueOnNXERil+r4l6qyWT_@nhjX3#XM6S4xUHQ_^>yKj(Stv$tgZK z5KL9E$zdDg%=F_Hja_^U=H<(~ReOGb+=vrE+hgc+&K}*?xJ)M)`Hk+FEumTn`?dYU z&iH!^&Qpzb^FAs|DtoGww(2J&3pvs*3ef4as8@pv=}sJ&UBv1dPs@P(%~!T_>48{m zEvz}RZ)d(l-si+*FD9J1xc^+zQGZ-QFWC zrSCj{aW-Cu7Mt}9TT_j2mEg{4m3U!ISSGbto?hTf$x&WS=ey}UuXD#>DBbQuv0Mqc zt9)Vs0znvBV^ECKvm^b)kD0<9JX%>}wFq1$((U}Fc;=jYr=2)34iK1ESeTP&#&sTn z63QU;Nb@@D_1EDGRFxmDp4>z`R}=k-JMUnLgm~=k0R(t&o?(H{@!Wo3f z{ciGO58C!Pl)t9{t9wDSOk&SB)>N8yINE6ry)_0|nzSkbR0x~l5_pKKF*U9>_eHXZ z{r>CEwe@h>`Xgmb-1^>!&&FxA5{FJm4n2#;qsma83m9!UXju*`(j)>1_{ZgrIM-5uIEQi$| zF`WF^Ctus~0roG}d{)$)QCh98zRdp-KX{w;%^8g?A20>QYkozu;HD_(*ZgOMRETd$ z9BfywpTF zr?&IUx{CZC3(zBpM>S@pc7?nMG};l2f6{tuwI!Z8+#MY)Y;YyeBACgpOj!t9hKw(r2zRO-CL^MJH81!~4JQy{3l#>{ zh1+wH-*`q_tLLYao9>bJ*|>I}A7l4T8#-%9kGX?xQZ;$dFKy_3>p;iXFjJ24_n4ey z2^j+X8~VbWsju^-iNx*5b3zMG-Af5MUN!%}zML-b8CUoW(#^@Wk-cQTez`I+=flQ% z4rzw$ssRKp*BnyeTufnC^r2aZS2Gf5Rr96Xp!Uu><3P@W!9<1doNe6M@PEt$GB$}L ztl=SZ{v7!m6AGUEkNQ!V!%J~a@XZ=`bebv)nly^PcVa)Y>YY?zSn;lv!K|;7daFhje_{ow-ZRKY<4nKsV{dvSM85v3;^pIyj$9 zN%WQG7DiE6W$b=9H^Vjyq}J&fF zP9)McY4kw*ymnZXSh^2|%+&q3EnTTJZ(@ku99bf#VumCA+&@|4W0P2MX^tMF1g74S zUmDG^9kS*?;%eNT7Vn~`uK9&$X==6UE%$J3H)-H!r2l{si6s|lTQ`Y3h^#V>Y>nWa zeQENH7f;QfH2UWKItn{%@VoqVoD-KsFu!q$BUWmVn?tM}+{854@0Yvqy`zZ8Frh?g z6G4h7?6#9w{#AErH3&d2beVUEQle@(4#hvIjY>gY{tBX(6|j)}Jer79yG#J2V=~Dy ztG10c^skLA_SVkqNo4LtT6!RStVq5j+EEDC(`j?-Ww^Y2L%u_et$3dTH#SiJMs@lt z&UU|Ywkk_CQqWhXZf%Cxc&{ZZ`8MMV(}KfsE*}7tPnKuSyL#U_C!fYtoR}LE zjS_7;Mvba^?C%zYpKYfDI<=?~2LA92^2$afo}7dhMl1%G#b#2ocLhO`wn?ViCXsK- zMNGZsyxZQpzD~>LGV~fDlm}~p*iQkGKbAPF2t@Ey7`n|p`mH}>Gh(r9l+NS~(frZ$ zxbha0v10~7rk3UABBc%3zuOqv{Ny=1T~WICLaCGGT&BV;obXJhd2OH8Vr}(UR+KlS z53zmz0n{xW>^*P(@qF69|L|_ef+qCe^7Gnn%$q`$V9mq5O4WYj&tFIMk|=r99r#IV z%g7L{o$jR(2-(SLzvaP7AiL)q_sjL#n_CG|evvizOo%k&T=;RId3@e#j3U*Ho=ehL zobdEU)B3aXerJgtiJw7AeeLbvR5p&|8T)xv$YZ9&l~fnzI?uST%`wg;8sA=M@=Xu* z(wu0aV+H)Nr`c61HN}|hyQyVNQD9?9S1Ccu!0X*Ej)TUO%Zi_im`K9@lgr&u{kR|H= z{RYxs%ITpA%XX~ZS<+hE>q*apRIqo^SRouSPe&@+qu=@|tCd%B5Stl2I~xCMu|NFe_M}tPS*^|KmTl=g%q)>JrR|KLSCN(~V_|nC?mlK>=c_-V0-SvbG+ts5TVTE*WiX_D zK!~&3op?FVFaTFBio$2!4ikZ31%Hj&oAYIw8YU(DbE(bzzRseyW&#Er!%p5cBz3(a z0Cb+haWk&E^0w6nj1@4}hN9{(E0$&j)3x$bk&i{NMs{oa(DcKX5P8lhjt;WAd~CtO zf6B?tFzy(z5oMiA4_(yEaPxtp-QgGB`nCC%yna zn}{6iRa9(s=>K_O^C=T0q)W)7=E3~)$~wd+0wdo$d3^E}=M&IlH&`_*|HuKSSU4|^ zN(w`9Nsd>rH%6k^ug(XN0_EW}7SA;+Ff7^|yr@+HgyTzq%S#B<)S($7mm>yyko&w1 zmR8IA^y;Xh0e<7nkr0J`hu}Syyf#-B#6GJSu7&C`AvG#hxYRMeH5?9L8>5Tf4FGUjE<>n8M~%Ya`%N92W@ zPWM`h?e8*8@iqKLB%pAA$(cJ?jU&}2^n#qTwwPkhVCt7=PQRL-`;kxa!W3??SH$@E zV9VuJ0Eh0Wc=%Pu(AYDOyL2E|++l@fZS7>WpF_oL#s=N;4Y3PUI$!<=hl;rv97LijCVlB!1DV$F3UjC-B_h6+dC&&`_uDJVb zy~KQ~*$7T~F`*)}nCO`c7C-*)=+5Zmtnw>0z*)yshw}8!uWI!V@XTkfj;3*R^~L3-z=?4m{Cc}xo}XaH)d#$@v8Z8U6Ok$(lS| zhr~|Xd8Mrs)Wr2Taw$5rzk%&1}TR)P)P+^s)b5T5?t646LDyF2%kB zFC-mv39OH>u-}kx>~&f#-K5&dSv3V=XGHu{xBzKZ6m5!i^zzYXPxqh3C@)fT%;3I( z8BnSIrdq{=n+?xoFHZd&Z(?0?+Y{Xtb_KAPvjw?<0V07g%fa70Z{?`X(zPOu}fN8Lj%hoqDQ-W1Q~de2_Kwzk!jz^G}KolSGUT?HMX8<0|PPs+{2iLu-Ra zyNG651ji!Z168)13B=@aItOln@tU&Kx-PyZ^t9JUX9I$29HQ5O9!@{Yr>bZh0TC5O;E zm=ngHsbBGJV(Z*KC}j0zN0^!4(hXN`l*Y7p@wl{#q)Z67-eX?Q8KqL(FR(??!F#>T zBS=R=KwTMx90N0GA0cXLK=ba6AuxBNkB1jfp9@{n9~QKwEe(UF_>eK*Hg(b@F3US z)@XaR;vDe)0XaG;<|uF3aU_E?YIVr<5x;NF0;;EDTP`8p5?n#CKCCG7T-Z*Lf;^#B zPMj$;GbE$6SZA50H|r~&B{Yc-dXpsGu_Nk+q%YYOVqB}ndhhT)Qn-U#Q;XkP$Z$Hp zhrHms`*1J$& zN!%R{(b)kvtTkru3mD6j@EdYmC8zl$RVuqtdoVIuUPV?{7&+t+yYB@u0!M&(rzVdo z7Z1|nLdZR|Xm);s`#y9xaz@z~<2KxL0oqUB3=H+Z?kz8V(iBfNa=O#tAvph9w#DS> zNA>@ke&z{q7(cQsHFkC`%1I2O%E?mGhlu~qn%{&DhOVZ&OpThd-Wc>z+g?sX1QgXe zKlx=Kzs~ewsKcvCy$FNvIFN)kEhnN!8*+6?Ya`V_V}gN*toWM=Q9ZK%AeQY_Wr?VU zA1-M%U@=66E}2(-t(95k_9S@o~Zh z`>bZoIz(s?I?~Ld@(T8q(|2ILbVR^XP5L`z%_YF!A}!M+3-fJy-q(fO?muJNjmQ$J ztCDYwsyxv=9+#kn`ib}&B<{p8?QKRdU=30RKfP9(UY4fd*tiZ41s4>UXT z28(2UV?urHARJZ0z~eWgU2OezHEZjDKy(YVU>Mo}^&Lkx-|IS+({nP!HL&j(k=djr-3&}zDrPWah_PRU^@WL%y)*^w zJ5h(a{S7=w~%W8g<27@Z_4lLE;~!ar-qA+Fi@nm3a;NCLPUI z|L7TpGA~pd6$!FG;EJl&z&;={FR}vx>{Pi~NQmf7exJMn&_vjh)B zHvHvSeCd~_O*x)L2^GX=n>XYcC^nH8{d%qUn9vURr;G`k7>pC^^RRMV91MY=l8b8 zm4la!{R-8@*YaOiE`Vi!FT2`#+3k5#4J2Lrk@qwBx?>D>=!d(83X8_5Fk2j)N*=H| zv^`_AR%*&AVGI|DszcwP+P?DuGh*(2Ve30V)E3P$+@k?`sfYO^UzizyO;m%ovQK!3 z`q^w4jF!XpRPuN8ZDzG@7l@xW>QWqdgge9^>2OHow6;E_mUP@@?d1!;yrI3DHLTo& zFMq&iefmxgE-=@AsZb=Hpu*pBXY;)arOWd>Os7pWnp6Ad@K__WsP2`=ScjWwc?0qK z-nuc-A6nYui|x4y7Fzbn&qd;|8=n8{!amu8AcKY={MP>20n4gNFmy>MjYz-VklV-o zdVrKPsm;cI=0ChL8{sX7<(A}jF&V}lRVjxv+9q6#7peafa-DIgU3zAQ`XGA(pKVr; z*RE;h?U&9WY!Ov4FgbBx!n#bl#e?@`ZmP`Qus}c|#$(4e4&~oN;q8C?X1p2m8i~YA z?HsHe)e+vF&KY@``l9*S61M{s1>4I9EGY(Sdxq?=p0!hxb_EL8?HR%-fm8)KHey$v z#MYs0O5<4~W}z4u6`-Px4h**1taGQQo0qQM$ZiFRas;X4%5-i&39 zrIq`*Q<}Cz4Bdm8!b0cbM4ju=BVwA*@(*e!X`CYN44gJ|dZ2}f#%b8kT1q_5SOioq zpP?&OEW?Z;hkMgT5Vi{8t7s<^R~TYS9*tg@EABSt)HW>~`0oYV$zO=vR57Gn{6Ql) zr?pfN<$fH|w*L#*#VF|f3_d12d|rsy`@YC{N>96*aN$YyD~O%Owyvr4KzaVlz*H^$ zn2RS}^d6i(6{XHBP^zvY#un}aOlwn>@NW`{QUBZ1Pr+!=;7d2nu znw2fnD7snora7|Q?zTbHj!LK0ph-^Gjk3zz`fVh#*YVm+daJ?L2PRagk(pgznF%(vkA#tzzF(fC1(>j~g|-;=LI zW6F2EJ8M5Yu0-pXv8eyG^ShK{YmZNFbo~xZo2P3A8%!FZdZz!C9dmJB22hv1)2S)u zgA;LW!-<i^o?dPv)N!R~Isc?muB?`YzG3Emnu5_W1P^;j-jx z$g%jhNCXw3Nia*ov4p`+s$sceT;2_7hdzA`*cf%wY9EV>R;8iVVMYUIihLEmkW+UQ z)D_>~=gQha3z4#59ql~@2n+YqSZXu3{L4LLtlx1^i^_H}^A;W-dr#;WFVw!AjBuJM zeFXh8T*igw0`;`w$xr}bo6|db=j1BVXVbHx2Lp&n@va!5OIZZ~tuG5Z_m7e^*-ez} zz&A%RbX8Ga;qjmsor*U5FXovy2R*jP*=MiQ( ztjIB?Kx((?E1y2U)HPK$8Ga1HzcZXV)0S3k<4hKD24IJ_U*zUU%*wQv-#J?16+nZr zY4kT8{Ewi60vdEixd@c&ohid$Yu%0XcQfP}g_8Zi+&%rQLv_!<2-dq1@0ml`Cc{u= z55&2}Ewl(AOik`2ZD2-r)AeiNLk~yCXt&NCxW> z=u`!sEmjoo{4rGOdqB3tkIiX$o94o=j$>5YWU+;VVJhkCb>A&Bmu5&UaSfa{e-ewd znfI&uI?X#RZXj)=2V((wOnoSl-6l;JFD1mU#^ayMZhV0i_EtCSg#3|nrDKJ?|5lAj z748OpFw-qqb{;TTtedE@iW$46T;JJnt(HG)_t%k!y-CERviKw^`Lh#uXCF_NlBARV zD(*pSCinIKx9NG>YrC83R8#_B0mq)ygAOwHomo zVs%0_ogn>=9iMJLQ@Jyt(&W(i*bmyw$00wRsGf1k8zq$V+?hQgcq8p_KBxrs+QfSu z7dF*|Lu8 zZNcSMvrmda3OVrlM*2}x4V6dEWp^F*Ywv_!cr4q>b7I%GFfumhnTrHZmRu$xLbvm% z;Y4whJHgg+=!Sm9PsQ*H*mW&&!*|(*sizmxzurYt8nb;{Z_}~9cJbi00#KD#bI9>3 z_9>aJHE2pmhJ;aIUoTC07u#`IJ^EjXazkw9O+wjJ0V}w}245#N+8mnAvl=f0+LxeY zKog9(9<*%DHWpWc#Zo zKq8bsKuW0ruSDa-ZnD)tER?Hak(f;(0l91TG1cV2B$!Ay4N1-9CfD_z|N1iQlD{!& zJJe3InUQk|uVSNj0b~z^X z`j(OI%-~?n;?WOMe@e_lx*b1*rBOMG{J4IHPwK)YD8;__RwVtg7M3P7j;cz zAkb%h6%UEYc37vcT~t#Pz`4-&Z%QBDj%{xfUUv~^aXQDgahqMuJCX1p=S6H@|3#km z`U1$(F>|92W#ITN2cYpi`RwRo`s!33!z>`79iS&1$&|g87Ct{2`lnX9zS8f8^yjvo zIFu#&dw6*0-AJ-{nY;Cqn#SiQ=c%eVc_XLSlFi|==Ab!$z5)O*IW`L}PtR;#L|s=5$bwG~BcBvyyLYAb>tirO=Y zt!nR?DoNVfTTwH%+Kt*HBxYj=vFDTfd7k_KyWiwhK6#PrI=|oZJkDd}H_4xpu za(YEjKKW+=OOLdZ}pVdGE*)v#K!Pa;d}DSK^(0!S3GF;V$Gg1S8XMKmZ3hL z`>L6Wqa7W+c2=uR1Ez!^l8?nOe1TNFd?}4}X91E5Nws(WYTeCt6S97&??1eQ>8XQ= zX`Vrkm8t)@QT)2UjM$8>Mj@<>D12dh?%OPinm)>YwDO>q1XNZqM%9(xe?OX@CG{}h z({Voq9q%IZ7dY5YG6>YL2uR;=k^_ttLHe~rUy#7*xd7v*n%>8Ou5b@$tYJc1UqP$V z_+rxE1~1Fft6ecKE6Qj&VTiiHFQxwS|K$SIZT()AygcbEueB=6`8tA)cY2K44vDbKhxQFNmcgufip>{$l;buu1xQje`7O{5_^<V6Gg?Tcpfc~ES^gDVtU>BDs<7Z_(Z6aMw9U4l;H2B6@s9m>s{NaN^@#W>^Z4h}w zqdiSRzBo-MZAktD)b@pMK*RNL*}nTPv{(;$*=$C`ClB=M#*8RtEc15O9@Gu}Zr`bg zT$58T%i>4xE>SFm*3&03hXf|t44&gb+x*=5F$|ZoB~hOdg({+9qf9Vq|7az2DkS z`n!W-8XkV!>3$hJBpz25aAnSkK={<9N}6j*rtgyn0E)KTr!tTd~T;p zBV1{yT%w+SHdU*av>5Eak4~w5LfIZ@uyZbF+f3%#7G7IVw-Z$Z2rN#JOn&OqQjup3 zVo&$tR6R_D<09kY|Eewr_yM6MsDNp*p|N}mDQl2PiS#G`Dr*CSg|`gF6OX1WAKDP9 z+-%THnOf~oH1FDvUacHluS8Ea_3hCPmIU9bP|mZ>uTkr@H0!T-|9Qf%xtrs4yt)*O zf)afg9`r2UYt^|6X)T^eYd>Ed3|gDEqOwPqfO+5u>epP2^O$(;uO`vmcnJFVl*Wde z73JLVEH-H-s~aUsotM!=;>6Ddc{tdX^u@`{e@m=;DOsU*&?ib^U)pDP;N{G2K zM4d>E_i&nVj!vdUCwu>rR9_kugih(w`hg6raxG*1C9yt<$Q@Yz?95?k4E~ zvhB37TX+l7uaXovE`3V8z?1OPfreje{(AW9NbRDp{#r~mk~h@Jb21XZgI$|;7m77Y z68^8lRJC6CSQ$t{c!>+&(rd{Se(> zx6mi=)M+gupT{ykHpu%J(YJKwD^*V2ti8KevlTFYtkJkWLl^IGN~P4Ny@_8&o`AY} z0`2?{v%tN<;@vM#EZgyzJN(Z}Mz5j&xOgS-l|J#p?xh2~ydH74#rMs#5aTem?V=d# z>+q`|2*3HCzbAN(*6Ydq=RJ{_go454!uL3OlxUELtH}ZC*_$u@7irG*8 zT2lwq@}wu%)Q`93%W%o-4dZac)1EZTv1}*^TKj@?`F(=xE?HYN(2-i~%h;bC=RbYF zTQMyR3>R1=RT;cPdpIHf?Mry38Aok@DwGrGsuKY!=1E}tUL_JjB$@y^5@y?7uKBUM z=(Aw$?k_FtM=q>mzh*Kp7d&Vy-4p~xaxAaQLA`oY z8G7rKZp5pBHNhSt=A8EinNFU_hlA~cN9TvXDlBHK1l$%76gF@azH{U1(*yJ6fL&Na z!#b>%N=IE*j)HYvFBS8^1fDzI?JI5LrQfY=;k3!8K2~_7qhv0(i#9t|d`2b@^y>y# zY+?zply?SW*DsoI6Z=EUo_sRc)v?~qyQM!D&)PjbR+2&=5dJb^teP!pR>#1AEa7~m%mpu`W^ZR>GoF7dTZq$pM`IqK%;GFtlY5Rn zI=>`dUJ$vu=6t?j)#I5Gl@8pl_n#?EzABO=^gjzuV&7VwogzW-4<=4C`#I-tU`Xu9 zb}6UDcmvaR+Uei;u0AT-F!5{oKpa3)iVFQU-7sX=dr4VFO%OA2b+?Z zRy6?7?2xdR>M*f*$!h&ohp*d8TcO_=4FzanOLIvNKYX#jhJg}1z)c{2)aVeOB#|>4 z6qJdas3-j^{?<=2Pa{(7Yt5voNhp%i8#$$AxjNt>;erB*++o%V7=X$ zR^~>*4EfvUfdcu%>rRyYdM&mh$LZF9pB;5xJY)y=hDlT}&wh=^~tZ3C>m~qO%T0G2yyP{U)anOuy~x|7Nrl!>lZas zArr`m$+eyN@MmP6v)28a-RVVZP6h|O<+Rh&Y}s|MG#yH~IQ!{WBUXV`s+|5?EO}J9 zdmwZ^zlWp^16$z@40HcRTJppBNYL*VZq(c90r}^D$rIk}=(Q$H6B7(vD70$6K#C7? z6~wUOb3FiqG3+0-vB0Y7F4DH|dYh#SOR0>avx_u~_8?)xeTx%2KX3lNIBmfjHMgdM zB9i@R36Caf#&ZW%-(mq~;rY-((BgH4r`@@aQ~6nFv`%)*STz%6S`w%So_*z#Z3Zr< z(7tjWw8cuZRD!n>y0ZbOwn_uMA*7xN2<~2LTB<3pR0+|M<}ehFj{tI<9}8no%?0Xe zlm5LE56MOynlELO$u{zbhgYs~-e0;Z;cbAQ%@bd?$M=EvpXT_cw+gOZxE%W80y4_& z^kVD|b(Y3o4Jx0wR4Vtjc)73rj3_&M1V~!sq;uvWGa!Jm%Zo`0skGkj`^NhheNt)} zYaIiW8D!-%A~pp3a3jg*hyHGZH5?pZus z8$UHpPVg9{u<6dzImUz$gB5l!Jio2Ux~{uF^5u?|3&>S)s57mk*FE<8l8ssL_r0G! zaj6I0{fl^qk`K9(9r6;zZ;pC$f84g8Ak5_h4!8ZHio8Ic0bL8(p9S8VfJIXG8kUaP zJ}#GWP537h?UnAmiSF-I_F%Sqz+cs!Z4tNF`kl~6Y-(~e8FVg_fxkq1wCbEWH&Uf9 zm`6+sAn`sL(t`0k1g~ax+wOxdF^*`(by<4t3}o$1aeVHHPfr?V{ABz3h(P)9cB=*K zGRjCx;Pi68Bs!GXz<_p0CQH`Iq7~|O=pXKXfzW`0pUk2Ur=Bz%g`8MW-MN!Kn2LL& z{b^!=bPV!At?=E;`zGab_($+9!&Mha7}~~B(87f-FHn`NpH0HRy$->I-wf4;5bxVnI=Jvk3vi=*xA(=+>BRcj=EsHl5Ep8Jo6@YY zAPRFNAe^XNQ;Gc>ow*$f^usPD4Km%Gt1+uQoE3%yZb9ArP?g>rU8lzFlDC7v;M!S( zW~SzpBXy{@fCy}-Mm}1(akLHCZOP|&K7PMrTO*~ipy=Jc_0os+@aE4u;azXhkvd?kaL_oa2n3b;BJ7qO?QlwuPGkvJnZeycgNpNEl(R zdb*-n9*{7NGnGZ<$H=tRHL^4XJpPTWjiAycT+i>1_kIQDH|gDA8};S%z}CD{{lMW0 z?EOX{(eSZcs4RMdIgO}~GY8?e(npJy0X2Bf_P`eWSP^^Qcg9#J>Ii>qVBma1i3uGA zr^(NIa7pSBaW@xiuDX01}Qm*O6ey{cRzq% z`9VeGjdv(DKOdv(yO=y$)*YC{zo7CBUoOxIKy|x7W zQYGMyRS99ykZ67wOK>N)z^(E0yz7 z%)jy4DN`9p-O{^{Oi7yF*>VX4%=AXR_$dxH{H7SiEFdraqXmpteqe58Jh7iR_zyBz zSREzgSZM87s=d;eDOf#7sKS*SxfhpG+a+{YEza|mms%oi3*M#gQ&2NrOt0?qnYg6eQ*xNOEB=he5d!X|E^jULg9;^CE5~`JT zVto9h93-40$PV_H_bK=LifFKCsn|Fv!d8s(?jsH&(1e)-ukENogR9a{&Grt~5~g># zqIIQz-COSU;^VEw`>U6uNo=v-G+=L|sFBy#0iVcpUbokl875`=hh=^#jLWMELUA^%13Ez;ud%*54wCf@EwU#Qhv66i+dh0mHc~EGLhx0 z%G|q!UYH6ZVn=so^jOLEu;BoWmVE*a_b`EfFa_2mdgw~QfRx}eubq-x48o;9&)?6t z7B{XMn!64fG&}riM;VM^E(!I1T|dn2)hl?w?m4H0O+z_&2h~ZDn@>*(|&Q=uw z(=RrBeUqQ$X@IePq_dgQ=6=9&iU6?|s<2&e)7|%NiQmh;u?gBE?9(M~1UHqo2z?Ud zOCZCb=J8|7y`yP&eIJ)4T!7MsX#O2O_(v*7DTV5X`oqSHifb7a&NO~Ax#YyL?@;R*b z8}LfonoHtb=m`ZCrSk8p1f~ft*uR|62dZ! zrh#UjU`ugCbkU-qg*d2{CWdO(WppS5W^ z5cu>Rp$}gc&0JfQr)o^`S-Y!5{Xa)BZF~Ap3+@f9B47!=zhvSe+mA0_D_x(Sy`yo( zlJL8WqQCfO`0gRIKK8)|D3p<6zvq(1+@gFUNiOYHnNW?-c<;YxjNf-HV}rL7d2css zglZFX@#FtI8_7BRJiOyozxcYLnmT~Y^3#g!0UoP7tBkT?3$=(576zzW`FX1ewD zMtz-TMST2Cmmq11UXOauPzs>TbGJvcoBq@H1`=9}L@HD42o?@el3O&{no8%09J2JH zhU3xLyK~|t_R{x<12e9L-1VA_eexB1E6xEc`y=N<<@r)FRFj7GTr-S(3Y{ zuF2d%ycZ*u^WK9}n5tUDTWA7Y#yi=ZH!Ziw`E<&OP!!M8SnBACVQmr~W2`wucG1@w z!j9iGze}|Fir+ye`}mGIW5+4IFkHNWD5=@B<{}27ytd%}p|uB#>E{jY2j;G}-|cdb z-0FqYMc}VgPqw+k;;f2xVK>(o_a?bGoVdt`*Y*IZCP&7tT(h@19bJ@NSwGBIp)a=G zW)AyTbMhY;v=-@Qu{Hjc@UUsBKv35%MT>CHlP?yTyJ&OGj0~Or3cWjdD7F_fwRJxw z_+@|{z@LbVhXhlPFw46To;}5XdzG;lGd;06hE9Fut!Vn@xME;ypd&L#84$4E;DZfr zicNivV$yfmoOxO1Ro@Zqum*87ecJ!d6uXAHSVhJA%n|$&+(MInUob-#i8E!Eau6Rm z*!?goR<%jSjzl(I&S&6uGbLknfqZ!A{)UwUy)W&Z5k}Q zmzP{J#4{PyT*X+1yhSTZoN=JABB+%`U0`n#XkNlX39byEXhf9aqK+*h!g@eUQ|Ye6<$;b`nVbtQqI|r$9qX2>sEbc1k-tT@ zgmF%NpAcwvn#nG%5yVDmLc?6$@XXioZKB>oNh^oJmH{X6qb7SszIIRA~9d=8Rcfo|FSwd)GG@T-{jV zunU_M-qd0@ly=ex8pXMSo8Yp5Y{1r|78cC?fggx@~iM0(hT4WcU~# z=$oxIXlC!l^*2BNcR1ID@uNa&?pvL#6%e1l89WT-`A;%aA;}$lH)!*Q6qaB>{Dtsy zLsug%q%PR}-L=}Xe!`8WSx+a_%1Hw$GmxPo4-v5@-0x9$*CjD@`o{67tEOc{#Psw; zc4+*1gT;Wmh9Szo+Ex*bE2YRWjWMQOALd{iNKgsaJ*W989ed;S7NS3Y<6C6g;Z#|Pu z(>~!A$=8F;`l;Az+IbWYP%)8lLNbl61G7!qW6N5~KT7crfF~@d(fS0(u3nqe0Zm&c z7XqJn(-ZH4#W?K?Pq=es+$gvywPa$@KTC_={Re_WPtG7Gu63yFfP@z>Uqc+~ZfqT~ zz|%=kHolnf5kDUCGf&R@}JaaVrW%!=~G<`tblXJoowG>!O0u3g(ps5VStPZRgCt z0s@ngcc@hHa5Krp<3#mNG$5lHAmV7oR$t<718XO`$^6*FN4r*&`F>l|MKttdbMs5c znd`*)fkD2XuK_Vb*~r}G${gp)vZJ#+soWW8ljpNu9Oe5rVV4J;R3FcKnGUyjwY4eaw9)0;yLr(jc5{rl^%TBN{2kC;Ca2Yp;Ok9!OH7}4l%_TD8%Z=7M&KPYJ8Ferdb#VKw^ z2HlGncnF-HS-s!_b&j0(${par&3AbBi-+>9Y3Um0Jn^fm{@hbJaw})Rtp$)YBbTXn zXDD{Vz}o?Z(~>pMuU?rGQ?Jwkdf{Z7Yd1e-uab<}<^|}&R-@j2-Po4XNoMjH22%7g zsfn#C06KE}hQv8kvi#jHHa!`{ZY+vDKISaj(}n4EUpQ=UyJc4h*D|469$2F1^F&W% z1@unXZW?D}h6z)_=heeAZM`81lGyiat?LbjSIFQ3A?&PrT)WF3PWGPH^*(-UQaCMg zUa+?Q>3VyO^G{*NCRalWeHSFL*4Y#i5>ZPRmY+{-C_Al>8EZ(>+3#;cC&XWl%M}Ny zgJ&l@MwclFxkc{~$YcRp-ec+lN5ZDHhN%M2`bUtFK~wF;jTYIs*^WIvAWyv`tKQMR zF63XRt?S9`$iC*<_>8%t=s<^&K|Wj{eoqB|Q|VlLFqi)N*@LML8igEj`k6&cW{$d` z`K~&$E>ez)tFZP2vivCU4$6-B_F%Vjk*W@xS-Pop-HXTavmQ~d>7rnQS42@5Ew0^{ z>Tt_A7lUx4+Fe+7%RC!sk!#GXIg!6y3|eWgnvLDCuXPTpJTxEo@A5d2A9=XkA)!Q6 zmI|?c!QTROdeg#whwB+*?NEmDLX<*4bUuXZxN1}E+=jWz6$Vr>P9^)x-OzUJ6!}2~ zw~g+QbKjFURB2d_U}>$`^BMMhIPBu)cZKxeroHP8Ixmlq)e$2Ksn%199xo-!cnBYr za%u$pse#X$O3vu~{tW4%_au$}F-6kC5$8N8_Nu>JqaftrHNKRg)6Nw5PZ9AWXM;x1 z@j%LJ*pJ$IG*?*up8Ikj-}m!^81Ei<3^V`6evTA0zFzB>I5vL{KS3Veycv!i=kWhx zIO`ww8dh0;nsa14@$Q4grmnAUq8At-`!_j)>$JD|ah-WzP1)(w=B!VrRgCUav`uSn zN%XZ>(Rg4%_hu7=O(pJ5IEB?|FzRu-riX76#&r0@e=G&_)IGTf`Zo0;ImcuO6m-wE znajb%=NvIu%~HPx>dy+!N5ZCCQZL-2i?bDr`Yc<>~E($-Q0)3gW9#wPQ8D% z4=Uhc=vcQjrh~R>6S#|bzC=@LP9;!I5tkCmx;RuHzLO#}NxPEOz555C`I)hW8NS^Q zC7b)poNPw&#~Jwu8AjUmRHIwjUdw7Uu%sa}k8>y^sA&a}ogp!3s5E+{u6Dd&5k^ow z&d01;p_6j#ga`$TGs`J`e%#`d z%*gO4nI5}8glFTq?b_QE6p)3zdKSLiT!Nzh{B0>oGUOZ8f)~m4UBIz__)CnaBPVDG=E>H zLIjj6a-K6E#F28oyz9gJs4uNCxHH1yb7CtSZKQ5Mm3fve{)1!b#WCvgn5wUiJ#m9b z^Cb=^?o!z}8{S-%!9L=yR#Ugg2!PmJ=6i_6y?tOV%mrE$MqXR`>rV8 zzcqp+j|3XK?RDa~wQw2MK&n*oGfK?jzuVOTvwf@J-$g0DyqVTk zeOvwlLn$p%MR>lZ05*ijb#sLH;1qPTA<{A^@*X;cB&kN`H9boE&05v1F6Id~;~DT2 zI%Qlr+(G*`)lAm}4ttA?%#6#=cjV0P<`Cfa=BEat@~FJqK2GO?Y;oV0QtqGCRYd9^#vUbXdu`eOK6abr_%?K8ztza`>vePwy&rjs3hSc z(GGt6?C5FCc7y0~*4F$|KADOL{*EUcEM8a|q@5m1r7?~TF}#;ckRe#2Ym4hyp#Sxq zSdF*8x*aRM7CRa@tMzAL7dc)Sqk2eKkPu1n^y`(St+!V8eKKM=)0r|{ytXMuOOtDw zXXYoZUWxP|Fm zGkeRlQ#ZW2y>*Wf`KXQaPmf?1TqPeJV3!Z9o?txtQqIF161F*Nq-huKV<4l)lU;Rk z;G_2N2#5)!mco;h_1Qc=<3}Ss^OEHW2CY|ALUY|b_|Bba*&toQ_SNOkM7Zmy0&!RM zrcj#I=y8^|Yk|Y9Z7)57I=f6-H|?VY;D?Qi^Xu(rmp`Z~7zc>83m1}PlTLOiuJff2 zjY8^>f>K;@0R7o6OXX%$`4fI2mLv(Qy<-b3gx0P7G$HgO%K1+kbLhj7S;bD$!0mmJ z+;b?XZ*WIX8b`#9)Us9-9}1VqP>O36DT9g=z)UNH7uf0ghbv!2j-{r%D%o(65Ai)I ze>z`H%^Z*zYR6sQ{#EwiLLl=!hgf16}hL?Xg(JC%8og= zEcGfArSXL$Py1fs^JP2zQ<}O<$)^$ic47UF_t87llWl-!04 zHF202_J#vOw|?gzZavD_P0T{ybceGv-TD<_vB#HbNy`eEIx7y^XN04T$A4`45Uu{! z^!6BDn!1qzbpK!ONuQde@E3AZQgn+db#MAY0~|hakYoG~{kboeyeFpe?bZ3uy}&Kl z!FUM2*)E%H;~i;$0ya4yR^e;cmE~s-B~4Ffs5V&UsriFOM70p`EBiOj>q8ZB*KX^y zDM~)SZZYo$$P#hg#uXf6jEq#c=DL6*Dlc#u$4)ep6`0#l_(EP+##KjxokU_z$h>fq zglH6zi72NMdlfl8-E4N`ezB_>st~6wgj0Mt{NBP6NfUWc^Fx2kdzd6fPTP4MxGBrH z<_!k1GYH)v_GzpEsjAQnY!a!-RYHyVv-bPNMZ%JJK(z8$uFK%qOmhOqyxR+lhMUJa z4~y1*$jQ{BDuc|X2@IA8t1Gf?+UbiSFGfJig zvzs-K;hEI7E{=89@uBeQ7N~n9^^X#ZaNdeajcAE!Jra$7aM`Qz8X^fD~O23{>3toFn)-4U25t#*HrG#2W72JtSFAt&@ zPLt;R-85eATqY&*^U*4?Nmz3qS+1fR+0a7S(O$SS_I`NZf>mH2F+U{O0oIJ8V@7cW z>Nf6TRGXD;H4(G@GS}7NUi_4M`T=q%+PWH{{`uzwkGT&INOO-G{ieU%@*8~dYt``k z+&Kgk+Wm!E-AgjC#R5+0ARpnHaOe+m40-HPOXbG*Ts^3U*0yB#nq~3Ypqk0}=wCG9-O{mi1zmmEvwQ)a`5@(kOW!BmhfDc5yfvwr7SPk3*(>i-IA0gt^ym1$#i zo8LL2O8ZUW;R|m~*1MvLIyw?f;s1&_ZNJME&5B*bV_d-}C5JE`qTvy@2c#e%xsyk!YL$;bz*l2gjL@(q5w@KB& z4edtwxe;-uf3iC^sf5AdC^)U=x^IVp6miL6+g-_Q+kcCkI2G-X8!mBu-NASHjOVGV zM&U<9`DiekjS6*Sf09G~+0j+Fp@tVGJl$9lZsFE$o5!bQ*;BjGJ{=kgIY?pWa z0~Fqb_|u$D8p?#(Ce_;FEjoEoZ{7dAFczsA&Zqhzgeq-OXSd^zK2WS6PTcfXt|x-S zO7&iLGPdY3O^<+VcYT`<#7vuXmDYU)^xwTHU7P(KwDvzmSZ3Gesc6wvu{Ta0)){oN zUHJXxFl}#+hwe(>4GIknZa*z!p>3P-(Rgt$=({Q|_bBoC_Szugs4vUK3 z)juK;;Wnj6?@svqx6ci0W7pOT=k zWQ6ub3ITBZ{vGI@n)_6s-c)Z#0U)Ec*65e#M)&&kv6fW^GGfPFX_-aaWxeQk-~!^K zo7<pM=MhiWqx08-h%|51024@g?A(Eh-!M)V&exr`;|?9m+^hQ7fwTCK)JnaiOvxSJ*Th#dKLUmlsTTT?G6vHk|xUr8N4^R5KCg`0J5 ztZ>E&54yZrJ;ycOV`Z6eH~rTg+3R7oON^m8B#w>#STxdsbHvb_Yu0H$ju}@6hLbBQ|!*8QkN(=QVcnaq7m62Fs{0Hm)Tk0;GIII7Cw@#QCh0TV$NK^LBODfOkl zD;sXEw`wQ1UE|<9w~645{kZC9tbHk2Q=8upjeizfaiy7~S74d!udXo=Y8|nbyvmF9 zS^AaPvm-(fJRdnQgc6mvZbA>WonoEAmrmsowN)0tE!uyQ$rdnwcyBt>3h5`(csyy< zNWGd$V-|PSm}pi=QoR*8=db|0Id_J9h=@4XjPSxS=eBhL*-`mzZ5?@Cn>WW6&&e_; zry^E()Py+fP_g_cNu$2#Txs&%Nj!OhHtX$=;~D3_>({PK$gWJBzL>f=VQn3bGg=69 z;F$pTDWVd(-}MidpSgbz00G8od}jCtDC1K;ms99F{&XgM5LkaTcE^atbUj#FGmGjb zH*GF2p!s5JZ-E)*pet{9-+5VSKX0$mPTkvkOwd*Kh};J?cwR#o5n6r*tP?B2>nk*$ z@A;Q6j#n5Gj@ID6{x_2Y%PZ!>E;<7I2;;*3qNGHW8hJNKB*dI8gn^wH`nZFWWEz1t zb$DG%E!gtQgiT-iM0nW@YQu_zdb<)QGTWa3e>-En?j&O?w$k1l--^_9C~#Vc`kK2m zkIbn4SzubcbuAF&?jpIoj%IetN$Ek38)E&6gUAf3`V@BCtPQ_D_fO1!y43bkX6I_o zw2#_*#=QpG*JEti(lR89T($dU->^@reGcyW$P}K~H!t?h?6%gzF^sjO$OY~0-@n|^ z-0!X^#_9g30~>kiqnxv((e0i?qFAE%d&NqT(R%W}di(x>`TcAb3K1#TH%O{vEDZz9 z)-N|tX_?wVK)sJxM$P?zCnG2NK*oKyrY-0`#XoPxq`=Z0vZ3Yl~2mVS+p@f`MY zXtTu#j?h+hH0~|S)9P&wnJf88eZ-t=z)euCKTLUjscjixKK^dN7E(?1RpPK2R+|4d zNJWrB|Dl95IU-dmJ6CMY!YUy&9v-M(-Ogl|dm~rqIp6yLbK%_5n&zT9Ip14bSx%=u zHNvnfp7Nf=ndsuf?z^9sQ-Nd*DjXs9r>ywd$$8-6e(NFHr0(aM;g^3eNORQ&fGd8? zb;2~4q#9Jx050mL=h%yH5ZvUV3V6~I`3g3&^DE9@o^b|YbO(i@mJyeMeTljg;Zxr( z1I>e6FJDYbh4Vd)9BH;}VE9MCsZwy&ZT*_)jWc0PI+yJ{)-;A`bV1HI} zq<=yt$^BMM6*AHH&h zS{Rv~ja*s(`tn5h@5pru!Qb?Qdr1F#Vzxl0_qWn!NgT1+$_+~oE_lKN4_C0Va|efPx9%g4*HVfT zUXS)RW)rDW)AvEz@ypAfUL#Rts{j}I)k2}}&Qo&G7kMxtr&juYHnPOampSJZC*;x! zOV=AB<{Tj7%C>_egenV|LEvEb{((8NzNfmzC*Axki^5*sW%FL15W)`kQ@eznNG1Db z*GJz!uqY7lH;wNW1WfgREJiQwevgk<21bps^u%iJ!@4H8u>n!Fi=EqmPXK`eLt{WMD1P=)o{^{3tm}cnRAE(2LC{F%+j(dn0OpM)Q!aQD#8fyxT3r8(&Q2Bf zh8*^&A5pP0X5I6pmy!BR!BJa2)1UH!)tP>5r1|`?5l1vShhOeq0vwLE+L)vkKmX#x zAe=W2M1t@kFEzTI*Y5~hvGXT0O~6pg&pvRbL6X={zXp0f`v{#8;F2^Drp?r+2=n|JvSWS=QkJy!c%W@0BuPJm zKS=k3*@Ao+d#?Q2TsFgJ9(q@e?5m5bc@?VT47fTckjsK=C&Be+t{@L4R9tZO~kGmcCUp=*u+WBjjCOB1f5tsHJTt3~; zvgq&y5E zX9bQRxrGP1XBC-BN0OHLo!{Hl$ECh`?rX#Deg}+WnCHp-=qtX;%?65W-&9EF4vxw#pu=tODd$~C4_FTsU9;8c6u{y5^%vviHsf=Ney0ThJF*HZe&Mx}HbH`j zYX8-SZUrzVfTxt9jpu5Y>VpTEuFoWnen?h;Q@us6`y=zo?o@6y?DP-PqvjLjP_<-P zlZcd-U%cbOz%_FYR}!e4DHxojT*=2w8^x><`Uf}>rTWjYT9kM;kop+;Y2}%>(wqig zU1-QM+cVbw)%k_h{aNhd5zN$#LZ(@ndT__<+u|yk!`Hc=rx09^^XV4s7#TU>K}XtS zD9q@MGP-=Ic7%itlK@dqG3OaL9`}};VF?dfTLSITcQ8~kBImThrz-4)f|H$H%Bqs(ITOr zv>>>Z?8v9$lt6VhMZ077D?{ukU8owrX7$&@a>83g!y_1Tr?pUjpaJ3k9^m{ZHZf}i zr+JFZQ}4?GoR?iDQv9FraL@OXp0#m(mdE{-Ezou@hQj`X$EWs=c9bF+BWv^X-+rW= zo4IvQA?&JK9ONr78&tQ`ewU6bA2eaF$O3`bwh7@GBHpha^UB1AJ7|#PpWtG~Md3Q~ zRBpe}wfuaI;W1G>f{Rs_WL%x}FKitAZ1+}%NPcYd zsbkA~J<#VVvQss-hb&Tzo*GcOZXM+Rp8WGwfWI`o<1AE-c0qC&MA0NgLd0v*h@L#>K}>Owa#q11cr(`7E6Qn z1FH7UeiExvS{wktKN;Anw~r4PG^H2U=G$#OgO77+7b=IU=uR!tyPgrwx(vDvAGE%h zGe>Q4X(-3U=X`CPt=VMGEirBJTh#4I&i6mvoK9di)T`MMjkg{!p5%05e(86ubep(; z3F!WB#gS{zcP^$A-k+`g!i`|pnYRu*AKuU967SPmHMzR4vWjql z{~5}&%V2(uGDG_yQj}VzUt=@(9$5$5TvOWoJ*wt}Y*kihPu*ahR6T?u zWN$w5pLsFhV_v_RA}v2=G_n3%?#$cb9>>X_h=;7|%T*g2e($>hl+N)3{LAP$A8$j3 z)s4O1Y;Q3T6KOCUJ7p4pS!~+1SYX_#b~&`Gfx|azyb}UVShE;#E^xY&t+SQJE`JT1 zfXyI*j?myp@p}?io85?#bQxiz@2S&14Mrk!*OxsP4j(QJpcK1oO!93JD?ty0P5k_h z4qCBup~D&NBQkPRd)5_VmpfWhRF>_ zw!IoqW&`z!c|#cnag(d-Oq3aeGeNM!~03gf~sEFZT7pZ(Y4+n zvsM{uBK`I(oCq3qqLHmjA!1&MrM11T)bXcnex)g{94}iKYM!Or*v5g%@V{Hx!snJ* zW&mID+-k2Kvh@tYIb4MPIM?THWWVz^1gySOi!vTJ^&uZQd9a|7AA%3|rz#~FWDdkx zeyC0O$x;oe2}WX+yatlw$7QC~-=*6|-TtA+8Hrsxn@RojE%h_uAkiY7Kc9D1?v9bL z`s)qe@c${m_^)xJDL47@f7g6P%Rg3@sl}#jp@&?h=MLx>1$D|Xu|fDQb+#q1S`GlvcE{3z>1(zGfX(nk41nrh0( ziFqXDJ;RN!I+?N_ADSxMH;b_nzYZ^34<(x;2jUH9MRu+npg;S~7))6G(0`?DB@V7oO}hrhx137)UR>LKiaN}4V^9W-7GoU*0EWIw z3Ws+Y9zVVsq?qG-Bgxryy_ACOSxE$_5^%WXCzC7t&)JP23zHri%`OeFOZlrAx^AMD zquAHO5akE9n}dB`5j~z-5!pV_*}CaU3oXZY90i!VV-+-1JIoIE^9Kp%`-&^l!iNjWO2=Xk2IA3BmVVi=Xt#-;X^QcsqAe zffWS=FJJ_6&C{QM4h|99;u{&al4mqqzD^4{qB|@xo4%hDhn)pP-D7I>`Qcy7wW?z+ z!F5iNBkv7MOL}v(`as0Ws+Hz+aFadY(8o{Wp@Ui50jh&WZ>a zz&~JoKj-Yt8on%Vr(8AbLfc@m&@(u!o|&c^*uQa(40^PPQsQkNB~~l?+@6rTQttS(RcUiFum(cudcAH zS8g|-aMpPfJt}rvIaHeUlWh3F?&c>A<=|^?#oZ&ZFD?%^vWrW`1mKf1rHj zwKlQl2G>2<-RI6`Z|H9aO_u_UE9jx3nVHp|1WNav-Pv)+yG{8AS*|j7R*k*}wVvNR z39L8!FzZ4;-25I@C9>|4^&~na>GSuen}8jvfcv%B=PtGUatA{RT|gpwr24nR#0U`) z=-+j4#M@$rd2}dQ=bSYpSk)mL5bjxCQi2}fRRm6K{uxLZ%6>H{>;oROUzNIT)ECe7 zrQTvb5>U;01<;f2@A3)=*z1P{XPw@a!pREMNK=chS8#=UDt)U8j`Ox!rN(EZb#B`~ z;jl5`ecw4K!^`@0D{?^Q+3C8Xt4;+v8?Ci2^l2KKo)$1#J4G|Uxi6M*RfNQTvsEMV zh*T0_V#=E32qfBeg74pMnL5cRR%X+WJuoFHFT37*DEwK?go}c_B~d9a%?h|<-a+60 z0$FJwW`QUYq#y-evHa!D{6RSDuS2w$QwvK{ZT#`KzqYbWKRkWhlN0QD^Q`WV$B3ub zyXTzn^12QiJB*)Tv#%dX{@#3Q&#JxQYM}>9RqeF!*4eR=Kb{ixmHh2|@;_(kiGr+A z%+_d?Jw)Kn>eb07BrCcAB!h z)L-9;<<6U@;b&vxZDESVlxMQP>^IQbwM9%SaFtQKer*seQJ9n$s8Eh9m8#hn8+JoG z!4VPxw@%$Fg&bd_M&2(r#`!pAm|oVA^t|5|#@H4Hl+hvDKOd#)exHGLa=la)AO6QA zeLt)FCHI(1K#YGZ;{OUTt0F>onzWW<{nif7u6%AXr^xRDd0S5E72o?W7XU-tvUCypf-5WGD3#a*B3SIkp59{%s)2)uXLu4;N|PJ~n4mP} zIZmLb-;#VJTS-nP#wJT=v)gfWq&hZ+Hi&hHDg&A59=)_i-8{5^GPu|xu0&EIrF`;I za{JpWGexQdi8My|iIgv{!BqN70M~!VK0xDQrK{SOR?T#v>~UfBu2dHhEWPq3PU7DZJ?ym;YN-Q88Bc7!sr^K1`HS@zq_yN`?>G;Kk)kHb)9pb z=TRqFjJt%!nb=?OeRwhH*OWj1?(cvMXnJnt)kJaq%_5LrrIPBDcdLvj1U;f*csn4q z%dOe3G}Zr?aa}2ajFgqk6-oV)iYSY8r@CBbMej;T-t4H1gDQ1{zlEha$nMHUEdzZd#|(jwdXfac zCTYZ4L5II|l&_fr;*Bb|tGM;ShrQ=&qqA)S*FcTfl{eh(k&ObwZlJ<%i|uYsle8g3 z2m?}*pkZV=FhN++@O@iXmgif$-ZW5qw=Vb-;*&3FV7AizBD_#UmGWEP*!;=zH8AR9 zKcqmVLaufocu@EpKK!U7rp^H((vzVWWad6g?*1C7h5iu^1}RywyKC)vaVfF{*DAGt z$T6GN8;=h|y-V7EBDq_Ex3=Y(?BYpRS1OQ}(Z#M^$iMaG%I&txE-bqtAMe|9SG) zuJRl0Ihw74yaCUps8O2El@*S zu4tG*^72)GXv18$!>?hiT(~;wc2{i#2Oqn+88ap$MMi;F%;#UT(Dhyq{pKr`qEO-K zukxaPQUzW;w*uOQ6GztL9V5<-dDh0>vXQSo`BNcdpLdlJIsQ6Y>*iVpaOCy)viHPg zg0Q6X6Z4M^_1mes?MKGk0srvxUmhuORvSKGf=!szs;DF&6CiJhM!y7nv>T@L!xngV zEYR7u4FfxSz6tsv3z(k&48uLyW4PSlq9`(t{UC0$_XA8SQy&O*!&*V`1Izx7x>Hc73P}ZuD7Z_Y_TnT>M{WEE}7w)EIToImusH)^fQgx z)w#Z-%=z^sV--0o^-MfG63v2X#5wyj9;0au##HHeQ(QgLFu1R&si<*sfrO)`T&{lY zAfuAo*sA0h=7lTu9))>$s!3!b^7ipzY-~FIhbV2Sd8As}+4c8gY?=9VbE_pOB?1+G z>CZaBO4=F;XFgqpDQ9aPQtlCdQhA>)PlJ9iC1d5f_Q7SuB4_iv*@Zs<6BZ0*b;v~r zI9@m)Brq)Y4)o0vjx3qL9lG_2No16T2|N=IM$CO8t9}otRFD2Q%oYurU>P`7B_6jiYG}ys}6o5%u3f;9hWoOWG=BA=<5Pi(-JSv{L zh3x$v3511g5md^KJ*waF90dtWR-g3-CKGDHGWy9wq^O|`;=a8i$-<}ziIlBrBknoV z>B=8kUT7G~e>EuTS8>8*RJkalxlwkZb}&;V8APbLI6s_taz9i##}mD6)4-#yhUfBJ zS$O|DS4db{U*0pZkLuVZ=5VH%0l|UC9;|GBxuci1R9hp;D#>p7+8v%@x}r_|!1la% z%dwNzKuKj$>jx!K9Hp7>UsULPsh7&eD@7kayL&m%>vC(5g$eF61M1Rao6f2SJsD1| zaXwl1a1!)ck=1Wdv?UQ(_`Kn9lZJ)I_~aGQdmWYYR2=Ufs(~{p@dn&wRV*7@YlV0^ zlb1c|`6XnEY&PZGo%NkCH@!NfHaYk27W;~B8Nvk^O@V;jG+eTVubO~EwG|vy3vmxo zoSYUijXs%$-NS`MUt>yIr?~B~*O09u>~lt52kg@5u^E&Y!L-eexe;(wuO8Vz_4bbz z{P7Qnci0cM_F3om3&HfL-hG&VnM&$Ca4cPYq-&(Cs@m<_*!>^u)L1#&N+ta1O3OWa zgoh?wIMKNpFohf;)dZT$1moO1h%VInTWsuh*QZX;7QT)oLa5G-UdIWKF!I5!!e+>B z8aCPPD>d-q6EHD2_ICSb(L3f-~Wf;y$8Wey*6Hv|+`LnwSoQw>^0#{vNM@R)d{` z{WFecya2UISII@l@>*%VP;)%=0k_bdgUG|j%ojW^o2Q+;H$!OYHC(W2hbG&EUw&5} z2@M%K(QK^01btT4$2ZO!e!M!x@k3GnkJsua2uXc2CkP@_i#z=-&~7vwKxVyb;(@8Y zLg&uBU%h{g5~+Rj`1PTp#0yeTH?83TGBOD__Ar1R?ub=`ZyDu(=Y(1+yXb2e}p1j zJ(k6H_73mp>+A1GG zG_gt?jkv7nQ@a7Xb6k7JI0WB~P_4P8!+Sx6j_L9>PS_Jn#_0N0>o;pk-B3b^t@i&&(!&0qwbg(kIxSK)h~fvJ8X}-v8Xt< zs^-@5CQK>srx6`;Mzhqw>66By##V{v#LrCCyACs~fa9!>QCKN@=@dSPyciM`z5H#y#W{0prnyW-6f3|XU_0Gy5gqM;AeYVk zIo62{h97Og!>o2|RQM;KT~TqY&2vhZ$gL9(A#?`*-zJ&8{p)&ph4!qs-|r{!C(OyzDqTQ|i4>01KgaWiL4=R&uR<_wEJx`-v1x z>WO!7Q^j1Kr#J!tV&}8MhyJ$tc(SD8mroxC=*T;w>JxK|Mp@e#`9hZ8NZGg9$}V%f zA#8^=422@8_PM@BGGE=Y_M++~X1|11>zr@N%^mk&`F(N`{$TMLS$1!7LG|j&`hu=0@2}AO&Kw62d=$o(8K!|c~}GMZNR zbEM=@Q{1m#ZghmcvG(_m6Jt?r^S+GT8T#1wJ8=-%WqhF*KiU4$YGEFEN2A>IszN}t zAyaJb(-C;8u;Xgr#O&BFCCp^lm>QHhEF*dw6>mp%pF8Vbjtt57If-R-Mgr-ncdUVy5UNidID;l(`pr@ZeKV>6Gg+<6Za*6uo&LdaWBBjY-$Yh9 zZvoD!4<*9cn)$4|?wNs-wifVnNHxOkr$3GyMkK#B@1^;ey^`S*AG$^O9m6m~v`Q>m zcC4sK^z0p}^AIBO?wu%FSz*-FIk+eRrqQiEEF?w!>Ud}^G!SsUx1>3CK5 zeZ5ugS={MB16S~!O9TI`DfcwF>J6`Pl`xD>5!7^%N3dmzw$t6m0UX|!ee+tbJ@3s3 z-P;c1N{j8z=)0Tr$U6AgD9+!U7HxfO-}tDmFCI7@UELyKS^ZN;AhzTGqdNb=cQ7>E z&)kbdo_=na+6TKmEbnzST3Z}ROmw~ZEb$uaWcie~Hs?g%*d7eryz7(21B3BA>TD4| zianBnUC)4F~k6A z^f9b`=-Q%yOU`1S3 z(QI%#aY1{bYi7L9#Uq{L#4qz75^vv}jo?RaWv}Jt$Yv_dZZrw|6vNCfvM4 zOpia9m?O2#9fB0eTn<|OZHS=enY2>+A|$jcB>zdYopCg>DoEay8Ryp5;TV;t)#~nt zfWC9G4G(le){KS3Ro<=u*Rmg{gzzTCR6+lW-C&~3*LNsJ4;GM6Wqc(ZnqID(8f9tQE=SB4Ijava+Umm(zJD3NCdLyd1wV_Hk3Bva! zlqZvXQ@6J2s_92G6z-EZ-X7TbACr_ZUd`ph;YgeWYC9@iC=Jy3_ZjHc+r}!tzPi(# zNk|pahcZZVM5S)juh_HfYuJ*nJQg70Awj%k8yz_`rTKG_!D@{&7GzNQ_NY>V*^ob$LsceuWWPD3R0} z_qd`4?|Cn5YpCDYJ>;GuBxA1sN*z*=vmYb-Rx{ z|2G>w+pqY(d$s|)B-11dOC|_>2Lw31B3^LZL72yT1#o zbmo`+K#klP>GW1VmxXmiEDkJ=4LIM)08VmDb10Itk)0g^C8k&M_^6+vIC+RPL)Z+J z_H>04`fMwsMyx8v>!#rg;L!LW_#!sv%-3g!4(-Em*vkpezLtnF}v=n~czT<7B^gWUMCQ+WLjF?L+KzX6`jjS9fmByC3R4_>|4%J5z~@yE-jU|>;3ukx zYYfj!s|J&{xXP^THZ~JqU(?j=50E{4KLB^!+?mz#1yM?YF2Ri8&=UO|W#yYBa2Cn? z2~Ejon%_GPl%~B%{NB}pg=dB+n}R%tJ08TvZKkheN&FmGGg>27);CKvGoQRmj$QThC1}@DheQG zH)(z)$TQNgr1Ut?ojw7p;5}`EYJ>hh7#>9~jkw#K56wT(N}56QH5I}Z2?UPuBA1i( z^GSW`i8T0fy?!fY*!f9=gM2Qw{hK4u;Xnhk<*BAou>~L4%}(sW+V4A{5=)z{%1Qah zZ>s?{ty!_5qs|z4jOQy3=nE}9zapO%=sVo?io z@vVBcW@dE3s@IjN=k*-=pGGt@?@e76Sr53FAAc65tdHwIRYUI$~ZU zw7zcP5N=||l#*oEyhU2RXIfUB{;O`C{wtPou|X5r;n^EKURiQcn2wGPe}~y=ub){h z`S)&iq>ngAsrIJaAUYD&%G%4XYjR#HyCL7im<>7N(vB166DwyG@#o6+d&25e9wUy(97a-%QBT7j_EIbQftkwP!zEGgbl}<^}cV=GMtz zn(_HwY%!UW;dcMsTY$vWLtBoXRE$&38gLVSs+WIovh#*F$DcBNK&o!u+^Xz#wboo1 zeuxc5@+~cmKD+0;20}D>zUIYNw8g6aI`?nv@(s8ec1FsnkWbb+XHx5tU1W^u*V{@> zp4ifx?I(IJ_4M`)9FYY>hzP~?y@Q~}!;EIMQ=4?gpA5?V=jI4moL57QpTtm}0>lT{ zvMHcal5JNuw#qKNQVhzIU2r6ZemRI;T~;zUy)e8HTp^HS zcWL2?MaTsiov94*j<`co@-p-IOz!HnguL1rhEU9dio7P*WX7MRlHh%CMuz7cN&J+7 zHxz1ANG~nrQMEz>2&U;TOUDDYaxS;3@e}#rdKWS74{7;W^1=O=2 z%ViU?R+6erU!OAYZTYk}6__J+*BRLv=FR7J*^fWFuu-A3V3ikES9UA*409WjsgLEM+5+j~I4u(v&)(%J&Ee(tAmo)_+uR|m) z{zqqJe^D1HYi{@1gSc`OE|zmCbWXFphL@d^_aF6d1wq9w7Zcg&HvU8y}yy8f*egu!H!U^KhMwmH#7)dqWaD<<|%#+ z)55uBMVH^HvJTDUhP}+@mv1&26kXWa-X7vQUmVmXEc+e|>tPTV8eyWLX3HRmL6M5U z^2bPQ_ECMGpl(0X-PB|(}Q;)=)Zt~=Tly7XFqXd%bw00tB3u85ZZ|2+=U+$y;;lyPy$2PCX390Z(-IT znTX9^p0t|_!y&FWus+aRUbzCl@Jn`-(GFQawMuO=xb2B=U4xZwsB%X*+a#K$o;hZd zX*0+e$@{r>F-LG=halpPG(VYRJiGBoe5OR!3H$s?lZ@xMybd8Imz)v=Ll88IpW1){JEF_ARCJsN+jAS!!Y(6h4;{?DVO+ zS&Ew`31s&DTcErtOp!h5k2L+8G1-;*ISe2rD3~BZ-;539ZUE}b*dDfeYYDCU*lYwI z#BOk>`FTbQ0TD4;6@ylduwn3_{iXJdeuBC(*qO`PBX6-A9PGUMcVbQ1>Y}Iq>07Ht z?=Lq8zqOV?;vmUMjN3soWPrRPIrE{ER0PY0(jDC6GD)s>>v))`}M)3Yj?V?m-dgq77`RkA+ z0p6KumQ9BAem%iDpI$e+fDL;DDamakupYKMw^H z2Rlm>v`&-Tl8EYlAV&-EGdkeo3Q3<7%KIJfjDz|?y9u5Z3YX$$&6DhF%I!War)C~sf*NJ` z3dmY=c+u_bwok4Bv7%Dy*5XJ>m? z?t{CS6;9(PK9l-X{V^Oa+9RYEuw53E#*tJcCu*ML$c6E%wn*c6)O*(m@gf4Er=`hZ z_~9%6(`BkKV6$G&8iua>9*z%I+$|n`C4G;Fx~g^Cm|}FYk!82D+6`>YCZi&}s1gD- zexJ8U$6uqIDKF!8WX5_mEDPIr8s0HQ9#(`ToMqxoZ(rX07lzJ~FKM8^-{pBF-19@= zp9uuasa(hr(6o;B^{g*@k!Rsozp1H}*0(JX$^pFh7Wg7(G>W3j+M7rCTW09bRW?JRU4f&BPGPf z>0m`l9IdWdH?m5t^s{cd_9!twgg>y;dnzC3uecLB!S$NwI~x0Xab)!z8Ws%^mXbwb$(;QBsa7DvSVMw_-KN8we{j^1^F_9y|I-3E zn5D5vLQ{E$cX$4U^#u2_Or3uJ6g#HrS(JINCZJkw>#9AE<{hdTe%7yg`3=XZ0W_aS zPv`;baBv`1a3P(1IoJMxU$U6gD?dEqXZ>&s8}`laHCT1so|hWMRgeyrLE8W)SkzoB zHvKta{tS7i#aPnqFLx_M3JDzg`iauI$iodsHBPMDpR28TC@K-+e#!;QP$hQ{BCRz#z$eYhisBP)Y4p;?AlK znMq0YEa){aE@%HUun(ptV4H9upA;FZ#7}Rq@*Z>b&Tx6Y;y34XA5V(M@^3Chy}DAG z!xN{+Rnw)I47Bq?;4w9gVE7)VJ-a&ZwX{-QEt;8iaucLve3NDv>$qvJrpPV(A!j)5 zaO3D%ZES%iQd&n1*qdtZukVs&N{qnKDjjc+Eo==1E6lt z;Eo#QnCswTjcA9$qg4{@=`O=Sc&# zT-dtOY+d-I`7;28^L6JnP)PW@PN_9Bn_c$)aTM;L@3mtJ@;>%($X0MP5z@QdlLbKZ zc>(Gp-*5J1$Eq|YI~Fj9r*^=MFcW*b0$;2)JP`VrUOI98gAconH+#I7_a(*g^W4rlIpIg(BqwG=F51x!A<{PZsc&CDyz?o6lF^+D1Cyax*&ObYYeI%Jv z7;r;2{C(u{ZSWw9UZ_IMrDE|p`^Y5abd#{8Ki1O<(7aEdHMTyvQs*5q;L|O92*Bn#QnJ44uRMuQWTQpLd)e{eEP9ND;q&&Ek zK)L%Ypi$R9?%8WPSQt{T^i)Zx=}=v5n`2@FD zrMJ%BO}OJnOifVzUy4-wTV~9HTyt=fD!|cAxAXkz(%O9|PDO(_mzC!QgD(LN{>{7K z3pY326F)ALb#7Q|zLELz-oMGILA*pgQGUr5+%jIX(%dCCy)cla;MJ_!rGGlwVjytW z@638dzjtFaUeZ~%u8b&8nd!!%S~}(Zdqb{3JRCZLgM2zvp}W&txzjQj3$z4wy!_1($gIPmgTa$)z9&II(-~!qIqkiuXY$*y+>FI9 zk>!9(@rr}bwRBRIY@1M}KCxNM@Z|>C8ZuPc7ZZy~ADbml4$KbHPdxT(*n4nEa@MQw zN;w|0nscoqKF&;2|2^d+b+@Nc$a}{9da+XT;zB*p5h3q3Yb2E9{v*Lq@{CPtm2E-a z5vK2(X(8sJ>Abz0N*ht}@rTtVIIFtW93q=!*R;Yo=x#U zxGC1-kfFn~!q>&IQ~n{(pwnZnQKh5e7|(h zBCR&TJlq`zT-mSu^Wc&fmzLwoZ6>A2od0UJLK51RccpfF*$Mw-_(c0($_d(I+nLi~dWG(dlZ; zqL2#4+R|pTa|gdYC-`ttObL<_dnH5aQ?RdD%ISQIg-QdIqvI6^$}479PG6d#tRr!A zUgHPZg=61i{dL74{Od={D=!YL+ty#0MiILmBm*D^R$E``* z)YLhwb?jfQr8>J8jy_to-3Qg;Zxr%%e}*)ZXx1mj{pDEPV&S1LVCUdw`NLP^`~LN1 zt?w_bAx1Y-)BKYp7f1-}w2BaK_n#Jo-L34^i3%zP*|-U*WqzUcN4Jq`bQ%_$bT%<` z>3BBzaO@?I4UB3SDIYJYv&vZ@9Nn=#Y{zu}2dB4k+2d^s8a!61NxVGB41ZYD6U-pi z6EmCW>Wa*o?%tXol;4{H@|5CNVTtvn79-KlQ;sR8gR9*q%|}ySFp43ULXQ~vhHGo= ztYM#fymyF~a>>J%UsKB*EskxWi;Cq8k2!Xp_R@V;WjD*${^P{B=+|SA_+{c}Q~;d$ zO9F}E{+6nfEIz5?d!P`|ezWf$=a;Qf!1vGNK1+A7M4k6krNZFRaG}TrF~GHJO2b*%Apx(0o-!r*>_6s4?|j6x^;njCK3|dOD0{ zR*K%M(b6TjZt@Rj9=iH<5f@!J(D~*7h;6mfGTin0-=P#UXS0K*UYf)|@Y`MHjPb%9@eQ@LyZUsl4V&AlFdHm~ ztqZkma@zWw-8>8f{Eq;w@Dn~?ZI~wNF%28lE|-e|{0f~v1!XP}cBI{rE+>C@DbNK0UWzC4DIOuP zW%G^E(#kGBxGNV|lsf^*Hyf+aeLrYofW(ex`cKjS~QemUcQ`!!qs1N<^3 z8D3}UQKdn>eMZM!Qp(}aDEL0+Z+Y$H>|?GfB}S-Il$E@ap{dmta;!RG5U84gA%g>w zH^#AiS9KMab&9p;zK6id<#nG;i-L@%D zf71d`QT;fnAF>>9`a&UvN6azxF(y!8tDFzicrOxAvwO4S7PWpK!M?LkTsbS$Lto{6 zh6plOu9kEGa;Mj-J(uK0s|U9U+|QVCvq~i(>BJ5r54vO4ygcE1-c9s9ae>=G7{ozCFe3SwJH&!# zf~=Ag2TYZXL15d~9juV&&EgQj$RV5t7$wVU_mD4-Akg|?E&`=QL^l1fdfa9*WI5fh5~49kp!ClsDN%7boCT+ zz`f+l!1Y$CkJXj>RI5b78Jg>y)YOu$weQ50EPqs{tbC)3;*g1`VOXWzj~!rtAO^S|9(i zK5m^oS39rZ&4q|f_w83x{iW`}>V$l{#)kw&Z6duJ0Vq!g9lsk5S1qaNA}AjR_hb^4C^j}U@zDC8SeC!l|y$81W7_5+m64eUS7x? zPLeygpppo1008*9&aGy1 zjliS1lC&7AXWsi~g7mVj8k@KzJG}ZnCNUNxxl2`_Pr!Ljx#7Vpp8`Es*&&#rp2**@ni{7VBqTLMZa| z+prlVN$!u&^$DS$XqZJo3P)&$h=%vtAAl|I)6FK`kZzk|B&*THJy^EmQgNOS#JlW( zq>||VeC!Zq!IQazx+jOrOEPI9>p9O)%_&HFHS6&n{-7o@W4hP&f-7632ZdYz3thP| z_o?mc&Ytj|&hw&I1MO}#-m*(dbU$dU3JAfby&5 z&SVDD-5_pzgP+G;>-W#a65W5iB_S2|V~Z4K9x@dqe6^d-ACM}=g}u~B`L;3Gzt~5E ztJn4S@k4l_E7sOU>8m!ji=L_rit*cO0&Dw<_t4d_#VS7xLZTt{Q5FpXLBj;S^E2y} zi)0A9_79trFhs9*38Ji^lqr(upU}qX%*`tWDJvtlN3xNO%pddmO3mx-;$qPOXG4sq zLqY-zG)y~f$Fo2$z{USk1{J!(;bh`j#q2TpZ07uccgvU5sWjKX=cf_y0Mw8_TlyQO zTKW=nr1uC(M?1Q_E*SJzw^L?%&ha<|4_Qo_*w}LY#)AQK(QP#tDDez0B|TSuIpl`) z;>t1)nSPO_r23pOv6orZ_e#SiVfe!l3UCBp*xAulMg?)to=%5LtDfz6{A?@_xlv7S zCL@o5V0lkW^n<#ar(gFbi2eRs^H2)QU!mse>LxQ@aI+TbV=2s?OrFdco(?Dbmw<6` zjasnlP9=^Eenn3l9D_S~VRO`r949Vj&0*2^oP~MY6(KnG_Y)WTXpL6xOmcD7cL=Fx z)2EdU##YWKGL_-)-wDjn&XRUxY$@f2v=ossI*;w?p~HVNzKxI3x9|)$*Qyl3Z$yYQ z&hknZ-$>yZXbRuUxb|WCu^GSZgz`2{V}b`>Ld;$|h_G{NT1RDeH*xrKxt6~h1t%z2 z_6Ff%8W-+$bz*gmg8c$J{Yy4q$#WfuUD%|x=vYOcJ(zc!a+^QDBeMu{J$h5;Tu?q{ zsl9D%GoL5ZQ)L-drmgQ9^7z@O_T<`8gt=SUtuyQ>+Gmh-bXy!B8GK% zoFANTXOWbx^NSvR?gjDsrA_$PGVk|v*;+|G!F}zn_tgR5XyXUxJ=Bb&2bHW>q3*=M zk;0X7)=9qFCv|rxu>^K*YP>Ms$PppC@0R%2WgmAc_)Qt7zxgh-9oAT+VYKk=@r~4% zjhZ?6*N&s)>a09=4iDMJagV|%(DTT2s(#>nf5QZs*u1GH78Y5yl{V8Bz!6R<6Evquf8F2+mB~++hDrb1f+Nx8`F0%pLCNWU?UJ51D|vL_z7-wc%Sk))u`01 zzlQVO!}zZU`&R^=vxW;4=D45*p-Dppor(ynkkm${(9SH*bFWmr7)F=dDai?a9n%%e zOgO>&Or~y)$HGb%Wq0F~o!{I}6J(M5G2a7{7`;3pr~Bxi%1(dN3gd>c;yUTE1!zN; zO_xv0BPes}jZ!Z*TPs9l00oYul&2#~xW&WSy3_H-7t`?~+TQ9o`5mP8pdx)$N^?7M z8CP*hg2V;l@^qO0d(~>#F!Fu1=bPf_wU1O|=_M~XzK$N6zH&|3QnV}$Xld0FcCv~O zKM@MwVm#mBJ=vT+Dw{p(h&^144V2_Bf45FKGs*t*-ph3D@>EH%IYO=w-Yc6VvPO6^ zDc{iE=2qB}@&f)|r`E3e-iYRl>M~#DA*^PpErebCTn=T9|W%?u}V z_Isou=e^A5MOl*Hw$Cqv`IIbi0brkrVfH=O-iEHS&FsRwzO$w%o4VP_`qd^$U#>ph z7=OP)n{trzTG>syi_5wHT(z@7t6ptZk2Mh~SoC}vilHy>c4i5V1}SA!?f|N@v}^V< zUh#!7m^Bm*T$@qh;%^r^@!| zw}?b)s-dw~b|SB}-yNs#7ADPzxIk+%%P-^E9+iKjZ2jb&L+tiF25JJjyQ)9BpMlg$ z>r&aGn{Qcbqi)xzsvn+(hJb-%%4NybqJrwdXsLC!=u_=^Ib?DjS5`^2RF5K}NjRue zIp0VG@6eo)|eN)G=Q2igcTIg2)KL(%2clkjXa}FwLRfnr0PXB!JnxBkR;D+ zQ=By=wZ$OseCdKOE_05dpugPFy!q5@B4Zl1?|}((U}qm>*lO}FN`{Ufhb`sxZo8ex zu~>Zl6^Ef369}pE>GR7Vifq935tjYE1)s5wqbY+h+8Jo4z-P9Vx?cBZn80|Mr*6$s zZGizCTsNh7J2z4sE?yn0ttHtuY+FeHH#vAfs}HQ2 zGb8|?4_ z9}jc=6aRWoqAyB(J=Fmrb z)T|Y=w&4OUbd#pA_Ph~?lBR-15nIno?86Z(lDl{SH0M9Z$B#(8BVinyk^&S{F$WB; zMS>cao(*E_u;bjn7n072)Yl}0)@?DnqpwnPoXhm#Blg=Bf_;A*Y~JN zthuRgByBjwnHW3^d_`HGsAY#?FJZkcRF$D;m9DF7ZtR_2aS_sudGp3jcm?=ukb{`V zV&0K+kYIR#@>|Lg9Mwm#v?~iEdW>1_hN+30`>rNbjKoJ-a{m_Y{JHe({>Q)eT7M>NJb8U>4&LHlce zkf)Ke=aIzI@UU}o3qIhi=zJN74|*7OLXX#;g=rRDO0Z8X_o2yXDD(BF-bj1gE^rN| zN>VmyPCe9aN!8mRsiGY$#UqbI{WKT03@Io$h>Bi z6WBni%Jjn;Rv28%|A5I|g{uYt>D$2%22YT9rn7UviYjDr7hcenpyY#JBSH7*Nve2s zZdosi6y{qb;1&YdW1q+SJBbu1;V`gLIBIfeaOmgX=C!KkqrQ*!o_X66z^v z#f5O%g7=4PyD7q+R@jlG=@u$xC#nbS+(!SCtlzF>35m<4|p8m`Z{H-gL(Y6vsd zP_&?Xz~%QP0Ta0{LV2g6Pnq8+N;0XRH(kXq1Aa4ZA}%&BYLxuZoo7Lh2xsx63iTA< zNS8?&yLKrg4aB>HfWSgWE1htzVyH!p?1EN{3gk5C-a?zOfzYjF2q86tz-2hh^S+&*&{9D*)UQwE<8gS zSI#fl*gLfEVbuSSEIf+ybqTy@bgTX=EJ1o+E2=-WhDyHs&m4bdu*TaE^J2?TpV==M zOx9RWR7`062te&_27OfP5%V}^_Hd(+eKK~pE%X!e9&z}EuUjp%&lT?AH9w-Y7W6Lv z#__j}VB&YuEiLjzbTUs79$6}n-86Xi{hLY+f%*e`U}J6`xgOoeEE)pD?J zc)xUuAjWa@Q`954sB|GnD?6u?B=<2TI*D(h>2L4u-#`T;F4;4@;$0rAD+FS6B`F0H z{4)z=P*~MsIg@P6Wj@IJa9pNKk>7tmDIDf_^56x}0Y?7S*x}z>XYu}ClY6W95Yc=3 z9yc`0`1AnwfaE~qWs0(9S9oKotCQ0=(ywf54Xw3I1D@_Kc-P_-4*&GjWl+Fv68QB#z4%r!XMtVAXE zo6j88hT_zV7<%}Z3)aRJA4tC9G2+=xJ|XViYbkM+a0<2>V`pj%irSkuH9mgx5HEFR zFm@cWQT;U(n-v3tYB0jawZc46DW%`6L}7_CllUinUJ*dSsozk7yV?B*IX+y^k&RXr zUZLPmMLh~TB`rr{R6!Rr1>dyhdr+l)O?{g_>ayG7@RQbg&d72WY>f$weuj6sVa8v-6$dU5nz`FC64wbB&7sC{|e zs(0HicOgxkcRK`r^0Ax#pBCWkZXLGsILaV0q3VWE)C1Gy#RJRfLUYo@PuNIV&dYea z;QD7G1)3xgH*{98T__ySv8-vQ6Z8-obL&O7P4nXpP+Z^b1SP%{Q*II0$jJvye~KP? zOpq@2)S>hK=u=aQ&f4Pkv>k?d--)|Rw7j2r7 z{-&>I>M8~cPYKVi73Q5F{hcRe7L+3K#nE6o(v0CNL2Nmif+RFgj>T)?+OQ^u<{of4*Fp z|Em?ne0o0KAl|qDGp%m(4Ow3N&zQP;RHyz!!yi1M-u(woKgr6p)BA#bN`2SxzW@sF z9xh%=MRUxGt~78^rtrkla7*6r*q6?~KevBSq-x4HvLi%I2-8*Tr}wAZKyf5KT#u^f z>8BG7i`OPAw2MN^h;@x4y+vyxEhH<^5do{c1&1J2Uv%`3<(_!a z`kCuScJThp&iBO(gHcyz!m=L!+SlyHVmoP=@2x(gfOnrT)I$Le>Jl`p-kdi^O8J=X zcMCeF6o96eSOZ@F;9euTGQ8%Vuy}S>0AH0Ef)%6)O>k}O$5nI^T?6u1BhFM21daWu zi>c~>qY!=eZ@Y)t)uVWOh{}8+4jdZha2lpDDCdU%#Mm*kdP!TXNzT|}#VCymPp+uo z@AL(G0Ac0g0cGbb9y3jG3W*hqK-3~|K{kh?Lp8H-Tzo$HWyVVD%0m;#Zt%H7Xz~ZL zV+DgpBZj6_Hh3`LM3+l8Yk*h2!Yo|)I z(0i;!1EpkNld*M-8~{o)JE;IbwY^twaD zeAipMesX_F8t6V%-3l88>=UwHK6?yRx?lyPym1(n2jmoAwJT-F0F|$cD6ScIAu~ev zrhRCe|0T5m<1X?U8B###%e9G5>yC4Z(dt90ik|%_tSyjV#k9o;D6DMClH<65jZv1} z8)OgmP) zx)98i?-MAJ-Igj}wBVD<`DR!S&dLE48iV-q%yR7BXhiKV%YlvH(E=#;mS5;qzzU4l z-L2#LUKj_$STqvovRKlSQw&n@Zp>E|0u;n%#6IeJ_mJUX^MH=whkR*>ko)*I9;YlX2El<9XyQN@OzPy>uTRXJ^ zKk4kC8`C)c70vd>d7F*P`3;=k`&sr&O^`Oxr}v(Hzaug-o=zw*{jgY$+(A)6PjAKdv5fpmvXThI)_-i{~N|0Qz(sXr<6Vc_t!@OzL5 zAp#d5$jjTf%MkqAn-YSz5)GfeI03C|epEQ;pros@R=`w@3>-)7 zR%JjKcyhbV?$f)Y@2+-=;l=AF^cSzJ**t4nlc}2FM$47-a;y5IE*pI8Lr>J@7fnB0 zJ$dMsj!@)XT|VjYk>n$5;mnb}9ZEahNAdO9XLH6B^N^!<6dzmhglfLJawas?<9qq? zJOc5ciii6u=?6LhgI}aljG1|=2mL8m%}osC$2yhu?Yw6@?m3R|M+Ayq`{*H+O4`J`TNwFFYFV>c9!>354(^jjysh817%8)n6O`4wjiB8a{S4l0Z#!oxyQr8f=q65kq)ve z>EoE@e0hQU%m>lFLg06#NC#y^NEO0w?=ren8GcoMxeE)~^KO}=|BQ#bsM#I{V6g%7 ztt99~w6$T?Ip!!u0rD;+uKx#>WN&Z55T%LiLM9JO6jgEC>0pRNHdXQPO3^R{h#7(# zu8UlvVSO@xM^j6ENc}=Hche39Wfd5tA~k7&_#r5^G7=*p4?KJ9Em`Os{VX?$16bZ` zl*yc|+MnX=Rp@nf0OAj<0fq!2kJ`U{*e0rLbujY_Ry9LlngMh-v=DdvsqI7Mx2k1^G1MeY1b-KmWK=U1~P>Oj1$v3 z7TZ48ga^aAISFrv;|{u%`&eCfJ`-+aB$ekl;r$j{=^+=%24oZPQ28!Y5A{9%4RUO6 z6VwpN3_9|%6Q4p$Ni!VF@O-K2?pd>X%;Ie_UvR|j3z9On49z`Awa>OU6Q{o{%;y_v zCah{;VN?CGuo$N$x?8pV9Nu^#82)flQQxNHCUmy5D@WjxEZet2an*}|kxRCvLu47x zJp~LnHyqrUs_ysIrQu0*hC9A|$9?T6zG@7r>pYaa#IKoXxH{vo?*EfP6hP?XMF|G^kY{%;R?^mYI^EYHtGlzecVmp; z%@*57vXh>K{6=4>45=RwopP8#FF5eX7sYLvWA?lENHq*AOWx3dJo&gP6H{r>vhqC6 z#5T03@1I3ZU>&mAThbLVwpBX4V>Q8iQ|nvjjrk?(4+_s|ulWw#`88E~pTH3ecH?nJ zI%!?g>=yPh+Dp59qgA|Ln%|BG+IFJnhwPVmS2}~`I7@xhytAg;>5q5b_CGNXH7(*r z&7eJ~210nn0wPzS7W~gG`0f3@3j2I%!mH#c&{jbu*`QA$0vI6Km$rEcPT{UwZmvN2 z0xY}F%(WDb0gRa#gO%xxPg6t-2?zem#!w7kZ$zo3d%sSMy=9)b*5+SA-nm0P3S{W>QmLeB2AGay%QmPQ+{o8p1fR$1w+j|5zBFp+0J7aRfw}eJeyOsC+Ca-1u}-vzCigZfFPPi_>t;e)cOs_ORy-BRh|?dw z^_h?MNF{S{H5fEe;y9x8^A+lK(d<6V*IhZ8XV|J9dbU6hs!+_0N=v^I#$me&T23G< zmk1)KZn&A`ku=Mv5TCgq6bCrOZDfQNmj+Nbz2p8gw}|k45i~f7Qbl`Sy5YX8R2c_P z7-)sYS<6I}+6L7v3_FOX#}MgJUlw|O;xx_9z6l-aPNyN$Ntik?U##Y;-<s%epl!xZ#F0@VdZ2AKpCo^U&+lc|Sr5A$3i@i+k;Asga*`5!R6z-GcYPFmKw} zyou)8xq;^(2`^nH)=gVYjms}y%0>2t6(S@V*@ECnw^0K_Lk9K!`|W;P`-H>3z*E5_SUss>kgFAKIaHT zst)4qOuTxue&U#Wrqgn@*Ng@Z#H1`X6z~QUht(UKN)s1%-0vz?;Jst|bSOOhgBAos z$FKhg^l&9}_VJ@RLYvRSLF>y~X3Or%EAey3PFBU9CPAZJ)LYGwat#l^C8W=dTffZN z82Gy3sf-kjTY|_EmU?NP7#5vxR%9FLk7CR-N{b@sF9_$3>;&HptC9xzsRx`}ODNP- z%Jx_46*GAtk=zOR*>^nt!~ta60r`6BiFvi`_Y!p%UnP1)zr_LeRri<{rYI!hbnsG= z(n%IobE1|lx`o39jWdb6AkgzZjY3(6LcW4QUr0pGh}cH&ru#9(ReFQ@!r9N zZ)=2gI;8p}YyE9g@%d_-FQ`!Zsc6?7QZ7Mgm@yuO-rfC@ieOX`?laJE2WP2=>{+#e z@$MA<{n0WIr3EE55JXaXHPg&!e{+*qAzb+4{QFBw)9sB`O;Syo-wX<4FpF2gL!=jY zwq5&QaX*60ldQ?utwpv0`~P=pjEW>mZ4j@Kzn=ah)kJ3Bw?2>256?xb%r7paDtCik z?PZ6E4;jduwxK5XkE%7!&5L%}&Qi7_`{0`r6pNTi4~x)qcWz=F{7K_nK;rGplRFLd z4Ae+6_j2h3@leL~3Xw(CHDv5~P|iOk1LKbFCdxrMlW+}WS?#`ZC&#ONgHg47Q>(H! zt_de0V9V0NT$Y7f?wd;kvhh3E${keTIx6siK?mnzB*-6AWm_C={fX|K)g;edNVO$3 zr4RS|om$Q3+o$#SeJ`k1M$ptRY#|kk8!Hzq>|(k=TA+a|cFZ@HVk{T~Gm{!Gbu-56 zrg6ItntRLd-wAcjt~e44xT^e09$mPnvyw6Dee3b1e=`Kr#5+HW#&TZ%*YUig8FYf$ zSsTf_E7h?uWL3C4%;o56;RS|I3r3B9bg| zBY-Sn7=8Lrd*PXMyhpUMnj(nzCt}T}Zd`AvZ?b3$e6!PX?J7w9ck(ezB<)jfa5ObC zjAqfjD5U8%@6JJO>0TDkafn~FyUvjUuI8)-Jan?TkhU>5F32d|pjkcC@2)(~gh_Xa zA^Z7ivO3Jw>vGm+JORy>>MAH<{q-jg6W#F!63F@m7^ZPY+6?cq7kRAIdkMB2gw+5G zG^CGG@3N+=4vTu#M^q(US=BS(Lu}stI?mS@GjN9>6KzmARu$;4YFpppZ*S$v{Y}G5 z`p6ydGOq2pbCy5l@K~vx$Eha{-nZsy9#+0Q4nYzXsOLLN%`gF6JoxbOURS3oaG7>f zJf2dO8={1p|Go&e9?Emx8+2;fPI2#Jp>*?&P_5|sON8Lc>@Z=NI2blB_h5Ck>}0}M zf2(|Fx9p%n5wT6$Q~7?mzAqhPGLs@Ubb(Jb1H4d!pZo(;X~;HmMbKJUc9?<>iqCo) zJ;?KZr9IG$F&O}UF*3wB91_Pw7Yn^hUhV1VsP1>W*!o2q1}hbQE~$9f)*)Tr+XiBh zo5amAMr(nc@aiS`X|aP9cJsEg$x!7{l$7eDCDsuP8SAWk(fhIDbE1LiP?&8 zweRVI^2**3962w^V3hXU2idoYW_=9{p7d@;hf600Q@^L|#^*U+0FI zcX!pj&tlo6t)rAhc&8@oo|M+;2xV}363fl8na*3_5AIh|12x+!tpw`dne;Ksnmpv~ zwRu6fH7zRFSlf458YA;QH*G^Ui?9`b%-CE|g85=!C;qZuJpC!l*~IYISq;I4`^hR+;hUe=7 z<~W4-^(ch+$G(l!|2FZ-i#Yk29kkCtjjp=Ima&nLfzQY5t576B*Yo}#xpP*uk_E?jYEjiIO*ne?L}*h)Wmp~->A1NUtep~ zmCT7`FEYh*yf9a>uP!5ZN~3{q|K6G1qUdqh-u_+K?prygGCMs1WRP^g^R0Vf@UvN1 zpW;XnEO8=rs8QlLcbF$M1nBe<{OSQd*fqoxM(Mj`Q*Ie-oaR_L=|Og38WG zO{{#UE1HC;=0bU!av#NO{+?pEvi1AAhGB?5PGE5N)}f8Z#_yB-AQ|4CZSc>3%#6~L ziW~k*dl`_89zTVj=^=Ctc;*1;pS^gy{3)K9eB{RV+1je@gxLbIUP9cXUapQQeS7a~ z-C*MFf6wAIv|cN>HvBn zvkf^6jO$B-rAAKBFL_jc4q<_7b%h%P&ZTX0l&`&Y1|Dkjb}#DSfN&n%Sj{aahTu78 zhG3sohAzV$o0F%E!E!^ z5wyVzPb~ygSL!M+6Y7!#LOw*(lRguqrgujS?xbg67Fv_^UTM&MMUYK5<^vM8ybi!_ zlQAyf#>*5Qj_+6S!TxA`T0ibe86u6YiXh6n`@R|a(b4E@g7Uei`eEbsxfa$B8CTc~ zbJh4zWx4Rd6B7DsjiumE*dhOSx3{theHDwB24);I;H^uB8WIWZHQ(VWJN!gu-^N^- zIIn|}IggGVLw{W3hH{qT35X!z8fWxL7$rHCt1Pa~&DN#T`!9>m`vs>z^_p2$Tu0Sm z7eoZbh4whRZMl|?zUG?SeNb8&NVJ9-=TJ5i*QCSowT*BCof^?Mbzn}O45bC!mSCKt(_J21-suT3uxFWP{wY~U5!x_pV%%6|_dUnY z9~L=Qgo{8!B9Y`2WVFNgHJ@1>BtIB~Jj3qGe?&_m7g8{*Y5PS4_C6|tTg{p?dN0W- zqigrL+WLrrEy$-0g^_0#L-G#%gG5pcjYh*Rw^KWj z7ucess{;9!d|{;@yj}$&MkjI?;E%)bG`5K-^d?=T`9${Pd(7y1wn`V^{tl}R&=yM- zlMg%|))qRVRTGuXYxS@PoMas-fz=5BWEOwtXL^pAI|duV4M~F7FsfpW@od^=tqWEL zZOhQY7ZKuY?*mpyuRKmI#cMoD~5l&D*+KY?p|Uh z50j%E!Xt*h?JfE(vin@PrGyxOgc0Pyma7I#?inepC99g>!>0derTjh$7g*Kf3W?@g z@|_THJA0+FZq$g+#kjF#3~SfB`VtenRFfF>v`Gb9FK_8KOlQ=yZE(EkD;=iQ_*9l2 zpE^$^=D#1Q!DpasG~z5Y_~h^|QfbT#_w#;M+HHlVGV#i!a$-AJv2Qhv1pT_?Ss3rq zb5X!@d)HmBX60lPVh|0Hjy^2Gl|e`G@lN2`vt`G`=o*v%4hn@Nxgr1jSr0 zoq5gstK7G%S^Gmn53tIO(I^z^P~wc(^m-~wYU?D+XKe^#>#BS>E@61eZ7>n);5krNxOO6V3{CjQecB;>2EkWHFhDY%OM zoykwd{FfK3zK~8@cI9ZBbF4t;`O#U~8Fb{A6!5fo?n-U#j6i6ntN!t9)56(N;BbQ> z__`)-^H=NF^Zck zC6BU%9MEmph#qlD%P&V2#4zg~QxrtWO}|k1C_6Az;6f~v=JZ+OpcpD#y`=o|NLY^0#L}n=77VUE!NM zZWD{Ux8u;SxFM8%J3|g_{%|HQ_}9?-zPfd``LQ9c_#{28Q9(Na%D)=6LGkQmlzR8c#)tM&7`C0F4@V%-xs-~T~VlGGgzlwaS(ahU64^h;xZp8>c~i; zF3pYiN5-aUbf;*v@Dd{%)A)IoFr;5rx3`^NF(k4ye52d`7b&i(Ml449qg_F5zJT)s zw(2-Ef-y6HS4u;16$A}G9q4(02G@S_1b@KixH}!jvS%R&OT|3ckEGb16?uuDe@P`) zV{4R2yC7GB{Ekn`BVIvg(C7r1bQ|Sc`Mi}B$7V+B#}_N##nl!Df2!1qpVV275%(HZ zLP9*^$PEaEs}v;${)f-OX|!$mH7PANNm_X#%rPEkP#<_|@n6vf-*_A_U)M;e z+r(3WH&&i;l6^;Kj(Y?5JQ6abTk$l@zZ#c_hH`!WJcR}dfs_)<0D8eA+RtWh8+J64 zC;zkP7Zh#+<%Ud{BJBR75D)9DvFHOOW=d3= z3c`P`GQOerwsVooh;o~kRzb%A7+S`Z)`aWVKSPvW@E8}e3^Bet&!Ai^Y$Ul%Z%aiW zgCpc%GHE|5DV+|?W~TC?U0NE}U@rbDdS#e}-Jx+AHN%|5kS~!(^&Fc^d0~MVfqaUV z*!_Z4jslGn96&xEbipbG!4Q1f((h#F0yxFWM^QrV_0DXZWm`pkDKWDNu7m(6I zuBXcUGE&K5ORLro*e`(?fu~f_-h-8iRsZpsBI8%aiPgGQe*4$}%YE8lr39Gr9)ok2 z4O}?NjBOjA9q-R&EqAFl%{Rni)tICZ?S22K@~Mlcosuz_5H-HY1`$Vncip;C@JcS- zAzoL!X@W_E_pfeY*`7^))zj1YuSIBe(jU$F7&|lDqt+YbbiIH%HC|g}ta#4?d}$zJ z8l-l%=sJIoo1Afix6ZNyo{vT@_~iX2D6C)ELiOC9cYYhNa!KFFcAWOpV_bZfb}C;#0exn5UIy#F=vqd2RhTOCZhW6*aCF~y_xEl9?u+a98orHN zMc;C$cLB5&9NWbG3!E`R$yB-Z{W~i6ed68DQt>rk%xs!Gxc$=GQeg$sD=fG86vYcI zUp79??e^hbsXC1GoKa*`ZU3)|yR+l{-?#|wB=y|Ahmta#5<#~XtnshGeSvir@o-z~ zJd`SCNOQGp=UL~TUr^96hBun|c%wYJ=)gCW5A})^?OUP1TA;rLe|nMQDjil zm)x|2Cjwi?;io>fs4+;~&}UD$5dLXZPoc}?+OrVhbq;)^NX9*e8(_|?6slV`;hM{x zM5>3>Q$8%oAMg-o^QTp7yS@OagOCJi)qW%GIDpC#)~`2?y<`Ah5%Xb7 zkDHa&duM@N48f!r!(}d1$=rzUnNwB2$kuz{{)_I){lAZgwUh@YAeYhO3_w$hchCZI zrKNs9#s1=@VQtEj-~~_ngN@yUcR;86fMU%B*=tNHDSFw>zCk`eTjS`Hyc1L_ z6~C&Zf`XIm->EouExKpiGMQxVwd|k z#oOcIGq<*>&AWXJV!M)T>y(XP%wxG)Mxf~i-a#GbJL%K0%lLarDq8xvHA6VO7~fdD zw}`fKSD>xRA_OTT%_AQ-!fYxlLTr>a2?b(_Ql1 z23aLTai{-w7Z(Fyut=0VVn@4aZ>ya$Z8>)|?JVV*G<%NUobiWDOx88N81dw2f8@p- zZOBbMPy69IgB+RWOO)V0_>FK?wHx=Hbi|+1(1iS46mc(R{GvuL1=4!_xC_-9PypR5 zG}}8dI_)SzzL@dcs30A0s$_xc>fUo_5dUbrHqmFmS2QN*7L7^;vLYIy$0}VE3OT!G zu{CQ7?wkd0DciLiU!7`}TYL7rEYNJ4OKuISM6&8@YO=KR?X{I zG&;03w)v74X%aExI^iXM;-`b7Fhf#P#e;5Tt{3f|e2OhK)F?QbHc(TFarA_OuOL>J zq<)=^(NtXLN830m>t2 zGSd%M3ocfA&JLlsP7LoCGOTcHf`i`|=mD*9jCMkRXDVJ7^GIUzq(>O4_oC?I2DH}8 zD$D)Qaw<2J#;OrSWvqr9@|gUZgsz~;Y%0Z0no{>S!l>0i{+85k(0ykU%#+2+8+6UE z=E9cwXYbyQHR@2u{4}vty8~Y)!%|5@LqoM4S3y*_%y_lUID}(-7WG-R$Vy8go{E9D zd+F5udLONqIw>{414{P4ophi4pxU^692fn|96IdX`eedG`I~1-$bx7cgi|I(P^Z#- z2hk?s_#OKp1pb?FzgvMy>wLQ`Lu@>fOy7-NAFh@NvYhHKzf|1D1i0NXLGP z#cP#~$~7=BmdR~hE@6aZJPqm$ObI!%S9t(`nmbyFzo!AdC%*^!5iuu=`ElV2J;^*? zd-r3MqJ0g$vNEdrV`G$TCgabhl0YZutJCVlHp3l!ye~!@3yC6XlQ6EQaG0OHDmm`l z@Hj7MKWTKP7S_e)@Ps!eC<_(dIMy+VEtcq0!m#gTAGuWLBNL)Hdp(^Q3tv}s3v(d8 zGI1MBK&GS$t>J$-;TQ0Q>!bD=4G-?dMLSO59u)qSDl7?l5VgML;dJMUg>^+&TDXQ? zJfL7j*DR1J0*E{m9Q;Ld3(2i2Z9g);c4D!+UYX0jZk-d!{_kV2lWORicQUpRgrxAx|Nx zuje%ClVehR(u94oMS>6I6xgcX5PTzFSA`Lm6iyh@FN<1>4t5`5a`xF z!lQzQeJ7dLq9X=!0{mW2$lN5-l`TBPI2?|jdntO8x+QChbq{s)H@Q76QDK#AB>}9w z1^YV;t1M>5$`Gj$_b}8a+EBz%OLAMeJYt;t;FZ!{a(KLKx3Vjh(1~*5{0qndLz4Gr z;$qzu?_~~rjuY|SeSA0jT7cuJwaQ0F$0Ro3F5CUz(iT6EKe^qMSKl>h@V!sbMc4mI zFJ6?{xXd?ZrKHC71e7I_%ROPSyHQ+8jK8>xtW0LZb{>l$84E;`8P!)dD|++FU+7#* zeKf%jpHOu?HuP=P&luFm8edM9J=Kx#&@oF58qVXk{&3=@Sc%8uNr!GYUL^0-`5xjN zHTuRBcjTCA$GNM}Wa=Uck}SxRa!TO&vz)h#GYyi>`S_)2CU$&uX4UJ>@>`LDq7Z*Vtgy>IW429hEs(HabKmK|X7TvS$ ziEV%u7PM6SH5{1md*#JmV12=yk?e>Ve9~%c4-^5)H9!h!! z98nJ?=>UdxyP-13Ip0sZ?$pJ1s5)hC=SrjlJvO$^1` zCHjdq%4)zBr8QtVSzUf(vf)Z&#TmH_yYv)(`7F}0iwpHO{_Vm$cBKFSn!A3T7RA`s z(m3O;H5+~P%E_wIGoVxsa+|oM?0k2JUwK$~l7|qnA6n0pmZiR&ty<#bUJtqBsnKZM z%x?~TSY5lKopxU}i)SfzL4>F1o$6G;@#P@w%#3-bJW;riWn4#?C?fmIdH(aG!9;kq zg`n@A=*Ur8obR%+i-Mi^PNV{HKE-qFt1sC(!2amE#o0ivbS3ei*?#(uHEbg8?Ux4k z$Y#Gu55s|hlf};>9fbq8*RoDMmTxt#{zL8eW8KV;?TDYC&)ihgF>F`)_;@Ez|EV8O zHJ#;cAkJb{2cuC7Z-6X}iQa~*7P1?`wK-t+nrlM%oU%sV`zq+koffC#~-?CPOD|v-!5Z zS63hZd=wwuuc1Jb$3FZf=t^jcZm>?h$nQVlTC_%w`R@Hpn55bB7YL1vAEZ})pHONp z!~F@;cXyh8s1vxDVaj^`hEFtf%(jWyBEcg7qj%2}z3hRy)lvl&T?3=) zKi7k0+^U2D^lCY_P?y|QSp6sJdT_z5LydYD=k5^>Y)!h}FB+@3Tynwo(HTu9EaBfuP7)$V(&k@9Aa%bNgenox^pSGn9h({cNf=sC;nfgG3zW=2(?gRn&jhjLn{Su5>jsU ztJj-Z!ZG_++l*$(>$W&ggDt-wA7r}+l~J| zc=S!si$N;f~&2gvZ1E9kB$m%~>!`w9a| z?OUTU6gXCDl%a%A09~_SqdB#tvnTc&a6i{TDTDH0=k{R4Feh_87!nWceGZX< z=kCjmnX&}0Zs3HBPEEHaDX6@1;Tx1w5O6)o=u;S>Yqn)E@~`T93Rnf;>=ks8alrP? z*xntl6Y?`UHJ|GlV~6ff0ps=9s91?NEWtjBf6DYorSHzmySgd(T=`SOE3|TUZtiXS zL0B4aO{1IU)WRl~&>tFbz!l;0VZvRHRmPZ>gD`G{ue)L*?vriInkX`ZGsJF>1~gm$ zkB@F_Q2CSkvRhFlw7!KgjUfHxm-+788G#lN7e7S)65|_4R=!&QL99H_tARMw@45DL zF{)A!?i`_66-8@lp-|i~>)w6QS>noBx$p2FdihqhV@>m1Uijhm+x8UC>LPdk6UX{7 zaS0O5=nA_8cXDB+^RL6mr@tW|q^%}8j}{X=K~pYkSC)R3?z6g53oQ7M`h3Bb2|j(j zwJU8?vSqNBq~B$qqU!CUb&rO?<)h-WjFt|4_DUwNmi)TKph~sj8gG_s`pwXXDY(~> zS^@eB97s^u?FP6MA#$ulMOC%p`1sgIfqN2nS{IZ%MK+poXx8w{^W;`HSu9zL^E4t% z;tY!;VOUGg8khZnA+oZ*8zv%E~uXCUglGi%zWQNGR^&Ugt_Z~CK>2o9f{H2X! zfp0Rg?t1VT<|#)m^!wCPs$N|>wSXY%=AVY?fDVNZP%^eEx+iE)@?IrPrWhrTZ%Rt` zr%qZ>_g|VYaZdw=ACAk;!~o?K%7KPZ7q@{cUQidyHlF+xLmx4;G%wT4y8Wg=GrRPK z(eeJGbRa8yI%oBf90gpRU2Y~A!Bd*dsGA>Q@WMc@JGJCMRZJlK;cf_p3um(ggU9hq zLqx8>6!WyXA6&TA8-B-dT_DGy)~{3bEdyo|zGQmWl~jX$@v2>#tz}qEgQrcJ1LJp7 zkdB1~!p2e>9jA6vE^q$b3LlPz_a)fDG(V}pS*b~jt;741sBEWSH@meSIszU65h5CS zJRhk3=H5-eAHAJ*bv5m5_(MJ#l%8*6KBd#m>|oM9l@eA*Cw3*#1eI2P;B>-cX0Lvi z>(l4T(|Hb@Kjwlj^qb2#}Xd%Ygsb5;}&4WJb#+nsr4to*bVnN;1PE;0W#v!t*l zzvE#!c>}F5_Ew&~7WPsG!bnNTmstOgmCLlGYZ5AGh;zdMq$mLQjjRXsU>gv^QxFT5fQ!(w7yZ zGiYbY_~kNi{;Jxj-jm@)SI(&4(DSd7%zfowh^jCpuji~y+ zR-7Cnh$h<@@wv`7uJnFyM(1Y{>eOz@2iJqq^GZ>f>8pu=Q|++e>gO_cjyl#vhy>LN z9}M}kvw#k8{nY@XvR9e@(RG(f0Y}|Mlc{gDg-rq6F1>S86b4+YqMA0&ewk%B3|!hu zktoJ1puF2#M+yE(Kw9Ht>T9sv8JgL68msSPAMpV!!E};3L&LkRG1=ymmv-lM;)*D= z+uZVI8kbie)#E*QGEm=zgB`lC1e4wD4-O7gS7?G;BH*7Qp4_)tmXDLUnI~a$Q`w`x zt@Zs;Oc*zQ-q5F&nRot4iar_*z0bGKXEC7n>TK$XT6fdFumVlSfajTUOtfw`?y^%k zGD`&_zWqX@Vd}G7DCx)75G_+nx1VX-GJcbd$sNlDOJlXYoD&o-{jDO`mt#fi9&f#OH?NCgDmfNY-)pUlxJN$&YY^U?{~hlkM$Y!+Iy7AxdT?^EUYL5S?g(!{5t3;W z%pzg+JKb+a+%e83g)8s;9D@FWCjK5Kd%oVkL{RV!mb$v}mpsp(vk=E^=?fTsZF!jR zkSRFfIwIWulJP~BggEZkiZ#)Uy4m3txz`6@{AzyHYOfd_+0vQ3PKjABNU_M<<(+}r z0F7?1!W*tOH*|k}4Ps?tZ4gn+FJHG(*xK$^KOfwJ(={(`n7(RVDlcD6r)!>>E8fhk zUB1iy`#v%ixKH7qOm%c>=N*%VD;V2+@rZ~psDO_N~>Ktq+k?N7jNn~qes`Ok)q2iE?YZYF|DeeRElYPQ0(c#7Vj1~t61}_j@hmE8 z_vLEYm4D^GDA?F6Ct7QB=9YG)V)@G3T%Mea62CU6hV1RL4k-fr&9z)>rz4Bq!HbX1 z-0Sy|o*bm@{93@4WB)TV;q`-}4F-wO>-zJ{Y*jBh%KDO$`eREQkg!$b~sHK(i(7T&NHglj&KM+7h) z@vpsrXwzM_zJ9DwxRHFP;I9L8Lxid1)OY>m#M3eA`u7$-&tPTh{>@Bz1t;WQI0m3RmLX|!%{a75B?J-aQMOf=!hVAe^? z`(E|(E3>5tq>x+V!RF17u>ohoKIuRR^`w7KkR_OQ;?E&Y5I|c{KSxh}2XrX;*Q-n% zMJSVJw=JwscyRbiT2*(du)2RWkMb)D4x2ZZ2kNy!H?Id*-Y1AvCzz3mUdnPi(Wj6bsC5BZRxuzMOB>WdRN|+zUO~0V5VD`x_HcFEu;$iWU7cO{kkn-}ns<^O@vXrXWF9Hp zr(V=~WoasK%qLc{6{?Vd>QWs9ReNCbHBYSh;My_~phPJYMH_P!tSXHD_U&tQ{DW>T za_`Su&fwK~^JYDu-o?>>@v=>7Dew5*svi<$6q#K(Yh%@X)aG`(+<;GiyYbP*78STFenohpV^FbJBmMDO&t?igQ+QrrB?;#ncHp5xzLGTE7$`KVm+n z#%P+(`^CxbI#2$1yIihYd-LkH^2YrQQ3uGl6Q4}(!j-`CpM~{NaM1TIq=BfdoajSu zjvH-A1Qva!6{%K2m@<@j5CrF9OBt$U3e~-(Ub-#_aH)=wbN=w?2hgbnr5agy>}1dc zdp(QAoLB`Z^^E$Pd|#@TQ}QuJe(}|&zQ&Pu^%u?TE*Zhach&MX)#bjUche&@nGM2J z3SQP@?n6m>z|jmNMZ!our)wmqo9-DYjk{t9KE1V|G!>*912B|>#e#S^n#Vy~@If-9D|a}xG%?&mH0 z04t>@{#iSZDE<(TdKrp~8Wg(PF=13WI!b*Vk|dpmk1T9_s8qpXXCl!h!{*i%w{qVb z>HlatPeGs>FMnD|WCusL`)~Lmd>%9n-6ck~W2IF!}b|5}0y5_bmvjDBS;ks#`{nrI(mDZD$B@o5*=(O>+C|G#GBUDgQBSfkgjy zuPdIV`{$U9s%Y9})bHPRFsFl6U-Kl7X@d!-D*8&1n?KwD18nu7hTSYB;T;z78aS)XGRzp0Q3oD_q@ z9PvKWfRNEym59r(0$kR+;p>cokB)u3 zM;+=}O>tjf2cJ7(wX+;e3*(IyXttYKpA%odkoAi}M5-HFGB)nCa*=z?8&3pu$`NFq zli$_}E<=4DdThxbFF|_T7LBdCe5-n_>z>v%^Q3fquFtuj+fZNcrNp*j^f7M3|2tWO z!+RhW`QfwMfE|rS$K95hooh>9y!aW@+lC664d*d-&+sQRGc#*SU02o&>@{li$|#oj z%g{k#*q`-0XLCQ~)aC`5eFUl3Gd4GpYCVr#z4+>!?yn6cUWDtDMtoILpfbhXb;Qyk z=mc@TvtMZmZv5wUd*k={rfUEJ^mjqIujbx)8ZOEov{vR@|FMMAk?%d{E1&w-5%(`B zqisXStvR{UTo5YxtDL(lrop>@d4=8ETUK+l1Xu6}CJiFjs_Bx+`L_hJvDP*Zd}OhqE#<{OpR?!f2)uc9DoQ0?&uY;Y zaOaLdwG-^GQ~;&8CNb2F(%e=EAO8n!m)Xu}D(HhQ_*0^?U?@Z)7C32hp>|72^PvNL zEcVM+M9)NL60>zg;3JiZ>hR1o9gNG;iL$|VdqxBt3whfN4L^}N39 z@IH)8qOr=zNyJyjqM+^?+a`&WTAD*V;N-!oEXNVjBY~e^s?rCRDQ2xo6qWhUgU&S9 zYzs1Jlg4Uu_P;v@7d^6yus<}RYu<6Z1Ei+8ZI;3s&zyIpGx{|J^ z=XpHt_uKvceE0~o(eaV;^m!IjHraQ%_vc+dJ6^h!5aiY4@ zDs2zW8>V}~Oe_Iny55_94BXM%E6sMH9xqP#a)xX8<(XdC>Ga>kMS-=)Q``Ut$v4!4 zp}~Ej#N^bmyTv?r`3Cug0IP{qT}KRbG_KO1(qi3!8)QI1%NEB*C=={Mcuj+27)VMY zS5$|neNfB-XAzT~PrXMQKMcB#^UCMSS14&@f6Is0Fa*8*M?MbcUZLJ#Uyxq-!Ag2F z+xFSq=BsOCQ0bb-z~*TQE{W(L>BdrY*_QqMXIC;I@Ty)c+W>ueIe%(XB&$N(K+y` zpD(ujyU{_@J7c)7n6L!N<%_X+UHsA&^77X8RSu-(B)X-J{w8eGb@c^*i*=?`vrllp zc(6WTo7ohe8QC^Vx{I)8k3(nJW2_fXsacb>Ias=6^2#?lbg_oL$G0VO$`9(sHWHe} z=IAc`{Td@Pg)d-b11Q74D}Q+DIR5y@0iWIWH%%zKi_EOICdhi&pYgvK1{pwYxZk_)5Kkd2!9L8_N?5 zFBc1|%e9Y|fLGA}9cDqi>t}9t@r>CW$(ScZB;BkCOb6cR$5X`=CaEA0UUM}^hz5jA zdqi*%fqb!bf&{AHW+SA4;KKkCArzu9>X4xV7`*e`Ac7qrT;L9Uzk?23FU?+^0P?PV z5*yrgcj59jaMG&*Yhn<7w_y*^z}BaM8yXPgMD*Cr>*fy*5B}1I)N6w1M}j|;vgsCh zAvUQ5iQKpXlG2-Dy|#T&B(%h?ILg3StDl!VcZ;Rb==4@!#tmd2Lje`7X*o60oqeBA zn)?0GQd|XJexGb)hfQ<1LO{V)_|-vZ9=GGO9JP#ZMlc()8}@x)@Lz3dhM2&asYe~j z7ggzHnaHE~goncGP~U|r7t>0mtShZENAW*5=0=^;j9X({Cg2xlw`=2-UDbsrVFC{i<@T41tGq3vSrWWO6%=lXjmXsSm1dRK(eUYth z&ide3UXDYYgXO`sjZ_@7t{2^k4*gXWm=n#WUd4X{pX0hS;o_z8lLWt^qF_5YzAJ+h z#@ZsQzbMJ-Z?xmR5_t+mi&ffd4I6T%IZo)E1_R_w(5KB2AH#|_Zf=xV?CF<+OIiHD zpBBh#r&4&}1>{sc7cvwebf@ed&Gh~I0w*M$-3bvRaf8q3;xm6Fx27-BH;ILgH_=tE z&p}w{T4+9B+B(&GISr&4Tu&7mjRPxN{tnX9VFKO z+|afKBWd)*quB( zKF%?9Qfwj#AtmfS^^Q8DIrHOXXYqMXiz>l!%Hkim7oAlx_8MCYt2_);D;W9c>R6K_ zfjq)aq<^q~w-%+tVt76SpB5G(0Y8kDPX%MQ7y>4>u*QI%{{ zyk+T$3~$sF8PIB6^g*W^Pv35?N6VyQ#mCU$Wqmm-;+rE2_Jb!M{t??@{8}*wbmq~r z-(dtX@U=`CXG_uarz*`LH^F}qsMjuh(gC5-aJcpo;#f{u#rb9e3Q6jo|buIR-jpC;; zn=E~cin=zqFdU7&$~>sCsunz+&1XU}@?bSEZ8iAu?d|Pavk+}o-8E28Od&-QIsb+| zm-5Q~ymIouD$K)W=ML!8hQ>M@Jj|F*fe-ioXHf>Qz&7}O0PDDyH*>`P*>d%i*E{;5L9NwH<7xjz@ zE%Uy&Ao?_^K!dlWU!8}aL)ogs-k;PG^%-6rR@lykGEw`XRUHorw>k9r$Bwst_Z4nG z&<-|7%o_BqG1i`GvkXUvb;eePU&@l}hl_q7TP7`}W}A?F)ZL~0kN0%@?IYWl9rvc2%yL8w z_qX=Ka=;IU$yQ;rx6!O;)I*wPt;W+}uCu|9K6a=l0!Z}$~ZkB#QOLmI}9 z3Cl{>QQNP}ZYN$s-4Me|eh1JdMr9Mfz(7Y1#h?$m@l^PYjl#>^-~*~z;OQsb(k?}- z0P?0JLSM=>CgJE}XfIipHI|okJN2*_njBobSY-ON0LOE|YFl?4|^8L*>WT3lws1YT1cJll2a=x4;l+64Qri^N7eZAjK-=&boMzpk#ZyJ5-d<;=jw)@r>EJq|Aqyiu`IiP{@8j?j1 zoQ)G?zU!}PGUz~9kW6tKJeLB>0{r1$pTA=WasU(or`Ppk%9vdm+3b`b#;+dQ32J3S zI>&%nLZar>%^z6%pnJToG7A)InRiW9fHUpc*q8wtz`NCDg9fY~5g7w}8qYxb(b9Gx znbLyye13TX@TEdwK!UwyYRXp5fnigbc(+@#?mWx~dbU>)i8@+Y)g_Lg#G%%f5l zKUl|)MN-@XR*7BCMl35|X|d%|@lveVEpiQhY4rLmHg38pRHT>P%#zsjz(P7TP@P-< z=vi`8C;ivqwPsxImEQ4VBlxYjrJmz|axACMn0}O$R7SshdcoGb0iPXZxlUK?V~sut z`*NahS%Rpg%Ijjb`X|_*Ai8s((s=^f{{-fUOwc)?&68Obz~Nw)938gj=Doy@G^d00 zEBAzM@BgBLX{aCEa^XG<(#4(o2(9oz9)e@Gd^HM zWaRmOg75au4m$W05!`&aWpxpaKRonmK1?NT?UVWz^w;N#l(M$(J&hp;LLhE(A2x(N z?DgMdJ>N^j!G=WRf#>zaOgk{KM!$vWwk8nqx{EG%;Vaxa$Oy|5Ckd%f1Dc2Bs&;K{n$jH*-2WXT$H+tUnGRQ68t!?L72 z{l1v4vUI4(=&iH7QST-rm-hR(?`+}n_Vqs!|7Q&IerE{CROBKu239x{WM7Z_;P}Rb zLiFw$iPG}OErHAM@D8&!J4K@DxIsb_*dH=JdNf3$-jCU0j6E{#M~Ix*UD){=Joh zDZd#znP76Mya?Yh_f%#wG|qgy&wc2Jf0p3ky&ro9!OlPWM|N#p0|py6GAqFfmjMbPe`r!fG~HUnIyRB2M!z+Y_UaD=?}|SAV(KQ zaPOy<<%j3Fo|j-lM@6ZHISXXA$=M+OFmP}^;bGGusrMNzRvY$c4*tYtOBLYL63Y_E z&Sl2C;I)Iiu0`M!gDah!|I7-v>k)9^*#tZLHX0}t51tIV!d>SAZqRIYcJ^$4zb5X6 zcQ%OnJGEGKixZy4K)>CbAYFbTH?U)X^_x8GL%m9MK$$f*_2_V*o*K&8@mkXDmsF@E zb#jOn(~OwiFMIugCii(CG!AL@qnVzpAN(kvH1_#Q&0}Bx?sjRzOMYepT(MFIYQE){ zYL_b^+ii9?!}6lJz%6-i?bz$P*GKP#yHm9*in{@Z#BTC6jUD!nK;!4YA*%7>rCyr- z_%R#BKZpj#3#_N?cOe(i+PPg=XyiP}kJ1AQ0bmy#2QK7(-~|)n2bKbwMs*i+BoE+h zydVV(&XJ!J0MQ&9vH{~57+Bf@W{7%gWb74>Bl_8Z#g6|GDEHB@Bo0{cXlX-!?^S{t z$yyJ9g%I)|hE@}JaZ;Jf#Ngu+`O~d@N`9#?Ww?GNiSP!d3m`-PLl&_@1?1?Ig@JpTNZ79 zM%W`)wP=a%_}UldnFKwK-c5y|_d?~$P0}raq_7?pw3gKxIbtn0P{$zwnq*(D-S`y~ zF!UI!ypzUDb?Rtp;HMiTmU1u`qx_lc^4ZGf>gwsmT+4qKuNx+4kKx+m+$k8Z2rPW% z_|?_lz^H64&rrKe1lz>?O*_c7JQKz~w#~v^SaS)gh{UgzZ>3GGuwJ;xy6FrXwb`7> zl>HKT1C^r`(J>&ncQ{D%`@M1JKp9@D`WhUFXB||V55xZi>GLqs!d(8D$BF0E2+?+H zl<5>8%tDwZzCA#)eU3xYs0f=snfN^Y$Wob+1DcyFu_vEuBT}ihTSWbyBiGuHxXM0E zV8YTVkMXZxF4!N(M_LqClL37h|8Lqs>#x1UafKjczS%QnDadFB5D(Jbz8OV!{A9zV zgCqj3J;++^_T05WlmKm>0^m3B$wyA(Du_&g|N3t*unYWh>r>`Pdd14cgejt9+gHA2 z{q56PBjCVmf^<;WQxkvQTQRP+t_=Xf9)3ByKFQ+Ip7K4^Ri&P78{i*)wC?~4^XxAY z>kp9ZAXb_X_V^+C9!o18P-)^0FjzMW_61;sh}0?_0PAS+8l+s}*V_fIj40MkApY>OG{f0TU9afeN=^p6k z46vZ=SArLdRs{-33%+=nMTuND!5mY+|Vj(t0?EW zKG-3%Zu<=VQclER0g*b1I9$=JLl9w9VucY$-r2mbkfcy9)m|yY5#Y$iawA@Ao}A*OIiUH69&Sb+A0ZAP6 zpRrh`$}#E(I6(kH@|kMlPuuIQ_B-Iy6>%CLfRjY?g7lr{p%i52>6B&_jibL(Z?y+U z01k1j1ytW@6F;})^=`$98zjEg%i=GH_5vb6{4)~YeU#WSQAJifM1Kx`$E zuX#Iuk=gZmFB1S>t?uA#c84+B)W4DD>gtctHV1S5;*v{HjYYO9()lQz^(>jY=$ zZae4c{sZDY&z#MMg6G4Cwq`uzG3 zUDk^K%>n0kN#1$`$DLhS#EK3i$z+!w#7KygA0L!`Gr`)O6xS4qTBe@7@lEIH%xy=E z<=jd60NLc!j(>@9ox z`QNnWu6Xw~mWj+>x%{*1!y=M|&Ki)R1~Z9#{9TqWJ#V#YypvGR8W+awLe?^zA&MYw8!=t*7?{u>@F ziQVdLLy~h5zNqZtP7qURC zX`pr3t^U(Vj5|P6a`;4cm`ZE|6YOb|7RYZF36Sb`Qbf`%C$_>w4qv-mb3pG3hE@fu z__gCvhm#lsD$`-EWibs8<6E``;d=NeX?ZC*#P7+Y<@P^$TKtrUpjgO?-zq>##S5Hd4$29re{%`tC*}{!$tOI`c{^ zwQQvxc>jAiW<7CZCoB~Ag7;j#&vW+xKbhS0O6W%XVN#&@Lf6^ISVJbb^HUR|lqVo8 z)JgCCI)g*8`mLkGrVS3{xa+t4wyCpsv(S<$&YhW55x)ZS-P}t6|IRU_dk1N(qKtl& zP}tbm7#+=Kp6KU{(a2nrjy-sHk+AnOG?2lOdH#Ju?B>Zf#WvgyGtyR@Es;B5D9f$@ z7XtoM%TB5*%q@(Im+y~Fd2@m}_ca(HMhY##=(Va!-Q6E0hVWW;;ePKu(by(tx;baf zG}U`kBjOFolc*z{S?~_9#uWha+pVis4(FEB%04*!cf<%8f^0R9I zV7PQxouXW9>M>EB9P1=Pm-c8AxcHO5H+I;R{u|2%43r<*+dfu$$5cK(oA|}i@4#yv zAoH8Dv`BA?>=UBEO?nz@*6mfiThBLB(MA7UxO zpgSe5&y^nYxc{`-h_yJN-e)v{=ci&I-O{q(T&Sa;4ESNQW4Umjrnra7o zOl49J`A*-zwGCWfhTAnhcFoj0(_8E1AaL(1Wr$q;S=K%nfEIQN2(%QI&;ft>^ue;f#I){&lX`4x-x*nvyDy+E0{2& zGI3nsB)kMFH6?i1vAKAq%}3K<*KOc&M6s`K&?^oKu0R*hFR?*!PR0?cVwz?u_2L4> z!M~{0i_7l7z9nGc)}zm6()Z+o#UFT9hC5L|yu|{x3fz8j17#R?T$iAPfAZpQxtOIq z_@le03;g}zcNAavgA)Jt)nSFRbd}@|ICYtuaV^K@9$-5Q{554xwIwV8j&ER_`==c^ zy{piMxmB;?cYwp$1|*0^uV!+rbj=|IIR$to000E_4^;4$F29h8`EON><4GlJoxP0d zZ^9d|$S;MnEz)N_Ny`Ro7F==GC2Qb4vEXEqAHo+vAXx{;FbAKUTwa9$9`}ZTW@ZtI z^{E&c$mfUMmNb!d8z;59iqNjYBuybz{3R?)w@yh?V8QL=g1}fy(id8!B_*jt0 z8hE1jQ&peY#N%iI9kVjxPj>y_&lPeyy)rl7Oc?AZ`8{V*MQaA!Fk62y>la6UezUO( z$MPhxQ`FZ3!5c{ABl%vQ_DnD4X;gs!M>l5xvu9is~D_^lVnW1`*EM%mckpyektcke1S{9C&Gq^g9-R~rJ z4bC-T)c)LLH(JTz#zl$atj0g))#2LQs?dnks^^zKEx5OkPp2^BCAb)W3Ms5wnRde~ zTo#ljBFeH9G8{T26W7lyq~dq%+1)U$7NDk>BPDoa>gg$WR_BwzKT=8Yogdcz8~ ze(93k1-`Xe!nppq=XGIolRVif-toZ)3Eu+Koi(7VO`;By3 zaSVLM0VNr>o?C{DN4u<}RZ%yNj$jo5H%{9_Uv1Ca^PFmBKw-JpD8I=*WYZ4^vuwz zu!!8!eWYY3J$PTNh{h$Te6sSz@=4Ka`7`jx{=o?Ql?P-wQ^js9ZM~9WeC+l}L&6)% zVE9oIc*AJq1Hf0J+r)8vM*Xl0f0~dE7eF6_iV#V_H_Fey`1-+JTs2Mbw8#)Ja zBQoEk6R^Oc6w-F3@Yf}F3kbA`ev=M00g{|6+`JIMAd{4#rh2m_&BiB0udWyAeE*SH zlYawN#51uZV5V?xAe_x&-fP_=0KBI@O~?j{n`qsq+NaigMiT^f-hX%w)`eywfwb}l zD%>g~-#a)Mvv+=;1vn%x6>mf18b7y3b7f8KD+fU0#cnyS8-Eh}8kARF{%BnFoi;tA zNt5v<>DFcsgP|xT4EtRyw=UMHx?)2~{L+`j<)ou#!%5BljD5d)`PSZ#xeBVO+og=c zGxlfR%LhMO#4VoO2vrCe61vog^N5l3IE?&iJ4@WYxR;(vYCAS^lCd3gs>U@-HtYPa z#%9mBovp5&-?C0kZ|W?&n>_GfFd5?rsV-dkE$kq26L8L7C&wk;ywbV;z*e+8q`@wj znw2W{tT_#bm#L?7Zi{Y0`BVT#7_)qWwuldwo z+$HF;U|8REoUdW#ea2O#eqM2)BrZS5*v0o}WmKlKltcL-%h{u$UUKQYn$-b`LHR8P zc4O7&@mIAAgY@}S_+FS1#_7Mo8NjIW|BKB1--+Gl4fbfpOSxXuuvf$`XC!dcu%qo~ z!7*|1la+%6*)3bkm=m#&@mN*2Y7F~ek>sz;z;MMG6h;Az;m?S3c-5tx>>M-HRi?k7 zZ5D@Uc{*P_iJQW|6^J(=jM2Z@dujbXcX07UViPA%Wl1ddwu#M)r#H;tZD+kIu?gJ) zMbi|tn$zGp*19`fyWN!Z7X2G6>b)|rKz^^_opoD8yNKy##@N;%v=sBS;}z2njY|G$ zNW~OkUUs~m=A%0c=3GVy$QumJ%m< zyA5oF=hVC)!o)Tuf(L{aY>zAlPM{2M8(Z_t3t=R)B<-)tQ$Pm{g$*BZRq&~))T4ug zi%)8x$Db&Tea-#^+OIvhG&jC805_wYxNsn$UnUlgR{ANpnn2n%ivPB9W9i|X$vCOe zGD_*&{$Lva)yFRC{b3~PYRV^sgrj}+K^k(@8x=fLs5Qf*P=r~b3v{z~-+Ey@)1x{z zipWnatJOMETl}fAu&1zNt}oyC$N9)^uJ+G2+OcHMl>$eN48kgZSbvqy z%o0aD?NAmju60^JD1u6;GlC&3Je+A?0Lz*fc9ciAF-)#f$$;E7@6ERbVdiN93Z?Rj zA%;$=q;+}}UDMrIZ2)r)khXHJx8WS9O>MfAA$*NwN~|e*D~wu8!@3T=NE5)plTV}B zs5mUGtY%U17=W2VIv!IU<8v;CTx%3BBClTo$ePpMFyhj~Vm!gK$^u^EF0@H)_r=K! zC0*{7GT5+*Jks7)H9kHwlqhnrNh_<-P=O7>j~UUN!|wPrT={P4`UcGTm>-xFG6~ZQ zY4rXWJUJV|z&+c>o^=hG>Nrd|r+Q~CmgHBxOU^PMk_Nl>a%Uee`QRUAwCC_Hi65L9L8q-M@fe4e zO>){h2V6Ol2A%Ok5^MVGaZg~6OAQCyx_1bRE(B~FLzB5@lB)yq+#H{i^B8N;0Od~t zdbZwdJM256d^SPbO#% zqv%;h0HScyQ?;qy(WKq*rZC&&7VK&@9e<-T^SQBgPh8hX3|#E4Hvi6@hXZT+7q?wu zgF;peHewNS(qvK)CvV0G@6OS)wn~HQVM@WGU;5u5XQ&=_$U{5G%CMk*J`rr)EE$*^ zVo6_}gHZ)=neJqXmD#Ku$*CraQn5I>cTWgR$7g2^`x6zkxRF0&q+^Jv<39{KaI;O} z$0I4ydUpcMF{Co+o}$Gp`YeiEuf{5wP^q&tSO9e@DwYezF-I)5lT;KSW|qur!ZYT; z!DprvtfZ(EAQnf)>BztuC{(c~?IWI;{a^4y$orAxFIN3*Y5So}p5!KK-et$;JKCkH zLI-+fWV&bH6iaKOQNgduUPSk?yHTuW)_$qloNkl0L-Jjbm$ilNMh@rIL|4NH;kHR! zeWa+hCLa*=JAi-`JVnTU#~ht+jQ^)m===NnI$U1{A7g424-2l|Aqc}wmBSBo1#mL& zv(YJE*^|Gs4(iU=b? z;4}BlLjEZ-nJHiq9`1)GJF8Ghr{b*_D+Y@v#Rp+o@Cr(Uy(z65Z$BD^R`7pSL5jh- zo=wNJuM(=~iaKrc!jkX3(HMpm{TRHngY9&@|Hi1>KhHdw_})%4@(TPb+@@htfHwKX zpZkrk&pyOCq4;hzM!IGPPXQjX^B1-Msvt6{BBRkSfPfqi4yvT(M>@5mPb_jL#y3U+n(%EnruuGv)2{#ey|j9+(b`le1NRUt zClG8G)A8}~VWYZ~7eD9RjB(^(d@L-$idOt4g`Ai5P?C3K5QOHddI>b$(K@Ye$BQfp#Bkdv-be!Puy@zxEM%fJuiK2NTxT@V4vONcLBb zq$v$6HFQ+alPtYd$6Iy!QIg%2k8oN`QD6!0*`vN#57n8u!v6#ME3up`V{86^*&XgaynvRTir{DV=2-p54 zl;LvZUylw$eb$d7yfs+)cqF?2Hv6@(B+KbhdpwX;4!$l_ke@?fPVtxziUjdsB)}AT z%U!eb8j3CLY-={>%NJ1F58>UnI-psoia2JRdw|W!bTC}fX1A$!ruH{irh=?WJ@-&v zf}`;$+Ln){#r_tbabaX`jrI=pymU9X8wcSpIgZE-D6?K`s$H$6PP)4(hA)CpT=qJ5 zsQ+}YXzf~W+A{aez8OkV`J>7pB3+#>flF_|n1LU1TNRoH1KWRcAADdCWpqejez)Qf zv~2XG9u?cY!$z1+AmXG9>ji$!B!jwtdyp`wc(NVi0U=o7e;^t>h0WWF6M%d*U!=># zqe_9HRR92uAu3*l^~L?o#&FUKnyNGV6>9&x@>0yt^3t~t#=T5Zww0CQ#38ti7XjJc z-xzw;6j8U5xCu$PKLzlFQi!l`;c``p>UmC$w3P78QTDI}@-NGOX~FXJSs>gwMN*- z-L+yC8S5!!+aBE$gO84GXX;S3Nz+M&aAxOeuebjaJ6{c;tA4ptwDLPD)%gb3c}y^) zR^pM6lG)I@)s~aA(XN(gl4N4zQJsE@$TtMwm(R8Q&NxZ5U-;g|`Xj2?Vdvv5Tz<2z z_<&G}k)O)ds7pE~$#rLBZ4U0}cw~2l|7gAI@i5I3amCy%!5bGO%D80B`r+EvYSs7S z;C^E_|F|8vtuDHuAG^kX_!pk5KqgRn*!WL;$Va83CAzxP{r;4`B6Pt0DekAR^?>ty z;Z}6w;i7|;s(;6K_X(fzzm?`fAI5~0cQ&lV5k8A1>_yPd`3CQxh&@0!lV`XF2c)5| zFUzmWk0P%|TACM*&JPYIN}W#2eC^n{oB1=$R8&e$JFu$IH-5c)Yue$tQ^mVJ*B>Yx z7q3>v*>&=n&V6ItS=&rXZL?uISj!m)LY8Ff)8Y@MlV_-AliItw1}ol*XB~H}uu0I1 z?X(1G6iQ^9(>dwO^!iXd)I(O6#nS58Q~e`G7oHhw+6ax${4ZRT#a{3ibYl&>?`$WG zB=&->WKt&2%)C{0jR+Z&h7}qK{M-^k`I+YiC_bzK)91cdET}B5OI3_&MD}Jm1{% z4u}=7>;~0n*PO^gTw9PSAT6NPkEi$OH`I|oCP{Q(VKWD&i0H7%0tqMrZZq)(iWa!7 zO^GY!|0UuqUNfw1^mBt&o>@EM0l3raQVvHUTMG!n4}8lu2drd?>L?720!*Dy!G}#eQRyc+tnbo~d2`!{;F*;c^TnN~Mdx=fZF@06nnVoo~p%sK(K)n;w7W zs8~DOk3hdyZ#nsS0DTry_3Vt+em@7nNz3q$_dK$8r6BqV`f13MOXh*~9Gnb>P z2`8qvf1TWiyP+JfHJMxD#!985@y>?d4LC|(Q-rCVYUB)PeviM~lQp4tzBhSB9={g2#vAy=*3mpM9Nhli z$|Y0XpM6Hls@>uI4PC8s!DlI-cv>Ug%p^h7GkI`dj#zv&-UL-ECYdBrFbLPJ3g(XI zyR5nkWaZ%r?8DO-8Ep$?0vJZ`TsaM%HN)}-T^dw(kMvavgUOlNhl})qA#%1<$!~ngLkQ}LXU#4IIjKAFI%pU%Mq7gMaA-lMXx{cR}d4% zrzpNP_f?;Z%*(r?P!uH_RO!VyC8%%h}4HZ;};Z8^s^rOWM2r{Ac8fHC1qyd8bgVxpB`_E z#R1hk5201Q>6im1la6pZhVmX&h7zYH*)g-kre)h_Ze|ER^7WY=iSEP&q#G%*YBGLlte)EAU-M#0 zMB3<=C2Kq`H4tdrZc^CU`3bc4EEk|#POPqB=U;M8z5rs-1dz@LP;SE63G?hPjUa9E zF)(UI~%()_Ss>qs90Fgz(h7tmg(x}Z16tSyFx@O-v9K`i#SDg?p9A9`5AIzeQ zRSj14Ekv>6q-UM#cI{d3`qSmSxyrJ2jO1$+{l z{wRz|2{a(VrSVCfF-9#JRA+LJKeSe_a*1&?B2cwm?ln!EZE#R|l6~H^_vf&`5mjQp zl7D3K7-0H#4OH4~`7T_ZcG?;bAtZ$~y+1qmz2*U-^yNb7rGOv?(47kS)UT}E)%ToD z00+W9Za(Aw5W$qOdcm^i5ZK_HyH|kGSrs^@TWr7;-5LOxBtW^P)l3eqUYjt{+`9aM zSOlPc`Zr98M|R*J`s?d7(zj?sUS#I;5lyf33#ar<16?TZRMCzy7CqM9ph>b;!+R{F zUf*%m0Ok=cVkJnFHni`dNnDYolW7izx}Ws(fYkZW%7APFptfKzILH;?HPi0%5#O@= zPKv!qa4}e_k}&{PFy(D&UInDm+5uk@e8rqr*W*L?~m-9-vy@{o{BH) zqB}ajNxTmo@_q~-g!LKHIooT`S|NK!-HBGm#1?&{>I}je+BGxPPes`~<9Dn7bV1Ff z0_D(mf~Jp5f*m@Ff2CqM`V5BlyaV>*cf<0J>hq-RQY)l|md+-u_Ww%k9rx5P!L?2p zSKAIawFUSc^Bmm}*Smhm!7MQwIUA-s&TG_mApt*k%DlU2;`=1)g<-0VDM*tJxi2!o z>u3A>WB5FtVF3om3p_bRgs2!b%YdAjujrRbP>$Wd!!I|c_ARJaymq;C9j73vMRTJk zvTHV4%ZzanzXew1@SYj?@7OS*S~&>A9W}FdZ5cS_>+2Hn(D9>l=ks{{=|*AT*-7C% zCfGR`n3x03OM@>mA=x;fNu>!)h!?$qgIhMnI}VGk@w)G3<*{t+*mB8bke7-4f*hMzc_Ad)78dSd9&w8}8_H30!S~XmA z(S1&D^)~Cy868eN_Yyl4w9L%jdHjZf*10-=15aOae4@)TlS!oPWZ#01QaiX2}>YF7i$|D=hg*L`Ha=hUZtgyevlVsijy-bvi$ z@{uC{4f$cSAF!uH4!|b)CwjLwkqI+<)YNj{?Zyr;xd)9`8e|s$v5x^)Aj}7p7}hU- zVD9448VC9&W_@x1aW2@jB{+u$G~53H#|&$G%2*O}^75>#t$(fslD0dxO{&uO44{#m zRG%&J6aY^U)b3+?P95YoHWD*K4-oWhz^t;IOIWRw1&DDh4J7DTm|F~8a1;d@k z)`6stzgC1TWxK++=8;R_ci7;`y{05p;0-Vn%iiEI=?alaxGS7}fG~&uHbBYS&j8Wt z#*MoxdG~}3B{B7Z$S)C(K!0afL|vOHgO8Wh%N%F&a~=-%9LrmMLqKk2_ehYNtfVWF z72w@W4V1)n>*T&{qRU_3bU;;I^{joP44rSBuUAPf*DKrq-k3Wh6##FscYZU&!_Hgk zVBc$x*62`|S%C`GXM2Sn{Gy@=bR;~EUwHi7v<1jWx2Oxx62%R7JsMVqy|YDX&XM`p zK?{SEo)E(12eOhl_9YKQ1O)#0samdyWQB$@jOrBV1DX5}@l^46Y(YH!YDxb*-0CDA z4TSZA$ARt%*HgPa;fgO-<)#0h1u%@Q!UnP1vN3iEY>Atq16bR9@L5ac-Fm9h?_H61 zauitAs5pk3{6%1Q(dHd$Ft*sz#hMmxMFtZ76G$#!#x#BWB0_hsDc|Ujp^m@7(8(;w zqLDe)D|hDyRc=l;bgUD;w4ncpMe61cN6JaxA%Y=sM$lEBKI4;cHZoj^w{jXaSNPtZ zlg2hS`5V*r9pSjjR-?EOKkT+F*^dyDp7LkE@(^+Skt9erH@CI$&# z)jcKJh2lP6%Z#M;kyxAP%%eR3ha-Q|G9KuO=yxF=VfhJL@YbY>5Z6j|6_f+ijM@i2 z8AEc^#{e|62Xx3l3e0FjU`Zf2xd{_DsOf2v$22csfMEWs5$XrHPQm0O@>X zRX=cy<+t+tM6!600%#kN6fp-m+4EsgzU>FW-GTKpCL+gW(iYap$!|S>ziu9eVOEmorB7Q zF?X-EIkwp;2PSXzS9zu49M1XbOXBnxh(GNxN8KH~sK58tjCytpzx94#X<8PV@1~WL zecJ4=ApMdd=YPmN^gp2)6L8UdfE{%4;)iiM?C>GW<;^{u4(-CSQx)r;;i%hNGTlU_8rX?APW$^*U|! zhTVPswD!YVZ_fk62&X`qXJ)hYBXl#HHs`>Hep4!FK(Mjzv5!95B^?NgYWfNF*H5p9 z*prXt%MyWl|8Ut6i^S7}WFw0q(yWs>q+N3{Py?$0>L&BQ{uLoOayuur)_hBewZ>7l z9iOUiwx=m(U2a%$HyTpjda`9bGQAHMX zvp>PKJQWa9WE~XS*tFtAdvYJy{4LFqam}{uh{UM-?+?4(lPuFa71$KN7UQ5TpJqCj z{pWn5$>9Jak4f;idO3|Ig@8%ocSWG#sFjCyKWnbM1KLebBey;lop4NB{2(tiuXAIi zF@bN9NP-Ci@|54JbtWOD!eQ0Mx@^A#SD6L)z8-fDi?VpNNv8Q(gQeeF+CCV7$SoQV z>@P945z?|#_KK`6XWW-%zU3}*WcGUX3J>)^otoAWeSF$o6G;8}DB|FbR(ija8HVp1 zH!UqF?QS{NRV(a~_8ryMaW&B8P8b4CPi%iQP$w&sQl(f)@oI>GW_ZS!>l<*vYljlk zHtuPOj!tm(C6OvuN3;3&5=PjjhZ8BHOh;3ahQu?5D+kx7 zZx1yaE*a1C>E%#26`JTsSu-Sx%#NJ~v;NIXWcrEky&aIsC zwZgRL0Y!%~=$gvpkgXa8UJEAXVMu7+S`#=+4=nWN*(>58{J zJ9_VMx@sTjNwJXv!qh;DdIQjmflShw+4cSm&j`mv0KUl(oIlx+ z`ob8@*CDSvZuri0sH-KQ1t@QgPJpGLfnv;3JCmXVTMPTMED}(yN5-VZ4*;33(@Jvz zti$6+pxGxgL(0zd*GJC%LB#j6&X$E>K0paK8w+iSIYm$0v^H2$!6F6vQx2DEx53V} z>qQfCH`VdOd_621Erki#iV94KRqxuQt(K})dyg)oR$Fats&?(2 z*exw;)v7I8MTb#4giuthBsFRigv1IWMiRpJ{`~R#{o{`~&T-D2`}KN`>v~*##r{<5 zeoE)iDe`Pe?^VZZ`^hQ(k%y=H756fEv~t28vk#+=ejS|^Mg96LkQx{A{OD2hSFn@G zeLH_57i;aOnhFEk50x%y+3y~$r>$~nse6B(xg5=AP6U-teYc3I#$$z->C0N40Ac>ODFXv*1B@rQb;51~%dQWW9} zBQ6|hA}56hH=W|N?$uwgbDN+PM&#Q3vM+^ao&Fw+{-Z7bp}W{o$?t$I(fX!N+0eK4 ztcs^@EM`UJuY7ODmpC4^HjvKeWwouzzinFVk~%w4uR3q}ICz)myw2g^nU_$2^_u;% z9$*ZbmET{V05Gm*hrnz&=(8$LhAWzWQ(`GB3nVy~52`Pnu7Put&SKmF&5@AVOhR+N zHNeN5(m0_4o@|Q@JK;KV?0FF3u>X9=v%g9xq!)15`XCIlZ-B~KkyxKrRaK^(_TW<> z{`xT!Kvf9X7|4}xlfmU@I^?pUwcIgRv{N?vSA4Knryc>7wbjZ^3k-iuN@tO3<*{92pr3xr=ZKHnA4|8YC zsR~<`82#-@3rSh74L&mH;Zp8zaDI>Anv}%ZVf~Sk1MfVoj@itv#HF=QGVqHx4}m-B zk@pW=mgc+|RM*nCz-&^xI%97#yK#zs*Rrg7+hXS(S$Ne*dvxl>xpJFlYLD8NfcSXg zY{}^C1!24HlC4yY^!?nJ-K!U+z+(VaS)pnpVeg&VALy%q6?=Vwl+Pws_7ws3U0E`v z$em8~w`eDvZYv)?=U~?$rMY)}P`-9V@D1%Usco1+3=5!!Upq1Rsn8{7Cs18y>r-Oh7aH!&+ni`-rs-dmz(k& zQ2{rWn*_ke2|&rY-?jcty;{HEH)jG?dmOonhhtvjvynQw;6dd!K*sYi7@F5eyr}D< zC!4x_9UYmZP>&UXFhgYR3P%2&8a2J_dn#vG5!q`tk99ah3qXPoINA7EwgNF^iS8yOQ z?+Utd<~EA_ahUqE-4m&;l;LMW_YDb~558`yaY_VQ)Sw@;a>-F-%6KtNu{jbsf_mQg zC-_!il^YlJG-`d_@PADWOl!6&isEx@90mtGBpWb>Jn7^x>LloJ6?VM3_X!7NcwFH) zlvZ!b|+Fv}R#wIjE@v^|MPhVKsl^ zeQdgXRWP4PuL=mNymkD?^|yVh-S9n%tJ$6db!YSOj{P4T)en6~##I#;u6w88q?!t_ z^-2*$sCS$_z0{trF5ys4`pr-@cjqpZ;>Q+55?La8e9^bKtGJSzUa3;ML7yy zcTnefa^sF=h|Mv?XJ^`*X8nzdl#lH>=FAV)==!O;Lm$|pyOvWMn zYytu`DDR|IOtsFGpFctt*CeG(>;IN!yQ@e@*7|AVt`!MuzyS8!FnGHU;P4=gFe3h! zZ2)9p0{i{Hd?_QVfsw*_+rR2Q4+8~&e5;v6OhZ6>QOM7`9+k^VOSdhG-{@~QNLr^! zv>(2-kg1JNF(KU>w~%z0e^uU6i2K0H_K~u~$`6}wmSog9ObN7#gLc-)0xxV|!aLQC z*K;~vyUz0j!y!HME0DF*jafzIW*%nt+t;vAiGZbTz~X|97D>k5nOec}c$kdTZ{EhY zNc%fQ;y$c?d3+Obei#sq9V$OBp}Io9*cC1#WLow+_6$Bi^))H7{ro5K`F=l&pf!Cn z&;v;>7?8>`Mazu~w;bRbN3R->H2Wgds7;Fc>mC@@#y3aP1al@va@7o)zkr=Wo7Cpu z$glih+UcN&cP;Zi+Mfl?86i2kMP--()9zisb^S9!Yo zHicEq!P?Al@~aG|A{3+oRtH%9GdVHt>Y0vjuz&;6G*!g3SFisZZRt#h%HOe!qSb82 zpQh4FLk6jP^^5PgA}Iyi=`y()awfB~Ro&T59cFeGp3ZN&WP$dt)~u;vOcR{x??P*; zIP1c#c;3hDk;?4tW18{A5yfKQ@y#tv_DaY^60m7!(Y}7wD%{m?@4p zjNVo=M;Q%Vn0sxP8gf*}GU8S>v~^)_H$YH6ofE}hg!piu%`hm%BWdx+>*LqLYsssM zUnEFbhfhqc5%o+Zem#l%1<5Ek553*VuCAT?VJ}<0p43VbPtAvJhZC+3`Irf{az18p zt!&ezytb6)0;x7Vg%X+#b;{jempfasI+T1Zmm=PK`tUI~HE&y88)kT?-jL;A*>{QJ z8e_Uv8=B85Fygcs(r`%a8mpZJ<$An+6!WR9&h#FhBSGHJ-#bFiGT?Tu3Rc#uR(${U ze~8Mayg62l1lj;R-tjOn3a1rG0l=UC1NQ=!OnWudbLO3qT`#U^(gCnxw_{nn#X$kw z;_X9z@^*lP#5H0D*x>WIdr6f!RRQ;vlwlKMQ;tc+<_1Xo*z3)nizy_s06>PH@)Z;X zWm`9e={1rSQ5=-!91Ahf!hooJzU^AbleqVzr`2}>rO8QW>XTDCjGQ?)*JfbF>T?u$ z%9mPu9^@AZusiHmM)#9CDI^AQi={Uc#wx)mAU517u*1P-6F3Yh*k%y%@IaGe!Gx%Lsn^$bG<{+$D!; zfTqa(#(nyJo2mHXqJ~C0y#!yAX|R)}=1RMYe7^ckbGLPMgg{R9v*#wVTa(Bhg6_A3D!L+OT+lv z`A_~pW8;V#?Es6mlhRYu>9utr+%1So~T>UD{hd;gPSG-w#=&Ru^23%3yi^*b<%V_lb3+ zgQ)i_X};pWIL5)s?;xPr*$x&kzHko=;AL1?yr2@guQZY`#Pp6ezUB527cGeEvLzNE zBqm0Es2&n=RN%)9!6Oxtfbc2YC2_+%`IBB}?@JZU|hTyqX zC7<&kT0j|5_0IC9sP_7{Mq^YDcZ`iz7}@Ah-Wys2in%Ay`n{owSEU`g%*^IMbKC>?W6jLkwwe zxs=r+d)elw?sS>pdmP&h({eMh1GY!GqcrYUYS#UBG6$70VUb~Hbj&+C244JlwVel% zHvHdxSt>=^{55+Uvv=qx2D_%O+N>@(HLyPLXZi$)w@EetSD`w()y2Hz zPjM`F_&-qf^Am9_``-R1H9^9m30xb_87XE^6jSqI`Az`6akK)sEgj2vNHc7?{=X#x zofic(^d&^=8%s@&ZIaG;(N6Jn=0^hj@lTC;?~JFf;~Gt9!B0LW2fzCj%bppM+NX*$ z5#sGb9AWM+3H>EB1`SU)Zgs_Rl+NUAJ>Mz7XR=IPJ`}71R6AA{->Co5u5nNcnO{^r z`SbMiwV?F#AlBs3@?LYuWxmfF@<>0M&I!47HS>9PYwic9Iriq{UNtX~ko94iS8%lk zd6zkemzO?!p%;8toa#QT-;-FsL}G_|3Gkm`pW@=K|4A+Mf0QG{y3^#v!O$Bs8c(gLYJ5Jdm}4{RqfO3H+#7Q?JseZ)@sT|emc6A zsvk!8nHIyl(_NCh>hUT&z5camKTlKBRG_!6iJ*}4_qQRq;~Cf?P}|YQPku1ewfD?O zG+MJJ0O9m&raY`tba;?P4NJAxj-tiL57p|1 z3p|Um{Eiy&KcV($`=KdVnAd}KO~DOEcM08x$4Mfor27#A2=dQu1)s`toBS4-qh}V! zqQ-9GSk^@Q(w~&5Nf^`|BXrzvPm_ppRlK2o>f^l_KElsMra-L%aO2ihQJA=N#RIFx zpWv!7AWAA)n)NYH=c_;1iT4lgQH;2Pv(jXLn;965&Cl=+ygI$wfWbOG``ghQEz);A zCCp|IAvW97E^0ATeYiC7wraNKoNvm>$x@r`pp<3k_(8?g)--B_Bpeocr;%(V>KJ2e z1me`#zu29Sdo^)2H})#?pQ{};Z=>~PZ=Ctq_Yn8c;n#b8{fQe_Up$#V5T|YAy z)Dxy=Rj1%@*Kj>yK}g%|9ouc3 z)=Yta_Oj_;=aA7#18a|rw!>>`;gfl88IiWHeJhwd-YRo-ogLr!f_8Oy_g*FlwfFL( zT`A3_vtoz`-dZ?&x^Ui1@8~7v4fSK{h42C5-oDd9n}Lf*RD+t~%iXX#jtME+O(Y~E z1Kwg>L7%|swyb#I{>JgdOMBs~bon`*2h>zJAoe!)_ zujtA!AF6=gpX$>_Wf@;x%dZv_)HMj$Z%P#JQ6D#0V;{%zU+`8xlET*=VxB%iK!#9> z4XStZ#0_`;>;VL`NCEBTtVuz~Q_#Mx^qa7Mq)8TseP2AXK@;5T zL_HSvuH%Cdpqm#4289JhNs1JXrE=xETLMMImb`U8mwap`ok+$mI3uua-{)IJB?+f$ zFZ%3oDLJ&57H=r_gbZ#jND2ARx{RbYE+Vt<>;g5^j%53Eel~gW4+Y-VmW(@TJ8=l# zI@oVIdOZ%C4($mM&edL486Ox*qXiFts+6sbk@Qv*jN1wjJQ#x5%O4gkZ0zS$E-O&) zT4?p`b*}brPvX1I#d%gf@eC>`go)U10gx(DB%c;??3~X5qC|F3oGO6&8(gOm_e*Ye zF?_tHYZ^uyRNvGw&=D_11dVaY>$Ng}S;@D=fVh89G@3-8W(H6OFXP^G#rqP4Ym^F9 z%BV;2>}5!vzZj?Mtm%ag=R(LL;-TuN^)uzqWCx_v?nbip1aq{HyH;>2hV(8zR5umr znwnKz6f5y<4Hue!5ziG$lSsxI8iD|(FezKPiM+iHKhxjr z?fnq>475#4@ve9cS}ndN-ITF)1r$*$C8RF6e<3=kkellG3{-J`{encx^y9-*#hw?U zFAsSiZtRv^0S)=)6KS62)h|E~DrXC<#?MqqfL=WV?MCWj+wg`a+^yv%qJilMW}R6H z5W4^ve#7pk^omsLXp^}NXiRk7>;mY#OA)a#KNFtH8a>C&j9;U_hL+7`KLZs2qQR$3 ze|gZel?rwsBS{duZIbUa{UvL319Xyh@^0EMBm@k|>;>$O?%e{l{#u0g!(?;Nf=vR1 zi?Lk<`1D(4-3d4s2Q{~`j5cTU^~lZiYvRSTzlXHPId-zP&nIe#7J14Iy^qfy`QE_T zzaMv>A3}c9nqHN3VRYkOg7OPK_1R!(qBVG+=UvfDy43gXNd`+$#tzpUpXQPT;{|0l zW?DTWF0YrVAY9e+2C8G*po68L;o;bCM!S(mh{t)m~SfV`qHq3W^Av zz*r9xb}t~Q`t}8@ve1QJZZHv{Yeqv&2XEP{{xp2o6CT%9>k(AIe^$P$xi9gex#}|V z(0{6Ee%s{S+BxVS$}a3Hj&d$iOf!=656K|#vNUZ?X*E2E-jX*Q{$G$iu8v3OJMUOi#?hb_C)tBef)FdptPuDrw&Ei;GGoJcHK=Ps0+9L$|R@%s%1?n(uO1nlJ8_p zDqPk%EBQ)F8iL8_1Xi5I3*!1=cLGk$x+&T@YBV1x);@3x4C-Vi;dN8?)8(A|i&RsL z(u58GAX5rDW}&y3nlF(w@_S25E5Jeo6`9~##TuppOzYq+EmlRR1EqzzXH_WI#NVEu z4k4}dyXJ;!zA6r3Bz?rdU^idX#-&R)S++2NQ&D3R7|;1Yt7<~ymxj!$yLvfsF{E}+NN6^5$0R1MpW_i@KBq=_LiEUkiPkv5^9d5X`OUI7_Rw7o3mNLgWR7|b?n{Hlpa zE(#?e984(ROU5%Ic0S^ z83YDP1ie^!!Yw(x1n#q6YdCRk_2par)`0t?XTPSUE%D7DuKKR^Xh_pLNnEeAT)b)b z^PMZzHa$fZ2{P%)I6HmYPg*M>=xiB>v`1Ph_I2>KmGMwS*;t=9_}^W|EANkJvBDYW zO7gDy&b4p?FZ840$9ir&2zpmw#qI;MrCZWiFune)*EFje{Z@AFbQAGn?(C&1N{-sS z{2k@0;ow^Vvr`of%~jjZ1(zksg}-`T>5~<2B${2|b- zg#xoy6GY3Oz;GiWe=#2eb#z9TzBpQ)UWsbs6NRlu-k~^jn)yH3Ts$@>I|4Rfb@hl^ zl<`{ZAxC!1K#^~oyWSiGxdy*8{x?mt=cIxaGY()-`YeCy(1@abg$|G_Pv`~zj ztM`ivr|yhNKJUqvqFvP^$&cG%E){vO!U5j^Vs@WPw;nhjT^RaM=4~XuEDN zB5CB~!X-{Wc*_S@Y|$Tq>ULq}rY2deB75A=cnfbX;K`qgzIdObXKGnd67FDjv0u~%$zmTF9lXb6UVVrpo^Wm+A%WDd_kH^WR+Yh)9l9D3oPK+Ia$pj@FV=v*7Ftbf)#-MvdH7&FcKM;0;?!!G z0@hg%wh=0(5jf{4$VkyrKN%I=D;#1+Iks<$w##dbLP|Hzb@@1#BJYIY-<2BygE!%D z@$)pDsc@p_S^NEdjj=rpaEq8X4Hz7IK2nGEc|;ztp8h($+(C<6*NDPyBq8I&Zx&|O zDMLgWu{Qrj2y@h`#cF&esrsy{2b%0cuXXR`48V~tvZ*`!6FQO5`x@%h9l5E~%YeA_jj?$RKY8E?#+I`<|NDq;tlfU%QqpHmLa0&8ziF(0WiL#S4!#m*-DFU<^wyJ6( zg!4Vh9_8S~6Xt>N5oBmBK75ZDS)j-iil8?g50*aj5;U$RSIHkqm5j*nLu01LeYM~= zax=4$RDpmqAEUWF8fa>-zUz36=X$bfM|%@)1qJ zCuBv6>P5ma-cn~)y}k^*jUo`nA`NRPPFjaQTG}qx_BuqAJrTc282L^*@@)AxpS2(2 z=*s-?`^$gFVDx!{@F>CfW#`#J4n=Cf5SwEBINMt z^JXrKoI%~RWn{u`fTogTtKX7&&!k|GeQh&!jD~+c4)G*4oEZBuddCPpUk32s)~lV; z|Ii0{wgrQFz>^EADj|EWvJZldj|zp?Za6;(SH$G&g*!1h3;}PIfJBne*X&<=Apr}+ zPDSVdtq~=gG4F9Ca=n?_h4rj$PW2P|Y7IFGme!Kl8=0N;0&b7%-ag)oce1FT!Sn#K6mG`@fPZ=w9T5FyfVrk* zlimqBf)z^vbCl06Z+alM_GC-oTlDPTy*+eQVj@0kC|fA3RR|rDkEXVwQYBgXA$RC# z#ffQyr=p3i9gahO zc}>4=O7y5qO86bj-cGb7HX#zntUQ1R>(A9C2a}4F_4fDb1Ybc4`gX$ozdF8ejlM+HCua}N5 z84xlw->(Rg?m4;{j`DFAv*)+^*_L7ai+VnY3Cr|Z+mDa)7|#TKn;uyP!x8Vp`rPQK=1H6_#*=NO4);__ z5RrILBXz6$^r9}*AE|sp;XV1cj5IugjxpGYt9NbX#?Bm{k3%NZ{=iQtiM|xGorL z_Q^&}UAh0hpk9;lxOTY%#}=oZuz<{v>Ic2eb;ulz*zQcFYo`QQ31)Ao(~5@XJ)EF= zE~hyoBJ`1JnvN5m+fx)p+UhMdFy3m5%G(u)-1X_-w)s|0hjtFjbP5ZPn*wa#t zCNae3oO3Tv-Mco}&{!C<`3ru(+Az~ikduTib@Kl$c zcUOJp!HGhH^#hUX5$ZlXf}ti#!mQlbjFT^a#yOM~$f$OYnGQdNqd{MIaAxhBf2z_Y zvM~bbZ@Ns8<{deYwz}1bj`ino&?5Ztu@<0R4kssSbD4>gA>m1JagN=VUyL@tcS-pb z5aDXOh_hpRhxZcSBmYi@9QCn~8b@k2ZC1H#gd4nB6TUS}qsON0VFlwBtRTBR+sk?2dH6+u${w@&-aR5ms! z@#IN<&R(|~n3u~^K~EF^(QvC9r$_YzQSI}?TOAe|{onBh-CtOZK1yE!O@HkyGVGO_ zrOa&DXgygs4Bl<_e6UYPo>f?j-+Fbkpu;MOc}Z-qBR|h3wPkt7jutd=##H>CxnRLi ztD4Opje~dJwlxLW3++F1?7V#(^^k|v{Ol95|FRz}HYEJkO(2B~>x*1Dc<;bHkpPbH z>j~TW=kQDaYSpf?q*@y!QosK7Ku zGL%;D*p~4b=SHfv^EOQaIbpcwdk9Q8SJ0 z$=kl*CS_&6kT3ydWo5E4Zr7M>&&bxk1f!2OJ*aFT(E)k!$}4Zeh&T(@LwZjgKN&wEZsmTQ-uxHWGOwGJmkTF&2zt^(a5 z8n`}uuXMWh>d$8BR>H;^glE3)Yc^y%O8$6)txGO*XN(x_0pL!Yi zj^NG=%D*>#s@U`y>;-5yh3Ko&9j?}(JKhLd5x8%KD7aFrYX{o)YReTK<+o)jF0=jL zXsz;YvlM89`vqA=m$~EGb!i^Z6AvTjsa8M8G9w$9ju~NO_kH(nGk5%`i{pTUeC=Lu zE}wdd=u(#gv1hYJ-x16{uN}o4y}LUb0t=xwM~44p20>Rf1klbKrP!-;p#eYf3b&JT z)t#F1Xe9d-SPFn$$v9svh+s2_ zSy#m85ui*t=(Rx@-)=SAS9D4+QC zYGUW0fRjLXmR7*mFh1e#-}&Qwv!$8nsbS{DTCFZ6CHg0tH8%BDz*Ma7Ha(i^Z2Sbg zuG)@t1rTx~C^J*JlOHj%CMS@EL}~_0F7k3&c;0|w36{2~wji5#v`_9v%h>o91u?8>3Fipp)jh0ZMfJn!U`S@ec8KjD z|8dpn#fy%yo(grPX>(~+R^zTo9;h7#!*-@9KT=s)#<7S<<%(K7#3R}dLwf35v5SFf z4a6g|WmMI;rP0ooh&>8x=_&j>bZtv3SmuS3ZyoRQaajF+Z`0Po3R0s4?ch|?O>5>6 zSxF4HEm!ZFh5n|L9HH^Sp9EI6%goEn!er$WpLG8wI@eP}2i;fh>&6|vNpeBGA?gNa zk_$8(E5@L7xPh3hY;54CR$1|vz5^fq2zP!B(-56bZ_-uNC>p)$coornlt=(!(iMe@ zNv32t>gtA{_YQ_Tq@*Wm61!<7F_2WY=_q__+I?Q}HY|7n6}vE5=SrUPsQxn^j+U{z zFkCycY4s>dy;MEsX@8mQ_aM`9RYJ4O<^R6@8~rCOFZznVI$P;)5x`t8d`xsNTW^py zzCHVBsY&ZwhZr@T#tW6+sV(uvr8ela^!c<|WG@Hyp`oXN#pIlcG;u0@?@p$Qfar54n zfc^Qa$dA%Kv9jddo=g^MMf5+ad)^pNzmZwy_x93+gzC$oXpf5zw&RXUHQ^T%wYYgB z1SjUcjBh;Jt~3Y)R27EL-1HJF_iD|a8b?AjuKQ?SD;NBe7+(;%5E2kjCm#QeWi&#m z!!5fR*{wS^s*a}2KFwadmZ(rgWUl8iVvlP@zxsmuCba{2W7OFLZngc}~i(&fY)7_%xzpRapKd6+YskFeY<0P&J>%WE;M=_;8VD;zkI#R})i(A3I%qh?O#E_h+TEF083%+P0TwbbF!w8dIIG!mjAuRNq0% zv<8d^boxzzN#^)_y_{J@~5P0qATp3CtyKn^Ph>`}kY&-Mig6)$0ziilu ziV;zB3wYgaU1HH&0q6p*jyHWsv&ENKD=fr^+&!JCr)#GBlk(wsjz;hw4@m{{XDojy z3GZ}X;Te2gDeL@p`N3Ii(l+PaNE^9h&8{V@N&4i}q*{rp$c&tz?%BKrExEUv{4)+} zGn_th#C5onhgq`$uD2NYrOE98t5^goG3~Q+-24wFDt)~grKe3#gFqnhQ+D0I+OFum zslNg$jcek^v}mzLe^dN2ws{dwN1P=i$>Sf;58}qKeNy|JvvubWfSpPhb4Tdm)(C5K ztrX~0zDU?C3et;lJw~M7kepKUdPiIhY5l$)+?z9hbQwvv#fw|-SUJYB zFwREY@;fL~2uj=u2`i4gVE#K;+r&BmoVD7>zSAG{p_S+2ae?mQJhpx`K=t8il&RTC z&+Dm#fq11Ap2{GH0v3wQxWsCrucJ*#^)~MfxJ{R%nG4Tu`&+Eu{Y&rHF9pRYNmz8J zsrza+{_W}WNVfOJYc|Sun$pUA0nVIXR0t1H5B+aQhJ~GIlaFW!a*+K&13CL-$NmG3 zu@z;S`E)AacsDx|7lb7To#4a4g$DtXKD%|c-dWTgPfemnk831mcep(RIDW9n;gy~d zMFH?hx(2Zk*7rN=K+(P31TUPbw@Vdd1c6C+^~2GVq7 z^n)$h@!m*mxSe%CcJL#ac;m;sw~`2eKI^v#`1+Tyb&_cDM@+Y>f(4*rC-f#2kC9sA zkM{{oMftd-vTqFwh|lJ7lQc9ffA|%88GXQpjoq~JvsV1?$Teyc$UjZY=B&}k_b3`y z*7Yv1uJqCqIKA`sepG(yQkaV16y@ry9XH(NzT2^LQ>8Sdl36xHFRQk7yCV_LY;XFJ z0ubJ44dR1uOkaT9QeL`gWaLPm8*bLElof)P^yW!g$O8 zXVC24H&??C97_p2xg{=d4|%SDgxy45QQl*&;I!_po}S)G!Vm_wdt6ra`Snl3%8$Gf zims|8KiY7`H+#nV>IYORdV720$>f^UkdImI&gLxnF_|?yLsqGXNsG*1-}aie{WTB# zlCtH)g%VZQK8fj$o>z(hm{YBviND&!KaoFZy**Z>7>=eT5%UXrAP+Qh67Te6K2?$d z`OhfKh1l0!yBk`_jg$HTE!uENzDxrv;*OwiJR50hCK=P3cwy&0i+iwn{1(b5pgYHQLo+XXm4A6D zoSY-TX^Tg@|L22f-4BOUK2UWD-UwZ6Ux%&N9_rf1sr3m_m&$w8s%?2@u$9<w?GPg*8R20THc9uMeW3mnS$>{WpUAQApyw-Z1-ov*#@E@y(6XxrA;qZU0Y~bUum$jCb zEXJ*pcR#-MPcD2g2)&2&q-H6s*V4o#NAiDB7+;Yp5XyjkDnLIuA@`RIx35;As|_il zGN49-+*7o0wLgIq5}=*0g+3PlYRo|jk;c{*oa>l3Pd^EHDFWR>%Zo$CE2h6NAH+Il z#fvq%5@}lsTqmEOKzvxEzg|sUzF0Nd2Q3nLUGKWE%&Y^8U4M8Ve`@~r_1aU>DdC%T zMLTn>(RSE_3n0I$u_@|){V9+-5S>#v5FT|QdeA;xoEa2xZ*`;I9 zrFf~LTA}t<8%QM(esCTmSPo6e&(DW7o$6R#!R;w~Y$)1^(G6RfQ37_6AA1J51B(n2 zmG60wU?sXodhfir>tb-ro9{U~;#|oEF+2C9u9DBvNHQH-8gm0XnofDWGZe=fi(Y zZiU~pTYN}}i5DQc3u&gB)&5PnJ=M=2u#*i=s~!c@-VB=F31(GZRe&K@&@aZ=mwpm} zd&0(YJc{^kyD#{8vlM)jQ+q9i_}*cdg1I zJr&z5X=fi94`|10ENs;ur1@aR(u!KPw&`gqL&7=btDW{`9(0t@HiPh{(mu%|gfXOi z*|bMs>MWG7uM4g@QU~T&5i>a4A2d1<4irxa#58rr6_=t-6FW(yQc>E$k)HiE9!JUk z6GmGMn=-vfC$&Lbc;$w&(B`;&Yn{rxnp!_XE-zx1Ga^Orz08SSXGE%fm`aLgK=(kJ zk=_n6mUvG0Jndeg7j2=tGW|56ek+4{7T-Ub73yP4~vF>EEX@K36eaj?K zVPT5G!S*D@P)GkNmpEf@=`UXfzv+^}CoaoJ?&z|QcOI?sdkIU1w>=$mvGBOA8;I!d z=X2quOwm@>=Bws6_&qJ`Jw~k@fBuMxl|4@&$&byO0C5O6HPFB&DWI~!r$-b5G>v5? zj;<+?0=|}|p#@3iub*MG6^QGRBqsy&XmGrFWc9x%9vV^P>yewpV|U3WUukCOOV_!} zo;Yi!Vq3So@#!b_+YO=ym3~2*w?U0fJW@RfbI|;2V)HdxKXb?K2WFktxKl4(m|h~j zz4k(E_d23sWtUMR!LLS3nO0NUGrxP>@CM!#`Tr_fK{@x(?Osg3*6tU2gh7qCKh||j zrzV%dzPdgG8J({v=K-=`%KX^;BD61n?DIW9ym3`L##|3Ca z^c3+w!G=aquU?4$eg*Uo_?ZbgUVM0Xe3u&}9rxrd-tixGU$kgoEJVC^+t;2D8O`Fe zcSB}YndbF(vWt)q6E4Ik7#Q|?NbQxmq`df$w~7U0#ywTk>m2!J*EeM#A@HfL224?= z)u2CMioBur=Y4fxx(ZcwA-57e(UR@U)l~8Op=~c@6WcP;(V`cp-b7#RsSq+=_V}@;vF!`H>K{L<&);s z65-k$hY}phB~1icmorqV6+{s)`$f9MGE^7jh?E9-h96Dcw62G5xuSg%bDt1tX}3_n zt=we40}E_PEoS#iBBWPaCS5n#eV1Dy&$xE6`<)zdE4S^E^1;JR`R`nve<+&cGIp2v zl5>g9ga7NlXJ`NXZ&eabyS};QjsJ;UWW;k5w%Ir&z( z^ID=l`OD?V?lOZF*kt?~|MNw$dBsS>C#rGqP2Qng&RGlPPv3$@*ht4!AoComQENEq z$(`2l>1==C(YrtT2 zArKB`oef~TTHL(xL1=O)?}kt+s*xfk1ESAzzCPv7;%Eo5NVoLx;3hEZY>k$?e;6UV zsq>7}eqw;Xl4xg-TSj+5neIqo7rLbH30ned`ziUQm8KVVnen|BK)oCqelsvTkYsC^ zDKlscX#?^MX)unvzoMFp#AH7OK|m2!On;SGX0_DRCD&UT_Elv64vkA{Ei!<8kBsRf zU`Y7r!Ho6{s;djnVg;g3Np|GKUQ!B?I2V=u9m6Hl52x9Vm<{Rjj&jkAFs@u3K6S`v zo~}DPXHp{zTSHnPMU6eSpS~L4nz{1M^K$e*qfq^M)=rT=q4|f6TQzk#wRZ}&Faats znKtY$5Y|=3wy)2lk#f#7N&^J_32oEF2xz4>&FKqV0c|!FdhZmS6hw^zxVQy55$r8T zV#zuw9#!x2d+9aROZ zDYJX@03xUK=p>h;IZ3F9(hY{{Skf1oj=1K&eJ=QOe*DUgMPq>?(1Mf_5+TXcn&`MKpQKcrE%R_VRVrF z?fgLDq!qHtprh%D8&M>GJ5javVNbp0bO|^R+yhyN)N2EXQM3<8jmyuP%-;6FU9MT^*$E@W_(8d%Pj~)T_~qn01I(FcB#M|Y~}YPr_~7%NxC{e0(~0_ji6kbHQ#ffcX% zdqW~$JT52+X-FL7@%N8LO`~MFN3)4RijJvmr>?eF8o_I7{;9uB=LVHBvaf)w^Ye(! zB#YOL^0z?TbUkLBDD|O{3(^0e+et;RGQ}~V_Nh-yrXn^YzcWV%Q=v>(1;9KY#+8ss zDS_e$reAJ)Me$PVZJln5BE+k$K%QV1>;7iYt!OC3 zis|a13~_oXXq|Cr2HM@(Kc#cL@+UDHY{8^cV6oxEeBE7yZBa*Pr{O#z+j36fs;RtM zJc44sJ0g9Ht4b!nJ(CAQHido^lN7vZE~KISh}*WY#3diU(x?+oow$GrX!ElcwVz~r zbuZ^8V#d9%`x&LyTEcd#UW>fXD)@C)=C+g89lR`{=e2DZ+x$&^yDk$qbXRyC?ATmQ zigb(>TfPUb7V`fP@p@;SuR<%^|BIKu@dBPXo(IHVayD^G8sqto!X3r!Mu_?5@g=TN z^LDUqRGsKKJZLXV!CA#gE?`#7K0#!!i=)3INGq{~AB#FoO$=1fLj-F|r}7tKtT79f zlezYbA*n*$IGFKDZFxnI-iLKI6g+B~IcLaPt@*yKh7-Fk4Qey|o7@^8)|D9fm()$+ zwbS3>T?^s4Br{b$Qk)&8p(TxOot{R(p)@&fZ=c2EVF5}=m(UH_NVR(vDa2~pJP>67g*qdUcXA6cDQ8#`E6@<4QcCejn9L8&7c(j!l z%duEwDr8+DX$8AM6F=IaO!|bu!>TfqDXl#LsYcww_cen3z2X)i>UPJPhl3hp3(l$m zE*wi2iJT`-q;$iVaO^%&1o^EE<{43Vw|ffPH3a|qTS|}R1J7WvQqR92SDR1&1!K%T zDied*+|UACIx#Xmg{bq9 z8or-y%M=MXd;0V$HSKppz-s8R0EWVsHaQVrXVU#D5DZ-xA&;N*;Mf#Tz8-}hTN6~M zWux_=j)B{a%pGgJ3T0!>)0zjPr>_1_mun7!NbH#XukaWf9AE``d;tE%fjwp&umv#1 z^{7bkka~X$tfg0TpdE4bqt}nz`;mz(rc$8WW6OTcplGnl$U*595bH6QolXg@Ah?IiE*!wppb@4$Jv`coFiJ^I^_%oa2^5 zKb9T} z9y$wL4CrCJ7&Rd`>*WI!r{oiwKJVdPOtSm!&%%i7)TH)367YSO>WFM3C)Jyv0%PHQ z4t-xlF|LRrWA#Uteen;m!b(Z>uQeMt7aUvrmvcyIU|6u`q?mBfham{)0e!)Wc8O+K znl#J3S@Y6a3A@(kZR@eLaM+=H_PG|#(A^Oy0Bb7B%$k^6byB!9dVQ}0A+xr}3SpSL zJ5nyT9*;$vZa=bqGbVvnSdio={ax5yd&CP-nBCr!|E=46P8XJB@1zz+gx0w3iG(;r z9P^=?2A}AveI0!I`!@Z~$>bxU zRWuK|z)M|0Z)vm@8;{U|9xe9b`d)M!c^U!rvgx6BTEiE)aw25m3&(^2Iu_3FO48 z<@?CwZ^F(?jWS`}Zy#~W>HyJ0;f!uPCp@-@O(RRm`wbi_ycr`+vcQD#pvWBLE;&~dUhHB(4zApFZ z($(pCBTC%Dr`v{YCBqX#M@pWTNgjGBqN8e%S$5G=n~T_2&%i<`(jve*j*x8u-Q2lN-dq;;U_?l`y@}*LI`z0VjJ#lz z>{1`=e(%(&>fk#rBcm%rF1@^STk(j0?mbNKc6pXj=`zl7@SPw@s#;8tZ%0oM8dLz8 zmrl%I3Kr?`9L{{D}~}R3#=0Uh}m+Ox@b^(TZz}E{eanwh}xfd;4(v zeokm4TzI(Tps*MT9NK*ra;Q_(THU_ZzykUBNbR|H3#j*`1s<#NTy2iD8~6|8PID0F zqly_GHGH$VzM5K2q%g?`DT#kLm6ej1HZT^{?Nc@&V65hCnDPPpVlMQ>1Mv63S&WH} zXy{X+G3TiWV!nBG4kb<^)KY`oKFD)_yXof|nwLkuX~1LmWpv-W8%G+^+U7Ffh7GcA z7V8Y4znqJA4p*voSrYB#KYOTAUaTw^a=cyN* z(ka}--o6E6$n!cXr%z@O#Zx>+P;p=#Z#eeCjy_V?eQRyPW`=hmv0boTs1)W(-|XGp zRVyO{J^&JB9MT-~cjr-b;1b0#XEyr+#@&`^&TSl6FQAaAX`GwY#BpUXE{CtLXJSz1 zIhF8^lF>P2_jjS1hz8-vGwIsblGB4i4E!G1o&}=q+mGFV)RK~9oScr^tW?vV|G_NG z?8nRq)tik=>|{6V^v{Cib47_m3Y&`K84g(;Ts%X|6hlsdCLk=hqg1!|!_V`JpL}P4 z@(y3D4hI!rm~o!ndSCs*V-M}YAN$99HCfIv2d)*L>YBb-iq^V{MhB1*fc~2ETxosa zNXINRD>iXNsa8|Z>e72gX}pJyixC9m0W4UdK*eLr)5PsULucQ|kp*uT=<^}g_gX>L z4%MchzcS*Jn;)3pZw*R1R+Ehbt6U36FWdt(_SHk(nz)qO01XO@9Hzfux`~*U1tnX) z&+nY1^HB?Y)Y1JRO)4Ka;JTzerZv{Dg)}{Qe#W4(RXi5bLLlJjcXqS7WE=e?%_B=i^$| z66G?Bx<(Tmh6=R%m+*@plm@D(q1mlB^}94zntskq{AkzD`t6L7a{uK^V)Ge7a5@(I zRY@Jya2TIFQOSVFDBzQll{PXV+s=~CG|mNV)U`z(dqqD_u1;(Yo!5Pm9U}B8Ny*PI z!p6pGzwkU2C?2&A1+>4@?CrA*S~!8nzx(q?JzK*u|>X#AUud`}!Uj$;Te>NrI9VpW&t#|18j59ojc z7{LZ2bgWbl$JU{SkT4)P-`e(q^b8Fd&dfDOPft%%#-a3A@C8;RICKC?9U?757|TBD zSr(nf$e@QqYXXy$)#{BKuD-#&rs2fUtTxp6VCa$G)BFMH(TCbOeN%6Pnui$b&70m$ z{KLxW38cQ|DqZxbA`O9pidrZfH$I+li9NQ#z4nWynP3SmwMYA~MB;AVk7-?KgM%c!nkeVArrl%uatD=H6C_>Dht^(cN=1Alhe7`K>KxHO$frZK}V zC`2>ZQ7^~wF%W(tR8L~Uts%L`PXUMT7X{QkYpwc_GF(Wux( zRKE)f&WZ`nH(V_rv3K6js`K`SS?9>+?YW86YX zC%tr66gLZ5w=H{U7LD*iWse3`r&ioSt}8EZ__xL^tF?&E79d6Dz`DE@Ovcu}8t-O( z5Q8$gp6@7K<$o-ibYIjDIq*QNcvN+L6vA{*9NN;18aVp*z(=r8Yrc(bK0>>8qa;e8 z7fll|s6A(z;hX_z^nc|jpf(e=Ly3i=c1{^M%rx}0kWwXkTs7pSt;7Jc9CQYC;Ji#^ zbcquewhJn)2qUSQlN+dy8OjlKVH6BCn)`R)FZ0}#%qlYc&wl= z;~5RMr{?^Up{%-k+`S(k>PK*1QD(nn9UoN>Xsx89tK7P6zRRD;7fcn1i(Ml> zhJYm`q_Y1F%dzFXgO?XdTckm5CVeYse}Zgbr^FIqQtC6>3AqbeKehx_T!Gh~v8B@i z#k3O`v^F^MK&g4-t*$lLlK*-)V-}ENP%gW-0Ld2iUOw-#^_$6bnh|~CVKz-*Lh2~t zd(k)}EqaePM7aZ*k6+`@6ypB8UzA~0c==?z#?#6~T(o87C}K-tMlt1(c(QnOS<7=U zBX*2~G_(AVkl|>ea-gQ3ui9^(Z`_Cg?ff9Gq9qhYW$|$X?4(zsQm>}xhZc1?SV;I_ z*3W?PA;xX}T+jmJ5rx7oPx^q`&)upA@2iApR82=7vt`3_wDxcx3)EUI$L${!VysdK zy+_fI_^g3hSv#u{VWNcWxSQvc_FE_A2Y|!!^Z42NXPf$8f*CbZ_=4oM#sQ;UD~$Zy zRZ|?BZ|or-&}B@a(4?2F29`A!CD;5Ri#}0pk(gk1Dg4XrcZ=-DKrGN(#@5cm<4YY7?UF++&$02okSm69+gs|4&?1{*hS6T5egt^jQq&nJAj4S^Z2`|Ac$K z#m;!6Omq9tT@FWal;z-6T3P+g&t_7ZED>M2?ff&7?ut|#}~dG@-6 zt1Zvnw=@9;Ye|7bq(Svf9+p5E>1x!~ z3}Au8oMBA!fCiwzym{8A zw8i)bSs=Wm<;;WNd1esBVq?Ye&ZlnNG4royA#XrklL0@5E!{n3WrBj4ev{4H^jPL_ zXWj=dZN#v?@2mha9m-nzYdKB4FTODUqHX@+<6?ckb_Fwf`~q}u!`Ypd}nTncIB$;A|4cay=&0h&3v zi2pSxHKwO4J?e|PHwR;P{2m6*^*CAlFkn(2(0b3VQ)=%6q0c$R=g^Kr>A-=<{Jvqs zZ!dRi$jZ{m=+1r%HY`pi659A}S-#I7bx}pu&8?J3JoJKu=EFMP-VRy6>e-EX7m&F7 z@8vs~%}f=~Pdte0%TL=fx^>opc%Rf4xE5Wx?br$(kd<#mf5JNTRwQ}EY3Wo!Mo;rVkP&~1&F*->++1n%!$8(T?TMt5z06;JUk#t4 z-S-BO0h5J(Dc9?}I_bH@uI~>OeJ%&x2=JcD*o>+cL@Cx}{ z0?)o%7GYsQ3*htr7qJHVe!NEkXrGV(E}$Pp8rN+VVf+?mgptBee+x$gzm`zz>9w+y zkP1>tUq39YCCpwor%!^h;?qZLvfeC>TaFh%>zX(fWe-GqC~D~VM*BKF9#}mVI-MzZ z*w~EeJ3(+`=AyDyTffVW@<1@lsogIH=YAgwbkP;)7v9G6@X9Qul&{I@GG<-LCzfqN zLTdpqwb0PmK!^K@j1h8-#m3&%Z(n|j?TUULxbXK*sCk0k-F`(wYuGn{b|1Uu?PAz# z=UueaA1pBzanOC^s?l18kA9fl=h-u+lJspg)4`#=?;K3T13GIW5*skN3Nuex4bX-XQ_6= zCJKevOzFZirjf*%tjzpz&k86_3s*XvtY)NSG4odx*hF0IzmeC*wldv`8416Vo-a6| zyJa@Ke6G=(52`2fvqRTi0iVG)kg1~gtrf^>vb5RwE~xM)$PA!T16A>oF?=(~%wYK? zQ^n;Isuakm$bKWYdNQa1q&k{(9b~!#Wttzt0+t;$slvj&ngno5rRP#Ez5l!V8xU&; zq;bLyOmayDyoZb3Q8C$DLkU8GVPhG#`M+>s8oFQ`hsq4R5@aJLo_+5FOfSDJx_zsI zU;EyQ9xHX;=W9&2X6Wwt+NK!iP>#h+$#3o0Bg)8@Tp4`;91$+e5I0_2(7Sbj+9L?i zuH*Ww$`v3PRFKe;_C#Lji#I~k^<^r5??9%)Rwt~Kd&hQf3j;)-CO_+)s-7m>7ye78 z{(rQF+6oUuKCIA6@m3~#`9EKemAEb(4hkAtYq3~VpO2uZy6uflp&&a_*}hfZ zFaAWgFf1_=<9?KqO>pQ&s|-o1^mpv|`tV*+nHVxKMF_Zx8+IjCP7;1%&ZCOs(`1@g zZNpGCdRqFUJGX$RV)5`$*$WCywhl!DQK$eOSQa6K(Sqm2A0d#pLyw`So+J_q+1yU> zYC98-@{Eu`(dBKIxeG)O&5nMGe4Z-@?w*kqU(Q+? z(jS>TeCGsipo72Q|0Tck#`5>H8F~OjMZ*eOWu|VS5vK7~mKT{?eg%K8NU+`e^ilJg z3L^<7L2p{+T^@NN-NLx)=C;kXGWSw+ z*#Hhm<-|HKS$7=<>D`kND1VL8&(NnI-gcb6ZGDhK0)P)I!c&xv2Th)ZO7I^=L-bOx zQ~P&hv}=t?zn8VWMjdG-FuLiuslE;Avd@*RB7CC3|8%L8oVZ^`OXR7wl5&3uMHqN! zkp)=OUgUKN4uxvmf2-Ek&4J{vq~y&)5;I1hF(}SB)BP-5X1+|e5pX*+yZw4;V)#iI zL629pO;tPJ?^SMadY*){e43-(|y=8EJJmr@Vn~I@`f7`b@<6 z^_&g0ATjGj&ouK#)u^QDtTHDj@&7*yU?&x&ntLYf3^T=P-OEgs!pC?KvM+q-HxRJ6u zJ)T?{cNXV(m_zz}sQFco7exs=mr`#Pf6;Xz^#y$IZ+p;WuzB-BrGzf7S|KpIDW(!02aw%HKr(P<BeB5zfqD00*ziKeZf%ym z$OWxy*syUq!)HzSOW6vTUE{&car5@@nCc$z-oX(xaR%!OLGLRa0i4rv4^QE>vt+<)4zI_J!o`@IXcG zZJ<~|d*xm0y+ri@qpV$ZjXUnuW{o2;s4baWMCye)2@$W9dyRcLKS9q&liXeBK2UsP zwp(w0Z@ZS|*rwb@$DW~kmo4G<{T{RXZt*xR0kPvzM5cq_xIWaJUpHU z`Dq{sfN#L_XI0D9Qg*G!t&G8CwMd2~QTRi(MAeulHH0cBG_6{ND7#GxK!~$t|JJxC z=y7h%b}oSwTQy>J1hEL)4-R_`G^YwgH1so%|F(@}TMKZOM?|TdrjAv|>4y08HpJ3Y zk4(&GR`;`lcp#4f=nOD*o1m1X2#* zKky-UwHb8M7M`&|=!CZN){c9n-~o2y^j1o@e~R;=>;Q|Ev+F5VTbR(M(N@)v@24AN zTz8({o^7O&Ifz+~gW^>nPvQab*{29vI zN;3!nK5Pu1vYsHDjD;;Za9gYy!l7^?q!||COEK46srwl;$(LEK^z?LL3rMCEHA(ji z_?K?PY6f&TjN6c|4yzbuUM$GWa2iM{i^SmnH^eog(~M17?q&ik;zJX8Q5Q3!h!K*X z{7lG$f0nQO!N-HoAMvs5o)^&~f3`-vLVx zAdxs7B%cGN|Fi)u9aeLLEL$Z13qU&RU3y{RD{2g~x4$O-~Z%MwdK-UI&IJb>w zIQ(Pkg69s3rJjyfZFmzBZkO(@GlMWdS*v1}Bx?D`=ub1~3JU1DT4!rToOz&Jy;*Tk zDGT-D!_NGhEBJWM!J959R;6VeOpudD*k%?+FGcm*PatB3gKZ+b_SrUQ*Vi`9;_BnZCko{TDOytFIWdcgPcQaO=kpFZ>>uC{kLi?z*RpYNPI^aNl%so%Gu2E*CndrYMCs8_Ob0e$}kwt>aFf zxuX@$-hmzGEk(1~?>7-rNG>&6+efO%P{`*FkezbYzCeRVdlT^Mi;&aYqA#r6qYObVz`s2ZQzTJ(_r>6a89xD#lH z^)2*CPj&;@Y6jYyYgG25Q}-s#`s7HxsA;MVJ<*UmCzP{wC$WG=ZO1guh0W!^_}J^ z`ySR@FvKdp@G_^$npeiX$Fgjzv0dO}Ta$I*KLp|%?RqVDeTweBM%)kmG^?yrUhJZY zWWns*dY~FoGJtlaAHxNq`!&v#t3qeA=;aa%>KKva`|-iLH=1w!vi`}(!)cxHSovYl zv1h1Ec(h6xhgNp$FhW0h;7T%F5h`)iQ?Tnuj;^WCR@X)tlK#Qv`BGnQC-U-N*^asx z#@1m_S0f4ucpSdrrkt}8l0V@&;Q3*LCV=_O!yyk>OMb_-V=ZJZz{Q}=!mbfnw+84U z)a|`@f&s#MGre3#IUS>Z<34Y_ZmHJ_EibZ7Z+5T;WI0w1EUj*g6n$echhy#Jcak}W z%5nxduSp2B-P>*u-u){zQ>O%t8C|=9LUH)03le~$_H;&5U|=)EpEf(!L#KPr;AQcU zkgdC|8%?cJtvkmIZ#eD<9ss9LAgh+$Cylg`UWB<}f|6Inw^IQkOu_Q-A&(w>x64Rytq7LxH`O?JdAKs_E*G{ zQ{pb`1id^|v9w=G2-=o>7x`CDYLV?&M?9AaGTsktiT-HC|TKgov2F3nuuc!#LsGQ`dL|9cf-}C(T74AU;O-$z#`?k zol`zSE;1ghwR|2)wYZ^&Ey>T<{=MD*=DB%7ev#vcqLrMbPKWwox4Q20=ho&wv(uUf zNmqHU7qXd3PMP~#xR)USOk&DI;M%dYtYxv^EFETsIYMVa`R!~#7uXLl3GB)|y=T|R z|5Firww5#SWKy4d#$^x3<67D-3X6jaL*jmM*qcK^iSC{kT5SDKW=SPCO3Byc2dT7GncR0gkpVs{+4N{j2{YYUX=;i zh?F zuiZo17L~7;In}RQXlrO~^w2C+IFAZUUHd?eh2PxH3O$|YICoEp%+f%U26IIg_$)->yGiQql#-_ikv#%Cf%Yl9e-V7J&+SUC6e5uKWvK zYRLNm+XMSm?B}^z%rrjV2>Z4;l8f_I)*Rt88My%RG9-Gmj@J0>_nggc0|1-A>G0D4 zk~YKm6lMjnev-!i-+pCk8m=l(=FR-tu%-4&vCD{uAZ+p)&}0`d#*_tGa^1nt#%TwJ znCGJ-gKWGYPNPrR-+r#Nd*iN2t}wo<7d3aHpF!Y@B2R8RNpAg@$^YL!u1&x#b65s& zFAJ@GWC#}bHkEGB6hcLvs_pM>g}q+m13$Z4d%WYT-u*V655d=Y{_KKNtB>GW>0diS zSNwb&hRYvWPKSAN@7Fi^Ix)$W4zXQ7HmI4+30C;sAvQ#V;d7E46k9bCgbSaSi@{!kRu0#mi5)_hc~Ys0G%_-mstdyU~JDg%y4GGJ6$J0bWOg z#hJQeynEVqBsPW!f6ORN^jO>wYZ~57`Y!5T*d*+Y{}HD33&uY2sE2d$7k-IHvz&wx zjP^gId5)%WEG<-uB-D;(biW+YSWF=-qJv6!b<<={L^joggi$_laF3Po{hXEmBNu8P z*E$a2P73kY01qmlO9kFJf#HWX4+j>sEtW9WG%#wynaJ(VK$)mc-cy9&X(l~+(!Z{b zkkUSxA45C}j9ZJErie8vq#8|#&CC*k%>Q`qAm8|R$J_elx8!H!gVe2##I&?5rx&6F zl}7&PHy7afN^$o;HKpMDR|HTI47+PEy_HcuoYf-&@AMD*(1lM_p0!*K=S?3z`u5F~ z4-k;Q+L%Skd0R`lJol;E#~`*l99=^7Q&44HBlLJJ>B&b5xW$f~pGa0{ABUOSzhLXQ zgGeZLH^@4zb3T_`>pH#yq0A^90j(K-_40#iOYg}+jc-RZ!}gi+awXUJq$=}}a;8AW zzoZh|(o2B?<+Wc)GYf%S!)x2v1-Pa5c>V>Id9%xCY~;>-QDqEwZ^dFJnKT=KkI_Em zVPsI^gsJ$&_4T{#;Tx(3;i^{F-3t}XPaV?7OR#RfapOv^4Q|9wQ8q@L_wRz9|I+oC zvupZgvGv>Y1@8K_S1@6HS=Wk~+)_KxW=>)$p+Q+eS_&p;8R5d(%Iaqmj=fV8m!R*=E*JsMFpTJ)K zE{B1U3=u%fYQ!S~n9pjQRnK^HB1I?R^;j~_(T4a_JH+(8Q-3`_D#$nZwsf{CPtyIW zV_&Aq=#L{A(RB%;Lu4jJe=<1!&W%O2wvdklpHPQ)L%;1TY6h)F3Sy4IDJ=Z+w82mD z&F^MKh7!|OUVKSII0uhm@;qNWXpLkqZC}ZtYy}>}ryi2S$5#bNzx=|Rzk9_?%vc*w zR(!~%+{CX!Ljx#QqU7+J`+E_L_JHbm;lX@Y9`l4}#ML&1>6<%0PMd!$P(R~vd(m;x zer2BEij!#Y_ZdX=1~XmAFCC^t1fsCjQFy;-qGWiq7SygP?QsYppwA_}&?r12e1j)Q z!XisThPBO1-t8+_XsKTqKPFyBh_=nY zo&R&P2q&7cZti`HqaoX;I$C%0 zVH^{~U}F0nm8q}|ysK0`Jbc#`Vuf$hz|YhvSRVKZ6h-5^B*W6EPjQ0snSx$DN0(Eg zF`2qK38h4eMl5gn-^YWC2^*0U?1P>cL_6bx1Q3Q~svAh>XN>rz+{6+8VaGmMR?sCJ zpd!_r0JdN3x42GL6q4g0MT z-ktC6bcx#=711+LQQ0-HuyLYj=xHP=7P=>ayvrEOp~6V{+K2Wp+++Up$d%6Mr!CTG zck=+qtWknjkyTEZ#LqQ3ZjDJP5Uu1|qoLVFPQfs~&j#4P_5G|Mg5Kk%KWadZP6P4h zXTmIt7hUXB%AzT|E8ECBkaLz*VBA4=YP(ImXptGjckchpE(UP7CcNzLAr?l*qNUq{ znV#ogqjo3ZQZ9kCaM+v=^$^g{7+e|X#}1Nd{s}wEhv|xs-=DT~MGGcBK|d}}-MqM8f^y#AI%0#cQ*2#_F5`kvBK%-)iC5g%=3HpsjPFl9#Tq` z>I`>VBQvj?+Eln&Np4{8K!d-A=P$`MsRPJ1j6}?V(`9-l;a6Uc@}lBeZgYh2S}*0{ z)Qm)9CZg1XC2F;I_drKXR@Fh{jheFEAL!hnt_C2von&dry8Fk;^gEVQpZxtK$#`d4 zf*n@Q!t+{X@icpc3ojGjjougm!h!!L$Bga(B!Hpk(0`nQ*R{S5$txeuLVeiK%u^K} zu@rgjg~r5`P-5vGFt;lG5fCE%nJ`*+ln|@{*3y}pwR|t1> z7alb1`ukufql(59w!dR3iEEsG%2HaqDqUx}|F;dzG{R&triCpZ2wcpeJWZL|wsxwC zb7aIf<`|76ToChd+kH~(1D25wf`hYR;i@XYe`7g2`OCbOd#3LO3I27WtejwiKP;wT z@f3bSMjJJQAl0@fr5^lUf;QMAeDF1RP}L|XdTHI>dIhX9BDStu*u*YMKq{+f$m5es zcZf%P;i4Aw6Bj|uY*5Gj5aJPKh2)T^tJ;!z`oEaY7uoWQsLtU^Vn)>$lk=j4ixa|Y z38R|vqrJ(ha|GMMCQ%{BAdFZr+>=;*{A|KUc{8(>v#lYPKnVV&Du;t5YSY8C&89iR z4<2q_hO6Up3zvGsbo9>*FO3d={oYB7Zsq=7NQN;L9f;k$#ab`aEOl}|( zDCC~|C=kyW9QOA&G~tRKxZU4@ax|U!XMMyLa8nYEBMMVq03NlYN*cD5UD)t!sWu{# z`9a#^IhGbvkS|W!Q^xKydQ;hY-?8i-h}I)JA%Rb}{z$a^>|U$GA0Q_K)g0HiPR36N zmW(M~%pX^?tsU5L&Vj27;=t&Xhkdcv!S-JDHrCROw<+20`@?(R5Q8l5?KTa#Xl2={ z3nW_>3>=n@v$hgd1He5W(CXt;HYb(+P9c^e)Msg{0<4=d{{P_rX5L~OW23)LaBe~L zWtT?kJWBq(mV@7$2>i0BEybRNF;YmdUgux4?~F5iTSjC%J5`}_wfO^ZWp#Gy2i}!D zSC4ZM!!9A5?7LEi1X4baZomilG)I`B=QOnMOnU^__GG*qFMR#xR|TiO*}mV%i;19x z;p3&GoK}-0`~Jxz&qZP zVV5;7i2MN?^y`aC!9N3Qfgi^J45K>T!a={Fs2vGys%%eD>#_-H2!A5mjnO*vBMqZM z6>X681OKD56W6rIR+Gv(QGI9EJLe$8EOwk@CeFN!fL9P+57x)e6BQ=6`?Na!J`K!K zTd1L0O>)T#gt~9Tg*e`5P7Z{P_-M3E=n=J*F{c_!QmPJ0nUB}TJ|Y&OX7kN;$2SYM zHc4|Np*~SEB3i>^EQCQ+Z7LV{GQYQrudWqDu9ygoEG0 zP#&y*k5cP;=IXD2w(exZMrD?ho3UVJG(Ri1VAevpPgemfm@`8MQWsV6o@El67=tx* zZb~gIjzI!n62cB+wv7jQP|ol^p`cFxR?XEYva_3-Mj7yD7O1@@Hm);jek$SUrCVfk z;@Gvs*Moj7E!EoN;+B#o?lOmL-BrqF?lB*o=Bs)-nu4+?&Ij>;k7o^oKcLb*)K?mm zHLN$i-QGo13;k}F`KzE8`)7OM)d5(gQQhZXcO6%n)dVMyV#I&6Ker<%ZK8%krEbus z-z_}UxNO9xll(lf>Q^tMZiHp$i#D9_PdIbZ+Ura2Lyz!o$3&&w4nCx~gA@pB_=MxT zHPiD#apCoeSHEu<#J+yRSrp_2ZO-19N$>LXB5Vj02w3F5QzyT?@+9E#))MZ#1f4ZV z$j{S2nf?LsxXVtIeDCw6$+S(<^3ag@Lvu=-va_a-B|nXvH%fNh!2B4fR8*eea&hvn z)ZYWw?sx`B!4LmAdOfCIUXLwecV4j0tC{}sISw^?@`G6DGpYQMs9vr$ux|>s^w_^b zUaKc*Rw4RI(Fe@Nkg%#7v#qj$i^k(OxV%Cx)-T;@sCxQ zPkd&Y(!$)c{nNabQ@cWwoK2Kgq|5OYv&f7lONb~d1uM!B4yY$rHOkVp6zS^17MAeY zYuAY+LHY|mX(hM%A^!@T|H!zuaH4$_OdL`QG2mtZNq{xR%CTPPs~`9L z7xWh0^!mF>E9)F0Zo|UXhO89Na`IvSFM<0YpY+c=mYq*g$Ei*mY1Se~xz;3spofBe zo6{TIi`7=ol}>SHW`(K7x=WOjIX|^+@l)`z7cICGgD@wuu)q)VLa!Ppw`bhY3+6*D zl`JF_e_K1fqwP-qcf@imn{XZ0K4lNnN zf7)M8S0WwcoH)P_Oiveqd6xrI?Og8XURDt-T$X3`xe;|so1Qt%ukAb}C9KQqJQVAZ z%?|x|Oxf&(el}EB6YY9rJI#0U^_JfV-w0d zchW8&x(Fk1tG=2|pNf!&l}kr1nwUto#j8l8|33?G+7eZ1l(5k_om$>Lb*B@vwr3~+ z9Hzh2L7KM+JrWA)WfcgCdEHLJoL@T{W}e$Si(EH;t(8&UH8n^+pT_d;(#Pp0eaTWa zopY1VeFLXr{uOs{FI%Wyab*j*tF(AxP*wX@dE%hKA{{?}kwxsIi@;sdHTuUQ@_|6} zXZMLrrtH`CmsUFHu`&pDgz4{bHHh}B!2DYmQt6(b+{12JJcmSWDShZA9XJ$__$U{P zjBHdTR6SKG?C-5#rYK#kuI%bgD2{d(OZd=Pcp2L!SXitCqPr~v*5}Dz6g}`{5O?AM zP)H%sIVZ(Au{o5;oCsn1F!E{u`bbKcka<$?WkeLI`iX9qi6j(vKGD8Q&CJ+*BP30D z?yc}U^VFR-c9mep?{mlIkAS()1ntl+I>^&$h#cKR`2qS-YJT^mu(;;@+lh*tnkW+3 zsVqx7_kPn{;#GHhuRy=1JLI(Bot3n;m&2#?aPrLu9R< zFP8bTL)9-^lfWcbrckN;iH|ORJ;U<>byasji4KBz-%GJ3ilwlSoWIw}#Bo( zWW!r4XGO|AKwK1LA1E7k6eROo6pqJ=85&itj=;0Ev!D|Yt0$4vS2*7@XfpY({yioJ zaKl-4UE}S~&%=Fuds59$WEA+8$>1Yq(`vTOcvT!{XvSkM)hpa6EvnUQg@k$wgDGWn zrth=8^Q_bLs?((MP{o!Kef#>vTJzcY#MWWa^g?oXY)^P~7OPCg>Ymzn6RlpVNWGzW zQA60Y5-N4t?8Qva;8zK^+C>QdxN!0jNjuK@t0cxxFbgy~%UME<| zR-X?WX!rBxV7RcM*(P>4tuXfG)Oq(SHabP4nWYLM-*u7gs^s(6y+FU{0 z(zv4eR#0)8g1S!qx6s&0LiYvbHfQx7ya~|E=t<MEkQTC| z{K3@^@`i%L0z8h=Z^e2?fdJUL!IhbRbyH`G|Bl~xs{K`Jr<#Wkat>6*nunufc!s1O z@@vq_a?fTl%c-YFUEjYbKytb`;$BtF6AfgF`zubswrWTf*!ftWM+#K)@$*-Jo7Qkc z8(JkZZLHK@(V^K#%g}Knv4Dl#pf}_HIO_nAG}K#3{77^7s0zZK1wEvZ#howQ8{zA4 zg2e{F9fzOO&iryjFpUKn6~#W%(y>)>e%v;FXD<&=3i?Bc4@LF(ep36eGg|3v3G71w zdy|L}vFV|}MfVura{g-2XruzJCgOaL#SEHM<2tZ3+BfN}-QNga#&Bw!^u}K%9?Tt8 z+Qh6ieKM|_y8tb!E=~Q#TUuH0?<|ks%8nT{If!1*>6KQd{aPqZ2s+V6x9rIoPW6~s zJ<{ZF^o`zZ-FiNYjX-2HD2`*cCjSaC^6|0@3bd`_UD?yt^(vX4n?yA*F$Z1Y$VI<5%YjTgUi(c3o=`Me>l~I6)X;w*xxY;%nvx<#Ptb(J%~)kQnt<{+ z>W_p3lfRsVhJa36VbQ~sv387;>ucrliIJU97w2rg6JR0eHvI}$W;f^F;Z06JPfhBCK`5dQ;b1EpPw!RdF-}aNz`f2 zX#58FPy<6HoW4f109Aox!79B62)CP48jTRo*3lHt9HY0bZnjY_LsOf7^F^!gYoFSX z-U$%SWba(`5~<#-j^#YneBddRwcFJhCWv!vgPx&rR}NhNb=-?Pl@-c=kHhQqk+L;o zmr}*vvWGb67FhY=A5#x}YE@h;$^+wfRNTn88`#{hZm)HEIxTK<5cuq8NRnF0 zzAnbZA$1Z&MA4?;`Vygo&%8y)>_py;oE-C;I>nxw0g#%)yv zU5ak8zfI7jZc$TT7-{9vdHNsH%E}&)|D=ZEA3otzL9IOSD&JWOZ-vc7KvFK9>JvqJ zXz|0<5+>Ry?StcfG=b#PmL>a7glyS9ZxLagh8O;!#u&hUYMCTM(^@I_tIFeY$ZFtB z-H;ke^JU}yj^%f*t>sy3I!+qAf{XxP@6e;bh*eK9{v3cXux)WnJV=gLp$Q0&tTc5-LL^IvQ#{?d<6{MqzHenJ z6l@Bmn$e_g4~&xzl&vo{lwP-dH1O#mm~Zsiq@0vt1f^j-G{9s(e3UU}4{ct(#sPOI zMG#7|q=+3e-qVA#KDn`$b>kO~VmkE&HVbYq#kV`t#(8JnEs7vSC!sF93n?Bj|FeE( zESuj2nR_=I40t(ALL-w+e|Jaoq#5mq33FD4SZl!IPnuKY93pkTjGBD3eB5Tj8Rma> zKSDR;Bv2dm;{6IO1njRaZ#6of^HaN{sI+o)zhCRLZ7XX!o?qqLln@~HpQ^zEi0L`Qr(GGulfzv-%+4lx052Bf^JNq66?%be!phy2MP zqboh=Grov}gR!&dz={Q|VT|&u8e@Pue@aND?KyFjYYUOp^8Q@MuxY17yUIAKOc$d< zYk`)f1m3W03qNkq{D^KiCyhGgfy+a-Xr+cjc)cFaIc0&yV(sb=jdd1Tb}D}sOYuY7 z8TY#vPTY?-m6q!eXw89Pw{_}1o-UsSiF~oq_r`rld1^SY>a8%r5vJn*5|fDH4ij(7 zGE~LWst!8F++8tmOx|or&mA&0o7Som)ewg8&h8WU+HCn%{!=3L(-Czp6nP&Jc-(h} z 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 R=PuxQ{mb`U^|v9n{u@WCHD~|; diff --git a/retrodeck.sh b/retrodeck.sh index 52fb6f44..5e28a6b9 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -1,16 +1,6 @@ #!/bin/bash -# workaround to fix a bug when updating to 0.5.0b where the post update is not triggered -# basically from 0.5 it's not reading the version from the lockfile so it doesn't know from which version it came from and the new rule of global.sh is that if version is unknown it's like a first boot -# remove it in the future -lockfile="/var/config/retrodeck/.lock" -if [[ $(cat $lockfile) == *"0.4."* ]] || [[ $(cat $lockfile) == *"0.3."* ]] || [[ $(cat $lockfile) == *"0.2."* ]] || [[ $(cat $lockfile) == *"0.1."* ]] -then - echo "Running version workaround" - version=$(cat $lockfile) -fi - -source /app/bin/global.sh +source /app/libexec/global.sh # We moved the lockfile in /var/config/retrodeck in order to solve issue #53 - Remove in a few versions if [ -f "$HOME/retrodeck/.lock" ] @@ -18,605 +8,6 @@ then mv "$HOME/retrodeck/.lock" $lockfile fi -# Functions area - -dir_prep() { - # This script is creating a symlink preserving old folder contents and moving them in the new one - - # Call me with: - # dir prep "real dir" "symlink location" - real="$1" - symlink="$2" - - echo -e "\n[DIR PREP]\nMoving $symlink in $real" #DEBUG - - # if the dest dir exists we want to backup it - if [ -d "$symlink" ]; - then - echo "$symlink found" #DEBUG - mv -fv "$symlink" "$symlink.old" - 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" - fi - - # creating the symlink - echo "linking $real in $symlink" #DEBUG - mkdir -pv "$(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 - mv -fv "$symlink".old/* $real - echo "Removing $symlink.old" #DEBUG - rm -rf "$symlink.old" - fi - - echo -e "$symlink is now $real\n" -} - -tools_init() { - rm -rfv /var/config/retrodeck/tools/ - mkdir -pv /var/config/retrodeck/tools/ - cp -rfv /app/retrodeck/tools/* /var/config/retrodeck/tools/ - mkdir -pv /var/config/emulationstation/.emulationstation/custom_systems/tools/ - rm -rfv /var/config/retrodeck/tools/gamelist.xml - cp -fv /app/retrodeck/tools-gamelist.xml /var/config/retrodeck/tools/gamelist.xml -} - -standalones_init() { - # This script is configuring the standalone emulators with the default files present in emuconfigs folder - - echo "----------------------" - echo "Initializing standalone emulators" - echo "----------------------" - - # Yuzu - echo "----------------------" - echo "Initializing YUZU" - echo "----------------------" - # removing dead symlinks as they were present in a past version - if [ -d $rdhome/bios/switch ]; then - find $rdhome/bios/switch -xtype l -exec rm {} \; - fi - # initializing the keys folder - dir_prep "$rdhome/bios/switch/keys" "/var/data/yuzu/keys" - # initializing the firmware folder - dir_prep "$rdhome/bios/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" - # initializing the save folders - dir_prep "$rdhome/saves/switch/yuzu/nand" "/var/data/yuzu/nand" - dir_prep "$rdhome/saves/switch/yuzy/sdmc" "/var/data/yuzu/sdmc" - # configuring Yuzu - dir_prep "$rdhome/.logs/yuzu" "/var/data/yuzu/log" - mkdir -pv /var/config/yuzu/ - cp -fvr $emuconfigs/yuzu/* /var/config/yuzu/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/yuzu/qt-config.ini - dir_prep "$rdhome/screenshots" "/var/data/yuzu/screenshots" - - # Dolphin - echo "----------------------" - echo "Initializing DOLPHIN" - echo "----------------------" - mkdir -pv /var/config/dolphin-emu/ - cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/dolphin-emu/Dolphin.ini - dir_prep "$rdhome/saves/gc/dolphin/EUR" "/var/data/dolphin-emu/GC/EUR" - dir_prep "$rdhome/saves/gc/dolphin/USA" "/var/data/dolphin-emu/GC/USA" - dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" - dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" - dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" - dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" - - # pcsx2 - echo "----------------------" - echo "Initializing PCSX2" - echo "----------------------" - mkdir -pv "/var/config/PCSX2/inis" - mkdir -pv "$rdhome/saves/ps2/pcsx2/memcards" - mkdir -pv "$rdhome/states/ps2/pcsx2" - cp -fvr $emuconfigs/PCSX2/* /var/config/PCSX2/inis/ - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini - #dir_prep "$rdhome/states/ps2/pcsx2" "/var/config/PCSX2/sstates" - #dir_prep "$rdhome/screenshots" "/var/config/PCSX2/snaps" - #dir_prep "$rdhome/.logs" "/var/config/PCSX2/logs" - #dir_prep "$rdhome/bios" "$rdhome/bios/pcsx2" - - # MelonDS - echo "----------------------" - echo "Initializing MELONDS" - echo "----------------------" - mkdir -pv /var/config/melonDS/ - mkdir -pv "$rdhome/saves/nds/melonds" - mkdir -pv "$rdhome/states/nds/melonds" - dir_prep "$rdhome/bios" "/var/config/melonDS/bios" - cp -fvr $emuconfigs/melonDS.ini /var/config/melonDS/ - # Replace ~/retrodeck with $rdhome as ~ cannot be understood by MelonDS - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/melonDS/melonDS.ini - - # CITRA - echo "------------------------" - echo "Initializing CITRA" - echo "------------------------" - mkdir -pv /var/config/citra-emu/ - mkdir -pv "$rdhome/saves/n3ds/citra/nand/" - mkdir -pv "$rdhome/saves/n3ds/citra/sdmc/" - dir_prep "$rdhome/bios/citra/sysdata" "/var/data/citra-emu/sysdata" - dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log" - cp -fv $emuconfigs/citra-qt-config.ini /var/config/citra-emu/qt-config.ini - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini - #TODO: do the same with roms folders after new variables is pushed (check even the others qt-emu) - #But actually everything is always symlinked to retrodeck/roms so it might be not needed - #sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini - - # RPCS3 - echo "------------------------" - echo "Initializing RPCS3" - echo "------------------------" - mkdir -pv /var/config/rpcs3/ - cp -fvr $emuconfigs/rpcs3/* /var/config/rpcs3/ - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/rpcs3/vfs.yml - - # XEMU - echo "------------------------" - echo "Initializing XEMU" - echo "------------------------" - mkdir -pv $rdhome/saves/xbox/xemu/ - cp -fv $emuconfigs/xemu.toml /var/data/xemu/xemu.toml - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml - # Preparing HD dummy Image if the image is not found - if [ ! -f $rdhome/bios/xbox_hdd.qcow2 ] - then - wget "https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip" -P $rdhome/bios/ - unzip -q $rdhome/bios/xbox_hdd.qcow2.zip $rdhome/bios/ - rm -rfv $rdhome/bios/xbox_hdd.qcow2.zip - fi - - # PPSSPPSDL - echo "------------------------" - echo "Initializing PPSSPPSDL" - echo "------------------------" - mkdir -p /var/config/ppsspp/PSP/SYSTEM/ - cp -fv $emuconfigs/ppssppsdl/* /var/config/ppsspp/PSP/SYSTEM/ - sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/ppsspp/PSP/SYSTEM/ppsspp.ini - - # DUCKSTATION - echo "------------------------" - echo "Initializing DUCKSTATION" - echo "------------------------" - mkdir -p /var/config/duckstation/ - cp -fv $emuconfigs/duckstation/* /var/config/duckstation - sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/ppsspp/PSP/SYSTEM/settings.ini - - - # PICO-8 - # Moved PICO-8 stuff in the finit as only it knows here roms folders is - -} - -ra_init() { - dir_prep "$rdhome/bios" "/var/config/retroarch/system" - dir_prep "$rdhome/.logs/retroarch" "/var/config/retroarch/logs" - mkdir -pv /var/config/retroarch/shaders/ - cp -rfv /app/share/libretro/shaders /var/config/retroarch/ - dir_prep "$rdhome/shaders/retroarch" "/var/config/retroarch/shaders" - mkdir -pv /var/config/retroarch/cores/ - cp /app/share/libretro/cores/* /var/config/retroarch/cores/ - cp -fv $emuconfigs/retroarch.cfg /var/config/retroarch/ - cp -fv $emuconfigs/retroarch-core-options.cfg /var/config/retroarch/ - cp -rfv $emuconfigs/retroarch-core-overrides/* /var/config/retroarch/config - #rm -rf $rdhome/bios/bios # in some situations a double bios symlink is created - sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/retroarch/retroarch.cfg - - # PPSSPP - echo "--------------------------------" - echo "Initializing PPSSPP_LIBRETRO" - echo "--------------------------------" - if [ -d $rdhome/bios/PPSSPP/flash0/font ] - then - mv -fv $rdhome/bios/PPSSPP/flash0/font $rdhome/bios/PPSSPP/flash0/font.bak - fi - mkdir -p $rdhome/bios/PPSSPP - #if [ ! -f "$rdhome/bios/PPSSPP/ppge_atlas.zim" ] - #then - wget "https://github.com/hrydgard/ppsspp/archive/refs/heads/master.zip" -P $rdhome/bios/PPSSPP - unzip -q "$rdhome/bios/PPSSPP/master.zip" -d $rdhome/bios/PPSSPP/ - mv "$rdhome/bios/PPSSPP/ppsspp-master/assets/"* "$rdhome/bios/PPSSPP/" - rm -rfv "$rdhome/bios/PPSSPP/master.zip" - rm -rfv "$rdhome/bios/PPSSPP/ppsspp-master" - #fi - if [ -d $rdhome/bios/PPSSPP/flash0/font.bak ] - then - mv -fv $rdhome/bios/PPSSPP/flash0/font.bak $rdhome/bios/PPSSPP/flash0/font - fi - - - # MSX / SVI / ColecoVision / SG-1000 - echo "-----------------------------------------------------------" - echo "Initializing MSX / SVI / ColecoVision / SG-1000 LIBRETRO" - echo "-----------------------------------------------------------" - wget "http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip" -P $rdhome/bios/MSX - unzip -q "$rdhome/bios/MSX/blueMSXv282full.zip" $rdhome/bios/MSX - mv -rfv $rdhome/bios/MSX/Databases $rdhome/bios/Databases - mv -rfv $rdhome/bios/MSX/Machines $rdhome/bios/Machines - rm -rfv $rdhome/bios/MSX - -} - -create_lock() { - # creating RetroDECK's lock file and writing the version in the config file - version=$hard_version - touch "$lockfile" - conf_write -} - -post_update() { - # post update script - echo "Executing post-update script" - - # Finding existing ROMs folder - if [ -d "$default_sd/retrodeck" ] - then - # ROMs on SD card - roms_folder="$default_sd/retrodeck/roms" - if [[ ! -L $rdhome && ! -L $rdhome/roms ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory - ln -s $roms_folder $rdhome/roms - fi - else - # ROMs on Internal - roms_folder="$HOME/retrodeck/roms" - fi - echo "ROMs folder found at $roms_folder" - - # Unhiding downloaded media from the previous versions - if [ -d "$rdhome/.downloaded_media" ] - then - mv -fv "$rdhome/.downloaded_media" "$media_folder" - fi - - # Unhiding themes folder from the previous versions - if [ -d "$rdhome/.themes" ] - then - mv -fv "$rdhome/.themes" "$themes_folder" - fi - - # Doing the dir prep as we don't know from which version we came - dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" - dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" - mkdir -pv $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/.emulationstation/es_settings.xml - - - # 0.4 -> 0.5 - # Perform save and state migration if needed - - # Moving PCSX2 Saves - mv -fv /var/config/PCSX2/sstates/* $rdhome/states/ps2/pcsx2 - mv -fv /var/config/PCSX2/memcards/* $rdhome/saves/ps2/memcards - - # Moving Citra saves from legacy location to 0.5.0b structure - - mv -fv $rdhome/saves/Citra/* $rdhome/saves/n3ds/citra - rmdir $rdhome/saves/Citra # Old folder cleanup - - versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves - - if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 - migration_logfile=$rdhome/.logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log" - save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" - state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" - - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="You are updating to a version of RetroDECK where save file locations have changed!\n\nYour existing files will be backed up for safety and then sorted automatically.\n\nIf a file cannot be sorted automatically it will remain where it is for manual sorting.\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." - - allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder - - allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder - - allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder - - totalsaves=${#allsaves[@]} - totalstates=${#allstates[@]} - filesleft= - current_dest_folder= - gamestoskip= - - tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety - echo "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 - - ( - movefile() { # Take matching save and rom files and sort save into appropriate system folder - echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar - progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) - echo $progress - filesleft=$((filesleft-1)) - if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually - game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder - gamebasename=$(basename "$game" | sed -e 's/\..*//') # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to - matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found - if [[ ${#matches[@]} -gt 1 ]]; then - echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile - gamestoskip+=("$1") - return - fi - echo "INFO: Examining ROM file:" "$game" >> $migration_logfile - echo "INFO: 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 - 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 - 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 - fi - } - - find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script - - totalfiles=$totalsaves #set variables for save file migration - filesleft=$totalsaves - currentlybeingmoved="saves" - current_dest_folder=$saves_folder - - for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match - found= - currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 - for j in "${allgames[@]}"; do - currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - [[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip - done - [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file - done - - totalfiles=$totalstates #set variables for state file migration - filesleft=$totalstates - currentlybeingmoved="states" - current_dest_folder=$states_folder - - for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match - found= - currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 - for j in "${allgames[@]}"; do - currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - [[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip - done - [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file - done - - ) | - zenity --progress \ - --icon-name=net.retrodeck.retrodeck \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title="Processing Files" \ - --text="# files remaining..." \ - --percentage=0 \ - --no-cancel \ - --auto-close - - if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." - - else - cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" - fi - - else - echo "Version" $version "is after the save and state organization was changed, no need to sort again" - fi - - ( - ra_init - standalones_init - tools_init - ) | - 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." - - create_lock -} - -start_retrodeck() { - # normal startup - echo "Starting RetroDECK v$version" - emulationstation --home /var/config/emulationstation -} - -browse(){ - # Function for browsing the sd card - path_selected=false - while [ $path_selected == false ] - do - sdcard="$(zenity --file-selection --title="Choose retrodeck folder location" --directory)" - # echo "Path choosed: $sdcard, answer=$?" # This echo breaks this function, the next "if" will always be answered yes if it is here - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ - --cancel-label="No" \ - --ok-label "Yes" \ - --text="Your rom folder will be:\n\n$sdcard/retrodeck/roms\n\nis that ok?" - if [ $? == 0 ] #yes - then - path_selected == true - roms_folder="$sdcard/retrodeck/roms" - break - else - zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" - if [ $? == 0 ] # yes, quit - then - exit 0 - fi - fi - done -} - -#advanced(){ -# # function to give advanced install options -# echo "Advaced choosed" -# -# choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ -# --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ -# --ok-label "ROMs" \ -# --extra-button "Media" \ -# --extra-button "Themes" \ -# --extra-button "Back" \ -# --text="What do you want to change?\n\nROMS folder = $roms_folder\nMedia folder (scraped data) = $media_folder\nThemes folder=$themes_folder" ) -# echo "Choice is $choice" -# -# case $choice in -# -# "" ) # Internal (yes) -# echo "ROMs" -# ;; -# -# "Media" ) -# echo "Media" -# ;; -# -# "Themes" ) -# echo "Themes" -# ;; -# -# "Back" ) # Browse + not found fallback -# echo "Back" -# finit -# ;; -# -# esac -#} - -finit() { - # Force/First init, depending on the situation - - echo "Executing finit" - - # Internal or SD Card? - choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ - --ok-label "Cancel" \ - --extra-button "Internal" \ - --extra-button "SD Card" \ - --text="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 roms folder to be located?" ) - echo "Choice is $choice" - - case $choice in - - "" ) # Cancel or X button quits - echo "Now quitting" - kill $$ - ;; - - "Internal" ) # Internal - echo "Internal selected" - roms_folder="$rdhome/roms" - ;; - - "SD Card" ) - echo "SD Card selected" - if [ ! -d "$sdcard" ] # SD Card path is not existing - then - echo "Error: SD card not found" - zenity --question --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" --cancel-label="Cancel" \ - --ok-label "Browse" \ - --text="SD Card was not find in the default location.\nPlease choose the SD Card root.\nA retrodeck/roms folder will be created starting from the directory that you selected." - browse # Calling the browse function - else - roms_folder="$sdcard/retrodeck/roms" # sdcard variable is correct as its given by browse function - echo "ROMs folder = $roms_folder" - fi - ;; - - #"Advanced" ) # Browse + not found fallback - # echo "Advanced" - # advanced - #;; - - esac - - mkdir -pv $roms_folder - - # TODO: after the next update of ES-DE this will not be needed - #zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --text="EmulationStation will now initialize the system.\nPlease DON'T EDIT THE ROMS LOCATION, just select:\n\nCREATE DIRECTORIES\nYES\nOK\nQUIT\n\nRetroDECK will manage the rest." - 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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." - - # Recreating the folder - rm -rfv /var/config/emulationstation/ - rm -rfv /var/config/retrodeck/tools/ - mkdir -pv /var/config/emulationstation/ - - # Initializing ES-DE - # TODO: after the next update of ES-DE this will not be needed - let's test it - emulationstation --home /var/config/emulationstation --create-system-dirs - - mkdir -pv /var/config/retrodeck/tools/ - - #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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." - - # Initializing ROMs folder - Original in retrodeck home (or SD Card) - dir_prep $roms_folder "/var/config/emulationstation/ROMs" - - mkdir -pv $rdhome/saves - mkdir -pv $rdhome/states - mkdir -pv $rdhome/screenshots - mkdir -pv $rdhome/bios/pico8 - mkdir -pv $rdhome/.logs - - # XMLSTARLET HERE - cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml - - # ES-DE preparing themes and scraped folders - dir_prep "$rdhome/downloaded_media" "/var/config/emulationstation/.emulationstation/downloaded_media" - dir_prep "$rdhome/themes" "/var/config/emulationstation/.emulationstation/themes" - - # PICO-8 - dir_prep "$roms_folder/pico8" "$rdhome/bios/pico8/bbs/carts" #this is the folder where pico-8 is saving the carts - - ( - ra_init - standalones_init - tools_init - ) | - 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." - create_lock - - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="Installation completed.\nPlease put your roms in:\n\n$roms_folder\n\nand your bioses in\n\n$rdhome/bios\n\nThen start the program again.\nIf you wish to change the roms location, you may use the tool located the tools section of RetroDECK.\n\nIMPORTANT NOTES:\n- RetroDECK must be manually added and launched from your Steam Library in order to work correctly.\n- It's recommended to use the 'RetroDECK Offical Controller Config' from Steam (under community layouts).\n- It's suggested to use BoilR to automatically add the SteamGridDB images to Steam (this will be automated soon).\nhttps://github.com/PhilipK/BoilR" - # TODO: Replace the stuff above with BoilR code when ready -} - # Arguments section for i in "$@"; do @@ -684,9 +75,6 @@ done # if lockfile exists if [ -f "$lockfile" ] then - - #conf_init # Initializing/reading the config file (sourced from global.sh) - # ...but the version doesn't match with the config file if [ "$hard_version" != "$version" ]; then @@ -696,12 +84,10 @@ then start_retrodeck exit 0 fi - # 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" - #conf_init # Initializing/reading the config file (sourced from global.sh) finit # Executing First/Force init conf_write # Writing variables in the config file (sourced from global.sh) exit 0 diff --git a/tools/configurator.sh b/tools/configurator.sh index 6e21b4a6..0a6aab18 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -2,11 +2,11 @@ # VARIABLES SECTION -rd_conf="retrodeck.cfg" # uncomment for standalone testing -source functions.sh # uncomment for standalone testing +#rd_conf="retrodeck.cfg" # uncomment for standalone testing +#source functions.sh # uncomment for standalone testing -#source /app/bin/global.sh # uncomment for flatpak testing -#source /app/libexec/functions.sh # uncomment for flatpak testing +source /app/libexec/global.sh # uncomment for flatpak testing +source /app/libexec/functions.sh # uncomment for flatpak testing # Config files for emulators with single config files @@ -14,7 +14,6 @@ citraconf="/var/config/citra-emu/qt-config.ini" melondsconf="/var/config/melonDS/melonDS.ini" rpcs3conf="/var/config/rpcs3/config.yml" yuzuconf="/var/config/yuzu/qt-config.ini" -source $rd_conf # ES-DE config files @@ -80,7 +79,7 @@ pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" # DIALOG TREE FUNCTIONS configurator_reset_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" --width=800 --height=600 \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Reset RetroArch" "Reset RetroArch to default settings" \ @@ -98,7 +97,7 @@ configurator_reset_dialog() { "Reset Specific Standalone" ) emulator_to_reset=$(zenity --list \ - --title "RetroDECK Configurator Utility - Reset Specific Standalone Emulator" --cancel-label="Back" --width=800 --height=600 \ + --title "RetroDECK Configurator Utility - Reset Specific Standalone Emulator" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Which emulator do you want to reset to default?" \ --hide-header \ @@ -184,7 +183,7 @@ configurator_reset_dialog() { ;; "Reset All" ) - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --width=800 --height=600 \ + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Reset RetroDECK" \ --text="You are resetting RetroDECK to its default state.\n\nAfter the process is complete you will need to exit RetroDECK and run it again." @@ -200,7 +199,7 @@ configurator_reset_dialog() { } configurator_retroachivement_dialog() { - login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" --width=800 --height=600 \ + login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Enter your RetroAchievements Account details.\n\nBe aware that this tool cannot verify your login details.\nFor registration and more info visit\nhttps://retroachievements.org/\n" \ --separator="=SEP=" \ @@ -231,7 +230,7 @@ configurator_update_dialog() { } configurator_power_user_changes_dialog() { - zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" --width=800 --height=600 \ + zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\n\nplease continue only if you know what you're doing.\n\nDo you want to continue?" @@ -241,7 +240,7 @@ configurator_power_user_changes_dialog() { fi emulator=$(zenity --list \ - --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" --width=800 --height=600 \ + --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Which emulator do you want to configure?" \ --hide-header \ @@ -313,7 +312,7 @@ configurator_power_user_changes_dialog() { configurator_retroarch_rewind_dialog() { if [[ $(get_setting_value $raconf rewind_enable retroarch) == "true" ]]; then - zenity --question --width=800 --height=600 \ + zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Rewind" \ --text="Rewind is currently enabled. Do you want to disable it?." @@ -326,7 +325,7 @@ configurator_retroarch_rewind_dialog() { configurator_options_dialog fi else - zenity --question --width=800 --height=600 \ + zenity --question \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - Rewind" \ --text="Rewind is currently disabled, do you want to enable it?\n\nNOTE:\nThis may impact performance expecially on the latest systems." @@ -342,7 +341,7 @@ configurator_retroarch_rewind_dialog() { } configurator_retroarch_options_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" --width=800 --height=600 \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Change Rewind Setting" "Enable or disable the Rewind function in RetroArch" ) @@ -361,7 +360,7 @@ configurator_retroarch_options_dialog() { } configurator_options_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" --width=800 --height=600 \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Change RetroArch Settings" "Change settings specific to RetroArch" \ @@ -385,12 +384,13 @@ configurator_options_dialog() { } configurator_move_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" --width=800 --height=600 \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Move ROMs" "Move your ROMs directory to a new location" \ "Move BIOS" "Move your BIOS directory to a new location" \ - "Move Downloaded Media" "Move your downloaded media directory to a new location" ) + "Move Downloaded Media" "Move your downloaded media directory to a new location" \ + "Move Everything" "Move the entire RetroDECK user directory to a new location" ) case $choice in @@ -576,7 +576,6 @@ configurator_move_dialog() { ;; esac - } configurator_welcome_dialog() { @@ -587,7 +586,7 @@ configurator_welcome_dialog() { setting= setting_value= - choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" --width=800 --height=600 \ + choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --column="Choice" --column="Action" \ "Move Files" "Move files between internal/SD card or to custom locations" \ From 4ebd2cea1173aa5b377994e125a53aee4b505057 Mon Sep 17 00:00:00 2001 From: XargonWan <6771419+XargonWan@users.noreply.github.com> Date: Wed, 26 Oct 2022 15:14:36 +0200 Subject: [PATCH 12/46] Fixed cooker version [skip ci] --- net.retrodeck.retrodeck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index e3943370..abadb705 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -76,7 +76,7 @@ modules: - | git checkout ${GITHUB_REF_NAME} mkdir -p ${FLATPAK_DEST}/retrodeck/ - VERSION="0.5.3b" + VERSION="cooker-0.5.3b" if [[ $VERSION == *"cooker"* ]]; then VERSION="cooker-"$(git rev-parse --short HEAD) From 0c1bfe962dd36ba1d3709f5210472073a918c090 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Wed, 26 Oct 2022 12:51:46 -0400 Subject: [PATCH 13/46] Setup more backend, move functions should be ready --- emu-configs/defaults/dolphin/Dolphin.ini | 4 +- emu-configs/defaults/dolphin/GBA.ini | 18 + emu-configs/defaults/duckstation/settings.ini | 12 +- emu-configs/dolphin/Dolphin.ini | 8 +- functions.sh | 173 ++- global.sh | 30 + tools/configurator.sh | 1008 +++++++++-------- 7 files changed, 751 insertions(+), 502 deletions(-) create mode 100644 emu-configs/defaults/dolphin/GBA.ini diff --git a/emu-configs/defaults/dolphin/Dolphin.ini b/emu-configs/defaults/dolphin/Dolphin.ini index db74b4ea..78748c52 100644 --- a/emu-configs/defaults/dolphin/Dolphin.ini +++ b/emu-configs/defaults/dolphin/Dolphin.ini @@ -43,13 +43,13 @@ Enabled = False [DSP] EnableJIT = False [GBA] -BIOS = /home/deck/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu/GBA/gba_bios.bin +BIOS = Rom1 = Rom2 = Rom3 = Rom4 = SavesInRomPath = False -SavesPath = /home/deck/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu/GBA/Saves/ +SavesPath = Threads = True [Input] BackgroundInput = False diff --git a/emu-configs/defaults/dolphin/GBA.ini b/emu-configs/defaults/dolphin/GBA.ini new file mode 100644 index 00000000..1956cf71 --- /dev/null +++ b/emu-configs/defaults/dolphin/GBA.ini @@ -0,0 +1,18 @@ +[GBA1] +Device = XInput2/0/Virtual core pointer +Buttons/B = `Z` +Buttons/A = `X` +Buttons/L = `Q` +Buttons/R = `W` +Buttons/SELECT = `Backspace` +Buttons/START = `Return` +D-Pad/Up = `T` +D-Pad/Down = `G` +D-Pad/Left = `F` +D-Pad/Right = `H` +[GBA2] +Device = XInput2/0/Virtual core pointer +[GBA3] +Device = XInput2/0/Virtual core pointer +[GBA4] +Device = XInput2/0/Virtual core pointer \ No newline at end of file diff --git a/emu-configs/defaults/duckstation/settings.ini b/emu-configs/defaults/duckstation/settings.ini index e6bff72f..3f181da1 100644 --- a/emu-configs/defaults/duckstation/settings.ini +++ b/emu-configs/defaults/duckstation/settings.ini @@ -44,7 +44,7 @@ FastmemMode = MMap [GPU] Renderer = OpenGL -Adapter = +Adapter = ResolutionScale = 1 Multisamples = 1 UseDebugDevice = false @@ -114,7 +114,7 @@ SeekSpeedup = 1 [Audio] Backend = Cubeb -Driver = +Driver = StretchMode = TimeStretch BufferMS = 50 OutputLatencyMS = 20 @@ -166,7 +166,7 @@ PrimedIndicators = true [Logging] LogLevel = Info -LogFilter = +LogFilter = LogToConsole = true LogToDebug = false LogToWindow = false @@ -207,6 +207,10 @@ Shaders = shaders Textures = textures +[UI] +MainWindowGeometry = AdnQywADAAAAAAGWAAAAeQAABLUAAAM0AAABlgAAAHkAAAS1AAADNAAAAAAAAAAABk0AAAGWAAAAeQAABLUAAAM0 + + [InputSources] SDL = true SDLControllerEnhancedMode = false @@ -280,4 +284,4 @@ OpenPauseMenu = Keyboard/Escape LoadSelectedSaveState = Keyboard/F1 SaveSelectedSaveState = Keyboard/F2 SelectPreviousSaveStateSlot = Keyboard/F3 -SelectNextSaveStateSlot = Keyboard/F4 +SelectNextSaveStateSlot = Keyboard/F4 \ No newline at end of file diff --git a/emu-configs/dolphin/Dolphin.ini b/emu-configs/dolphin/Dolphin.ini index 59737d0f..bfa1e7c2 100644 --- a/emu-configs/dolphin/Dolphin.ini +++ b/emu-configs/dolphin/Dolphin.ini @@ -25,10 +25,10 @@ Fullscreen = True DisableScreenSaver = True [GBA] BIOS = ~/retrodeck/bios -Rom1 = -Rom2 = -Rom3 = -Rom4 = +Rom1 = +Rom2 = +Rom3 = +Rom4 = SavesInRomPath = False SavesPath = ~/retrodeck/saves/gba Threads = True diff --git a/functions.sh b/functions.sh index 6bc9ea68..e4b3d651 100644 --- a/functions.sh +++ b/functions.sh @@ -43,7 +43,7 @@ verify_space() { # USAGE: verify_space $source_dir $dest_dir # Function returns "true" if there is enough space, "false" if there is not - source_size=$(du -sk /home/deck/retrodeck | awk '{print $1}') + source_size=$(du -sk $1 | awk '{print $1}') source_size=$((source_size+(source_size/10))) # Add 10% to source size for safety dest_avail=$(df -k --output=avail $2 | tail -1) @@ -143,6 +143,59 @@ get_setting_name() { # Function for getting the setting name from a full setting line from a config file # USAGE: get_setting_name $setting_line $system (needed as different systems use different config file syntax) + case $2 in + + "retrodeck" ) + echo "$1" | grep -o -P ".*(?=\=)" + ;; + + "retroarch" ) + echo "$1" | grep -o -P ".*(?= \= )" + ;; + + "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters + echo "$1" | grep -o -P ".*(?= \= )" + ;; + + "duckstation" ) + echo "$1" | grep -o -P ".*(?= \= )" + ;; + + "pcsx2" ) + echo "$1" | grep -o -P ".*(?= \= )" + ;; + + "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces + echo "$1" | grep -o -P ".*(?= \= )" + ;; + + "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces + echo "$1" | grep -o -P ".*(?=:)" + ;; + + "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo '$yuzu_setting' | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' + ;; + + "citra" ) # Use quotes when passing setting_name, as this config file contains special characters + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$1") # Accomodate for backslashes in setting names + echo '$citra_setting' | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' + ;; + + "melonds" ) + echo "$1" | grep -o -P ".*(?=\=)" + ;; + + "xemu" ) + echo "$1" | grep -o -P ".*(?= \= )" + ;; + + "emulationstation" ) + echo '$1' | grep -o -P "(?<=name\=\").*(?=\" value)" + ;; + +esac } get_setting_value() { @@ -205,11 +258,129 @@ esac } disable_setting() { + # This function will add a '#' to the beginning of a defined setting line, disabling it. + # USAGE: disable_setting $setting_file $setting_name $system + case $3 in + + "retrodeck" ) + sed -i "s%^$2=%#$2=%" $1 + ;; + + "retroarch" ) + sed -i "s%^$2 = %#$2 = %" $1 + ;; + + "dolphin" ) + sed -i "s%^$2 = %#$2 = %" $1 + ;; + + "duckstation" ) + sed -i "s%^$2 = %#$2 = %" $1 + ;; + + "pcsx2" ) + sed -i "s%^$2 = %#$2 = %" $1 + ;; + + "ppsspp" ) + sed -i "s%^$2 = %#$2 = %" $1 + ;; + + "rpcs3" ) # This does not currently work for settings with a $ in them + sed -i "s%^$2: %#$2: %" $1 + ;; + + "yuzu" ) + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%^$yuzu_setting=%#$yuzu_setting=%" $1 + ;; + + "citra" ) + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%^$citra_setting=%#$citra_setting=%" $1 + ;; + + "melonds" ) + sed -i "s%^$2=%#$2=%" $1 + ;; + + "xemu" ) + sed -i "s%^$2 = %#$2 = %" $1 + ;; + +esac } enable_setting() { + # This function will remove a '#' to the beginning of a defined setting line, enabling it. + # USAGE: enable_setting $setting_file $setting_name $system + case $3 in + + "retrodeck" ) + sed -i "s%^#$2=%$2=%" $1 + ;; + + "retroarch" ) + sed -i "s%^#$2 = %$2 = %" $1 + ;; + + "dolphin" ) + sed -i "s%^#$2 = %$2 = %" $1 + ;; + + "duckstation" ) + sed -i "s%^#$2 = %$2 = %" $1 + ;; + + "pcsx2" ) + sed -i "s%^#$2 = %$2 = %" $1 + ;; + + "ppsspp" ) + sed -i "s%^#$2 = %$2 = %" $1 + ;; + + "rpcs3" ) # This does not currently work for settings with a $ in them + sed -i "s%^#$2: %$2: %" $1 + ;; + + "yuzu" ) + yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%^#$yuzu_setting=%$yuzu_setting=%" $1 + ;; + + "citra" ) + citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name + sed -i "s%^#$citra_setting=%$citra_setting=%" $1 + ;; + + "melonds" ) + sed -i "s%^#$2=%$2=%" $1 + ;; + + "xemu" ) + sed -i "s%^#$2 = %$2 = %" $1 + ;; + +esac +} + +disable_file() { + # This function adds the suffix ".disabled" to the end of a file to prevent it from being used entirely. + # USAGE: disable_file $file_name + # NOTE: $filename can be a defined variable from global.sh or must have the full path to the file + + mv $(realpath $1) $(realpath $1).disabled +} + +enable_file() { + # This function removes the suffix ".disabled" to the end of a file to allow it to be used. + # USAGE: enable_file $file_name + # NOTE: $filename can be a defined variable from global.sh or must have the full path to the file and should not have ".disabled" as a suffix + + mv $(realpath $1.disabled) $(realpath $(echo $1 | sed -e 's/\.disabled//')) } conf_write() { diff --git a/global.sh b/global.sh index 9ea10aee..d0689825 100755 --- a/global.sh +++ b/global.sh @@ -11,6 +11,36 @@ lockfile="/var/config/retrodeck/.lock" # where the lockfile default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem) +# Config files for emulators with single config files + +citraconf="/var/config/citra-emu/qt-config.ini" +melondsconf="/var/config/melonDS/melonDS.ini" +rpcs3conf="/var/config/rpcs3/config.yml" +yuzuconf="/var/config/yuzu/qt-config.ini" + +# ES-DE config files + +es_settings="/var/config/emulationstation/.emulationstation/es_settings.xml" + +# RetroArch config files + +raconf="/var/config/retroarch/retroarch.cfg" +ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" + +# Dolphin config files + +dolphinconf="/var/config/dolphin-emu/Dolphin.ini" +dolphingcpadconf="/var/config/dolphin-emu/GCPadNew.ini" +dolphingfxconf="/var/config/dolphin-emu/GFX.ini" +dolphinhkconf="/var/config/dolphin-emu/Hotkeys.ini" +dolphinqtconf="/var/config/dolphin-emu/Qt.ini" + +# PCSX2 config files + +pcsx2conf="/var/config/PCSX2/inis/GS.ini" +pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" +pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" + # If there is no config file I initalize the file with the the default values if [ ! -f "$rd_conf" ] then diff --git a/tools/configurator.sh b/tools/configurator.sh index 0a6aab18..c9a455ab 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -8,36 +8,6 @@ source /app/libexec/global.sh # uncomment for flatpak testing source /app/libexec/functions.sh # uncomment for flatpak testing -# Config files for emulators with single config files - -citraconf="/var/config/citra-emu/qt-config.ini" -melondsconf="/var/config/melonDS/melonDS.ini" -rpcs3conf="/var/config/rpcs3/config.yml" -yuzuconf="/var/config/yuzu/qt-config.ini" - -# ES-DE config files - -es_settings="/var/config/emulationstation/.emulationstation/es_settings.xml" - -# RetroArch config files - -raconf="/var/config/retroarch/retroarch.cfg" -ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" - -# Dolphin config files - -dolphinconf="/var/config/dolphin-emu/Dolphin.ini" -dolphingcpadconf="/var/config/dolphin-emu/GCPadNew.ini" -dolphingfxconf="/var/config/dolphin-emu/GFX.ini" -dolphinhkconf="/var/config/dolphin-emu/Hotkeys.ini" -dolphinqtconf="/var/config/dolphin-emu/Qt.ini" - -# PCSX2 config files - -pcsx2conf="/var/config/PCSX2/inis/GS.ini" -pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" -pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" - # DIALOG SECTION # Configurator Option Tree @@ -47,6 +17,7 @@ pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" # - Migrate ROM directory # - Migrate BIOS directory # - Migrate downloaded_media +# - Migrate everything # - Change Emulator Options # - RetroArch # - Change Rewind Setting @@ -79,170 +50,27 @@ pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" # DIALOG TREE FUNCTIONS configurator_reset_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" \ + choice=$(zenity --list --title="RetroDECK Configurator Utility - Reset Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Reset RetroArch" "Reset RetroArch to default settings" \ + "Reset Specific Standalone" "Reset only one specific standalone emulator to default settings" \ + "Reset All Standalones" "Reset all standalone emulators to default settings" \ + "Reset Tools" "Reset Tools menu entries" \ + "Reset All" "Reset RetroDECK to default settings" ) + + case $choice in + + "Reset RetroArch" ) + debug_dialog "ra_init" + configurator_process_complete_dialog "resetting RetroArch" + ;; + + "Reset Specific Standalone" ) + emulator_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" \ - --column="Choice" --column="Action" \ - "Reset RetroArch" "Reset RetroArch to default settings" \ - "Reset Specific Standalone" "Reset only one specific standalone emulator to default settings" \ - "Reset All Standalones" "Reset all standalone emulators to default settings" \ - "Reset Tools" "Reset Tools menu entries" \ - "Reset All" "Reset RetroDECK to default settings" ) - - case $choice in - - "Reset RetroArch" ) - debug_dialog "ra_init" - configurator_process_complete_dialog "resetting RetroArch" - ;; - - "Reset Specific Standalone" ) - emulator_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" \ - --text="Which emulator do you want to reset to default?" \ - --hide-header \ - --column=emulator \ - "RetroArch" \ - "Citra" \ - "Dolphin" \ - "Duckstation" \ - "MelonDS" \ - "PCSX2" \ - "PPSSPP" \ - "RPCS3" \ - "XEMU" \ - "Yuzu") - - case $emulator_to_reset in - - "RetroArch" ) - debug_dialog "ra_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "Citra" ) - debug_dialog "citra_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "Dolphin" ) - debug_dialog "dolphin_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "Duckstation" ) - debug_dialog "duckstation_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "MelonDS" ) - debug_dialog "melonds_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "PCSX2" ) - debug_dialog "pcsx2_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "PPSSPP" ) - debug_dialog "ppssppsdl_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "RPCS3" ) - debug_dialog "rpcs3_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "XEMU" ) - debug_dialog "xemu_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "Yuzu" ) - debug_dialog "yuzu_init" - configurator_process_complete_dialog "resetting $emulator_to_reset" - ;; - - "" ) # No selection made or Back button clicked - configurator_reset_dialog - ;; - - esac - ;; - - "Reset All Standalones" ) - debug_dialog "standalones_init" - configurator_process_complete_dialog "resetting standalone emulators" - ;; - - "Reset Tools" ) - debug_dialog "tools_init" - configurator_process_complete_dialog "resetting the tools menu" - ;; - - "Reset All" ) - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Reset RetroDECK" \ - --text="You are resetting RetroDECK to its default state.\n\nAfter the process is complete you will need to exit RetroDECK and run it again." - debug_dialog "rm -f "$lockfile"" - configurator_process_complete_dialog "resetting RetroDECK" - ;; - - "" ) # No selection made or Back button clicked - configurator_welcome_dialog - ;; - - esac -} - -configurator_retroachivement_dialog() { - login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --text="Enter your RetroAchievements Account details.\n\nBe aware that this tool cannot verify your login details.\nFor registration and more info visit\nhttps://retroachievements.org/\n" \ - --separator="=SEP=" \ - --add-entry="Username" \ - --add-password="Password") - - if [ $? == 1 ] # Cancel button clicked - then - configurator_welcome_dialog - fi - - arrIN=(${login//=SEP=/ }) - user=${arrIN[0]} - pass=${arrIN[1]} - - #set_setting_value $raconf cheevos_enable true retroarch - #set_setting_value $raconf cheevos_username $user retroarch - #set_setting_value $raconf cheevos_password $pass retroarch - - debug_dialog "set_setting_value $raconf cheevos_enable true retroarch\n\nset_setting_value $raconf cheevos_username $user retroarch\n\nset_setting_value $raconf cheevos_password $pass retroarch" - - configurator_process_complete_dialog "logging in to RetroAchievements" -} - -configurator_update_dialog() { - configurator_generic_dialog "This feature is not available yet" - configurator_welcome_dialog -} - -configurator_power_user_changes_dialog() { - zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\n\nplease continue only if you know what you're doing.\n\nDo you want to continue?" - - if [ $? == 1 ] # Cancel button clicked - then - configurator_options_dialog - fi - - emulator=$(zenity --list \ - --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --text="Which emulator do you want to configure?" \ + --text="Which emulator do you want to reset to default?" \ --hide-header \ --column=emulator \ "RetroArch" \ @@ -250,378 +78,576 @@ configurator_power_user_changes_dialog() { "Dolphin" \ "Duckstation" \ "MelonDS" \ - "PCSX2-QT" \ - "PCSX2-Legacy" \ + "PCSX2" \ "PPSSPP" \ "RPCS3" \ "XEMU" \ "Yuzu") - case $emulator in + case $emulator_to_reset in "RetroArch" ) - retroarch - ;; + debug_dialog "ra_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "Citra" ) - citra-qt - ;; + debug_dialog "citra_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "Dolphin" ) - dolphin-emu - ;; + debug_dialog "dolphin_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "Duckstation" ) - duckstation-qt - ;; + debug_dialog "duckstation_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "MelonDS" ) - melonDS - ;; + debug_dialog "melonds_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; - "PCSX2-QT" ) - pcsx2-qt - ;; - - "PCSX2-Legacy" ) - pcsx2 - ;; + "PCSX2" ) + debug_dialog "pcsx2_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "PPSSPP" ) - PPSSPPSDL - ;; + debug_dialog "ppssppsdl_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "RPCS3" ) - rpcs3 - ;; + debug_dialog "rpcs3_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "XEMU" ) - xemu - ;; + debug_dialog "xemu_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "Yuzu" ) - yuzu - ;; + debug_dialog "yuzu_init" + configurator_process_complete_dialog "resetting $emulator_to_reset" + ;; "" ) # No selection made or Back button clicked - configurator_options_dialog - ;; + configurator_reset_dialog + ;; esac + ;; + +"Reset All Standalones" ) + debug_dialog "standalones_init" + configurator_process_complete_dialog "resetting standalone emulators" +;; + +"Reset Tools" ) + debug_dialog "tools_init" + configurator_process_complete_dialog "resetting the tools menu" +;; + +"Reset All" ) + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Reset RetroDECK" \ + --text="You are resetting RetroDECK to its default state.\n\nAfter the process is complete you will need to exit RetroDECK and run it again." + debug_dialog "rm -f "$lockfile"" + configurator_process_complete_dialog "resetting RetroDECK" +;; + +"" ) # No selection made or Back button clicked + configurator_welcome_dialog +;; + + esac +} + +configurator_retroachivement_dialog() { + login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Enter your RetroAchievements Account details.\n\nBe aware that this tool cannot verify your login details.\nFor registration and more info visit\nhttps://retroachievements.org/\n" \ + --separator="=SEP=" \ + --add-entry="Username" \ + --add-password="Password") + + if [ $? == 1 ] # Cancel button clicked + then + configurator_welcome_dialog + fi + + arrIN=(${login//=SEP=/ }) + user=${arrIN[0]} + pass=${arrIN[1]} + + #set_setting_value $raconf cheevos_enable true retroarch + #set_setting_value $raconf cheevos_username $user retroarch + #set_setting_value $raconf cheevos_password $pass retroarch + + debug_dialog "set_setting_value $raconf cheevos_enable true retroarch\n\nset_setting_value $raconf cheevos_username $user retroarch\n\nset_setting_value $raconf cheevos_password $pass retroarch" + + configurator_process_complete_dialog "logging in to RetroAchievements" +} + +configurator_update_dialog() { + configurator_generic_dialog "This feature is not available yet" + configurator_welcome_dialog +} + +configurator_power_user_changes_dialog() { + zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\n\nplease continue only if you know what you're doing.\n\nDo you want to continue?" + + if [ $? == 1 ] # Cancel button clicked + then + configurator_options_dialog + fi + + emulator=$(zenity --list \ + --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Which emulator do you want to configure?" \ + --hide-header \ + --column=emulator \ + "RetroArch" \ + "Citra" \ + "Dolphin" \ + "Duckstation" \ + "MelonDS" \ + "PCSX2-QT" \ + "PCSX2-Legacy" \ + "PPSSPP" \ + "RPCS3" \ + "XEMU" \ + "Yuzu") + + case $emulator in + + "RetroArch" ) + retroarch + ;; + + "Citra" ) + citra-qt + ;; + + "Dolphin" ) + dolphin-emu + ;; + + "Duckstation" ) + duckstation-qt + ;; + + "MelonDS" ) + melonDS + ;; + + "PCSX2-QT" ) + pcsx2-qt + ;; + + "PCSX2-Legacy" ) + pcsx2 + ;; + + "PPSSPP" ) + PPSSPPSDL + ;; + + "RPCS3" ) + rpcs3 + ;; + + "XEMU" ) + xemu + ;; + + "Yuzu" ) + yuzu + ;; + + "" ) # No selection made or Back button clicked + configurator_options_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 - Rewind" \ - --text="Rewind is currently enabled. Do you want to disable it?." + 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 - Rewind" \ + --text="Rewind is currently enabled. Do you want to disable it?." - if [ $? == 0 ] - then - debug_dialog "set_setting_value $raconf rewind_enable true retroarch" - configurator_process_complete_dialog "enabling Rewind" - else - configurator_options_dialog - fi + if [ $? == 0 ] + then + debug_dialog "set_setting_value $raconf rewind_enable true retroarch" + configurator_process_complete_dialog "enabling Rewind" else - zenity --question \ - --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator - Rewind" \ - --text="Rewind is currently disabled, do you want to enable it?\n\nNOTE:\nThis may impact performance expecially on the latest systems." - - if [ $? == 0 ] - then - debug_dialog "set_setting_value $raconf rewind_enable false retroarch" - configurator_process_complete_dialog "disabling Rewind" - else - configurator_options_dialog - fi + configurator_options_dialog fi + else + zenity --question \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator - Rewind" \ + --text="Rewind is currently disabled, do you want to enable it?\n\nNOTE:\nThis may impact performance expecially on the latest systems." + + if [ $? == 0 ] + then + debug_dialog "set_setting_value $raconf rewind_enable false retroarch" + configurator_process_complete_dialog "disabling Rewind" + else + configurator_options_dialog + fi + fi } configurator_retroarch_options_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --column="Choice" --column="Action" \ - "Change Rewind Setting" "Enable or disable the Rewind function in RetroArch" ) + choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Change Rewind Setting" "Enable or disable the Rewind function in RetroArch" ) - case $choice in + case $choice in - "Change Rewind Setting" ) - configurator_retroarch_rewind_dialog - ;; + "Change Rewind Setting" ) + configurator_retroarch_rewind_dialog + ;; - "" ) # No selection made or Back button clicked - configurator_options_dialog - ;; + "" ) # No selection made or Back button clicked + configurator_options_dialog + ;; - esac + esac } configurator_options_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --column="Choice" --column="Action" \ - "Change RetroArch Settings" "Change settings specific to RetroArch" \ - "Power User Changes" "Make changes directly in an emulator" ) + choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Change RetroArch Settings" "Change settings specific to RetroArch" \ + "Power User Changes" "Make changes directly in an emulator" ) - case $choice in + case $choice in - "Change RetroArch Settings" ) - configurator_retroarch_options_dialog - ;; + "Change RetroArch Settings" ) + configurator_retroarch_options_dialog + ;; - "Power User Changes" ) - configurator_power_user_changes_dialog - ;; + "Power User Changes" ) + configurator_power_user_changes_dialog + ;; - "" ) # No selection made or Back button clicked - configurator_welcome_dialog - ;; + "" ) # No selection made or Back button clicked + configurator_welcome_dialog + ;; - esac + esac } configurator_move_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --column="Choice" --column="Action" \ - "Move ROMs" "Move your ROMs directory to a new location" \ - "Move BIOS" "Move your BIOS directory to a new location" \ - "Move Downloaded Media" "Move your downloaded media directory to a new location" \ - "Move Everything" "Move the entire RetroDECK user directory to a new location" ) + choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Move ROMs" "Move your ROMs directory to a new location" \ + "Move BIOS" "Move your BIOS directory to a new location" \ + "Move Downloaded Media" "Move your downloaded media directory to a new location" \ + "Move Everything" "Move the entire RetroDECK user directory to a new location" ) - case $choice in + case $choice in - "Move ROMs" ) - if [[ -d $roms_folder ]]; then - configurator_generic_dialog "The current ROMs folder was found at $roms_folder.\n\nPlease select the location you would like to move it." - destination=$(configurator_destination_choice_dialog "ROMs" "Please choose a destination for the ROMs folder.") - case $destination in - "Back" ) - configurator_move_dialog - ;; - "Internal Storage" ) - if [[ $roms_folder == "$rdhome/roms" ]]; then - configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving ROMs folder to $destination" - move $roms_folder "$rdhome/roms" - roms_folder="$rdhome/roms" - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the ROMs directory to internal storage" - fi - ;; - "SD Card" ) - if [[ $roms_folder == "$sdcard/retrodeck/roms" ]]; then - configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving ROMs folder to $destination" - move $roms_folder "$sdcard/retrodeck/roms" - roms_folder="$sdcard/retrodeck/roms" - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the ROMs directory to SD card" - fi - ;; - "Custom Location" ) - configurator_generic_dialog "Please select the custom location to move the ROMs folder to." - destination=$(browse "ROMs directory destination") - if [[ $destination == $roms_folder ]]; then - configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving ROMs folder from $roms_folder\n\nto $destination.\n\nClick OK to continue." - move $roms_folder $destination - roms_folder=$destination - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the ROMs directory to $destination" - fi - ;; - esac + "Move ROMs" ) + if [[ -d $roms_folder ]]; then + configurator_generic_dialog "The current ROMs folder was found at $roms_folder.\n\nPlease select the location you would like to move it." + destination=$(configurator_destination_choice_dialog "ROMs" "Please choose a destination for the ROMs folder.") + case $destination in + "Back" ) + configurator_move_dialog + ;; + "Internal Storage" ) + if [[ $roms_folder == "$rdhome/roms" ]]; then + configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." + configurator_move_dialog else - configurator_generic_dialog "The ROMs folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the ROMs folder." - roms_folder=$(browse "ROMs directory location") - conf_write - configurator_generic_dialog "ROMs folder now configured at $roms_folder. Please start the moving process again." - configurator_move_dialog + configurator_generic_dialog "Moving ROMs folder to $destination" + debug_dialog "move $roms_folder "$rdhome/roms"" + roms_folder="$rdhome/roms" + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the ROMs directory to internal storage" fi - ;; - - "Move BIOS" ) - if [[ -d $bios_folder ]]; then - configurator_generic_dialog "The current BIOS folder was found at $bios_folder.\n\nPlease select the location you would like to move it." - destination=$(configurator_destination_choice_dialog "BIOS" "Please choose a destination for the BIOS folder.") - case $destination in - "Back" ) - configurator_move_dialog - ;; - "Internal Storage" ) - if [[ $bios_folder == "$rdhome/bios" ]]; then - configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving BIOS folder to $destination" - move $bios_folder "$rdhome/bios" - bios_folder="$rdhome/bios" - debug_dialog "dir_prep $bios_folder "$rdhome/bios"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the BIOS directory to internal storage" - fi - ;; - "SD Card" ) - if [[ $bios_folder == "$sdcard/retrodeck/bios" ]]; then - configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving BIOS folder to $destination" - move $bios_folder "$sdcard/retrodeck/bios" - bios_folder="$sdcard/retrodeck/bios" - debug_dialog "dir_prep $bios_folder "$rdhome/bios"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the BIOS directory to SD card" - fi - ;; - "Custom Location" ) - configurator_generic_dialog "Please select the custom location to move the BIOS folder to." - destination=$(browse "BIOS directory destination") - if [[ $destination == $bios_folder ]]; then - configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving BIOS folder from $bios_folder\n\nto $destination.\n\nClick OK to continue." - move $bios_folder $destination - bios_folder=$destination - debug_dialog "dir_prep $bios_folder "$rdhome/bios"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the BIOS directory to $destination" - fi - ;; - esac + ;; + "SD Card" ) + if [[ $roms_folder == "$sdcard/retrodeck/roms" ]]; then + configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." + configurator_move_dialog else - configurator_generic_dialog "The BIOS folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the BIOS folder." - bios_folder=$(browse "BIOS directory location") - conf_write - configurator_generic_dialog "BIOS folder now configured at $bios_folder. Please start the moving process again." - configurator_move_dialog + configurator_generic_dialog "Moving ROMs folder to $destination" + debug_dialog "move $roms_folder "$sdcard/retrodeck/roms"" + debug_dialog "ln -svf $roms_folder $rdhome/roms" # Link back to "default" location for standalone compatibilty + roms_folder="$sdcard/retrodeck/roms" + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the ROMs directory to SD card" fi - ;; - - "Move Downloaded Media" ) - if [[ -d $media_folder ]]; then - configurator_generic_dialog "The current media folder was found at $media_folder.\n\nPlease select the location you would like to move it." - destination=$(configurator_destination_choice_dialog "Media" "Please choose a destination for the Media folder.") - case $destination in - "Back" ) - configurator_move_dialog - ;; - "Internal Storage" ) - if [[ $media_folder == "$rdhome/downloaded_media" ]]; then - configurator_generic_dialog "The media folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving media folder to $destination" - move $media_folder "$rdhome/downloaded_media" - media_folder="$rdhome/downloaded_media" - debug_dialog "dir_prep $media_folder "$rdhome/downloaded_media"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the media directory to internal storage" - fi - ;; - "SD Card" ) - if [[ $media_folder == "$sdcard/retrodeck/downloaded_media" ]]; then - configurator_generic_dialog "The media folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving media folder to $destination" - move $media_folder "$sdcard/retrodeck/downloaded_media" - media_folder="$sdcard/retrodeck/downloaded_media" - debug_dialog "dir_prep $media_folder "$rdhome/downloaded_media"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the media directory to SD card" - fi - ;; - "Custom Location" ) - configurator_generic_dialog "Please select the custom location to move the media folder to." - destination=$(browse "Media directory destination") - if [[ $destination == $media_folder ]]; then - configurator_generic_dialog "The media folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving media folder from $media_folder\n\nto $destination.\n\nClick OK to continue." - move $media_folder $destination - media_folder=$destination - debug_dialog "dir_prep $media_folder "$rdhome/downloaded_media"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the media directory to $destination" - fi - ;; - esac + ;; + "Custom Location" ) + configurator_generic_dialog "Please select the custom location to move the ROMs folder to." + destination=$(browse "ROMs directory destination") + if [[ $destination == $roms_folder ]]; then + configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." + configurator_move_dialog else - configurator_generic_dialog "The media folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the media folder." - media_folder=$(browse "Media directory location") - conf_write - configurator_generic_dialog "Media folder now configured at $media_folder. Please start the moving process again." - configurator_move_dialog + configurator_generic_dialog "Moving ROMs folder from $roms_folder\n\nto $destination.\n\nClick OK to continue." + debug_dialog "move $roms_folder $destination" + debug_dialog "ln -svf $roms_folder $rdhome/roms" # Link back to "default" location for standalone compatibilty + roms_folder=$destination + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the ROMs directory to $destination" fi - ;; + ;; + esac + else + configurator_generic_dialog "The ROMs folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the ROMs folder." + roms_folder=$(browse "ROMs directory location") + conf_write + configurator_generic_dialog "ROMs folder now configured at $roms_folder. Please start the moving process again." + configurator_move_dialog + fi + ;; - "" ) # No selection made or Back button clicked - configurator_welcome_dialog - ;; + "Move BIOS" ) + if [[ -d $bios_folder ]]; then + configurator_generic_dialog "The current BIOS folder was found at $bios_folder.\n\nPlease select the location you would like to move it." + destination=$(configurator_destination_choice_dialog "BIOS" "Please choose a destination for the BIOS folder.") + case $destination in + "Back" ) + configurator_move_dialog + ;; + "Internal Storage" ) + if [[ $bios_folder == "$rdhome/bios" ]]; then + configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving BIOS folder to $destination" + move $bios_folder "$rdhome/bios" + bios_folder="$rdhome/bios" + debug_dialog "dir_prep $bios_folder "$rdhome/bios"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the BIOS directory to internal storage" + fi + ;; + "SD Card" ) + if [[ $bios_folder == "$sdcard/retrodeck/bios" ]]; then + configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving BIOS folder to $destination" + move $bios_folder "$sdcard/retrodeck/bios" + bios_folder="$sdcard/retrodeck/bios" + debug_dialog "dir_prep $bios_folder "$rdhome/bios"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the BIOS directory to SD card" + fi + ;; + "Custom Location" ) + configurator_generic_dialog "Please select the custom location to move the BIOS folder to." + destination=$(browse "BIOS directory destination") + if [[ $destination == $bios_folder ]]; then + configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving BIOS folder from $bios_folder\n\nto $destination.\n\nClick OK to continue." + move $bios_folder $destination + bios_folder=$destination + debug_dialog "dir_prep $bios_folder "$rdhome/bios"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the BIOS directory to $destination" + fi + ;; + esac + else + configurator_generic_dialog "The BIOS folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the BIOS folder." + bios_folder=$(browse "BIOS directory location") + conf_write + configurator_generic_dialog "BIOS folder now configured at $bios_folder. Please start the moving process again." + configurator_move_dialog + fi + ;; - esac + "Move Downloaded Media" ) + if [[ -d $media_folder ]]; then + configurator_generic_dialog "The current media folder was found at $media_folder.\n\nPlease select the location you would like to move it." + destination=$(configurator_destination_choice_dialog "Media" "Please choose a destination for the Media folder.") + case $destination in + "Back" ) + configurator_move_dialog + ;; + "Internal Storage" ) + if [[ $media_folder == "$rdhome/downloaded_media" ]]; then + configurator_generic_dialog "The media folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving media folder to $destination" + debug_dialog "move $media_folder "$rdhome/downloaded_media"" + media_folder="$rdhome/downloaded_media" + debug_dialog "dir_prep $media_folder "/var/config/emulationstation/.emulationstation/downloaded_media"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the media directory to internal storage" + fi + ;; + "SD Card" ) + if [[ $media_folder == "$sdcard/retrodeck/downloaded_media" ]]; then + configurator_generic_dialog "The media folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving media folder to $destination" + debug_dialog "move $media_folder "$sdcard/retrodeck/downloaded_media"" + media_folder="$sdcard/retrodeck/downloaded_media" + debug_dialog "dir_prep $media_folder "/var/config/emulationstation/.emulationstation/downloaded_media"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the media directory to SD card" + fi + ;; + "Custom Location" ) + configurator_generic_dialog "Please select the custom location to move the media folder to." + destination=$(browse "Media directory destination") + if [[ $destination == $media_folder ]]; then + configurator_generic_dialog "The media folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving media folder from $media_folder\n\nto $destination.\n\nClick OK to continue." + debug_dialog "move $media_folder $destination" + media_folder=$destination + debug_dialog "dir_prep $media_folder "/var/config/emulationstation/.emulationstation/downloaded_media"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the media directory to $destination" + fi + ;; + esac + else + configurator_generic_dialog "The media folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the media folder." + media_folder=$(browse "Media directory location") + conf_write + configurator_generic_dialog "Media folder now configured at $media_folder. Please start the moving process again." + configurator_move_dialog + fi + ;; + + "Move Everything" ) + if [[ -d $rdhome ]]; then + configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." + destination=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the RetroDECK data folder.") + case $destination in + "Back" ) + configurator_move_dialog + ;; + "Internal Storage" ) + if [[ ! -L /home/deck/retrodeck && -d /home/deck/retrodeck ]]; then + configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." + configurator_move_dialog + else + configurator_generic_dialog "Moving RetroDECK data folder to $destination" + debug_dialog "unlink /home/deck/retrodeck" # Remove symlink for $rdhome + debug_dialog "move $sdcard/retrodeck "/home/deck/"" + debug_dialog "roms_folder="$rdhome/roms"" + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" + fi + ;; + "SD Card" ) + if [[ -L $rdhome && -d $sdcard/retrodeck ]]; then + configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." + configurator_move_dialog + else + if [[ ! -w $sdcard ]]; then + configurator_generic_dialog "The SD card was found but is not writable\nThis can happen with cards formatted on PC or for other reasons.\nPlease format the SD card through the Steam Deck's Game Mode and try the moving process again." + configurator_welcome_dialog + else + configurator_generic_dialog "Moving RetroDECK data folder to $destination" + if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created + debug dialog "unlink $rdhome/roms" + fi + debug_dialog "dir_prep "$sdcard/retrodeck" $rdhome" + debug_dialog "roms_folder="$sdcard/retrodeck/roms"" + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" + fi + fi + ;; + esac + else + configurator_generic_dialog "The RetroDECK data folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the RetroDECK data folder." + debug_dialog "rdhome=$(browse "RetroDECK directory location")" + debug_dialog "conf_write" + configurator_generic_dialog "RetroDECK data folder now configured at $rdhome. Please start the moving process again." + configurator_move_dialog + fi + ;; + + "" ) # No selection made or Back button clicked + configurator_welcome_dialog + ;; + + esac } configurator_welcome_dialog() { - # Clear the variables - source= - destination= - action= - setting= - setting_value= + # Clear the variables + source= + destination= + action= + setting= + setting_value= - choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --column="Choice" --column="Action" \ - "Move Files" "Move files between internal/SD card or to custom locations" \ - "Change Options" "Adjust how RetroDECK behaves" \ - "Update" "Update parts of RetroDECK" \ - "RetroAchivements" "Log in to RetroAchievements" \ - "Reset" "Reset parts of RetroDECK" ) + choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --column="Choice" --column="Action" \ + "Move Files" "Move files between internal/SD card or to custom locations" \ + "Change Options" "Adjust how RetroDECK behaves" \ + "Update" "Update parts of RetroDECK" \ + "RetroAchivements" "Log in to RetroAchievements" \ + "Reset" "Reset parts of RetroDECK" ) - case $choice in + case $choice in - "Move Files" ) - configurator_move_dialog - ;; + "Move Files" ) + configurator_move_dialog + ;; - "Change Options" ) - configurator_options_dialog - ;; + "Change Options" ) + configurator_options_dialog + ;; - "Update" ) - configurator_update_dialog - ;; + "Update" ) + configurator_update_dialog + ;; - "RetroAchivements" ) - configurator_retroachivement_dialog - ;; + "RetroAchivements" ) + configurator_retroachivement_dialog + ;; - "Reset" ) - configurator_reset_dialog - ;; + "Reset" ) + configurator_reset_dialog + ;; - "Quit" ) - exit 0 - ;; + "Quit" ) + exit 0 + ;; - esac + esac } # START THE CONFIGURATOR From e76194306a31c50f2ba78573ce917dd3b2461cf2 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Wed, 26 Oct 2022 12:59:36 -0400 Subject: [PATCH 14/46] Trim move function down to only RD folder --- tools/configurator.sh | 285 +++++++----------------------------------- 1 file changed, 47 insertions(+), 238 deletions(-) diff --git a/tools/configurator.sh b/tools/configurator.sh index c9a455ab..b746080b 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -355,253 +355,62 @@ configurator_options_dialog() { } configurator_move_dialog() { - choice=$(zenity --list --title="RetroDECK Configurator Utility - Move Directories" --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --column="Choice" --column="Action" \ - "Move ROMs" "Move your ROMs directory to a new location" \ - "Move BIOS" "Move your BIOS directory to a new location" \ - "Move Downloaded Media" "Move your downloaded media directory to a new location" \ - "Move Everything" "Move the entire RetroDECK user directory to a new location" ) - - case $choice in - - "Move ROMs" ) - if [[ -d $roms_folder ]]; then - configurator_generic_dialog "The current ROMs folder was found at $roms_folder.\n\nPlease select the location you would like to move it." - destination=$(configurator_destination_choice_dialog "ROMs" "Please choose a destination for the ROMs folder.") - case $destination in - "Back" ) - configurator_move_dialog - ;; - "Internal Storage" ) - if [[ $roms_folder == "$rdhome/roms" ]]; then - configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving ROMs folder to $destination" - debug_dialog "move $roms_folder "$rdhome/roms"" - roms_folder="$rdhome/roms" - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the ROMs directory to internal storage" - fi - ;; - "SD Card" ) - if [[ $roms_folder == "$sdcard/retrodeck/roms" ]]; then - configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving ROMs folder to $destination" - debug_dialog "move $roms_folder "$sdcard/retrodeck/roms"" - debug_dialog "ln -svf $roms_folder $rdhome/roms" # Link back to "default" location for standalone compatibilty - roms_folder="$sdcard/retrodeck/roms" - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the ROMs directory to SD card" - fi - ;; - "Custom Location" ) - configurator_generic_dialog "Please select the custom location to move the ROMs folder to." - destination=$(browse "ROMs directory destination") - if [[ $destination == $roms_folder ]]; then - configurator_generic_dialog "The ROMs folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving ROMs folder from $roms_folder\n\nto $destination.\n\nClick OK to continue." - debug_dialog "move $roms_folder $destination" - debug_dialog "ln -svf $roms_folder $rdhome/roms" # Link back to "default" location for standalone compatibilty - roms_folder=$destination - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the ROMs directory to $destination" - fi - ;; - esac - else - configurator_generic_dialog "The ROMs folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the ROMs folder." - roms_folder=$(browse "ROMs directory location") - conf_write - configurator_generic_dialog "ROMs folder now configured at $roms_folder. Please start the moving process again." +"Move Everything" ) + if [[ -d $rdhome ]]; then + configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." + destination=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the RetroDECK data folder.") + case $destination in + "Back" ) configurator_move_dialog - fi - ;; - - "Move BIOS" ) - if [[ -d $bios_folder ]]; then - configurator_generic_dialog "The current BIOS folder was found at $bios_folder.\n\nPlease select the location you would like to move it." - destination=$(configurator_destination_choice_dialog "BIOS" "Please choose a destination for the BIOS folder.") - case $destination in - "Back" ) + ;; + "Internal Storage" ) + if [[ ! -L /home/deck/retrodeck && -d /home/deck/retrodeck ]]; then + configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." configurator_move_dialog - ;; - "Internal Storage" ) - if [[ $bios_folder == "$rdhome/bios" ]]; then - configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving BIOS folder to $destination" - move $bios_folder "$rdhome/bios" - bios_folder="$rdhome/bios" - debug_dialog "dir_prep $bios_folder "$rdhome/bios"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the BIOS directory to internal storage" - fi - ;; - "SD Card" ) - if [[ $bios_folder == "$sdcard/retrodeck/bios" ]]; then - configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving BIOS folder to $destination" - move $bios_folder "$sdcard/retrodeck/bios" - bios_folder="$sdcard/retrodeck/bios" - debug_dialog "dir_prep $bios_folder "$rdhome/bios"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the BIOS directory to SD card" - fi - ;; - "Custom Location" ) - configurator_generic_dialog "Please select the custom location to move the BIOS folder to." - destination=$(browse "BIOS directory destination") - if [[ $destination == $bios_folder ]]; then - configurator_generic_dialog "The BIOS folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving BIOS folder from $bios_folder\n\nto $destination.\n\nClick OK to continue." - move $bios_folder $destination - bios_folder=$destination - debug_dialog "dir_prep $bios_folder "$rdhome/bios"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the BIOS directory to $destination" - fi - ;; - esac - else - configurator_generic_dialog "The BIOS folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the BIOS folder." - bios_folder=$(browse "BIOS directory location") - conf_write - configurator_generic_dialog "BIOS folder now configured at $bios_folder. Please start the moving process again." - configurator_move_dialog - fi - ;; - - "Move Downloaded Media" ) - if [[ -d $media_folder ]]; then - configurator_generic_dialog "The current media folder was found at $media_folder.\n\nPlease select the location you would like to move it." - destination=$(configurator_destination_choice_dialog "Media" "Please choose a destination for the Media folder.") - case $destination in - "Back" ) + else + configurator_generic_dialog "Moving RetroDECK data folder to $destination" + debug_dialog "unlink /home/deck/retrodeck" # Remove symlink for $rdhome + debug_dialog "move $sdcard/retrodeck "/home/deck/"" + debug_dialog "roms_folder="$rdhome/roms"" + debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" + debug_dialog "conf_write" + configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" + fi + ;; + "SD Card" ) + if [[ -L $rdhome && -d $sdcard/retrodeck ]]; then + configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." configurator_move_dialog - ;; - "Internal Storage" ) - if [[ $media_folder == "$rdhome/downloaded_media" ]]; then - configurator_generic_dialog "The media folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving media folder to $destination" - debug_dialog "move $media_folder "$rdhome/downloaded_media"" - media_folder="$rdhome/downloaded_media" - debug_dialog "dir_prep $media_folder "/var/config/emulationstation/.emulationstation/downloaded_media"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the media directory to internal storage" - fi - ;; - "SD Card" ) - if [[ $media_folder == "$sdcard/retrodeck/downloaded_media" ]]; then - configurator_generic_dialog "The media folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving media folder to $destination" - debug_dialog "move $media_folder "$sdcard/retrodeck/downloaded_media"" - media_folder="$sdcard/retrodeck/downloaded_media" - debug_dialog "dir_prep $media_folder "/var/config/emulationstation/.emulationstation/downloaded_media"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the media directory to SD card" - fi - ;; - "Custom Location" ) - configurator_generic_dialog "Please select the custom location to move the media folder to." - destination=$(browse "Media directory destination") - if [[ $destination == $media_folder ]]; then - configurator_generic_dialog "The media folder is already at that location, please pick a new one." - configurator_move_dialog - else - configurator_generic_dialog "Moving media folder from $media_folder\n\nto $destination.\n\nClick OK to continue." - debug_dialog "move $media_folder $destination" - media_folder=$destination - debug_dialog "dir_prep $media_folder "/var/config/emulationstation/.emulationstation/downloaded_media"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the media directory to $destination" - fi - ;; - esac - else - configurator_generic_dialog "The media folder was not found at the configured location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the media folder." - media_folder=$(browse "Media directory location") - conf_write - configurator_generic_dialog "Media folder now configured at $media_folder. Please start the moving process again." - configurator_move_dialog - fi - ;; - - "Move Everything" ) - if [[ -d $rdhome ]]; then - configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." - destination=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the RetroDECK data folder.") - case $destination in - "Back" ) - configurator_move_dialog - ;; - "Internal Storage" ) - if [[ ! -L /home/deck/retrodeck && -d /home/deck/retrodeck ]]; then - configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." - configurator_move_dialog + else + if [[ ! -w $sdcard ]]; then + configurator_generic_dialog "The SD card was found but is not writable\nThis can happen with cards formatted on PC or for other reasons.\nPlease format the SD card through the Steam Deck's Game Mode and try the moving process again." + configurator_welcome_dialog else configurator_generic_dialog "Moving RetroDECK data folder to $destination" - debug_dialog "unlink /home/deck/retrodeck" # Remove symlink for $rdhome - debug_dialog "move $sdcard/retrodeck "/home/deck/"" - debug_dialog "roms_folder="$rdhome/roms"" + if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created + debug dialog "unlink $rdhome/roms" + fi + debug_dialog "dir_prep "$sdcard/retrodeck" $rdhome" + debug_dialog "roms_folder="$sdcard/retrodeck/roms"" debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" debug_dialog "conf_write" - configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" + configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" fi - ;; - "SD Card" ) - if [[ -L $rdhome && -d $sdcard/retrodeck ]]; then - configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." - configurator_move_dialog - else - if [[ ! -w $sdcard ]]; then - configurator_generic_dialog "The SD card was found but is not writable\nThis can happen with cards formatted on PC or for other reasons.\nPlease format the SD card through the Steam Deck's Game Mode and try the moving process again." - configurator_welcome_dialog - else - configurator_generic_dialog "Moving RetroDECK data folder to $destination" - if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created - debug dialog "unlink $rdhome/roms" - fi - debug_dialog "dir_prep "$sdcard/retrodeck" $rdhome" - debug_dialog "roms_folder="$sdcard/retrodeck/roms"" - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" - configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" - fi - fi - ;; - esac - else - configurator_generic_dialog "The RetroDECK data folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the RetroDECK data folder." - debug_dialog "rdhome=$(browse "RetroDECK directory location")" - debug_dialog "conf_write" - configurator_generic_dialog "RetroDECK data folder now configured at $rdhome. Please start the moving process again." + fi + ;; + + "Custom Location" ) + configurator_generic_dialog "A custom location for the RetroDECK data folder is not currently supported.\nPlease choose another location." configurator_move_dialog - fi - ;; - - "" ) # No selection made or Back button clicked - configurator_welcome_dialog - ;; - - esac + ;; + esac + else + configurator_generic_dialog "The RetroDECK data folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the RetroDECK data folder." + debug_dialog "rdhome=$(browse "RetroDECK directory location")" + debug_dialog "conf_write" + configurator_generic_dialog "RetroDECK data folder now configured at $rdhome. Please start the moving process again." + configurator_move_dialog + fi } configurator_welcome_dialog() { From a73e36c45f74c5a7eeab9fedd6bc484de2479c5e Mon Sep 17 00:00:00 2001 From: icenine451 Date: Wed, 26 Oct 2022 15:28:12 -0400 Subject: [PATCH 15/46] Emulator defaults should be done --- emu-configs/{PCSX2 => PCSX2-legacy}/GS.ini | 0 emu-configs/{PCSX2 => PCSX2-legacy}/PCSX2.ini | 0 .../{PCSX2 => PCSX2-legacy}/PCSX2_ui.ini | 0 .../{PCSX2 => PCSX2-legacy}/PCSX2_vm.ini | 0 .../defaults/citra/citra-qt-config.ini | 7 +- emu-configs/defaults/dolphin/Dolphin.ini | 25 + emu-configs/defaults/dolphin/Qt.ini | 7 + emu-configs/defaults/duckstation/settings.ini | 12 + .../pcsx2-qt/{PCSX2_ui.ini => PCSX2.ini} | 8 +- emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini | 115 ---- emu-configs/defaults/ppsspp/controls.ini | 3 + emu-configs/defaults/ppsspp/ppsspp.ini | 105 +-- .../retroarch/retroarch-core-options.cfg | 599 ++++++++++++++++++ emu-configs/defaults/retroarch/retroarch.cfg | 2 +- emu-configs/defaults/rpcs3/config.yml | 2 + emu-configs/defaults/xemu/xemu.toml | 26 +- emu-configs/defaults/yuzu/qt-config.ini | 11 +- 17 files changed, 748 insertions(+), 174 deletions(-) rename emu-configs/{PCSX2 => PCSX2-legacy}/GS.ini (100%) rename emu-configs/{PCSX2 => PCSX2-legacy}/PCSX2.ini (100%) rename emu-configs/{PCSX2 => PCSX2-legacy}/PCSX2_ui.ini (100%) rename emu-configs/{PCSX2 => PCSX2-legacy}/PCSX2_vm.ini (100%) rename emu-configs/defaults/pcsx2-qt/{PCSX2_ui.ini => PCSX2.ini} (97%) delete mode 100644 emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini create mode 100644 emu-configs/defaults/retroarch/retroarch-core-options.cfg diff --git a/emu-configs/PCSX2/GS.ini b/emu-configs/PCSX2-legacy/GS.ini similarity index 100% rename from emu-configs/PCSX2/GS.ini rename to emu-configs/PCSX2-legacy/GS.ini diff --git a/emu-configs/PCSX2/PCSX2.ini b/emu-configs/PCSX2-legacy/PCSX2.ini similarity index 100% rename from emu-configs/PCSX2/PCSX2.ini rename to emu-configs/PCSX2-legacy/PCSX2.ini diff --git a/emu-configs/PCSX2/PCSX2_ui.ini b/emu-configs/PCSX2-legacy/PCSX2_ui.ini similarity index 100% rename from emu-configs/PCSX2/PCSX2_ui.ini rename to emu-configs/PCSX2-legacy/PCSX2_ui.ini diff --git a/emu-configs/PCSX2/PCSX2_vm.ini b/emu-configs/PCSX2-legacy/PCSX2_vm.ini similarity index 100% rename from emu-configs/PCSX2/PCSX2_vm.ini rename to emu-configs/PCSX2-legacy/PCSX2_vm.ini diff --git a/emu-configs/defaults/citra/citra-qt-config.ini b/emu-configs/defaults/citra/citra-qt-config.ini index 6d162bb1..6e176b83 100644 --- a/emu-configs/defaults/citra/citra-qt-config.ini +++ b/emu-configs/defaults/citra/citra-qt-config.ini @@ -320,7 +320,12 @@ Paths\gamedirs\2\deep_scan\default=true Paths\gamedirs\2\expanded=true Paths\gamedirs\2\expanded\default=true Paths\gamedirs\2\path=SYSTEM -Paths\gamedirs\size=2 +Paths\gamedirs\3\deep_scan=false +Paths\gamedirs\3\deep_scan\default=true +Paths\gamedirs\3\expanded=true +Paths\gamedirs\3\expanded\default=true +Paths\gamedirs\3\path= +Paths\gamedirs\size=3 Paths\language=en Paths\language\default=false Paths\moviePlaybackPath= diff --git a/emu-configs/defaults/dolphin/Dolphin.ini b/emu-configs/defaults/dolphin/Dolphin.ini index 78748c52..5ac640b9 100644 --- a/emu-configs/defaults/dolphin/Dolphin.ini +++ b/emu-configs/defaults/dolphin/Dolphin.ini @@ -26,13 +26,38 @@ WiimoteControllerInterface = False WiimoteEnableSpeaker = False WiiSDCardAllowWrites = True WiiSDCardEnableFolderSync = False +SIDevice0 = 6 +SIDevice1 = 0 +SIDevice2 = 0 +SIDevice3 = 0 +AudioStretch = False +AudioStretchMaxLatency = 80 +DPL2Decoder = False +DPL2Quality = 2 +DSPHLE = True [Display] +Fullscreen = False DisableScreenSaver = True +[GBA] +BIOS = +Rom1 = +Rom2 = +Rom3 = +Rom4 = +SavesInRomPath = False +SavesPath = +Threads = True [General] +ISOPath0 = +ISOPath1 = +ISOPaths = 2 +WiiSDCardPath = +WirelessMac = HotkeysRequireFocus = True RecursiveISOPaths = False [Interface] ConfirmStop = True +CursorVisibility = 0 OnScreenDisplayMessages = True PauseOnFocusLost = False ShowActiveTitle = True diff --git a/emu-configs/defaults/dolphin/Qt.ini b/emu-configs/defaults/dolphin/Qt.ini index b9f0b1b9..c42cea70 100644 --- a/emu-configs/defaults/dolphin/Qt.ini +++ b/emu-configs/defaults/dolphin/Qt.ini @@ -47,8 +47,15 @@ bpwrite=false display_type=1 floating=false 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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) +searchascii=true +searchhex=false inputcombo=1 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) +typeascii=false +typefloat=false +typeu16=false +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\0\0\0\0\0\x6M\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3) diff --git a/emu-configs/defaults/duckstation/settings.ini b/emu-configs/defaults/duckstation/settings.ini index 3f181da1..50d2654f 100644 --- a/emu-configs/defaults/duckstation/settings.ini +++ b/emu-configs/defaults/duckstation/settings.ini @@ -23,6 +23,8 @@ RewindEnable = false RewindFrequency = 10.000000 RewindSaveSlots = 10 RunaheadFrameCount = 0 +ControllerBackend = SDL +ControllerEnhancedMode = false EnableDiscordPresence = false @@ -36,6 +38,7 @@ ExecutionMode = Recompiler OverclockEnable = false OverclockNumerator = 1 OverclockDenominator = 1 +OverclockEnable = false RecompilerMemoryExceptions = false RecompilerBlockLinking = true RecompilerICache = false @@ -48,6 +51,7 @@ Adapter = ResolutionScale = 1 Multisamples = 1 UseDebugDevice = false +UseSoftwareRendererForReadbacks = false PerSampleShading = false UseThread = true ThreadedPresentation = true @@ -88,6 +92,7 @@ Stretch = false PostProcessing = false ShowOSDMessages = true ShowFPS = false +ShowVPS = false ShowSpeed = false ShowResolution = false ShowCPU = false @@ -95,7 +100,11 @@ ShowGPU = false ShowStatusIndicators = true ShowInputs = false ShowEnhancements = false +Fullscreen = false +VSync = false DisplayAllFrames = false +PostProcessChain = +MaxFPS = 0.000000 InternalResolutionScreenshots = false VSync = false MaxFPS = 0.000000 @@ -135,6 +144,9 @@ GPUMaxRunAhead = 128 PatchTTYEnable = false PatchFastBoot = false SearchDirectory = bios +PathNTSCU = +PathNTSCJ = +PathPAL = [MemoryCards] diff --git a/emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini b/emu-configs/defaults/pcsx2-qt/PCSX2.ini similarity index 97% rename from emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini rename to emu-configs/defaults/pcsx2-qt/PCSX2.ini index 1fbf8e0c..0cc29275 100644 --- a/emu-configs/defaults/pcsx2-qt/PCSX2_ui.ini +++ b/emu-configs/defaults/pcsx2-qt/PCSX2.ini @@ -40,6 +40,7 @@ EnableRecordingTools = true EnableGameFixes = true SaveStateOnShutdown = false EnableDiscordPresence = false +InhibitScreensaver = true ConsoleToStdio = false HostFs = false BackupSavestate = true @@ -127,7 +128,10 @@ OsdShowGPU = false OsdShowResolution = false OsdShowGSStats = false OsdShowIndicators = true -HWDisableReadbacks = false +OsdShowSettings = false +OsdShowInputs = false +HWSpinGPUForReadbacks = false +HWSpinCPUForReadbacks = false paltex = false autoflush_sw = true preload_frame_with_gs_data = false @@ -169,6 +173,7 @@ crc_hack_level = -1 filter = 2 texture_preloading = 2 GSDumpCompression = 1 +HWDownloadMode = 0 dithering_ps2 = 2 MaxAnisotropy = 0 extrathreads = 2 @@ -296,6 +301,7 @@ RichPresence = true ChallengeMode = false Leaderboards = true SoundEffects = true +PrimedIndicators = true [Filenames] diff --git a/emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini b/emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini deleted file mode 100644 index ab8a88b8..00000000 --- a/emu-configs/defaults/pcsx2-qt/PCSX2_vm.ini +++ /dev/null @@ -1,115 +0,0 @@ -[EmuCore] -CdvdVerboseReads=disabled -CdvdDumpBlocks=disabled -CdvdShareWrite=disabled -EnablePatches=enabled -EnableCheats=disabled -EnablePINE=disabled -EnableWideScreenPatches=disabled -EnableNoInterlacingPatches=disabled -EnableRecordingTools=enabled -ConsoleToStdio=disabled -HostFs=disabled -BackupSavestate=enabled -SavestateZstdCompression=enabled -McdEnableEjection=enabled -McdFolderAutoManage=enabled -MultitapPort0_Enabled=disabled -MultitapPort1_Enabled=disabled -WarnAboutUnsafeSettings=enabled -GzipIsoIndexTemplate=$(f).pindex.tmp -[EmuCore/Speedhacks] -EECycleRate=0 -EECycleSkip=0 -fastCDVD=disabled -IntcStat=enabled -WaitLoop=enabled -vuFlagHack=enabled -vuThread=disabled -vu1Instant=enabled -[EmuCore/CPU] -FPU.DenormalsAreZero=enabled -FPU.FlushToZero=enabled -FPU.Roundmode=3 -AffinityControlMode=0 -VU.DenormalsAreZero=enabled -VU.FlushToZero=enabled -VU.Roundmode=3 -[EmuCore/CPU/Recompiler] -EnableEE=enabled -EnableIOP=enabled -EnableEECache=disabled -EnableVU0=enabled -EnableVU1=enabled -vuOverflow=enabled -vuExtraOverflow=disabled -vuSignOverflow=disabled -vuUnderflow=disabled -fpuOverflow=enabled -fpuExtraOverflow=disabled -fpuFullMode=disabled -StackFrameChecks=disabled -PreBlockCheckEE=disabled -PreBlockCheckIOP=disabled -[EmuCore/GS] -VsyncQueueSize=2 -FrameLimitEnable=enabled -VsyncEnable=0 -FramerateNTSC=59.94 -FrameratePAL=50 -[EmuCore/Gamefixes] -VuAddSubHack=disabled -FpuMulHack=disabled -FpuNegDivHack=disabled -XgKickHack=disabled -EETimingHack=disabled -SoftwareRendererFMVHack=disabled -SkipMPEGHack=disabled -OPHFlagHack=disabled -DMABusyHack=disabled -VIFFIFOHack=disabled -VIF1StallHack=disabled -GIFFIFOHack=disabled -GoemonTlbHack=disabled -IbitHack=disabled -VUSyncHack=disabled -VUOverflowHack=disabled -BlitInternalFPSHack=disabled -[EmuCore/Profiler] -Enabled=disabled -RecBlocks_EE=enabled -RecBlocks_IOP=enabled -RecBlocks_VU0=enabled -RecBlocks_VU1=enabled -[EmuCore/Debugger] -ShowDebuggerOnStart=disabled -AlignMemoryWindowStart=enabled -FontWidth=8 -FontHeight=12 -WindowWidth=0 -WindowHeight=0 -MemoryViewBytesPerRow=16 -[EmuCore/TraceLog] -Enabled=disabled -EE.bitset=0 -IOP.bitset=0 -[DEV9] -[DEV9/Eth] -EthEnable=disabled -EthApi=Unset -EthDevice= -EthLogDNS=disabled -InterceptDHCP=disabled -PS2IP=0.0.0.0 -Mask=0.0.0.0 -Gateway=0.0.0.0 -DNS1=0.0.0.0 -DNS2=0.0.0.0 -AutoMask=enabled -AutoGateway=enabled -ModeDNS1=Auto -ModeDNS2=Auto -[DEV9/Hdd] -HddEnable=disabled -HddFile=DEV9hdd.raw -HddSizeSectors=83886080 diff --git a/emu-configs/defaults/ppsspp/controls.ini b/emu-configs/defaults/ppsspp/controls.ini index 476bb718..62e144a4 100644 --- a/emu-configs/defaults/ppsspp/controls.ini +++ b/emu-configs/defaults/ppsspp/controls.ini @@ -21,3 +21,6 @@ Fast-forward = 1-61 SpeedToggle = 1-68 Pause = 1-111,10-109,10-104 Rewind = 1-67 +Save State = 1-53 +Load State = 1-48 +Screenshot = 1-46 \ No newline at end of file diff --git a/emu-configs/defaults/ppsspp/ppsspp.ini b/emu-configs/defaults/ppsspp/ppsspp.ini index c4112ae2..60d69f50 100644 --- a/emu-configs/defaults/ppsspp/ppsspp.ini +++ b/emu-configs/defaults/ppsspp/ppsspp.ini @@ -1,11 +1,11 @@ [General] FirstRun = False -RunCount = 1 +RunCount = 5 Enable Logging = True AutoRun = True Browse = False IgnoreBadMemAccess = True -CurrentDirectory = /home/deck +CurrentDirectory = /home/deck/retrodeck/roms/psp ShowDebuggerOnLoad = False CheckForNewVersion = True Language = en_US @@ -16,7 +16,7 @@ AutoLoadSaveState = 0 EnableCheats = False CwCheatRefreshRate = 77 CwCheatScrollPosition = 0.000000 -GameListScrollPosition = 0.000000 +GameListScrollPosition = 2056.913086 ScreenshotsAsPNG = False UseFFV1 = False DumpFrames = False @@ -55,7 +55,7 @@ ReportingHost = default AutoSaveSymbolMap = False CacheFullIsoInRam = False RemoteISOPort = 0 -LastRemoteISOServer = +LastRemoteISOServer = LastRemoteISOPort = 0 RemoteISOManualConfig = False RemoteShareOnStartup = False @@ -69,10 +69,11 @@ PauseWhenMinimized = False DumpDecryptedEboots = False MemStickInserted = True EnablePlugins = True -IgnoreCompatSettings = +IgnoreCompatSettings = [CPU] CPUCore = 1 SeparateSASThread = True +SeparateIOThread = True IOTimingMethod = 0 FastMemoryAccess = True FunctionReplacements = True @@ -88,10 +89,10 @@ CardboardXShift = 0 CardboardYShift = 0 ShowFPSCounter = 0 GraphicsBackend = 0 (OPENGL) -FailedGraphicsBackends = -DisabledGraphicsBackends = -VulkanDevice = -CameraDevice = +FailedGraphicsBackends = +DisabledGraphicsBackends = +VulkanDevice = +CameraDevice = RenderingMode = 1 SoftwareRenderer = False SoftwareRendererJit = True @@ -151,7 +152,7 @@ ExtraAudioBuffering = False GlobalVolume = 10 ReverbVolume = 10 AltSpeedVolume = -1 -AudioDevice = +AudioDevice = AutoAudioDevice = True [Control] HapticFeedback = False @@ -221,80 +222,80 @@ AnalogAutoRotSpeed = 8.000000 TouchSnapToGrid = False TouchSnapGridSize = 64 ActionButtonSpacing2 = 1.000000 -ActionButtonCenterX = -1.000000 -ActionButtonCenterY = -1.000000 +ActionButtonCenterX = 0.875000 +ActionButtonCenterY = 0.779412 ActionButtonScale = 1.150000 -DPadX = -1.000000 -DPadY = -1.000000 +DPadX = 0.148958 +DPadY = 0.470588 DPadScale = 1.150000 ShowTouchDpad = True DPadSpacing = 1.000000 -StartKeyX = -1.000000 -StartKeyY = -1.000000 +StartKeyX = 0.619792 +StartKeyY = 0.873162 StartKeyScale = 1.150000 ShowTouchStart = True -SelectKeyX = -1.000000 -SelectKeyY = -1.000000 +SelectKeyX = 0.500000 +SelectKeyY = 0.873162 SelectKeyScale = 1.150000 ShowTouchSelect = True -UnthrottleKeyX = -1.000000 -UnthrottleKeyY = -1.000000 +UnthrottleKeyX = 0.380208 +UnthrottleKeyY = 0.873162 UnthrottleKeyScale = 1.150000 ShowTouchUnthrottle = True -LKeyX = -1.000000 -LKeyY = -1.000000 +LKeyX = 0.071875 +LKeyY = 0.196691 LKeyScale = 1.150000 ShowTouchLTrigger = True -RKeyX = -1.000000 -RKeyY = -1.000000 +RKeyX = 0.928125 +RKeyY = 0.196691 RKeyScale = 1.150000 ShowTouchRTrigger = True -AnalogStickX = -1.000000 -AnalogStickY = -1.000000 +AnalogStickX = 0.148958 +AnalogStickY = 0.830882 AnalogStickScale = 1.150000 ShowAnalogStick = True -RightAnalogStickX = -1.000000 -RightAnalogStickY = -1.000000 +RightAnalogStickX = 0.875000 +RightAnalogStickY = 0.830882 RightAnalogStickScale = 1.150000 ShowRightAnalogStick = False -fcombo0X = -1.000000 -fcombo0Y = -1.000000 +fcombo0X = 0.643750 +fcombo0Y = 0.500000 comboKeyScale0 = 1.150000 ShowComboKey0 = False -fcombo1X = -1.000000 -fcombo1Y = -1.000000 +fcombo1X = 0.763542 +fcombo1Y = 0.500000 comboKeyScale1 = 1.150000 ShowComboKey1 = False -fcombo2X = -1.000000 -fcombo2Y = -1.000000 +fcombo2X = 0.883333 +fcombo2Y = 0.500000 comboKeyScale2 = 1.150000 ShowComboKey2 = False -fcombo3X = -1.000000 -fcombo3Y = -1.000000 +fcombo3X = 0.643750 +fcombo3Y = 0.332721 comboKeyScale3 = 1.150000 ShowComboKey3 = False -fcombo4X = -1.000000 -fcombo4Y = -1.000000 +fcombo4X = 0.763542 +fcombo4Y = 0.332721 comboKeyScale4 = 1.150000 ShowComboKey4 = False -fcombo5X = -1.000000 -fcombo5Y = -1.000000 +fcombo5X = 0.356250 +fcombo5Y = 0.500000 comboKeyScale5 = 1.150000 ShowComboKey5 = False -fcombo6X = -1.000000 -fcombo6Y = -1.000000 +fcombo6X = 0.236458 +fcombo6Y = 0.500000 comboKeyScale6 = 1.150000 ShowComboKey6 = False -fcombo7X = -1.000000 -fcombo7Y = -1.000000 +fcombo7X = 0.116667 +fcombo7Y = 0.500000 comboKeyScale7 = 1.150000 ShowComboKey7 = False -fcombo8X = -1.000000 -fcombo8Y = -1.000000 +fcombo8X = 0.356250 +fcombo8Y = 0.332721 comboKeyScale8 = 1.150000 ShowComboKey8 = False -fcombo9X = -1.000000 -fcombo9Y = -1.000000 +fcombo9X = 0.236458 +fcombo9Y = 0.332721 comboKeyScale9 = 1.150000 ShowComboKey9 = False AnalogDeadzone = 0.150000 @@ -367,9 +368,9 @@ FuncHashMap = False MemInfoDetailed = False DrawFrameGraph = False [Upgrade] -UpgradeMessage = -UpgradeVersion = -DismissedVersion = +UpgradeMessage = +UpgradeVersion = +DismissedVersion = [Theme] ThemeName = Default [Recent] @@ -447,3 +448,5 @@ ColorCorrectionSettingValue4 = 1.000000 ScanlinesSettingValue1 = 1.000000 ScanlinesSettingValue2 = 0.500000 SharpenSettingValue1 = 1.500000 +[PinnedPaths] +Path0 = diff --git a/emu-configs/defaults/retroarch/retroarch-core-options.cfg b/emu-configs/defaults/retroarch/retroarch-core-options.cfg new file mode 100644 index 00000000..6be315ae --- /dev/null +++ b/emu-configs/defaults/retroarch/retroarch-core-options.cfg @@ -0,0 +1,599 @@ +beetle_psx_analog_calibration = "disabled" +beetle_psx_analog_toggle = "disabled" +beetle_psx_aspect_ratio = "corrected" +beetle_psx_cd_access_method = "sync" +beetle_psx_cd_fastload = "2x(native)" +beetle_psx_core_timing_fps = "force_progressive" +beetle_psx_cpu_dynarec = "disabled" +beetle_psx_cpu_freq_scale = "100%(native)" +beetle_psx_crop_overscan = "smart" +beetle_psx_crosshair_color_p1 = "red" +beetle_psx_crosshair_color_p2 = "blue" +beetle_psx_display_internal_fps = "disabled" +beetle_psx_dither_mode = "1x(native)" +beetle_psx_dynarec_eventcycles = "128" +beetle_psx_dynarec_invalidate = "full" +beetle_psx_enable_memcard1 = "enabled" +beetle_psx_enable_multitap_port1 = "disabled" +beetle_psx_enable_multitap_port2 = "disabled" +beetle_psx_frame_duping = "disabled" +beetle_psx_gpu_overclock = "1x(native)" +beetle_psx_gte_overclock = "disabled" +beetle_psx_gun_cursor = "cross" +beetle_psx_gun_input_mode = "lightgun" +beetle_psx_image_crop = "disabled" +beetle_psx_image_offset = "disabled" +beetle_psx_initial_scanline = "0" +beetle_psx_initial_scanline_pal = "0" +beetle_psx_internal_resolution = "1x(native)" +beetle_psx_last_scanline = "239" +beetle_psx_last_scanline_pal = "287" +beetle_psx_line_render = "default" +beetle_psx_memcard_left_index = "0" +beetle_psx_memcard_right_index = "1" +beetle_psx_mouse_sensitivity = "100%" +beetle_psx_negcon_deadzone = "0%" +beetle_psx_negcon_response = "linear" +beetle_psx_override_bios = "disabled" +beetle_psx_pal_video_timing_override = "disabled" +beetle_psx_pgxp_2d_tol = "disabled" +beetle_psx_pgxp_mode = "disabled" +beetle_psx_pgxp_nclip = "disabled" +beetle_psx_shared_memory_cards = "disabled" +beetle_psx_skip_bios = "disabled" +beetle_psx_use_mednafen_memcard0_method = "libretro" +beetle_psx_widescreen_hack = "disabled" +beetle_psx_widescreen_hack_aspect_ratio = "16:9" +cap32_advanced_green_phosphor = "15" +cap32_autorun = "enabled" +cap32_combokey = "y" +cap32_db_mapkeys = "enabled" +cap32_floppy_sound = "enabled" +cap32_gfx_colors = "24bit" +cap32_lang_layout = "english" +cap32_model = "6128" +cap32_ram = "128" +cap32_retrojoy0 = "auto" +cap32_retrojoy1 = "auto" +cap32_scr_intensity = "8" +cap32_scr_tube = "color" +cap32_statusbar = "onloading" +citra_analog_function = "C-Stick and Touchscreen Pointer" +citra_custom_textures = "disabled" +citra_deadzone = "15" +citra_dump_textures = "disabled" +citra_is_new_3ds = "Old 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_swap_screen = "Top" +citra_texture_filter = "none" +citra_touch_touchscreen = "enabled" +citra_use_acc_geo_shaders = "enabled" +citra_use_acc_mul = "enabled" +citra_use_cpu_jit = "enabled" +citra_use_gdbstub = "disabled" +citra_use_hw_renderer = "enabled" +citra_use_hw_shader_cache = "enabled" +citra_use_hw_shaders = "enabled" +citra_use_libretro_save_path = "LibRetro Default" +citra_use_shader_jit = "enabled" +citra_use_virtual_sd = "enabled" +desmume_advanced_timing = "enabled" +desmume_boot_into_bios = "disabled" +desmume_color_depth = "16-bit" +desmume_cpu_mode = "jit" +desmume_firmware_language = "Auto" +desmume_frameskip = "0" +desmume_gfx_edgemark = "enabled" +desmume_gfx_highres_interpolate_color = "disabled" +desmume_gfx_linehack = "enabled" +desmume_gfx_multisampling = "disabled" +desmume_gfx_texture_deposterize = "disabled" +desmume_gfx_texture_scaling = "1" +desmume_gfx_texture_smoothing = "disabled" +desmume_gfx_txthack = "disabled" +desmume_hybrid_cursor_always_smallscreen = "enabled" +desmume_hybrid_layout_ratio = "3:1" +desmume_hybrid_layout_scale = "disabled" +desmume_hybrid_showboth_screens = "enabled" +desmume_input_rotation = "0" +desmume_internal_resolution = "256x192" +desmume_jit_block_size = "12" +desmume_load_to_memory = "disabled" +desmume_mic_mode = "pattern" +desmume_mouse_speed = "1.0" +desmume_num_cores = "1" +desmume_opengl_depth_lequal_polygon_facing = "disabled" +desmume_opengl_mode = "disabled" +desmume_opengl_nds_depth_calculation = "enabled" +desmume_opengl_shadow_polygon = "enabled" +desmume_opengl_special_zero_alpha = "enabled" +desmume_pointer_colour = "white" +desmume_pointer_device_acceleration_mod = "0" +desmume_pointer_device_deadzone = "15" +desmume_pointer_device_l = "none" +desmume_pointer_device_r = "none" +desmume_pointer_mouse = "enabled" +desmume_pointer_stylus_pressure = "50" +desmume_pointer_type = "mouse" +desmume_screens_gap = "0" +desmume_screens_layout = "top/bottom" +desmume_use_external_bios = "disabled" +dolphin_alt_gc_ports_on_wii = "disabled" +dolphin_bbox_enabled = "disabled" +dolphin_cheats_enabled = "disabled" +dolphin_cpu_clock_rate = "100%" +dolphin_cpu_core = "JIT64" +dolphin_dsp_hle = "enabled" +dolphin_dsp_jit = "enabled" +dolphin_efb_scale = "x1 (640 x 528)" +dolphin_efb_scaled_copy = "enabled" +dolphin_efb_to_texture = "enabled" +dolphin_efb_to_vram = "disabled" +dolphin_enable_rumble = "enabled" +dolphin_fast_depth_calculation = "enabled" +dolphin_fastmem = "enabled" +dolphin_force_texture_filtering = "disabled" +dolphin_gpu_texture_decoding = "disabled" +dolphin_ir_mode = "Right Stick controls pointer (relative)" +dolphin_ir_offset = "10" +dolphin_ir_pitch = "15" +dolphin_ir_yaw = "15" +dolphin_language = "English" +dolphin_load_custom_textures = "disabled" +dolphin_log_level = "Info" +dolphin_max_anisotropy = "1x" +dolphin_mixer_rate = "32000" +dolphin_osd_enabled = "enabled" +dolphin_pal60 = "enabled" +dolphin_progressive_scan = "enabled" +dolphin_renderer = "Hardware" +dolphin_sensor_bar_position = "Bottom" +dolphin_shader_compilation_mode = "sync" +dolphin_texture_cache_accuracy = "Fast" +dolphin_wait_for_shaders = "disabled" +dolphin_widescreen = "enabled" +dolphin_widescreen_hack = "disabled" +dolphin_wiimote_continuous_scanning = "disabled" +duckstation_BIOS.PatchFastBoot = "true" +duckstation_BIOS.PathNTSCJ = "scph5500.bin" +duckstation_BIOS.PathNTSCU = "scph5501.bin" +duckstation_BIOS.PathPAL = "scph5502.bin" +duckstation_CDROM.LoadImagePatches = "false" +duckstation_CDROM.LoadImageToRAM = "false" +duckstation_CDROM.MuteCDAudio = "false" +duckstation_CDROM.PreCacheCHD = "false" +duckstation_CDROM.ReadaheadSectors = "8" +duckstation_CDROM.ReadSpeedup = "1" +duckstation_CDROM.ReadThread = "true" +duckstation_CDROM.RegionCheck = "false" +duckstation_CDROM.SeekSpeedup = "1" +duckstation_Console.Enable8MBRAM = "false" +duckstation_Console.Region = "Auto" +duckstation_Controller1.AnalogDPadInDigitalMode = "true" +duckstation_Controller1.AxisScale = "1.00f" +duckstation_Controller1.ForceAnalogOnReset = "false" +duckstation_Controller1.SteeringDeadzone = "0.10" +duckstation_Controller1.TwistResponse = "linear" +duckstation_Controller1.VibrationBias = "8" +duckstation_Controller1.XScale = "1.00" +duckstation_Controller2.AnalogDPadInDigitalMode = "true" +duckstation_Controller2.AxisScale = "1.00f" +duckstation_Controller2.ForceAnalogOnReset = "false" +duckstation_Controller2.SteeringDeadzone = "0.00" +duckstation_Controller2.TwistResponse = "linear" +duckstation_Controller2.VibrationBias = "8" +duckstation_Controller2.XScale = "1.00" +duckstation_Controller3.AnalogDPadInDigitalMode = "true" +duckstation_Controller3.AxisScale = "1.00f" +duckstation_Controller3.ForceAnalogOnReset = "false" +duckstation_Controller3.SteeringDeadzone = "0.10" +duckstation_Controller3.TwistResponse = "linear" +duckstation_Controller3.VibrationBias = "8" +duckstation_Controller4.AnalogDPadInDigitalMode = "true" +duckstation_Controller4.AxisScale = "1.00f" +duckstation_Controller4.ForceAnalogOnReset = "false" +duckstation_Controller4.SteeringDeadzone = "0.10" +duckstation_Controller4.TwistResponse = "linear" +duckstation_Controller4.VibrationBias = "8" +duckstation_Controller5.AnalogDPadInDigitalMode = "true" +duckstation_Controller5.AxisScale = "1.00f" +duckstation_Controller5.ForceAnalogOnReset = "false" +duckstation_Controller5.VibrationBias = "8" +duckstation_Controller6.AnalogDPadInDigitalMode = "true" +duckstation_Controller6.AxisScale = "1.00f" +duckstation_Controller6.ForceAnalogOnReset = "false" +duckstation_Controller6.VibrationBias = "8" +duckstation_Controller7.AnalogDPadInDigitalMode = "true" +duckstation_Controller7.AxisScale = "1.00f" +duckstation_Controller7.ForceAnalogOnReset = "false" +duckstation_Controller7.VibrationBias = "8" +duckstation_Controller8.AnalogDPadInDigitalMode = "true" +duckstation_Controller8.AxisScale = "1.00f" +duckstation_Controller8.ForceAnalogOnReset = "false" +duckstation_Controller8.VibrationBias = "8" +duckstation_ControllerPorts.MultitapMode = "Disabled" +duckstation_CPU.ExecutionMode = "Recompiler" +duckstation_CPU.FastmemMode = "MMap" +duckstation_CPU.FastmemRewrite = "false" +duckstation_CPU.Overclock = "100" +duckstation_CPU.RecompilerBlockLinking = "true" +duckstation_CPU.RecompilerICache = "false" +duckstation_Display.ActiveEndOffset = "0" +duckstation_Display.ActiveStartOffset = "0" +duckstation_Display.AspectRatio = "Auto" +duckstation_Display.CropMode = "Borders" +duckstation_Display.CustomAspectRatioDenominator = "3" +duckstation_Display.CustomAspectRatioNumerator = "4" +duckstation_Display.Force4_3For24Bit = "false" +duckstation_Display.LineEndOffset = "0" +duckstation_Display.LineStartOffset = "0" +duckstation_Display.ShowOSDMessages = "true" +duckstation_GPU.ChromaSmoothing24Bit = "false" +duckstation_GPU.DisableInterlacing = "true" +duckstation_GPU.DownsampleMode = "Disabled" +duckstation_GPU.ForceNTSCTimings = "false" +duckstation_GPU.MSAA = "4" +duckstation_GPU.PGXPCPU = "false" +duckstation_GPU.PGXPCulling = "true" +duckstation_GPU.PGXPDepthBuffer = "false" +duckstation_GPU.PGXPEnable = "true" +duckstation_GPU.PGXPPreserveProjFP = "false" +duckstation_GPU.PGXPTextureCorrection = "true" +duckstation_GPU.PGXPTolerance = "-1.0" +duckstation_GPU.PGXPVertexCache = "false" +duckstation_GPU.Renderer = "Vulkan" +duckstation_GPU.ResolutionScale = "3" +duckstation_GPU.ScaledDithering = "true" +duckstation_GPU.TextureFilter = "Bilinear" +duckstation_GPU.TrueColor = "false" +duckstation_GPU.UseSoftwareRendererForReadbacks = "false" +duckstation_GPU.UseThread = "true" +duckstation_GPU.WidescreenHack = "false" +duckstation_Logging.LogLevel = "Info" +duckstation_Main.ApplyGameSettings = "true" +duckstation_Main.LoadDevicesFromSaveStates = "false" +duckstation_Main.RunaheadFrameCount = "0" +duckstation_MemoryCards.Card1Type = "Libretro" +duckstation_MemoryCards.Card2Type = "None" +duckstation_MemoryCards.UsePlaylistTitle = "true" +duckstation_TextureReplacements.EnableVRAMWriteReplacements = "false" +duckstation_TextureReplacements.PreloadTextures = "false" +gambatte_audio_resampler = "sinc" +gambatte_dark_filter_level = "0" +gambatte_gb_bootloader = "enabled" +gambatte_gb_colorization = "internal" +gambatte_gb_hwmode = "Auto" +gambatte_gb_internal_palette = "GB - DMG" +gambatte_gb_link_mode = "Not Connected" +gambatte_gb_link_network_port = "56400" +gambatte_gb_link_network_server_ip_1 = "0" +gambatte_gb_link_network_server_ip_10 = "0" +gambatte_gb_link_network_server_ip_11 = "0" +gambatte_gb_link_network_server_ip_12 = "0" +gambatte_gb_link_network_server_ip_2 = "0" +gambatte_gb_link_network_server_ip_3 = "0" +gambatte_gb_link_network_server_ip_4 = "0" +gambatte_gb_link_network_server_ip_5 = "0" +gambatte_gb_link_network_server_ip_6 = "0" +gambatte_gb_link_network_server_ip_7 = "0" +gambatte_gb_link_network_server_ip_8 = "0" +gambatte_gb_link_network_server_ip_9 = "0" +gambatte_gb_palette_pixelshift_1 = "PixelShift 01 - Arctic Green" +gambatte_gb_palette_twb64_1 = "TWB64 001 - Aqours Blue" +gambatte_gb_palette_twb64_2 = "TWB64 101 - 765PRO Pink" +gambatte_gbc_color_correction = "GBC only" +gambatte_gbc_color_correction_mode = "accurate" +gambatte_gbc_frontlight_position = "central" +gambatte_mix_frames = "disabled" +gambatte_rumble_level = "10" +gambatte_show_gb_link_settings = "disabled" +gambatte_turbo_period = "4" +gambatte_up_down_allowed = "disabled" +genesis_plus_gx_add_on = "auto" +genesis_plus_gx_addr_error = "enabled" +genesis_plus_gx_aspect_ratio = "auto" +genesis_plus_gx_audio_filter = "disabled" +genesis_plus_gx_bios = "disabled" +genesis_plus_gx_blargg_ntsc_filter = "disabled" +genesis_plus_gx_bram = "per game" +genesis_plus_gx_cdda_volume = "100" +genesis_plus_gx_fm_preamp = "100" +genesis_plus_gx_force_dtack = "enabled" +genesis_plus_gx_frameskip = "disabled" +genesis_plus_gx_frameskip_threshold = "33" +genesis_plus_gx_gg_extra = "disabled" +genesis_plus_gx_gun_cursor = "disabled" +genesis_plus_gx_gun_input = "lightgun" +genesis_plus_gx_invert_mouse = "disabled" +genesis_plus_gx_lcd_filter = "disabled" +genesis_plus_gx_left_border = "disabled" +genesis_plus_gx_lock_on = "disabled" +genesis_plus_gx_lowpass_range = "60" +genesis_plus_gx_md_channel_0_volume = "100" +genesis_plus_gx_md_channel_1_volume = "100" +genesis_plus_gx_md_channel_2_volume = "100" +genesis_plus_gx_md_channel_3_volume = "100" +genesis_plus_gx_md_channel_4_volume = "100" +genesis_plus_gx_md_channel_5_volume = "100" +genesis_plus_gx_no_sprite_limit = "disabled" +genesis_plus_gx_overclock = "100%" +genesis_plus_gx_overscan = "disabled" +genesis_plus_gx_pcm_volume = "100" +genesis_plus_gx_psg_channel_0_volume = "100" +genesis_plus_gx_psg_channel_1_volume = "100" +genesis_plus_gx_psg_channel_2_volume = "100" +genesis_plus_gx_psg_channel_3_volume = "100" +genesis_plus_gx_psg_preamp = "150" +genesis_plus_gx_region_detect = "auto" +genesis_plus_gx_render = "single field" +genesis_plus_gx_show_advanced_audio_settings = "disabled" +genesis_plus_gx_sms_fm_channel_0_volume = "100" +genesis_plus_gx_sms_fm_channel_1_volume = "100" +genesis_plus_gx_sms_fm_channel_2_volume = "100" +genesis_plus_gx_sms_fm_channel_3_volume = "100" +genesis_plus_gx_sms_fm_channel_4_volume = "100" +genesis_plus_gx_sms_fm_channel_5_volume = "100" +genesis_plus_gx_sms_fm_channel_6_volume = "100" +genesis_plus_gx_sms_fm_channel_7_volume = "100" +genesis_plus_gx_sms_fm_channel_8_volume = "100" +genesis_plus_gx_sound_output = "stereo" +genesis_plus_gx_system_hw = "auto" +genesis_plus_gx_ym2413 = "auto" +genesis_plus_gx_ym2413_core = "mame" +genesis_plus_gx_ym2612 = "mame (ym2612)" +mame-external_hiscore = "disabled" +mame_alternate_renderer = "disabled" +mame_altres = "640x480" +mame_auto_save = "disabled" +mame_boot_from_cli = "disabled" +mame_boot_to_bios = "disabled" +mame_boot_to_osd = "disabled" +mame_buttons_profiles = "enabled" +mame_cheats_enable = "disabled" +mame_cpu_overclock = "default" +mame_current_adj_brightness = "default" +mame_current_adj_contrast = "default" +mame_current_adj_gamma = "default" +mame_current_aspect_ratio = "DAR" +mame_current_frame_skip = "0" +mame_current_mouse_enable = "enabled" +mame_current_sample_rate = "48000Hz" +mame_current_skip_gameinfo = "disabled" +mame_current_skip_nagscreen = "enabled" +mame_current_skip_warnings = "disabled" +mame_current_turbo_button = "disabled" +mame_current_turbo_delay = "medium" +mame_current_videoapproach1_enable = "disabled" +mame_lightgun_mode = "none" +mame_mame_4way_enable = "disabled" +mame_mame_paths_enable = "disabled" +mame_media_type = "rom" +mame_mouse_enable = "disabled" +mame_read_config = "disabled" +mame_saves = "game" +mame_softlists_auto_media = "enabled" +mame_softlists_enable = "enabled" +mame_throttle = "disabled" +mame_write_config = "disabled" +melonds_audio_bitrate = "Automatic" +melonds_audio_interpolation = "None" +melonds_boot_directly = "enabled" +melonds_console_mode = "DS" +melonds_dsi_sdcard = "disabled" +melonds_hybrid_ratio = "2" +melonds_hybrid_small_screen = "Bottom" +melonds_jit_block_size = "32" +melonds_jit_branch_optimisations = "enabled" +melonds_jit_enable = "enabled" +melonds_jit_fast_memory = "enabled" +melonds_jit_literal_optimisations = "enabled" +melonds_opengl_better_polygons = "disabled" +melonds_opengl_filtering = "nearest" +melonds_opengl_renderer = "disabled" +melonds_opengl_resolution = "1x native (256x192)" +melonds_randomize_mac_address = "disabled" +melonds_screen_gap = "0" +melonds_screen_layout = "Top/Bottom" +melonds_swapscreen_mode = "Toggle" +melonds_threaded_renderer = "disabled" +melonds_touch_mode = "enabled" +mgba_allow_opposing_directions = "no" +mgba_audio_low_pass_filter = "disabled" +mgba_audio_low_pass_range = "60" +mgba_color_correction = "OFF" +mgba_force_gbp = "OFF" +mgba_frameskip = "disabled" +mgba_frameskip_interval = "0" +mgba_frameskip_threshold = "33" +mgba_gb_colors = "Grayscale" +mgba_gb_colors_preset = "0" +mgba_gb_model = "Autodetect" +mgba_idle_optimization = "Remove Known" +mgba_interframe_blending = "OFF" +mgba_sgb_borders = "ON" +mgba_skip_bios = "OFF" +mgba_solar_sensor_level = "0" +mgba_use_bios = "ON" +mupen64plus-169screensize = "960x540" +mupen64plus-43screensize = "640x480" +mupen64plus-alt-map = "False" +mupen64plus-angrylion-multithread = "all threads" +mupen64plus-angrylion-overscan = "disabled" +mupen64plus-angrylion-sync = "Low" +mupen64plus-angrylion-vioverlay = "Filtered" +mupen64plus-aspect = "4:3" +mupen64plus-astick-deadzone = "15" +mupen64plus-astick-sensitivity = "100" +mupen64plus-BackgroundMode = "OnePiece" +mupen64plus-BilinearMode = "standard" +mupen64plus-CorrectTexrectCoords = "Off" +mupen64plus-CountPerOp = "0" +mupen64plus-CountPerOpDenomPot = "0" +mupen64plus-cpucore = "dynamic_recompiler" +mupen64plus-d-cbutton = "C3" +mupen64plus-DitheringPattern = "False" +mupen64plus-DitheringQuantization = "False" +mupen64plus-EnableCopyAuxToRDRAM = "False" +mupen64plus-EnableCopyColorToRDRAM = "Async" +mupen64plus-EnableCopyDepthToRDRAM = "Software" +mupen64plus-EnableEnhancedHighResStorage = "False" +mupen64plus-EnableEnhancedTextureStorage = "False" +mupen64plus-EnableFBEmulation = "True" +mupen64plus-EnableFragmentDepthWrite = "True" +mupen64plus-EnableHiResAltCRC = "False" +mupen64plus-EnableHWLighting = "False" +mupen64plus-EnableInaccurateTextureCoordinates = "False" +mupen64plus-EnableLegacyBlending = "False" +mupen64plus-EnableLODEmulation = "True" +mupen64plus-EnableN64DepthCompare = "False" +mupen64plus-EnableNativeResFactor = "0" +mupen64plus-EnableNativeResTexrects = "Disabled" +mupen64plus-EnableOverscan = "Enabled" +mupen64plus-EnableShadersStorage = "True" +mupen64plus-EnableTexCoordBounds = "False" +mupen64plus-EnableTextureCache = "True" +mupen64plus-ForceDisableExtraMem = "False" +mupen64plus-FrameDuping = "False" +mupen64plus-Framerate = "Original" +mupen64plus-FXAA = "0" +mupen64plus-GLideN64IniBehaviour = "late" +mupen64plus-HybridFilter = "True" +mupen64plus-IgnoreTLBExceptions = "False" +mupen64plus-l-cbutton = "C2" +mupen64plus-MaxHiResTxVramLimit = "0" +mupen64plus-MaxTxCacheSize = "8000" +mupen64plus-MultiSampling = "0" +mupen64plus-OverscanBottom = "0" +mupen64plus-OverscanLeft = "0" +mupen64plus-OverscanRight = "0" +mupen64plus-OverscanTop = "0" +mupen64plus-pak1 = "memory" +mupen64plus-pak2 = "none" +mupen64plus-pak3 = "none" +mupen64plus-pak4 = "none" +mupen64plus-parallel-rdp-deinterlace-method = "Bob" +mupen64plus-parallel-rdp-dither-filter = "True" +mupen64plus-parallel-rdp-divot-filter = "True" +mupen64plus-parallel-rdp-downscaling = "disable" +mupen64plus-parallel-rdp-gamma-dither = "True" +mupen64plus-parallel-rdp-native-tex-rect = "True" +mupen64plus-parallel-rdp-native-texture-lod = "False" +mupen64plus-parallel-rdp-overscan = "0" +mupen64plus-parallel-rdp-super-sampled-read-back = "False" +mupen64plus-parallel-rdp-super-sampled-read-back-dither = "True" +mupen64plus-parallel-rdp-synchronous = "True" +mupen64plus-parallel-rdp-upscaling = "1x" +mupen64plus-parallel-rdp-vi-aa = "True" +mupen64plus-parallel-rdp-vi-bilinear = "True" +mupen64plus-r-cbutton = "C1" +mupen64plus-rdp-plugin = "gliden64" +mupen64plus-RDRAMImageDitheringMode = "False" +mupen64plus-rsp-plugin = "hle" +mupen64plus-ThreadedRenderer = "False" +mupen64plus-txCacheCompression = "True" +mupen64plus-txEnhancementMode = "None" +mupen64plus-txFilterIgnoreBG = "True" +mupen64plus-txFilterMode = "None" +mupen64plus-txHiresEnable = "False" +mupen64plus-txHiresFullAlphaChannel = "False" +mupen64plus-u-cbutton = "C4" +mupen64plus-virefresh = "Auto" +opera_savestate_auto_load = "False" +pcsx2_accurate_date = "enabled" +pcsx2_anisotropic_filter = "0" +pcsx2_aspect_ratio = "0" +pcsx2_bios = "scph10000.bin" +pcsx2_boot_bios = "disabled" +pcsx2_clamping_mode = "1" +pcsx2_conservative_buffer = "enabled" +pcsx2_deinterlace_mode = "7" +pcsx2_dithering = "2" +pcsx2_enable_60fps_patches = "disabled" +pcsx2_enable_cheats = "disabled" +pcsx2_enable_widescreen_patches = "enabled" +pcsx2_fast_invalidation = "disabled" +pcsx2_fastboot = "disabled" +pcsx2_fastcdvd = "disabled" +pcsx2_frames_to_draw = "1" +pcsx2_frames_to_skip = "1" +pcsx2_frameskip = "disabled" +pcsx2_fxaa = "0" +pcsx2_gamepad_l_deadzone = "0" +pcsx2_gamepad_r_deadzone = "0" +pcsx2_memcard_slot_1 = "shared8" +pcsx2_memcard_slot_2 = "empty" +pcsx2_mipmapping = "-1" +pcsx2_palette_conversion = "disabled" +pcsx2_renderer = "Auto" +pcsx2_round_mode = "3" +pcsx2_rumble_enable = "enabled" +pcsx2_rumble_intensity = "100" +pcsx2_speedhacks_presets = "3" +pcsx2_system_language = "English" +pcsx2_texture_filtering = "2" +pcsx2_upscale_multiplier = "1" +pcsx2_userhack_align_sprite = "disabled" +pcsx2_userhack_auto_flush = "disabled" +pcsx2_userhack_fb_conversion = "disabled" +pcsx2_userhack_halfpixel_offset = "0" +pcsx2_userhack_halfscreen_fix = "-1" +pcsx2_userhack_merge_sprite = "disabled" +pcsx2_userhack_round_sprite = "0" +pcsx2_userhack_skipdraw_layers = "0" +pcsx2_userhack_skipdraw_start = "0" +pcsx2_userhack_texture_offset_x_hundreds = "0" +pcsx2_userhack_texture_offset_x_tens = "0" +pcsx2_userhack_texture_offset_y_hundreds = "0" +pcsx2_userhack_texture_offset_y_tens = "0" +pcsx2_userhack_wildarms_offset = "disabled" +pcsx2_vsync_mtgs_queue = "2" +pcsx2_vu_clamping_mode = "1" +pcsx2_vu_round_mode = "3" +pokemini_lcdbright = "0" +pokemini_lcdcontrast = "64" +pokemini_lcdfilter = "dotmatrix" +pokemini_lcdmode = "analog" +pokemini_lowpass_filter = "disabled" +pokemini_lowpass_range = "60" +pokemini_palette = "Default" +pokemini_piezofilter = "enabled" +pokemini_rumble_lv = "10" +pokemini_screen_shake_lv = "3" +pokemini_turbo_period = "18" +pokemini_video_scale = "4x" +ppsspp_auto_frameskip = "disabled" +ppsspp_block_transfer_gpu = "enabled" +ppsspp_button_preference = "Cross" +ppsspp_cheats = "disabled" +ppsspp_cpu_core = "JIT" +ppsspp_disable_slow_framebuffer_effects = "disabled" +ppsspp_fast_memory = "enabled" +ppsspp_force_lag_sync = "disabled" +ppsspp_frameskip = "Off" +ppsspp_frameskiptype = "Number of frames" +ppsspp_gpu_hardware_transform = "enabled" +ppsspp_ignore_bad_memory_access = "enabled" +ppsspp_inflight_frames = "Up to 2" +ppsspp_internal_resolution = "480x272" +ppsspp_io_timing_method = "Fast" +ppsspp_language = "Automatic" +ppsspp_lazy_texture_caching = "disabled" +ppsspp_locked_cpu_speed = "off" +ppsspp_lower_resolution_for_effects = "Off" +ppsspp_rendering_mode = "Buffered" +ppsspp_retain_changed_textures = "disabled" +ppsspp_software_skinning = "enabled" +ppsspp_spline_quality = "Low" +ppsspp_texture_anisotropic_filtering = "off" +ppsspp_texture_deposterize = "disabled" +ppsspp_texture_filtering = "Auto" +ppsspp_texture_replacement = "disabled" +ppsspp_texture_scaling_level = "Off" +ppsspp_texture_scaling_type = "xbrz" +ppsspp_texture_shader = "Off" +ppsspp_vertex_cache = "disabled" diff --git a/emu-configs/defaults/retroarch/retroarch.cfg b/emu-configs/defaults/retroarch/retroarch.cfg index 0ee6dd1a..aa4c1fe3 100644 --- a/emu-configs/defaults/retroarch/retroarch.cfg +++ b/emu-configs/defaults/retroarch/retroarch.cfg @@ -3195,4 +3195,4 @@ xmb_menu_color_theme = "4" xmb_shadows_enable = "true" xmb_theme = "0" xmb_vertical_thumbnails = "false" -youtube_stream_key = "" +youtube_stream_key = "" \ No newline at end of file diff --git a/emu-configs/defaults/rpcs3/config.yml b/emu-configs/defaults/rpcs3/config.yml index d0829b8c..91d97f8c 100644 --- a/emu-configs/defaults/rpcs3/config.yml +++ b/emu-configs/defaults/rpcs3/config.yml @@ -101,6 +101,7 @@ Video: Disable Vulkan Memory Allocator: false Use full RGB output range: true Strict Texture Flushing: false + Disable native float16 support: true Multithreaded RSX: false Relaxed ZCULL Sync: false Enable 3D: false @@ -120,6 +121,7 @@ Video: DECR memory layout: false Allow Host GPU Labels: false Disable MSL Fast Math: false + Software VkSemaphore: false Vulkan: Adapter: llvmpipe (LLVM 14.0.6, 256 bits) Force FIFO present mode: false diff --git a/emu-configs/defaults/xemu/xemu.toml b/emu-configs/defaults/xemu/xemu.toml index 1daa4bd5..b2a54171 100644 --- a/emu-configs/defaults/xemu/xemu.toml +++ b/emu-configs/defaults/xemu/xemu.toml @@ -1,9 +1,29 @@ [general] show_welcome = false -last_viewed_menu_index = 6 +screenshot_dir = '/home/deck/retrodeck/screenshots' + +[input.bindings] +port1 = '03000000de280000ff11000001000000' + +[display.quality] +surface_scale = 2 [display.window] -last_height = 885 +fullscreen_on_startup = true +startup_size = '1280x800' +last_width = 1620 +last_height = 738 + +[display.ui] +fit = 'scale_16_9' +scale = 2 +auto_scale = false + +[sys] +mem_limit = '128' [sys.files] -eeprom_path = '/home/deck/.var/app/app.xemu.xemu/data/xemu/xemu/eeprom.bin' \ No newline at end of file +bootrom_path = '' +flashrom_path = '' +eeprom_path = '' +hdd_path = '' \ No newline at end of file diff --git a/emu-configs/defaults/yuzu/qt-config.ini b/emu-configs/defaults/yuzu/qt-config.ini index a0fa387e..0c378fa1 100644 --- a/emu-configs/defaults/yuzu/qt-config.ini +++ b/emu-configs/defaults/yuzu/qt-config.ini @@ -897,6 +897,8 @@ debug=false debug\default=true disable_shader_loop_safety_checks=false disable_shader_loop_safety_checks\default=true +fps_cap=1000 +fps_cap\default=true fullscreen_mode=1 fullscreen_mode\default=true gpu_accuracy=1 @@ -996,7 +998,12 @@ Paths\gamedirs\3\deep_scan\default=true Paths\gamedirs\3\expanded=true Paths\gamedirs\3\expanded\default=true Paths\gamedirs\3\path=SysNAND -Paths\gamedirs\size=3 +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\size=4 Paths\language= Paths\language\default=true Paths\recentFiles=@Invalid() @@ -1200,4 +1207,4 @@ web_api_url\default=true yuzu_token= yuzu_token\default=true yuzu_username= -yuzu_username\default=true +yuzu_username\default=true \ No newline at end of file From a9becd50f816bd0c059f322a04a2603abf067215 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Thu, 27 Oct 2022 15:37:22 -0400 Subject: [PATCH 16/46] Patch engine functions v4 --- emu-configs/PCSX2-legacy/PCSX2.ini | 10 +- emu-configs/PCSX2/PCSX2.ini | 444 +++++++++++++++++++ emu-configs/defaults/retroarch/retroarch.cfg | 106 +++-- emu-configs/retroarch.cfg | 12 + functions.sh | 39 +- 5 files changed, 546 insertions(+), 65 deletions(-) create mode 100644 emu-configs/PCSX2/PCSX2.ini diff --git a/emu-configs/PCSX2-legacy/PCSX2.ini b/emu-configs/PCSX2-legacy/PCSX2.ini index e99a089c..56981725 100644 --- a/emu-configs/PCSX2-legacy/PCSX2.ini +++ b/emu-configs/PCSX2-legacy/PCSX2.ini @@ -21,13 +21,13 @@ SaveStateOnShutdown = true ConsoleToStdio = false HostFs = false PatchBios = false -PatchRegion = +PatchRegion = BackupSavestate = true SavestateZstdCompression = true McdEnableEjection = true McdFolderAutoManage = true GzipIsoIndexTemplate = $(f).pindex.tmp -BlockDumpSaveDirectory = +BlockDumpSaveDirectory = [EmuCore/Speedhacks] @@ -169,7 +169,7 @@ ShadeBoost_Contrast = 50 ShadeBoost_Saturation = 50 saven = 0 savel = 5000 -Adapter = +Adapter = shaderfx_conf = shaders/GS_FX_Settings.ini shaderfx_glsl = shaders/GS.fx @@ -198,7 +198,7 @@ DplDecodingLevel = 0 [DEV9/Eth] EthEnable = false EthApi = Unset -EthDevice = +EthDevice = EthLogDNS = false InterceptDHCP = false PS2IP = 0.0.0.0 @@ -267,7 +267,7 @@ IOP.bitset = 0 [Filenames] -BIOS = +BIOS = [Framerate] diff --git a/emu-configs/PCSX2/PCSX2.ini b/emu-configs/PCSX2/PCSX2.ini new file mode 100644 index 00000000..961c2b72 --- /dev/null +++ b/emu-configs/PCSX2/PCSX2.ini @@ -0,0 +1,444 @@ +[UI] +SettingsVersion = 1 +InhibitScreensaver = true +ConfirmShutdown = true +StartPaused = false +PauseOnFocusLoss = false +StartFullscreen = true +DoubleClickTogglesFullscreen = true +HideMouseCursor = false +RenderToSeparateWindow = false +HideMainWindowWhenRunning = false +DisableWindowResize = false +Theme = darkfusion + + +[Folders] +Bios = ~/retrodeck/roms/bios +Snapshots = ~/retrodeck/screenshots +Savestates = ~/retrodeck/states/ps2/pcsx2 +MemoryCards = ~/retrodeck/saves/ps2/memcards +Logs = ~/retrodeck/.logs +Cheats = /var/config/PCSX2/cheats +CheatsWS = /var/config/PCSX2/cheats_ws +CheatsNI = cheats_ni +Cache = /var/config/PCSX2/cache +Textures = /var/config/PCSX2/textures +InputProfiles = inputprofiles + + +[EmuCore] +CdvdVerboseReads = false +CdvdDumpBlocks = false +CdvdShareWrite = false +EnablePatches = true +EnableCheats = false +EnablePINE = false +EnableWideScreenPatches = false +EnableNoInterlacingPatches = false +EnableRecordingTools = true +EnableGameFixes = true +SaveStateOnShutdown = false +EnableDiscordPresence = false +InhibitScreensaver = true +ConsoleToStdio = false +HostFs = false +BackupSavestate = true +SavestateZstdCompression = true +McdEnableEjection = true +McdFolderAutoManage = true +WarnAboutUnsafeSettings = true +GzipIsoIndexTemplate = $(f).pindex.tmp +BlockDumpSaveDirectory = +EnableFastBoot = true + + +[EmuCore/Speedhacks] +EECycleRate = 0 +EECycleSkip = 0 +fastCDVD = false +IntcStat = true +WaitLoop = true +vuFlagHack = true +vuThread = false +vu1Instant = true + + +[EmuCore/CPU] +FPU.DenormalsAreZero = true +FPU.FlushToZero = true +FPU.Roundmode = 3 +AffinityControlMode = 0 +VU.DenormalsAreZero = true +VU.FlushToZero = true +VU.Roundmode = 3 + + +[EmuCore/CPU/Recompiler] +EnableEE = true +EnableIOP = true +EnableEECache = false +EnableVU0 = true +EnableVU1 = true +vuOverflow = true +vuExtraOverflow = false +vuSignOverflow = false +vuUnderflow = false +fpuOverflow = true +fpuExtraOverflow = false +fpuFullMode = false +StackFrameChecks = false +PreBlockCheckEE = false +PreBlockCheckIOP = false + + +[EmuCore/GS] +VsyncQueueSize = 2 +FrameLimitEnable = true +VsyncEnable = 0 +FramerateNTSC = 59.94 +FrameratePAL = 50 +SyncToHostRefreshRate = false +AspectRatio = Auto 4:3/3:2 +FMVAspectRatioSwitch = Off +Zoom = 100 +StretchY = 100 +CropLeft = 0 +CropTop = 0 +CropRight = 0 +CropBottom = 0 +pcrtc_antiblur = true +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 +SkipDuplicateFrames = false +OsdShowMessages = true +OsdShowSpeed = false +OsdShowFPS = false +OsdShowCPU = false +OsdShowGPU = false +OsdShowResolution = false +OsdShowGSStats = false +OsdShowIndicators = true +OsdShowSettings = false +OsdShowInputs = 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_DisableDepthSupport = false +UserHacks_DisablePartialInvalidation = false +UserHacks_Disable_Safe_Features = false +UserHacks_merge_pp_sprite = false +UserHacks_WildHack = false +UserHacks_TextureInsideRt = false +fxaa = false +ShadeBoost = false +shaderfx = false +dump = false +save = false +savef = false +savet = false +savez = false +DumpReplaceableTextures = false +DumpReplaceableMipmaps = false +DumpTexturesWithFMVActive = false +DumpDirectTextures = true +DumpPaletteTextures = true +LoadTextureReplacements = false +LoadTextureReplacementsAsync = true +PrecacheTextureReplacements = false +deinterlace = 7 +OsdScale = 100 +Renderer = -1 +upscale_multiplier = 1 +mipmap_hw = -1 +accurate_blending_unit = 1 +crc_hack_level = -1 +filter = 2 +texture_preloading = 2 +GSDumpCompression = 1 +HWDownloadMode = 0 +dithering_ps2 = 2 +MaxAnisotropy = 0 +extrathreads = 2 +extrathreads_height = 4 +TVShader = 0 +UserHacks_SkipDraw_Start = 0 +UserHacks_SkipDraw_End = 0 +UserHacks_Half_Bottom_Override = -1 +UserHacks_HalfPixelOffset = 0 +UserHacks_round_sprite_offset = 0 +UserHacks_TCOffsetX = 0 +UserHacks_TCOffsetY = 0 +UserHacks_CPUSpriteRenderBW = 0 +TriFilter = -1 +OverrideTextureBarriers = -1 +OverrideGeometryShaders = -1 +ShadeBoost_Brightness = 50 +ShadeBoost_Contrast = 50 +ShadeBoost_Saturation = 50 +saven = 0 +savel = 5000 +Adapter = +shaderfx_conf = shaders/GS_FX_Settings.ini +shaderfx_glsl = shaders/GS.fx + + +[SPU2/Mixing] +Interpolation = 5 +FinalVolume = 100 +VolumeAdjustC = 0 +VolumeAdjustFL = 0 +VolumeAdjustFR = 0 +VolumeAdjustBL = 0 +VolumeAdjustBR = 0 +VolumeAdjustSL = 0 +VolumeAdjustSR = 0 +VolumeAdjustLFE = 0 + + +[SPU2/Output] +OutputModule = cubeb +BackendName = +Latency = 100 +SynchMode = 0 +SpeakerConfiguration = 0 +DplDecodingLevel = 0 + + +[DEV9/Eth] +EthEnable = false +EthApi = Unset +EthDevice = +EthLogDNS = false +InterceptDHCP = false +PS2IP = 0.0.0.0 +Mask = 0.0.0.0 +Gateway = 0.0.0.0 +DNS1 = 0.0.0.0 +DNS2 = 0.0.0.0 +AutoMask = true +AutoGateway = true +ModeDNS1 = Auto +ModeDNS2 = Auto + + +[DEV9/Eth/Hosts] +Count = 0 + + +[DEV9/Hdd] +HddEnable = false +HddFile = DEV9hdd.raw +HddSizeSectors = 83886080 + + +[EmuCore/Gamefixes] +VuAddSubHack = false +FpuMulHack = false +FpuNegDivHack = false +XgKickHack = false +EETimingHack = false +SoftwareRendererFMVHack = false +SkipMPEGHack = false +OPHFlagHack = false +DMABusyHack = false +VIFFIFOHack = false +VIF1StallHack = false +GIFFIFOHack = false +GoemonTlbHack = false +IbitHack = false +VUSyncHack = false +VUOverflowHack = false +BlitInternalFPSHack = false + + +[EmuCore/Profiler] +Enabled = false +RecBlocks_EE = true +RecBlocks_IOP = true +RecBlocks_VU0 = true +RecBlocks_VU1 = true + + +[EmuCore/Debugger] +ShowDebuggerOnStart = false +AlignMemoryWindowStart = true +FontWidth = 8 +FontHeight = 12 +WindowWidth = 0 +WindowHeight = 0 +MemoryViewBytesPerRow = 16 + + +[EmuCore/TraceLog] +Enabled = false +EE.bitset = 0 +IOP.bitset = 0 + + +[Achievements] +Enabled = false +TestMode = false +UnofficialTestMode = false +RichPresence = true +ChallengeMode = false +Leaderboards = true +SoundEffects = true +PrimedIndicators = true + + +[Filenames] +BIOS = + + +[Framerate] +NominalScalar = 1 +TurboScalar = 2 +SlomoScalar = 0.5 + + +[MemoryCards] +Slot1_Enable = true +Slot1_Filename = Mcd001.ps2 +Slot2_Enable = true +Slot2_Filename = Mcd002.ps2 +Multitap1_Slot2_Enable = false +Multitap1_Slot2_Filename = Mcd-Multitap1-Slot02.ps2 +Multitap1_Slot3_Enable = false +Multitap1_Slot3_Filename = Mcd-Multitap1-Slot03.ps2 +Multitap1_Slot4_Enable = false +Multitap1_Slot4_Filename = Mcd-Multitap1-Slot04.ps2 +Multitap2_Slot2_Enable = false +Multitap2_Slot2_Filename = Mcd-Multitap2-Slot02.ps2 +Multitap2_Slot3_Enable = false +Multitap2_Slot3_Filename = Mcd-Multitap2-Slot03.ps2 +Multitap2_Slot4_Enable = false +Multitap2_Slot4_Filename = Mcd-Multitap2-Slot04.ps2 + + +[Logging] +EnableSystemConsole = false +EnableFileLogging = false +EnableTimestamps = true +EnableVerbose = false +EnableEEConsole = false +EnableIOPConsole = false +EnableInputRecordingLogs = true +EnableControllerLogs = false + + +[InputSources] +Keyboard = true +Mouse = true +SDL = true +SDLControllerEnhancedMode = false + + +[Hotkeys] +ToggleFullscreen = Keyboard/Alt & Keyboard/Return +CycleAspectRatio = Keyboard/F6 +CycleInterlaceMode = Keyboard/F5 +CycleMipmapMode = Keyboard/Insert +GSDumpMultiFrame = Keyboard/Control & Keyboard/Shift & Keyboard/F8 +Screenshot = SDL-0/Back & SDL-0/A +GSDumpSingleFrame = Keyboard/Shift & Keyboard/F8 +ToggleSoftwareRendering = Keyboard/F9 +InputRecToggleMode = Keyboard/Shift & Keyboard/R +LoadStateFromSlot = SDL-0/Back & SDL-0/LeftShoulder +SaveStateToSlot = SDL-0/Back & SDL-0/RightShoulder +NextSaveStateSlot = SDL-0/Back & SDL-0/DPadUp +PreviousSaveStateSlot = SDL-0/Back & SDL-0/DPadDown +OpenPauseMenu = SDL-0/Back & SDL-0/Y +ToggleFrameLimit = Keyboard/F4 +TogglePause = SDL-0/Back & SDL-0/B +ToggleSlowMotion = Keyboard/Shift & Keyboard/Backtab +ToggleTurbo = Keyboard/Tab +HoldTurbo = Keyboard/L +ShutdownVM = SDL-0/Start & SDL-0/Back + + +[Pad] +MultitapPort1 = false +MultitapPort2 = false +PointerXScale = 8 +PointerYScale = 8 + + +[Pad1] +Type = DualShock2 +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 +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 +L2 = SDL-0/+LeftTrigger +R1 = SDL-0/RightShoulder +R2 = SDL-0/+RightTrigger +L3 = SDL-0/LeftStick +R3 = SDL-0/RightStick +LUp = SDL-0/-LeftY +LRight = SDL-0/+LeftX +LDown = SDL-0/+LeftY +LLeft = SDL-0/-LeftX +RUp = SDL-0/-RightY +RRight = SDL-0/+RightX +RDown = SDL-0/+RightY +RLeft = SDL-0/-RightX +SmallMotor = SDL-0/SmallMotor +LargeMotor = SDL-0/LargeMotor + + +[Pad2] +Type = None + + +[Pad3] +Type = None + + +[Pad4] +Type = None + + +[Pad5] +Type = None + + +[Pad6] +Type = None + + +[Pad7] +Type = None + + +[Pad8] +Type = None diff --git a/emu-configs/defaults/retroarch/retroarch.cfg b/emu-configs/defaults/retroarch/retroarch.cfg index aa4c1fe3..042fdacc 100644 --- a/emu-configs/defaults/retroarch/retroarch.cfg +++ b/emu-configs/defaults/retroarch/retroarch.cfg @@ -10,10 +10,10 @@ all_users_control_menu = "false" apply_cheats_after_load = "false" apply_cheats_after_toggle = "false" aspect_ratio_index = "22" -assets_directory = "~/.config/retroarch/assets" +assets_directory = ":\assets" audio_block_frames = "0" audio_device = "" -audio_driver = "pulse" +audio_driver = "xaudio" audio_dsp_plugin = "" audio_enable = "true" audio_enable_menu = "false" @@ -22,7 +22,7 @@ audio_enable_menu_cancel = "false" audio_enable_menu_notice = "false" audio_enable_menu_ok = "false" audio_fastforward_mute = "false" -audio_filter_dir = "~/.config/retroarch/filters/audio" +audio_filter_dir = ":\filters\audio" audio_latency = "64" audio_max_timing_skew = "0.050000" audio_mixer_mute_enable = "false" @@ -35,6 +35,9 @@ audio_resampler = "sinc" audio_resampler_quality = "3" audio_sync = "true" audio_volume = "0.000000" +audio_wasapi_exclusive_mode = "true" +audio_wasapi_float_format = "false" +audio_wasapi_sh_buffer_length = "-16" auto_overrides_enable = "true" auto_remaps_enable = "true" auto_screenshot_filename = "true" @@ -43,7 +46,7 @@ autosave_interval = "10" block_sram_overwrite = "false" bluetooth_driver = "null" builtin_imageviewer_enable = "true" -builtin_mediaplayer_enable = "false" +builtin_mediaplayer_enable = "true" bundle_assets_dst_path = "" bundle_assets_dst_path_subdir = "" bundle_assets_extract_enable = "false" @@ -53,8 +56,8 @@ bundle_assets_src_path = "" cache_directory = "" camera_allow = "false" camera_device = "" -camera_driver = "video4linux2" -cheat_database_path = "~/.config/retroarch/cheats" +camera_driver = "null" +cheat_database_path = ":\cheats" check_firmware_before_loading = "false" cheevos_auto_screenshot = "false" cheevos_badges_enable = "false" @@ -72,17 +75,17 @@ cheevos_unlock_sound_enable = "false" cheevos_username = "" cheevos_verbose_enable = "true" config_save_on_exit = "true" -content_database_path = "~/.config/retroarch/database/rdb" +content_database_path = ":\database\rdb" content_favorites_directory = "default" -content_favorites_path = "~/.config/retroarch/content_favorites.lpl" +content_favorites_path = "" content_favorites_size = "200" content_history_directory = "default" -content_history_path = "~/.config/retroarch/content_history.lpl" +content_history_path = "" content_history_size = "200" content_image_history_directory = "default" -content_image_history_path = "~/.config/retroarch/content_image_history.lpl" +content_image_history_path = "" content_music_history_directory = "default" -content_music_history_path = "~/.config/retroarch/content_music_history.lpl" +content_music_history_path = "" content_runtime_log = "true" content_runtime_log_aggregate = "false" content_show_add = "true" @@ -97,9 +100,10 @@ content_show_netplay = "true" content_show_playlists = "true" content_show_settings = "true" content_show_settings_password = "" +content_show_video = "true" content_video_directory = "default" -content_video_history_path = "~/.config/retroarch/content_video_history.lpl" -core_assets_directory = "~/.config/retroarch/downloads" +content_video_history_path = "" +core_assets_directory = ":\downloads" core_info_cache_enable = "true" core_option_category_enable = "true" core_options_path = "" @@ -119,16 +123,19 @@ crt_switch_resolution_use_custom_refresh_rate = "false" crt_switch_timings = "" crt_video_refresh_rate = "60.000000" current_resolution_id = "0" -cursor_directory = "~/.config/retroarch/database/cursors" -custom_viewport_height = "720" -custom_viewport_width = "960" +cursor_directory = ":\database\cursors" +custom_viewport_height = "0" +custom_viewport_width = "0" custom_viewport_x = "0" custom_viewport_y = "0" +d3d10_gpu_index = "0" +d3d11_gpu_index = "0" +d3d12_gpu_index = "0" desktop_menu_enable = "true" discord_allow = "false" discord_app_id = "475456035851599874" driver_switch_enable = "true" -dynamic_wallpapers_directory = "default" +dynamic_wallpapers_directory = ":\assets\wallpapers" enable_device_vibration = "false" facebook_stream_key = "" fastforward_frameskip = "true" @@ -144,7 +151,7 @@ frame_time_counter_reset_after_save_state = "false" framecount_show = "false" frontend_log_level = "1" game_specific_options = "true" -gamemode_enable = "false" +gamemode_enable = "true" gamma_correction = "0" global_core_options = "false" history_list_enable = "true" @@ -214,7 +221,7 @@ input_disk_prev = "nul" input_disk_prev_axis = "nul" input_disk_prev_btn = "nul" input_disk_prev_mbtn = "nul" -input_driver = "x" +input_driver = "dinput" input_duty_cycle = "3" input_enable_hotkey = "nul" input_enable_hotkey_axis = "nul" @@ -249,8 +256,24 @@ input_hold_slowmotion_axis = "nul" input_hold_slowmotion_btn = "nul" input_hold_slowmotion_mbtn = "nul" input_hotkey_block_delay = "5" -input_joypad_driver = "udev" +input_joypad_driver = "xinput" input_keyboard_layout = "" +input_libretro_device_p1 = "1" +input_libretro_device_p10 = "1" +input_libretro_device_p11 = "1" +input_libretro_device_p12 = "1" +input_libretro_device_p13 = "1" +input_libretro_device_p14 = "1" +input_libretro_device_p15 = "1" +input_libretro_device_p16 = "1" +input_libretro_device_p2 = "1" +input_libretro_device_p3 = "1" +input_libretro_device_p4 = "1" +input_libretro_device_p5 = "1" +input_libretro_device_p6 = "1" +input_libretro_device_p7 = "1" +input_libretro_device_p8 = "1" +input_libretro_device_p9 = "1" input_load_state = "f4" input_load_state_axis = "nul" input_load_state_btn = "nul" @@ -2681,7 +2704,7 @@ input_recording_toggle_axis = "nul" input_recording_toggle_btn = "nul" input_recording_toggle_mbtn = "nul" input_remap_binds_enable = "true" -input_remapping_directory = "~/.config/retroarch/config/remaps" +input_remapping_directory = ":\config\remaps" input_reset = "h" input_reset_axis = "nul" input_reset_btn = "nul" @@ -2760,19 +2783,19 @@ input_volume_up = "add" input_volume_up_axis = "nul" input_volume_up_btn = "nul" input_volume_up_mbtn = "nul" -joypad_autoconfig_dir = "~/.config/retroarch/autoconfig" +joypad_autoconfig_dir = ":\autoconfig" keyboard_gamepad_enable = "true" keyboard_gamepad_mapping_type = "1" kiosk_mode_enable = "false" kiosk_mode_password = "" led_driver = "null" -libretro_directory = "~/.config/retroarch/cores" -libretro_info_path = "~/.config/retroarch/cores" +libretro_directory = ":\cores" +libretro_info_path = ":\info" libretro_log_level = "1" load_dummy_on_core_shutdown = "true" location_allow = "false" location_driver = "null" -log_dir = "~/.config/retroarch/logs" +log_dir = ":\logs" log_to_file = "false" log_to_file_timestamp = "false" log_verbosity = "false" @@ -2843,7 +2866,7 @@ menu_show_rewind = "true" menu_show_shutdown = "true" menu_show_sublabels = "true" menu_show_video_layout = "true" -menu_swap_ok_cancel_buttons = "false" +menu_swap_ok_cancel_buttons = "true" menu_throttle_framerate = "true" menu_thumbnail_upscale_threshold = "0" menu_thumbnails = "3" @@ -2868,7 +2891,7 @@ menu_xmb_thumbnail_scale_factor = "100" menu_xmb_title_margin = "5" menu_xmb_title_margin_horizontal_offset = "0" menu_xmb_vertical_fade_factor = "100" -midi_driver = "alsa" +midi_driver = "winmm" midi_input = "Off" midi_output = "Off" midi_volume = "100" @@ -2915,6 +2938,7 @@ netplay_show_only_installed_cores = "false" netplay_show_passworded = "true" netplay_spectate_password = "" netplay_start_as_spectator = "false" +netplay_stateless_mode = "false" netplay_use_mitm_server = "false" network_cmd_enable = "false" network_cmd_port = "55355" @@ -2950,7 +2974,7 @@ notification_show_screenshot_duration = "0" notification_show_screenshot_flash = "0" notification_show_set_initial_disk = "true" notification_show_when_menu_is_alive = "false" -overlay_directory = "~/.config/retroarch/overlay" +overlay_directory = ":\overlays" ozone_collapse_sidebar = "false" ozone_menu_color_theme = "1" ozone_scroll_content_metadata = "false" @@ -2960,7 +2984,7 @@ ozone_truncate_playlist_name = "true" pause_nonactive = "true" perfcnt_enable = "false" playlist_compression = "false" -playlist_directory = "~/.config/retroarch/playlists" +playlist_directory = ":\playlists" playlist_entry_remove_enable = "1" playlist_entry_rename = "true" playlist_fuzzy_archive_match = "false" @@ -2999,9 +3023,9 @@ quick_menu_show_take_screenshot = "true" quick_menu_show_undo_save_load_state = "true" quit_on_close_content = "0" quit_press_twice = "true" -record_driver = "null" -recording_config_directory = "~/.config/retroarch/records_config" -recording_output_directory = "~/.config/retroarch/records" +record_driver = "ffmpeg" +recording_config_directory = ":\config\record" +recording_output_directory = ":\recordings" remap_save_on_exit = "true" resampler_directory = "" rewind_buffer_size = "20971520" @@ -3014,7 +3038,7 @@ rgui_background_filler_thickness_enable = "true" rgui_border_filler_enable = "true" rgui_border_filler_thickness_enable = "true" rgui_browser_directory = "default" -rgui_config_directory = "~/.config/retroarch/config" +rgui_config_directory = ":\config" rgui_extended_ascii = "false" rgui_inline_thumbnails = "false" rgui_internal_upscale_level = "0" @@ -3034,12 +3058,12 @@ run_ahead_hide_warnings = "false" run_ahead_secondary_instance = "true" runtime_log_directory = "default" save_file_compression = "false" -savefile_directory = "~/.config/retroarch/saves" +savefile_directory = ":\saves" savefiles_in_content_dir = "false" savestate_auto_index = "false" savestate_auto_load = "false" savestate_auto_save = "false" -savestate_directory = "~/.config/retroarch/states" +savestate_directory = ":\states" savestate_file_compression = "true" savestate_max_keep = "0" savestate_thumbnail_enable = "false" @@ -3047,7 +3071,7 @@ savestates_in_content_dir = "false" scan_without_core_match = "false" screen_brightness = "100" screen_orientation = "0" -screenshot_directory = "~/.config/retroarch/screenshots" +screenshot_directory = ":\screenshots" screenshots_in_content_dir = "false" settings_show_accessibility = "true" settings_show_achievements = "true" @@ -3086,10 +3110,10 @@ stdin_cmd_enable = "false" streaming_mode = "0" suspend_screensaver_enable = "true" sustained_performance_mode = "false" -system_directory = "~/.config/retroarch/system" +system_directory = ":\system" systemfiles_in_content_dir = "false" threaded_data_runloop_enable = "true" -thumbnails_directory = "~/.config/retroarch/thumbnails" +thumbnails_directory = ":\thumbnails" twitch_stream_key = "" ui_companion_enable = "false" ui_companion_start_on_boot = "true" @@ -3110,7 +3134,7 @@ video_ctx_scaling = "false" video_disable_composition = "false" video_driver = "gl" video_filter = "" -video_filter_dir = "~/.config/retroarch/filters/video" +video_filter_dir = ":\filters\video" video_font_enable = "true" video_font_path = "" video_font_size = "32.000000" @@ -3130,7 +3154,7 @@ video_hdr_enable = "false" video_hdr_expand_gamut = "true" video_hdr_max_nits = "1000.000000" video_hdr_paper_white_nits = "200.000000" -video_layout_directory = "~/.config/retroarch/layouts" +video_layout_directory = ":\layouts" video_layout_enable = "true" video_layout_path = "" video_layout_selected_view = "0" @@ -3157,7 +3181,7 @@ video_scale = "3" video_scale_integer = "false" video_scale_integer_overscale = "false" video_shader_delay = "0" -video_shader_dir = "~/.config/retroarch/shaders" +video_shader_dir = ":\shaders" video_shader_enable = "false" video_shader_preset_save_reference_enable = "true" video_shader_remember_last_dir = "false" diff --git a/emu-configs/retroarch.cfg b/emu-configs/retroarch.cfg index 202e3d34..7ee4f8e2 100644 --- a/emu-configs/retroarch.cfg +++ b/emu-configs/retroarch.cfg @@ -2792,6 +2792,8 @@ memory_show = "false" memory_update_interval = "256" menu_battery_level_enable = "true" menu_core_enable = "true" +menu_disable_info_button = "false" +menu_disable_search_button = "false" menu_driver = "ozone" menu_dynamic_wallpaper_enable = "true" menu_enable_widgets = "true" @@ -2862,8 +2864,10 @@ menu_widget_scale_factor_windowed = "1.000000" menu_xmb_animation_horizontal_highlight = "0" menu_xmb_animation_move_up_down = "0" menu_xmb_animation_opening_main_menu = "0" +menu_xmb_show_title_header = "true" menu_xmb_thumbnail_scale_factor = "100" menu_xmb_title_margin = "5" +menu_xmb_title_margin_horizontal_offset = "0" menu_xmb_vertical_fade_factor = "100" midi_driver = "alsa" midi_input = "Off" @@ -2871,6 +2875,8 @@ midi_output = "Off" midi_volume = "100" netplay_allow_pausing = "false" netplay_allow_slaves = "true" +netplay_chat_color_msg = "16777215" +netplay_chat_color_name = "32768" netplay_check_frames = "600" netplay_custom_mitm_server = "" netplay_fade_chat = "true" @@ -2906,6 +2912,8 @@ netplay_require_slaves = "false" netplay_share_analog = "1" netplay_share_digital = "1" netplay_show_only_connectable = "true" +netplay_show_only_installed_cores = "false" +netplay_show_passworded = "true" netplay_spectate_password = "" netplay_start_as_spectator = "false" netplay_stateless_mode = "false" @@ -2983,6 +2991,7 @@ quick_menu_show_save_content_dir_overrides = "true" quick_menu_show_save_core_overrides = "true" quick_menu_show_save_game_overrides = "true" quick_menu_show_save_load_state = "true" +quick_menu_show_savestate_submenu = "false" quick_menu_show_set_core_association = "true" quick_menu_show_shaders = "true" quick_menu_show_start_recording = "true" @@ -2995,6 +3004,7 @@ quit_press_twice = "true" record_driver = "ffmpeg" recording_config_directory = "/var/config/retroarch/records_config" recording_output_directory = "/var/config/retroarch/records" +remap_save_on_exit = "true" resampler_directory = "" rewind_buffer_size = "20971520" rewind_buffer_size_step = "10" @@ -3094,6 +3104,7 @@ video_adaptive_vsync = "false" video_allow_rotate = "true" video_aspect_ratio = "1.333300" video_aspect_ratio_auto = "false" +video_autoswitch_refresh_rate = "0" video_black_frame_insertion = "0" video_context_driver = "" video_crop_overscan = "true" @@ -3162,6 +3173,7 @@ video_stream_url = "" video_swap_interval = "1" video_threaded = "false" video_vsync = "true" +video_waitable_swapchains = "true" video_window_auto_height_max = "1080" video_window_auto_width_max = "1920" video_window_custom_size_enable = "false" diff --git a/functions.sh b/functions.sh index e4b3d651..00928d10 100644 --- a/functions.sh +++ b/functions.sh @@ -141,7 +141,7 @@ set_setting_value() { get_setting_name() { # Function for getting the setting name from a full setting line from a config file - # USAGE: get_setting_name $setting_line $system (needed as different systems use different config file syntax) + # USAGE: get_setting_name $current_setting_line $current_system (needed as different systems use different config file syntax) case $2 in @@ -174,13 +174,13 @@ get_setting_name() { ;; "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo '$yuzu_setting' | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' + yuzu_setting_name=$(sed -e 's%\\%\\\\%g' <<< "$1") # Accomodate for backslashes in setting names + echo '$yuzu_setting_name' | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' ;; "citra" ) # Use quotes when passing setting_name, as this config file contains special characters - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$1") # Accomodate for backslashes in setting names - echo '$citra_setting' | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' + citra_setting_name=$(sed -e 's%\\%\\\\%g' <<< "$1") # Accomodate for backslashes in setting names + echo "$citra_setting_name" | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' ;; "melonds" ) @@ -205,53 +205,53 @@ get_setting_value() { case $3 in "retrodeck" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + echo $(grep -o -P "(?<=^$2=).*" $1) ;; "retroarch" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = \").*(?=\")") + echo $(grep -o -P "(?<=^$2 = \").*(?=\")" $1) ;; "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + echo $(grep -o -P "(?<=^$2 = ).*" $1) ;; "duckstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + echo $(grep -o -P "(?<=^$2 = ).*" $1) ;; "pcsx2" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + echo $(grep -o -P "(?<=^$2 = ).*" $1) ;; "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + echo $(grep -o -P "(?<=^$2 = ).*" $1) ;; "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces - echo $(grep "$2" $1 | grep -o -P "(?<=$2: ).*") + echo $(grep -o -P "(?<=^$2: ).*" $1) ;; "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$yuzu_setting" $1 | grep -o -P "(?<=$yuzu_setting=).*") + yuzu_setting_value=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep -o -P "(?<=^$yuzu_setting_value=).*" $1) ;; "citra" ) # Use quotes when passing setting_name, as this config file contains special characters - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep "$citra_setting" $1 | grep -o -P "(?<=$citra_setting=).*") + citra_setting_value=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names + echo $(grep -o -P "(?<=^$citra_setting_value=).*" $1) ;; "melonds" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2=).*") + echo $(grep -o -P "(?<=^$2=).*" $1) ;; "xemu" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2 = ).*") + echo $(grep -o -P "(?<=^$2 = ).*" $1) ;; "emulationstation" ) - echo $(grep "$2" $1 | grep -o -P "(?<=$2\" value=\").*(?=\")") + echo $(grep -o -P "(?<=^$2\" value=\").*(?=\")" $1) ;; esac @@ -535,6 +535,7 @@ pcsx2_init() { #dir_prep "$rdhome/screenshots" "/var/config/PCSX2/snaps" #dir_prep "$rdhome/.logs" "/var/config/PCSX2/logs" #dir_prep "$rdhome/bios" "$rdhome/bios/pcsx2" +} melonds_init() { echo "----------------------" From e588f9c455a3fb9e647255e95070b497d82eea7c Mon Sep 17 00:00:00 2001 From: icenine451 Date: Thu, 27 Oct 2022 16:51:37 -0400 Subject: [PATCH 17/46] Minor cleanups --- emu-configs/defaults/dolphin/GCPadNew.ini | 3 ++- emu-configs/xemu.toml | 3 +-- functions.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/emu-configs/defaults/dolphin/GCPadNew.ini b/emu-configs/defaults/dolphin/GCPadNew.ini index 4157abb6..1d817ebe 100644 --- a/emu-configs/defaults/dolphin/GCPadNew.ini +++ b/emu-configs/defaults/dolphin/GCPadNew.ini @@ -26,6 +26,7 @@ D-Pad/Up = `T` D-Pad/Down = `G` D-Pad/Left = `F` D-Pad/Right = `H` +Rumble/Motor = Strong [GCPad2] Device = XInput2/0/Virtual core pointer Main Stick/Modifier/Range = 50.0 @@ -37,4 +38,4 @@ C-Stick/Modifier/Range = 50.0 [GCPad4] Device = XInput2/0/Virtual core pointer Main Stick/Modifier/Range = 50.0 -C-Stick/Modifier/Range = 50.0 +C-Stick/Modifier/Range = 50.0 \ No newline at end of file diff --git a/emu-configs/xemu.toml b/emu-configs/xemu.toml index 1c119bd3..fb196502 100644 --- a/emu-configs/xemu.toml +++ b/emu-configs/xemu.toml @@ -26,5 +26,4 @@ mem_limit = '128' bootrom_path = '/home/deck/retrodeck/bios/mcpx_1.0.bin' flashrom_path = '/home/deck/retrodeck/bios/Complex.bin' eeprom_path = '/home/deck/retrodeck/saves/xbox/xemu/xbox-eeprom.bin' -hdd_path = '/home/deck/retrodeck/bios/xbox_hdd.qcow2' - +hdd_path = '/home/deck/retrodeck/bios/xbox_hdd.qcow2' \ No newline at end of file diff --git a/functions.sh b/functions.sh index 00928d10..b8ab515f 100644 --- a/functions.sh +++ b/functions.sh @@ -175,7 +175,7 @@ get_setting_name() { "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters yuzu_setting_name=$(sed -e 's%\\%\\\\%g' <<< "$1") # Accomodate for backslashes in setting names - echo '$yuzu_setting_name' | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' + echo "$yuzu_setting_name" | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' ;; "citra" ) # Use quotes when passing setting_name, as this config file contains special characters From 65e4e5bf34ce381f50693af8b53a0ed89079975d Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 7 Nov 2022 14:57:06 -0500 Subject: [PATCH 18/46] Verified working patch engine! --- emu-configs/defaults/dolphin/GCKeyNew.ini | 93 ----- functions.sh | 453 ++++++++++------------ 2 files changed, 212 insertions(+), 334 deletions(-) delete mode 100644 emu-configs/defaults/dolphin/GCKeyNew.ini diff --git a/emu-configs/defaults/dolphin/GCKeyNew.ini b/emu-configs/defaults/dolphin/GCKeyNew.ini deleted file mode 100644 index dcdb8ce3..00000000 --- a/emu-configs/defaults/dolphin/GCKeyNew.ini +++ /dev/null @@ -1,93 +0,0 @@ -[GCKeyboard1] -Device = XInput2/0/Virtual core pointer -Keys/HOME = Home -Keys/END = End -Keys/PGUP = Prior -Keys/PGDN = Next -Keys/SCR LK = Scroll_Lock -Keys/A = A -Keys/B = B -Keys/C = C -Keys/D = D -Keys/E = E -Keys/F = F -Keys/G = G -Keys/H = H -Keys/I = I -Keys/J = J -Keys/K = K -Keys/L = L -Keys/M = M -Keys/N = N -Keys/O = O -Keys/P = P -Keys/Q = Q -Keys/R = R -Keys/S = S -Keys/T = T -Keys/U = U -Keys/V = V -Keys/W = W -Keys/X = X -Keys/Y = Y -Keys/Z = Z -Keys/1 = `1` -Keys/2 = `2` -Keys/3 = `3` -Keys/4 = `4` -Keys/5 = `5` -Keys/6 = `6` -Keys/7 = `7` -Keys/8 = `8` -Keys/9 = `9` -Keys/0 = `0` -Keys/- = minus -Keys/` = grave -Keys/PRT SC = Print -Keys/' = apostrophe -Keys/[ = bracketleft -Keys/EQUALS = equal -Keys/* = KP_Multiply -Keys/] = bracketright -Keys/, = comma -Keys/. = period -Keys// = slash -Keys/\ = backslash -Keys/F1 = F1 -Keys/F2 = F2 -Keys/F3 = F3 -Keys/F4 = F4 -Keys/F5 = F5 -Keys/F6 = F6 -Keys/F7 = F7 -Keys/F8 = F8 -Keys/F9 = F9 -Keys/F10 = F10 -Keys/F11 = F11 -Keys/F12 = F12 -Keys/ESC = Escape -Keys/INSERT = Insert -Keys/DELETE = Delete -Keys/; = semicolon -Keys/BACKSPACE = BackSpace -Keys/TAB = Tab -Keys/CAPS LOCK = Caps_Lock -Keys/L SHIFT = Shift_L -Keys/R SHIFT = Shift_R -Keys/L CTRL = Control_L -Keys/R ALT = Alt_R -Keys/L WIN = Super_L -Keys/SPACE = space -Keys/R WIN = Super_R -Keys/MENU = Menu -Keys/LEFT = Left -Keys/DOWN = Down -Keys/UP = Up -Keys/RIGHT = Right -Keys/ENTER = Return -[GCKeyboard2] -Device = XInput2/0/Virtual core pointer -[GCKeyboard3] -Device = XInput2/0/Virtual core pointer -[GCKeyboard4] -Device = XInput2/0/Virtual core pointer diff --git a/functions.sh b/functions.sh index b8ab515f..38beab7a 100644 --- a/functions.sh +++ b/functions.sh @@ -81,59 +81,24 @@ move() { set_setting_value() { # Function for editing settings - # USAGE: set_setting_value $setting_file $setting_name $new_setting_value $system (needed as different systems use different config file syntax) - # NOTES: RPCS3 has special conditions, see comments below + # USAGE: set_setting_value $setting_file "$setting_name" "$new_setting_value" $system $section_name(optional) + + local setting_name_to_change=$(sed -e 's^\\^\\\\^g;s^`^\\`^g' <<< "$2") + local setting_value_to_change=$(sed -e 's^\\^\\\\^g;s^`^\\`^g' <<< "$3") + local current_section_name=$(sed -e 's/%/\\%/g' <<< "$5") case $4 in - "retrodeck" ) - sed -i "s%$2=.*%$2=$3%" $1 - ;; - - "retroarch" ) - sed -i "s%$2 = \".*\"%$2 = \"$3\"%" $1 - ;; - - "dolphin" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "duckstation" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "pcsx2" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "ppsspp" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - - "rpcs3" ) # This does not currently work for settings with a $ in them - sed -i "s%$2: .*%$2: $3%" $1 - ;; - - "yuzu" ) - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%$yuzu_setting=.*%$yuzu_setting=$3%" $1 - ;; - - "citra" ) - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%$citra_setting=.*%$citra_setting=$3%" $1 - ;; - - "melonds" ) - sed -i "s%$2=.*%$2=$3%" $1 - ;; - - "xemu" ) - sed -i "s%$2 = .*%$2 = $3%" $1 - ;; - "emulationstation" ) - sed -i "s%$2\" \" value=\".*\"%$2\" \" value=\"$3\"" $1 + sed -i "s%$setting_name_to_change\" \" value=\".*\"%$setting_name_to_change\" \" value=\"$setting_value_to_change\"" $1 + ;; + + * ) + if [[ -z $current_section_name ]]; then + sed -i -E 's^\b'"$setting_name_to_change"'(\s?[=:]\s?).*^'"$setting_name_to_change"'\1'"$setting_value_to_change"'^' $1 + else + sed -i -E '\^\['"$current_section_name"'\]^,\^\b'"$setting_name_to_change"'.*^s^\b'"$setting_name_to_change"'(\s?[=:]\s?).*^'"$setting_name_to_change"'\1'"$setting_value_to_change"'^' $1 + fi ;; esac @@ -141,230 +106,104 @@ set_setting_value() { get_setting_name() { # Function for getting the setting name from a full setting line from a config file - # USAGE: get_setting_name $current_setting_line $current_system (needed as different systems use different config file syntax) + # USAGE: get_setting_name "$current_setting_line" $system + + local current_setting_line="$1" case $2 in - "retrodeck" ) - echo "$1" | grep -o -P ".*(?=\=)" - ;; - - "retroarch" ) - echo "$1" | grep -o -P ".*(?= \= )" - ;; - - "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters - echo "$1" | grep -o -P ".*(?= \= )" - ;; - - "duckstation" ) - echo "$1" | grep -o -P ".*(?= \= )" - ;; - - "pcsx2" ) - echo "$1" | grep -o -P ".*(?= \= )" - ;; - - "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces - echo "$1" | grep -o -P ".*(?= \= )" - ;; - - "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces - echo "$1" | grep -o -P ".*(?=:)" - ;; - - "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters - yuzu_setting_name=$(sed -e 's%\\%\\\\%g' <<< "$1") # Accomodate for backslashes in setting names - echo "$yuzu_setting_name" | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' - ;; - - "citra" ) # Use quotes when passing setting_name, as this config file contains special characters - citra_setting_name=$(sed -e 's%\\%\\\\%g' <<< "$1") # Accomodate for backslashes in setting names - echo "$citra_setting_name" | grep -o -P ".*(?=\=)" | sed -e 's%\\\\%\\%g' - ;; - - "melonds" ) - echo "$1" | grep -o -P ".*(?=\=)" - ;; - - "xemu" ) - echo "$1" | grep -o -P ".*(?= \= )" - ;; - "emulationstation" ) - echo '$1' | grep -o -P "(?<=name\=\").*(?=\" value)" + echo "$current_setting_line" | grep -o -P "(?<=name\=\").*(?=\" value)" ;; -esac + "rpcs3" ) + #echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's%\\\\%\\%g' | sed -e 's/^[ \t]*//' + echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g' + ;; + + * ) + echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?=\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g;s^\\$^^' + ;; + + esac } get_setting_value() { # Function for getting the current value of a setting from a config file -# USAGE: get_setting_value $setting_file $setting_name $system (needed as different systems use different config file syntax) +# USAGE: get_setting_value $setting_file "$setting_name" $system $section (optional) -case $3 in + local current_setting_name="$2" + local current_section_name="$4" - "retrodeck" ) - echo $(grep -o -P "(?<=^$2=).*" $1) - ;; - - "retroarch" ) - echo $(grep -o -P "(?<=^$2 = \").*(?=\")" $1) - ;; - - "dolphin" ) # Use quotes when passing setting_name, as this config file contains special characters - echo $(grep -o -P "(?<=^$2 = ).*" $1) - ;; - - "duckstation" ) - echo $(grep -o -P "(?<=^$2 = ).*" $1) - ;; - - "pcsx2" ) - echo $(grep -o -P "(?<=^$2 = ).*" $1) - ;; - - "ppsspp" ) # Use quotes when passing setting_name, as this config file contains spaces - echo $(grep -o -P "(?<=^$2 = ).*" $1) - ;; - - "rpcs3" ) # Use quotes when passing setting_name, as this config file contains special characters and spaces - echo $(grep -o -P "(?<=^$2: ).*" $1) - ;; - - "yuzu" ) # Use quotes when passing setting_name, as this config file contains special characters - yuzu_setting_value=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep -o -P "(?<=^$yuzu_setting_value=).*" $1) - ;; - - "citra" ) # Use quotes when passing setting_name, as this config file contains special characters - citra_setting_value=$(sed -e 's%\\%\\\\%g' <<< "$2") # Accomodate for backslashes in setting names - echo $(grep -o -P "(?<=^$citra_setting_value=).*" $1) - ;; - - "melonds" ) - echo $(grep -o -P "(?<=^$2=).*" $1) - ;; - - "xemu" ) - echo $(grep -o -P "(?<=^$2 = ).*" $1) - ;; + case $3 in "emulationstation" ) - echo $(grep -o -P "(?<=^$2\" value=\").*(?=\")" $1) + echo $(grep -o -P "(?<=^$current_setting_name\" value=\").*(?=\")" $1) ;; -esac + rpcs3 ) + if [[ -z $current_section_name ]]; then + sed -n -E 's^\s*\b'"$current_setting_name"'\s?:\s?(.*)^\1^p' $1 + else + sed -n -E '\^\['"$current_section_name"'\]^,\^'"$current_setting_name"'^{ \^\['"$current_section_name"'\]^! { \^\b'"$current_setting_name"'^ p } }' $1 | sed -n -E 's^\s*\b.*\s?:\s?(.*)$^\1^p' + fi + ;; + + * ) + if [[ -z $current_section_name ]]; then + sed -n -E 's^\s*\b'"$current_setting_name"'\s?=\s?(.*)^\1^p' $1 + else + sed -n -E '\^\['"$current_section_name"'\]^,\^\b'"$current_setting_name"'^{ \^\['"$current_section_name"'\]^! { \^\b'"$current_setting_name"'^ p } }' $1 | sed -n -E 's^\s*\b.*\s?=\s?(.*)^\1^p' + fi + ;; + + esac +} + +add_setting() { + # This function will add a setting line to a file. This is useful for dynamically generated config files where a setting line may not exist until the setting is changed from the default. + echo "WIP" + } disable_setting() { # This function will add a '#' to the beginning of a defined setting line, disabling it. - # USAGE: disable_setting $setting_file $setting_name $system + # USAGE: disable_setting $setting_file $setting_line $system $section (optional) + + local current_setting_line"$2" + local current_section_name="$4" case $3 in - "retrodeck" ) - sed -i "s%^$2=%#$2=%" $1 - ;; + * ) + if [[ -z $current_section_name ]]; then + sed -i -E 's^(\s*?)'"$current_setting_line"'^\1#'"$current_setting_line"'^' $1 + else + sed -i -E '\^\['"$current_section_name"'\]^,\^\s*?'"$current_setting_line"'^s^(\s*?)'"$current_setting_line"'^\1#'"$current_setting_line"'^' $1 + fi + ;; - "retroarch" ) - sed -i "s%^$2 = %#$2 = %" $1 - ;; - - "dolphin" ) - sed -i "s%^$2 = %#$2 = %" $1 - ;; - - "duckstation" ) - sed -i "s%^$2 = %#$2 = %" $1 - ;; - - "pcsx2" ) - sed -i "s%^$2 = %#$2 = %" $1 - ;; - - "ppsspp" ) - sed -i "s%^$2 = %#$2 = %" $1 - ;; - - "rpcs3" ) # This does not currently work for settings with a $ in them - sed -i "s%^$2: %#$2: %" $1 - ;; - - "yuzu" ) - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%^$yuzu_setting=%#$yuzu_setting=%" $1 - ;; - - "citra" ) - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%^$citra_setting=%#$citra_setting=%" $1 - ;; - - "melonds" ) - sed -i "s%^$2=%#$2=%" $1 - ;; - - "xemu" ) - sed -i "s%^$2 = %#$2 = %" $1 - ;; - -esac + esac } enable_setting() { # This function will remove a '#' to the beginning of a defined setting line, enabling it. - # USAGE: enable_setting $setting_file $setting_name $system + # USAGE: enable_setting $setting_file $setting_line $system $section (optional) + + local current_setting_line"$2" + local current_section_name="$4" case $3 in - "retrodeck" ) - sed -i "s%^#$2=%$2=%" $1 - ;; + * ) + if [[ -z $current_section_name ]]; then + sed -i -E 's^(\s*?)#'"$current_setting_line"'^\1'"$current_setting_line"'^' $1 + else + sed -i -E '\^\['"$current_section_name"'\]^,\^\s*?#'"$current_setting_line"'^s^(\s*?)#'"$current_setting_line"'^\1'"$current_setting_line"'^' $1 + fi + ;; - "retroarch" ) - sed -i "s%^#$2 = %$2 = %" $1 - ;; - - "dolphin" ) - sed -i "s%^#$2 = %$2 = %" $1 - ;; - - "duckstation" ) - sed -i "s%^#$2 = %$2 = %" $1 - ;; - - "pcsx2" ) - sed -i "s%^#$2 = %$2 = %" $1 - ;; - - "ppsspp" ) - sed -i "s%^#$2 = %$2 = %" $1 - ;; - - "rpcs3" ) # This does not currently work for settings with a $ in them - sed -i "s%^#$2: %$2: %" $1 - ;; - - "yuzu" ) - yuzu_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%^#$yuzu_setting=%$yuzu_setting=%" $1 - ;; - - "citra" ) - citra_setting=$(sed -e 's%\\%\\\\%g' <<< "$2") # Acommodate backslashes in setting name - sed -i "s%^#$citra_setting=%$citra_setting=%" $1 - ;; - - "melonds" ) - sed -i "s%^#$2=%$2=%" $1 - ;; - - "xemu" ) - sed -i "s%^#$2 = %$2 = %" $1 - ;; - -esac + esac } disable_file() { @@ -383,6 +222,138 @@ enable_file() { mv $(realpath $1.disabled) $(realpath $(echo $1 | sed -e 's/\.disabled//')) } +generate_patch () { + # generate_patch $original_file $modified_file $patch_file $system + + rm $3 # Remove old patch file (maybe change this to create a backup instead?) + + while read -r current_setting_line; # Look for changes from the original file to the modified one + do + + printf -v escaped_setting_line '%q' "$current_setting_line" # Take care of special characters before they mess with future commands + + if [[ (! -z $current_setting_line) && (! $current_setting_line == "#!/bin/bash") ]]; then # Ignore empty or Bash start lines + if [[ $current_setting_line =~ ^\[.*\] ]]; then # Capture section header lines + action="section" + current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name + elif [[ (! -z $current_section) ]]; then # If line is in a section... + if [[ ! -z $(grep -o -P "^\s*?#.*?$" <<< "$current_setting_line") ]]; then # Check for disabled lines + if [[ -z $(sed -n -E '\^\['"$current_section"'\]^,\^\s*?'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'^{ \^\['"$current_section"'\]^! { \^\s*?'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'^ p } }' $2) ]]; then # If disabled line is not disabled in new file... + action="disable_setting" + echo $action"^"$current_section"^"$(sed -n -E 's^\s*?#(.*?)$^\1^p' <<< $(sed -E 's/^[ \t]*//' <<< "$current_setting_line")) >> $3 + fi + elif [[ ! -z $(sed -n -E '\^\['"$current_section"'\]^,\^\s*?#'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'^{ \^\['"$current_section"'\]^! { \^\s*?#'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'^ p } }' $2) ]]; then # Check if line is disabled in new file + action="enable_setting" + echo $action"^"$current_section"^"$current_setting_line >> $3 + else # Look for setting value differences + current_setting_name=$(get_setting_name "$escaped_setting_line" $4) + if [[ (-z $(sed -n -E '\^\['"$current_section"'\]^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]^! { \^\b'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'$^ p } }' $2)) ]]; then # If the same setting line is not found in the same section of the modified file... + if [[ ! -z $(sed -n -E '\^\['"$current_section"'\]^,\^\b'"$current_setting_name"'^{ \^\['"$current_section"'\]^! { \^\b'"$current_setting_name"'^ p } }' $2) ]]; then # But the setting exists in that section, only with a different value... + new_setting_value=$(get_setting_value $2 "$current_setting_name" $4 $current_section) + action="change" + echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$4 >> $3 + fi + fi + fi + elif [[ (-z $current_section) ]]; then # If line is not in a section... + if [[ ! -z $(grep -o -P "^\s*?#.*?$" <<< "$current_setting_line") ]]; then # Check for disabled lines + if [[ -z $(grep -o -P "^\s*?$current_setting_line$" $2) ]]; then # If disabled line is not disabled in new file... + action="disable_setting" + echo $action"^"$current_section"^"$(sed -n -E 's^\s*?#(.*?)$^\1^p' <<< "$current_setting_line") >> $3 + fi + elif [[ ! -z $(sed -n -E '\^\s*?#'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'$^p' $2) ]]; then # Check if line is disabled in new file + action="enable_setting" + echo $action"^"$current_section"^"$current_setting_line >> $3 + else # Look for setting value differences + if [[ (-z $(sed -n -E '\^\s*?\b'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'$^p' $2)) ]]; then # If the same setting line is not found in the modified file... + current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") + if [[ ! -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' $2) ]]; then # But the setting exists, only with a different value... + new_setting_value=$(get_setting_value $2 "$current_setting_name" $4) + action="change" + echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$4 >> $3 + fi + fi + fi + fi + fi + done < $1 + + # Reset the variables for reuse + action="" + current_section="" + current_setting_name="" + current_setting_value="" + + while read -r current_setting_line; # Look for new lines (from dynamically generated config files) in modified file compared to original + do + + printf -v escaped_setting_line '%q' "$current_setting_line" # Take care of special characters before they mess with future commands + + if [[ (! -z $current_setting_line) && (! $current_setting_line == "#!/bin/bash") ]]; then # Ignore empty or Bash start lines + if [[ $current_setting_line =~ ^\[.*\] ]]; then # Capture section header lines + action="section" + current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name + elif [[ (! -z $current_section) ]]; then + current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") + if [[ -z $(sed -n -E '\^\['"$current_section"'\]^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]^! { \^\b'"$current_setting_name"'^p } }' $1 ) ]]; then # If setting name is not found in this section of the original file... + action="add_setting" + echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> $3 + fi + elif [[ (-z $current_section) ]]; then + current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") + if [[ -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' $1) ]]; then # If setting name is not found in the original file... + action="add_setting" + echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> $3 + fi + fi + fi + done < $2 +} + +deploy_patch () { + +# This function will take an "original" file and a patch file and generate a ready to use modified file +# USAGE: deploy_patch $original_file $patch_file $output_file + +cp -fv $1 $3 # Create a copy of the original file to be patched + +while IFS="^" read -r action current_section setting_name setting_value system_name +do + + case $action in + + "disable_file" ) + disable_file $setting_name + ;; + + "enable_file" ) + enable_file $setting_name + ;; + + "add_setting" ) + add_setting $3 "$setting_name" $system_name $current_section + ;; + + "disable_setting" ) + disable_setting $3 "$setting_name" $system_name $current_section + ;; + + "enable_setting" ) + enable_setting $3 "$setting_name" $system_name $current_section + ;; + + "change" ) + set_setting_value $3 "$setting_name" "$setting_value" $system_name $current_section + ;; + + * ) + echo "Config file malformed" + ;; + + esac +done < $2 +} + conf_write() { # writes the variables in the retrodeck config file From b16b875b64fcc82f1e0283ed9bf7ee92123667ba Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 7 Nov 2022 17:03:36 -0500 Subject: [PATCH 19/46] Add_setting function and RPCS3 workarounds --- functions.sh | 58 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/functions.sh b/functions.sh index 38beab7a..8c85257b 100644 --- a/functions.sh +++ b/functions.sh @@ -97,7 +97,7 @@ set_setting_value() { if [[ -z $current_section_name ]]; then sed -i -E 's^\b'"$setting_name_to_change"'(\s?[=:]\s?).*^'"$setting_name_to_change"'\1'"$setting_value_to_change"'^' $1 else - sed -i -E '\^\['"$current_section_name"'\]^,\^\b'"$setting_name_to_change"'.*^s^\b'"$setting_name_to_change"'(\s?[=:]\s?).*^'"$setting_name_to_change"'\1'"$setting_value_to_change"'^' $1 + sed -i -E '\^\['"$current_section_name"'\]|\b'"$current_section"':$^,\^\b'"$setting_name_to_change"'.*^s^\b'"$setting_name_to_change"'(\s?[=:]\s?).*^'"$setting_name_to_change"'\1'"$setting_value_to_change"'^' $1 fi ;; @@ -145,7 +145,7 @@ get_setting_value() { if [[ -z $current_section_name ]]; then sed -n -E 's^\s*\b'"$current_setting_name"'\s?:\s?(.*)^\1^p' $1 else - sed -n -E '\^\['"$current_section_name"'\]^,\^'"$current_setting_name"'^{ \^\['"$current_section_name"'\]^! { \^\b'"$current_setting_name"'^ p } }' $1 | sed -n -E 's^\s*\b.*\s?:\s?(.*)$^\1^p' + sed -n -E '\^\b'"$current_section"':$^,\^'"$current_setting_name"'^{ \^\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^ p } }' $1 | sed -n -E 's^\s*\b.*\s?:\s?(.*)$^\1^p' fi ;; @@ -162,8 +162,22 @@ get_setting_value() { add_setting() { # This function will add a setting line to a file. This is useful for dynamically generated config files where a setting line may not exist until the setting is changed from the default. - echo "WIP" + # USAGE: add_setting $setting_file $setting_line $system $section (optional) + local current_setting_line=$(sed -e 's^\\^\\\\^g;s^`^\\`^g' <<< "$2") + local current_section_name=$(sed -e 's/%/\\%/g' <<< "$4") + + case $3 in + + * ) + if [[ -z $current_section_name ]]; then + sed -i '$ a '"$current_setting_line"'' $1 + else + sed -i '/^\s*?\['"$current_section_name"'\]|\b'"$current_section"':$/a '"$current_setting_line"'' $1 + fi + ;; + + esac } disable_setting() { @@ -179,7 +193,7 @@ disable_setting() { if [[ -z $current_section_name ]]; then sed -i -E 's^(\s*?)'"$current_setting_line"'^\1#'"$current_setting_line"'^' $1 else - sed -i -E '\^\['"$current_section_name"'\]^,\^\s*?'"$current_setting_line"'^s^(\s*?)'"$current_setting_line"'^\1#'"$current_setting_line"'^' $1 + sed -i -E '\^\['"$current_section_name"'\]|\b'"$current_section"':$^,\^\s*?'"$current_setting_line"'^s^(\s*?)'"$current_setting_line"'^\1#'"$current_setting_line"'^' $1 fi ;; @@ -199,7 +213,7 @@ enable_setting() { if [[ -z $current_section_name ]]; then sed -i -E 's^(\s*?)#'"$current_setting_line"'^\1'"$current_setting_line"'^' $1 else - sed -i -E '\^\['"$current_section_name"'\]^,\^\s*?#'"$current_setting_line"'^s^(\s*?)#'"$current_setting_line"'^\1'"$current_setting_line"'^' $1 + sed -i -E '\^\['"$current_section_name"'\]|\b'"$current_section"':$^,\^\s*?#'"$current_setting_line"'^s^(\s*?)#'"$current_setting_line"'^\1'"$current_setting_line"'^' $1 fi ;; @@ -232,23 +246,28 @@ generate_patch () { printf -v escaped_setting_line '%q' "$current_setting_line" # Take care of special characters before they mess with future commands - if [[ (! -z $current_setting_line) && (! $current_setting_line == "#!/bin/bash") ]]; then # Ignore empty or Bash start lines - if [[ $current_setting_line =~ ^\[.*\] ]]; then # Capture section header lines - action="section" - current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name + if [[ (! -z $current_setting_line) && (! $current_setting_line == "#!/bin/bash") && (! $current_setting_line == "[]") ]]; then # Ignore empty lines, empty arrays or Bash start lines + if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") || ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # Capture section header lines + if [[ $current_setting_line =~ ^\[.+\] ]]; then # If normal section line + action="section" + current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name + elif [[ ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # If RPCS3 section name + action="section" + current_section=$(sed 's^:$^^' <<< $current_setting_line) # Remove colon from section name + fi elif [[ (! -z $current_section) ]]; then # If line is in a section... if [[ ! -z $(grep -o -P "^\s*?#.*?$" <<< "$current_setting_line") ]]; then # Check for disabled lines - if [[ -z $(sed -n -E '\^\['"$current_section"'\]^,\^\s*?'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'^{ \^\['"$current_section"'\]^! { \^\s*?'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'^ p } }' $2) ]]; then # If disabled line is not disabled in new file... + if [[ -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\s*?'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\s*?'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'^ p } }' $2) ]]; then # If disabled line is not disabled in new file... action="disable_setting" echo $action"^"$current_section"^"$(sed -n -E 's^\s*?#(.*?)$^\1^p' <<< $(sed -E 's/^[ \t]*//' <<< "$current_setting_line")) >> $3 fi - elif [[ ! -z $(sed -n -E '\^\['"$current_section"'\]^,\^\s*?#'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'^{ \^\['"$current_section"'\]^! { \^\s*?#'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'^ p } }' $2) ]]; then # Check if line is disabled in new file + elif [[ ! -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\s*?#'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\s*?#'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'^ p } }' $2) ]]; then # Check if line is disabled in new file action="enable_setting" echo $action"^"$current_section"^"$current_setting_line >> $3 else # Look for setting value differences current_setting_name=$(get_setting_name "$escaped_setting_line" $4) - if [[ (-z $(sed -n -E '\^\['"$current_section"'\]^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]^! { \^\b'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'$^ p } }' $2)) ]]; then # If the same setting line is not found in the same section of the modified file... - if [[ ! -z $(sed -n -E '\^\['"$current_section"'\]^,\^\b'"$current_setting_name"'^{ \^\['"$current_section"'\]^! { \^\b'"$current_setting_name"'^ p } }' $2) ]]; then # But the setting exists in that section, only with a different value... + if [[ (-z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'$^ p } }' $2)) ]]; then # If the same setting line is not found in the same section of the modified file... + if [[ ! -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^ p } }' $2) ]]; then # But the setting exists in that section, only with a different value... new_setting_value=$(get_setting_value $2 "$current_setting_name" $4 $current_section) action="change" echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$4 >> $3 @@ -289,13 +308,20 @@ generate_patch () { printf -v escaped_setting_line '%q' "$current_setting_line" # Take care of special characters before they mess with future commands - if [[ (! -z $current_setting_line) && (! $current_setting_line == "#!/bin/bash") ]]; then # Ignore empty or Bash start lines - if [[ $current_setting_line =~ ^\[.*\] ]]; then # Capture section header lines + if [[ (! -z $current_setting_line) && (! $current_setting_line == "#!/bin/bash") && (! $current_setting_line == "[]") ]]; then # Ignore empty lines, empty arrays or Bash start lines + if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") || ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # Capture section header lines + if [[ $current_setting_line =~ ^\[.+\] ]]; then # If normal section line action="section" current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name + echo "Section found:" "$current_section""." + elif [[ ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # If RPCS3 section name + action="section" + current_section=$(sed 's^:$^^' <<< $current_setting_line) # Remove colon from section name + echo "Section found:" "$current_section""." + fi elif [[ (! -z $current_section) ]]; then current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") - if [[ -z $(sed -n -E '\^\['"$current_section"'\]^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]^! { \^\b'"$current_setting_name"'^p } }' $1 ) ]]; then # If setting name is not found in this section of the original file... + if [[ -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^p } }' $1 ) ]]; then # If setting name is not found in this section of the original file... action="add_setting" echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> $3 fi From 61bd22dd33b0dfc122fa5ceda415a82af2517e7a Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 8 Nov 2022 10:56:05 -0500 Subject: [PATCH 20/46] Update Dolphin flatpack detection --- rd-submodules/dolphin/detectflatpak.patch | 47 ++++++++++------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/rd-submodules/dolphin/detectflatpak.patch b/rd-submodules/dolphin/detectflatpak.patch index 2133f1ff..d0b0f889 100644 --- a/rd-submodules/dolphin/detectflatpak.patch +++ b/rd-submodules/dolphin/detectflatpak.patch @@ -1,40 +1,33 @@ -commit d4c899cede0743d40934ca11f83691cda72ff9dd -Author: Carles Pastor -Date: Sat Apr 2 20:47:06 2022 +0200 +From f2d3b349d8487cf0ee50b36ba024ac513d36f826 Mon Sep 17 00:00:00 2001 +From: Carles Pastor +Date: Sat, 20 Aug 2022 13:35:32 +0200 +Subject: [PATCH] Detect we are running inside a flatpak sandbox - Detect when running inside a flatpak sandbox +--- + Source/Core/UICommon/UICommon.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/UICommon/UICommon.cpp b/Source/Core/UICommon/UICommon.cpp -index cb857fd3c7..e3ddde24fb 100644 +index 8d9dc2abb8..8a9d39a3d5 100644 --- a/Source/Core/UICommon/UICommon.cpp +++ b/Source/Core/UICommon/UICommon.cpp -@@ -309,24 +309,25 @@ void SetUserDirectory(std::string custom_path) - // We are on a non-Apple and non-Android POSIX system, there are 4 cases: - // 1. GetExeDirectory()/portable.txt exists +@@ -348,7 +348,7 @@ void SetUserDirectory(std::string custom_path) // -> Use GetExeDirectory()/User -- // 2. $DOLPHIN_EMU_USERPATH is set -+ // 2. $DOLPHIN_EMU_USERPATH is set, and we're not in flatpak + // 2. $DOLPHIN_EMU_USERPATH is set // -> Use $DOLPHIN_EMU_USERPATH - // 3. ~/.dolphin-emu directory exists + // 3. ~/.dolphin-emu directory exists, and we're not in flatpak // -> Use ~/.dolphin-emu // 4. Default // -> Use XDG basedir, see - // http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - user_path = home_path + "." DOLPHIN_DATA_DIR DIR_SEP; - std::string exe_path = File::GetExeDirectory(); -+ bool flatpak = File::Exists("/.flatpak-info"); - if (File::Exists(exe_path + DIR_SEP "portable.txt")) +@@ -381,7 +381,7 @@ void SetUserDirectory(std::string custom_path) { - user_path = exe_path + DIR_SEP "User" DIR_SEP; - } -- else if (env_path) -+ else if (env_path && !flatpak) - { - user_path = env_path; - } -- else if (!File::Exists(user_path)) -+ else if (flatpak || !File::Exists(user_path)) - { - const char* data_home = getenv("XDG_DATA_HOME"); - std::string data_path = + user_path = home_path + "." DOLPHIN_DATA_DIR DIR_SEP; + +- if (!File::Exists(user_path)) ++ if (File::Exists("/.flatpak-info") || !File::Exists(user_path)) + { + const char* data_home = getenv("XDG_DATA_HOME"); + std::string data_path = +-- +2.37.1 \ No newline at end of file From f823b80ecabd6f24cc83e4703c008e1468f8bdd6 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 18 Nov 2022 14:37:51 -0500 Subject: [PATCH 21/46] Prepare PCSX2 configs for 0.6.0b --- .../{PCSX2-legacy => PCSX2-QT}/PCSX2.ini | 158 +++++++++--------- emu-configs/{PCSX2-legacy => PCSX2}/GS.ini | 0 emu-configs/PCSX2/PCSX2.ini | 158 +++++++++--------- .../{PCSX2-legacy => PCSX2}/PCSX2_ui.ini | 0 .../{PCSX2-legacy => PCSX2}/PCSX2_vm.ini | 0 5 files changed, 158 insertions(+), 158 deletions(-) rename emu-configs/{PCSX2-legacy => PCSX2-QT}/PCSX2.ini (78%) rename emu-configs/{PCSX2-legacy => PCSX2}/GS.ini (100%) rename emu-configs/{PCSX2-legacy => PCSX2}/PCSX2_ui.ini (100%) rename emu-configs/{PCSX2-legacy => PCSX2}/PCSX2_vm.ini (100%) diff --git a/emu-configs/PCSX2-legacy/PCSX2.ini b/emu-configs/PCSX2-QT/PCSX2.ini similarity index 78% rename from emu-configs/PCSX2-legacy/PCSX2.ini rename to emu-configs/PCSX2-QT/PCSX2.ini index 56981725..6923a916 100644 --- a/emu-configs/PCSX2-legacy/PCSX2.ini +++ b/emu-configs/PCSX2-QT/PCSX2.ini @@ -1,9 +1,30 @@ [UI] SettingsVersion = 1 -MainWindowGeometry = AdnQywADAAAAAAAAAAAAAAAAA7UAAAJ/AAAAAAAAAAAAAAO1AAACfwAAAAAAAAAABQAAAAAAAAAAAAAAA7UAAAJ/ -MainWindowState = AAAA/wAAAAD9AAAAAAAAA7YAAAJXAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIAAAAAAP////8AAAAAAAAAAA== -PauseOnFocusLoss = true +InhibitScreensaver = true +ConfirmShutdown = true +StartPaused = false +PauseOnFocusLoss = false StartFullscreen = true +DoubleClickTogglesFullscreen = true +HideMouseCursor = false +RenderToSeparateWindow = false +HideMainWindowWhenRunning = false +DisableWindowResize = false +Theme = darkfusion + + +[Folders] +Bios = ~/retrodeck/roms/bios +Snapshots = ~/retrodeck/screenshots +Savestates = ~/retrodeck/states/ps2/pcsx2 +MemoryCards = ~/retrodeck/saves/ps2/memcards +Logs = ~/retrodeck/.logs +Cheats = /var/config/PCSX2/cheats +CheatsWS = /var/config/PCSX2/cheats_ws +CheatsNI = cheats_ni +Cache = /var/config/PCSX2/cache +Textures = /var/config/PCSX2/textures +InputProfiles = inputprofiles [EmuCore] @@ -17,7 +38,9 @@ EnableWideScreenPatches = false EnableNoInterlacingPatches = false EnableRecordingTools = true EnableGameFixes = true -SaveStateOnShutdown = true +SaveStateOnShutdown = false +EnableDiscordPresence = false +InhibitScreensaver = true ConsoleToStdio = false HostFs = false PatchBios = false @@ -26,8 +49,10 @@ BackupSavestate = true SavestateZstdCompression = true McdEnableEjection = true McdFolderAutoManage = true +WarnAboutUnsafeSettings = true GzipIsoIndexTemplate = $(f).pindex.tmp BlockDumpSaveDirectory = +EnableFastBoot = true [EmuCore/Speedhacks] @@ -37,7 +62,7 @@ fastCDVD = false IntcStat = true WaitLoop = true vuFlagHack = true -vuThread = true +vuThread = false vu1Instant = true @@ -73,13 +98,13 @@ PreBlockCheckIOP = false 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 +Zoom = 100 +StretchY = 100 CropLeft = 0 CropTop = 0 CropRight = 0 @@ -105,8 +130,10 @@ OsdShowGPU = false OsdShowResolution = false OsdShowGSStats = false OsdShowIndicators = true -HWDisableReadbacks = false -accurate_date = true +OsdShowSettings = false +OsdShowInputs = false +HWSpinGPUForReadbacks = false +HWSpinCPUForReadbacks = false paltex = false autoflush_sw = true preload_frame_with_gs_data = false @@ -139,7 +166,7 @@ LoadTextureReplacements = false LoadTextureReplacementsAsync = true PrecacheTextureReplacements = false deinterlace = 7 -OsdScale = 250 +OsdScale = 100 Renderer = -1 upscale_multiplier = 1 mipmap_hw = -1 @@ -148,6 +175,7 @@ crc_hack_level = -1 filter = 2 texture_preloading = 2 GSDumpCompression = 1 +HWDownloadMode = 0 dithering_ps2 = 2 MaxAnisotropy = 0 extrathreads = 2 @@ -161,7 +189,7 @@ UserHacks_round_sprite_offset = 0 UserHacks_TCOffsetX = 0 UserHacks_TCOffsetY = 0 UserHacks_CPUSpriteRenderBW = 0 -UserHacks_TriFilter = -1 +TriFilter = -1 OverrideTextureBarriers = -1 OverrideGeometryShaders = -1 ShadeBoost_Brightness = 50 @@ -177,18 +205,19 @@ shaderfx_glsl = shaders/GS.fx [SPU2/Mixing] Interpolation = 5 FinalVolume = 100 -VolumeAdjustC = 0.000000 -VolumeAdjustFL = 0.000000 -VolumeAdjustFR = 0.000000 -VolumeAdjustBL = 0.000000 -VolumeAdjustBR = 0.000000 -VolumeAdjustSL = 0.000000 -VolumeAdjustSR = 0.000000 -VolumeAdjustLFE = 0.000000 +VolumeAdjustC = 0 +VolumeAdjustFL = 0 +VolumeAdjustFR = 0 +VolumeAdjustBL = 0 +VolumeAdjustBR = 0 +VolumeAdjustSL = 0 +VolumeAdjustSR = 0 +VolumeAdjustLFE = 0 [SPU2/Output] OutputModule = cubeb +BackendName = Latency = 100 SynchMode = 0 SpeakerConfiguration = 0 @@ -266,14 +295,25 @@ EE.bitset = 0 IOP.bitset = 0 +[Achievements] +Enabled = false +TestMode = false +UnofficialTestMode = false +RichPresence = true +ChallengeMode = false +Leaderboards = true +SoundEffects = true +PrimedIndicators = true + + [Filenames] BIOS = [Framerate] -NominalScalar = 1.000000 -TurboScalar = 2.000000 -SlomoScalar = 0.500000 +NominalScalar = 1 +TurboScalar = 2 +SlomoScalar = 0.5 [MemoryCards] @@ -295,25 +335,22 @@ Multitap2_Slot4_Enable = false Multitap2_Slot4_Filename = Mcd-Multitap2-Slot04.ps2 -[Folders] -Bios = ~/retrodeck/bios -Snapshots = ~/retrodeck/screenshots -SaveStates = ~/retrodeck/states/ps2/pcsx2 -MemoryCards = ~/retrodeck/saves/ps2/pcsx2/memcards -Logs = logs -Cheats = cheats -CheatsWS = cheats_ws -CheatsNI = cheats_ni -Cache = cache -Textures = textures -InputProfiles = inputprofiles +[Logging] +EnableSystemConsole = false +EnableFileLogging = false +EnableTimestamps = true +EnableVerbose = false +EnableEEConsole = false +EnableIOPConsole = false +EnableInputRecordingLogs = true +EnableControllerLogs = false [InputSources] +Keyboard = true +Mouse = true SDL = true SDLControllerEnhancedMode = false -XInput = false -RawInput = false [Hotkeys] @@ -342,10 +379,8 @@ ShutdownVM = SDL-0/Start & SDL-0/Back [Pad] MultitapPort1 = false MultitapPort2 = false -PointerXScale = 8.000000 -PointerYScale = 8.000000 -PointerXInvert = false -PointerYInvert = false +PointerXScale = 8 +PointerYScale = 8 [Pad1] @@ -385,66 +420,27 @@ LargeMotor = SDL-0/LargeMotor [Pad2] Type = None -Deadzone = 0.000000 -AxisScale = 1.330000 -LargeMotorScale = 1.000000 -SmallMotorScale = 1.000000 -PressureModifier = 0.500000 [Pad3] Type = None -Deadzone = 0.000000 -AxisScale = 1.330000 -LargeMotorScale = 1.000000 -SmallMotorScale = 1.000000 -PressureModifier = 0.500000 [Pad4] Type = None -Deadzone = 0.000000 -AxisScale = 1.330000 -LargeMotorScale = 1.000000 -SmallMotorScale = 1.000000 -PressureModifier = 0.500000 [Pad5] Type = None -Deadzone = 0.000000 -AxisScale = 1.330000 -LargeMotorScale = 1.000000 -SmallMotorScale = 1.000000 -PressureModifier = 0.500000 [Pad6] Type = None -Deadzone = 0.000000 -AxisScale = 1.330000 -LargeMotorScale = 1.000000 -SmallMotorScale = 1.000000 -PressureModifier = 0.500000 [Pad7] Type = None -Deadzone = 0.000000 -AxisScale = 1.330000 -LargeMotorScale = 1.000000 -SmallMotorScale = 1.000000 -PressureModifier = 0.500000 [Pad8] Type = None -Deadzone = 0.000000 -AxisScale = 1.330000 -LargeMotorScale = 1.000000 -SmallMotorScale = 1.000000 -PressureModifier = 0.500000 - - -[GameList] -RecursivePaths = ~/retrodeck/roms/ps2 \ No newline at end of file diff --git a/emu-configs/PCSX2-legacy/GS.ini b/emu-configs/PCSX2/GS.ini similarity index 100% rename from emu-configs/PCSX2-legacy/GS.ini rename to emu-configs/PCSX2/GS.ini diff --git a/emu-configs/PCSX2/PCSX2.ini b/emu-configs/PCSX2/PCSX2.ini index 6923a916..56981725 100644 --- a/emu-configs/PCSX2/PCSX2.ini +++ b/emu-configs/PCSX2/PCSX2.ini @@ -1,30 +1,9 @@ [UI] SettingsVersion = 1 -InhibitScreensaver = true -ConfirmShutdown = true -StartPaused = false -PauseOnFocusLoss = false +MainWindowGeometry = AdnQywADAAAAAAAAAAAAAAAAA7UAAAJ/AAAAAAAAAAAAAAO1AAACfwAAAAAAAAAABQAAAAAAAAAAAAAAA7UAAAJ/ +MainWindowState = AAAA/wAAAAD9AAAAAAAAA7YAAAJXAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIAAAAAAP////8AAAAAAAAAAA== +PauseOnFocusLoss = true StartFullscreen = true -DoubleClickTogglesFullscreen = true -HideMouseCursor = false -RenderToSeparateWindow = false -HideMainWindowWhenRunning = false -DisableWindowResize = false -Theme = darkfusion - - -[Folders] -Bios = ~/retrodeck/roms/bios -Snapshots = ~/retrodeck/screenshots -Savestates = ~/retrodeck/states/ps2/pcsx2 -MemoryCards = ~/retrodeck/saves/ps2/memcards -Logs = ~/retrodeck/.logs -Cheats = /var/config/PCSX2/cheats -CheatsWS = /var/config/PCSX2/cheats_ws -CheatsNI = cheats_ni -Cache = /var/config/PCSX2/cache -Textures = /var/config/PCSX2/textures -InputProfiles = inputprofiles [EmuCore] @@ -38,9 +17,7 @@ EnableWideScreenPatches = false EnableNoInterlacingPatches = false EnableRecordingTools = true EnableGameFixes = true -SaveStateOnShutdown = false -EnableDiscordPresence = false -InhibitScreensaver = true +SaveStateOnShutdown = true ConsoleToStdio = false HostFs = false PatchBios = false @@ -49,10 +26,8 @@ BackupSavestate = true SavestateZstdCompression = true McdEnableEjection = true McdFolderAutoManage = true -WarnAboutUnsafeSettings = true GzipIsoIndexTemplate = $(f).pindex.tmp BlockDumpSaveDirectory = -EnableFastBoot = true [EmuCore/Speedhacks] @@ -62,7 +37,7 @@ fastCDVD = false IntcStat = true WaitLoop = true vuFlagHack = true -vuThread = false +vuThread = true vu1Instant = true @@ -98,13 +73,13 @@ PreBlockCheckIOP = false VsyncQueueSize = 2 FrameLimitEnable = true VsyncEnable = 0 -FramerateNTSC = 59.94 -FrameratePAL = 50 +FramerateNTSC = 59.940000 +FrameratePAL = 50.000000 SyncToHostRefreshRate = false AspectRatio = Auto 4:3/3:2 FMVAspectRatioSwitch = Off -Zoom = 100 -StretchY = 100 +Zoom = 100.000000 +StretchY = 100.000000 CropLeft = 0 CropTop = 0 CropRight = 0 @@ -130,10 +105,8 @@ OsdShowGPU = false OsdShowResolution = false OsdShowGSStats = false OsdShowIndicators = true -OsdShowSettings = false -OsdShowInputs = false -HWSpinGPUForReadbacks = false -HWSpinCPUForReadbacks = false +HWDisableReadbacks = false +accurate_date = true paltex = false autoflush_sw = true preload_frame_with_gs_data = false @@ -166,7 +139,7 @@ LoadTextureReplacements = false LoadTextureReplacementsAsync = true PrecacheTextureReplacements = false deinterlace = 7 -OsdScale = 100 +OsdScale = 250 Renderer = -1 upscale_multiplier = 1 mipmap_hw = -1 @@ -175,7 +148,6 @@ crc_hack_level = -1 filter = 2 texture_preloading = 2 GSDumpCompression = 1 -HWDownloadMode = 0 dithering_ps2 = 2 MaxAnisotropy = 0 extrathreads = 2 @@ -189,7 +161,7 @@ UserHacks_round_sprite_offset = 0 UserHacks_TCOffsetX = 0 UserHacks_TCOffsetY = 0 UserHacks_CPUSpriteRenderBW = 0 -TriFilter = -1 +UserHacks_TriFilter = -1 OverrideTextureBarriers = -1 OverrideGeometryShaders = -1 ShadeBoost_Brightness = 50 @@ -205,19 +177,18 @@ shaderfx_glsl = shaders/GS.fx [SPU2/Mixing] Interpolation = 5 FinalVolume = 100 -VolumeAdjustC = 0 -VolumeAdjustFL = 0 -VolumeAdjustFR = 0 -VolumeAdjustBL = 0 -VolumeAdjustBR = 0 -VolumeAdjustSL = 0 -VolumeAdjustSR = 0 -VolumeAdjustLFE = 0 +VolumeAdjustC = 0.000000 +VolumeAdjustFL = 0.000000 +VolumeAdjustFR = 0.000000 +VolumeAdjustBL = 0.000000 +VolumeAdjustBR = 0.000000 +VolumeAdjustSL = 0.000000 +VolumeAdjustSR = 0.000000 +VolumeAdjustLFE = 0.000000 [SPU2/Output] OutputModule = cubeb -BackendName = Latency = 100 SynchMode = 0 SpeakerConfiguration = 0 @@ -295,25 +266,14 @@ EE.bitset = 0 IOP.bitset = 0 -[Achievements] -Enabled = false -TestMode = false -UnofficialTestMode = false -RichPresence = true -ChallengeMode = false -Leaderboards = true -SoundEffects = true -PrimedIndicators = true - - [Filenames] BIOS = [Framerate] -NominalScalar = 1 -TurboScalar = 2 -SlomoScalar = 0.5 +NominalScalar = 1.000000 +TurboScalar = 2.000000 +SlomoScalar = 0.500000 [MemoryCards] @@ -335,22 +295,25 @@ Multitap2_Slot4_Enable = false Multitap2_Slot4_Filename = Mcd-Multitap2-Slot04.ps2 -[Logging] -EnableSystemConsole = false -EnableFileLogging = false -EnableTimestamps = true -EnableVerbose = false -EnableEEConsole = false -EnableIOPConsole = false -EnableInputRecordingLogs = true -EnableControllerLogs = false +[Folders] +Bios = ~/retrodeck/bios +Snapshots = ~/retrodeck/screenshots +SaveStates = ~/retrodeck/states/ps2/pcsx2 +MemoryCards = ~/retrodeck/saves/ps2/pcsx2/memcards +Logs = logs +Cheats = cheats +CheatsWS = cheats_ws +CheatsNI = cheats_ni +Cache = cache +Textures = textures +InputProfiles = inputprofiles [InputSources] -Keyboard = true -Mouse = true SDL = true SDLControllerEnhancedMode = false +XInput = false +RawInput = false [Hotkeys] @@ -379,8 +342,10 @@ ShutdownVM = SDL-0/Start & SDL-0/Back [Pad] MultitapPort1 = false MultitapPort2 = false -PointerXScale = 8 -PointerYScale = 8 +PointerXScale = 8.000000 +PointerYScale = 8.000000 +PointerXInvert = false +PointerYInvert = false [Pad1] @@ -420,27 +385,66 @@ LargeMotor = SDL-0/LargeMotor [Pad2] Type = None +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 [Pad3] Type = None +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 [Pad4] Type = None +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 [Pad5] Type = None +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 [Pad6] Type = None +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 [Pad7] Type = None +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 [Pad8] Type = None +Deadzone = 0.000000 +AxisScale = 1.330000 +LargeMotorScale = 1.000000 +SmallMotorScale = 1.000000 +PressureModifier = 0.500000 + + +[GameList] +RecursivePaths = ~/retrodeck/roms/ps2 \ No newline at end of file diff --git a/emu-configs/PCSX2-legacy/PCSX2_ui.ini b/emu-configs/PCSX2/PCSX2_ui.ini similarity index 100% rename from emu-configs/PCSX2-legacy/PCSX2_ui.ini rename to emu-configs/PCSX2/PCSX2_ui.ini diff --git a/emu-configs/PCSX2-legacy/PCSX2_vm.ini b/emu-configs/PCSX2/PCSX2_vm.ini similarity index 100% rename from emu-configs/PCSX2-legacy/PCSX2_vm.ini rename to emu-configs/PCSX2/PCSX2_vm.ini From ab8ef28cae7726e3a5110bbc6f66616dca18f322 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 18 Nov 2022 15:10:17 -0500 Subject: [PATCH 22/46] Refactor post_update --- functions.sh | 188 ---------------------------------- global.sh | 12 ++- net.retrodeck.retrodeck.yml | 2 + post_update.sh | 197 ++++++++++++++++++++++++++++++++++++ retrodeck.sh | 11 +- tools/configurator.sh | 1 - 6 files changed, 213 insertions(+), 198 deletions(-) create mode 100644 post_update.sh diff --git a/functions.sh b/functions.sh index 8c85257b..7e0203dc 100644 --- a/functions.sh +++ b/functions.sh @@ -741,194 +741,6 @@ create_lock() { conf_write } -post_update() { - # post update script - echo "Executing post-update script" - - # Finding existing ROMs folder - if [ -d "$default_sd/retrodeck" ] - then - # ROMs on SD card - roms_folder="$default_sd/retrodeck/roms" - if [[ ! -L $rdhome && ! -L $rdhome/roms ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory - ln -s $roms_folder $rdhome/roms - fi - else - # ROMs on Internal - roms_folder="$HOME/retrodeck/roms" - fi - echo "ROMs folder found at $roms_folder" - - # Unhiding downloaded media from the previous versions - if [ -d "$rdhome/.downloaded_media" ] - then - mv -fv "$rdhome/.downloaded_media" "$media_folder" - fi - - # Unhiding themes folder from the previous versions - if [ -d "$rdhome/.themes" ] - then - mv -fv "$rdhome/.themes" "$themes_folder" - fi - - # Doing the dir prep as we don't know from which version we came - dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" - dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" - mkdir -pv $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/.emulationstation/es_settings.xml - - - # 0.4 -> 0.5 - # Perform save and state migration if needed - - # Moving PCSX2 Saves - mv -fv /var/config/PCSX2/sstates/* $rdhome/states/ps2/pcsx2 - mv -fv /var/config/PCSX2/memcards/* $rdhome/saves/ps2/memcards - - # Moving Citra saves from legacy location to 0.5.0b structure - - mv -fv $rdhome/saves/Citra/* $rdhome/saves/n3ds/citra - rmdir $rdhome/saves/Citra # Old folder cleanup - - versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves - - if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 - migration_logfile=$rdhome/.logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log" - save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" - state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" - - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="You are updating to a version of RetroDECK where save file locations have changed!\n\nYour existing files will be backed up for safety and then sorted automatically.\n\nIf a file cannot be sorted automatically it will remain where it is for manual sorting.\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." - - allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder - - allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder - - allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder - - totalsaves=${#allsaves[@]} - totalstates=${#allstates[@]} - filesleft= - current_dest_folder= - gamestoskip= - - tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety - echo "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 - - ( - movefile() { # Take matching save and rom files and sort save into appropriate system folder - echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar - progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) - echo $progress - filesleft=$((filesleft-1)) - if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually - game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder - gamebasename=$(basename "$game" | sed -e 's/\..*//') # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to - matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found - if [[ ${#matches[@]} -gt 1 ]]; then - echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile - gamestoskip+=("$1") - return - fi - echo "INFO: Examining ROM file:" "$game" >> $migration_logfile - echo "INFO: 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 - 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 - 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 - fi - } - - find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script - - totalfiles=$totalsaves #set variables for save file migration - filesleft=$totalsaves - currentlybeingmoved="saves" - current_dest_folder=$saves_folder - - for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match - found= - currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 - for j in "${allgames[@]}"; do - currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - [[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip - done - [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file - done - - totalfiles=$totalstates #set variables for state file migration - filesleft=$totalstates - currentlybeingmoved="states" - current_dest_folder=$states_folder - - for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match - found= - currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 - for j in "${allgames[@]}"; do - currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 - [[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip - done - [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file - done - - ) | - zenity --progress \ - --icon-name=net.retrodeck.retrodeck \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title="Processing Files" \ - --text="# files remaining..." \ - --percentage=0 \ - --no-cancel \ - --auto-close - - if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." - - else - cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" - zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" \ - --text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" - fi - - else - echo "Version" $version "is after the save and state organization was changed, no need to sort again" - fi - - ( - ra_init - standalones_init - tools_init - ) | - 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." - - create_lock -} - start_retrodeck() { # normal startup echo "Starting RetroDECK v$version" diff --git a/global.sh b/global.sh index d0689825..08487ba2 100755 --- a/global.sh +++ b/global.sh @@ -41,6 +41,16 @@ pcsx2conf="/var/config/PCSX2/inis/GS.ini" pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" +# PCSX2-QT config file + +pcsx2qtconf="/var/config/PCSX2/inis/PCSX2.ini" + +# 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 +fi + # If there is no config file I initalize the file with the the default values if [ ! -f "$rd_conf" ] then @@ -51,7 +61,7 @@ then # 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 [[ $(cat $lockfile) == *"0.4."* ]] || [[ $(cat $lockfile) == *"0.3."* ]] || [[ $(cat $lockfile) == *"0.2."* ]] || [[ $(cat $lockfile) == *"0.1."* ]]; 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" version=$(cat $lockfile) else diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 3261faa3..2d8dfa67 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -985,6 +985,8 @@ modules: - cp functions.sh /app/libexec/functions.sh + - cp post_update.sh /app/libexec/post_update.sh + # Desktop entry - cp net.retrodeck.retrodeck.desktop /app/share/applications/net.retrodeck.retrodeck.desktop diff --git a/post_update.sh b/post_update.sh new file mode 100644 index 00000000..5f1d73c1 --- /dev/null +++ b/post_update.sh @@ -0,0 +1,197 @@ +#!/bin/bash + +post_update() { + + # post update script + echo "Executing post-update script" + + case $version in # Only run updates as needed + + "0.5.4b" ) + + # Finding existing ROMs folder + if [ -d "$default_sd/retrodeck" ] + then + # ROMs on SD card + roms_folder="$default_sd/retrodeck/roms" + if [[ ! -L $rdhome && ! -L $rdhome/roms ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory + ln -s $roms_folder $rdhome/roms + fi + else + # ROMs on Internal + roms_folder="$HOME/retrodeck/roms" + fi + echo "ROMs folder found at $roms_folder" + + # Unhiding downloaded media from the previous versions + if [ -d "$rdhome/.downloaded_media" ] + then + mv -fv "$rdhome/.downloaded_media" "$media_folder" + fi + + # Unhiding themes folder from the previous versions + if [ -d "$rdhome/.themes" ] + then + mv -fv "$rdhome/.themes" "$themes_folder" + fi + + # Doing the dir prep as we don't know from which version we came + dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" + mkdir -pv $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/.emulationstation/es_settings.xml + + # 0.4 -> 0.5 + # Perform save and state migration if needed + + # Moving PCSX2 Saves + mv -fv /var/config/PCSX2/sstates/* $rdhome/states/ps2/pcsx2 + mv -fv /var/config/PCSX2/memcards/* $rdhome/saves/ps2/memcards + + # Moving Citra saves from legacy location to 0.5.0b structure + + mv -fv $rdhome/saves/Citra/* $rdhome/saves/n3ds/citra + rmdir $rdhome/saves/Citra # Old folder cleanup + + versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves + + if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 + migration_logfile=$rdhome/.logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log" + save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" + state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip" + + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="You are updating to a version of RetroDECK where save file locations have changed!\n\nYour existing files will be backed up for safety and then sorted automatically.\n\nIf a file cannot be sorted automatically it will remain where it is for manual sorting.\n\nPLEASE BE PATIENT! This process can take several minutes if you have a large ROM library." + + allgames=($(find "$roms_folder" -maxdepth 2 -mindepth 2 ! -name "systeminfo.txt" ! -name "systems.txt" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" ! -name "*^*" | sed -e "s/ /\^/g")) # Build an array of all games and multi-disc-game-containing folders, adding whitespace placeholder + + allsaves=($(find "$saves_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all save files, ignoring standalone emulator sub-folders, adding whitespace placeholder + + allstates=($(find "$states_folder" -mindepth 1 -maxdepth 1 -name "*.*" ! -name "gc" ! -name "n3ds" ! -name "nds" ! -name "wii" ! -name "xbox" | sed -e "s/ /\^/g")) # Build an array of all state files, ignoring standalone emulator sub-folders, adding whitespace placeholder + + totalsaves=${#allsaves[@]} + totalstates=${#allstates[@]} + filesleft= + current_dest_folder= + gamestoskip= + + tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety + echo "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 + + ( + movefile() { # Take matching save and rom files and sort save into appropriate system folder + echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar + progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) + echo $progress + filesleft=$((filesleft-1)) + if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually + game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder + gamebasename=$(basename "$game" | sed -e 's/\..*//') # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to + matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found + if [[ ${#matches[@]} -gt 1 ]]; then + echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile + gamestoskip+=("$1") + return + fi + echo "INFO: Examining ROM file:" "$game" >> $migration_logfile + echo "INFO: 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 + 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 + 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 + fi + } + + find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script + + totalfiles=$totalsaves #set variables for save file migration + filesleft=$totalsaves + currentlybeingmoved="saves" + current_dest_folder=$saves_folder + + for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match + found= + currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 + for j in "${allgames[@]}"; do + currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + [[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip + done + [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file + done + + totalfiles=$totalstates #set variables for state file migration + filesleft=$totalstates + currentlybeingmoved="states" + current_dest_folder=$states_folder + + for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match + found= + currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 + for j in "${allgames[@]}"; do + currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 + [[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip + done + [[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file + done + + ) | + zenity --progress \ + --icon-name=net.retrodeck.retrodeck \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title="Processing Files" \ + --text="# files remaining..." \ + --percentage=0 \ + --no-cancel \ + --auto-close + + if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." + + else + cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" + zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" + fi + + else + echo "Version" $version "is after the save and state organization was changed, no need to sort again" + fi + ;; + + esac + + # These commands are run every time, for now + + ( + ra_init + standalones_init + tools_init + ) | + 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." + + create_lock +} \ No newline at end of file diff --git a/retrodeck.sh b/retrodeck.sh index 5e28a6b9..79e582a7 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -1,12 +1,7 @@ #!/bin/bash source /app/libexec/global.sh - -# 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 -fi +source /app/libexec/post_update.sh # Arguments section @@ -22,7 +17,7 @@ Arguments: -h, --help Print this help -v, --version Print RetroDECK version --info-msg Print paths and config informations - --reset Starts the initial RetroDECK installer (backup your data first!) + --reset-all Starts the initial RetroDECK installer (backup your data first!) --reset-ra Resets RetroArch's config to the default values --reset-sa Reset standalone emulator configs to the default values --reset-tools Recreate the tools section @@ -58,7 +53,7 @@ https://retrodeck.net tools_init shift # past argument with no value ;; - --reset*) + --reset-all*) rm -f "$lockfile" shift # past argument with no value ;; diff --git a/tools/configurator.sh b/tools/configurator.sh index b746080b..b3103f50 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -355,7 +355,6 @@ configurator_options_dialog() { } configurator_move_dialog() { -"Move Everything" ) if [[ -d $rdhome ]]; then configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." destination=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the RetroDECK data folder.") From d0591a08b3bb2eed6e8235dbf2ac943652bdc2a5 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 18 Nov 2022 15:15:59 -0500 Subject: [PATCH 23/46] SA manual config disclaimer --- tools/configurator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/configurator.sh b/tools/configurator.sh index b3103f50..d5857b7d 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -203,7 +203,7 @@ configurator_update_dialog() { configurator_power_user_changes_dialog() { zenity --title "RetroDECK Configurator Utility - Power User Options" --question --no-wrap --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\n\nplease continue only if you know what you're doing.\n\nDo you want to continue?" + --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\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?" if [ $? == 1 ] # Cancel button clicked then From 1d0480c473954a86d33b327a467fc1e942b052e8 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 18 Nov 2022 21:28:05 -0500 Subject: [PATCH 24/46] Fix Unzips, removed redundant conf_write --- functions.sh | 11 ++++++----- net.retrodeck.retrodeck.yml | 4 ++-- retrodeck.sh | 2 -- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/functions.sh b/functions.sh index 7e0203dc..7b564d2c 100644 --- a/functions.sh +++ b/functions.sh @@ -577,13 +577,14 @@ xemu_init() { echo "Initializing XEMU" echo "------------------------" mkdir -pv $rdhome/saves/xbox/xemu/ + mkdir -pv /var/data/xemu/ cp -fv $emuconfigs/xemu.toml /var/data/xemu/xemu.toml sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml # Preparing HD dummy Image if the image is not found if [ ! -f $rdhome/bios/xbox_hdd.qcow2 ] then wget "https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip" -P $rdhome/bios/ - unzip -q $rdhome/bios/xbox_hdd.qcow2.zip $rdhome/bios/ + unzip -q $rdhome/bios/xbox_hdd.qcow2.zip -d $rdhome/bios/ rm -rfv $rdhome/bios/xbox_hdd.qcow2.zip fi } @@ -603,7 +604,7 @@ duckstation_init() { echo "------------------------" mkdir -p /var/config/duckstation/ cp -fv $emuconfigs/duckstation/* /var/config/duckstation - sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/ppsspp/PSP/SYSTEM/settings.ini + sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/duckstation/settings.ini } standalones_init() { @@ -728,7 +729,7 @@ ra_init() { echo "Initializing MSX / SVI / ColecoVision / SG-1000 LIBRETRO" echo "-----------------------------------------------------------" wget "http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip" -P $rdhome/bios/MSX - unzip -q "$rdhome/bios/MSX/blueMSXv282full.zip" $rdhome/bios/MSX + unzip -q "$rdhome/bios/MSX/blueMSXv282full.zip" -d $rdhome/bios/MSX mv -rfv $rdhome/bios/MSX/Databases $rdhome/bios/Databases mv -rfv $rdhome/bios/MSX/Machines $rdhome/bios/Machines rm -rfv $rdhome/bios/MSX @@ -868,8 +869,8 @@ finit() { ) | 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 Finishing Initialization" \ + --text="RetroDECK is finishing the initial setup process, please wait." create_lock zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 2d8dfa67..c9c822c5 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -1004,5 +1004,5 @@ modules: sources: - type: git - url: https://github.com/XargonWan/RetroDECK.git - branch: cooker-0.6.0b \ No newline at end of file + url: https://github.com/icenine451/RetroDECK.git + branch: cooker-configurator \ No newline at end of file diff --git a/retrodeck.sh b/retrodeck.sh index 79e582a7..a3362b2f 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -75,7 +75,6 @@ then then echo "Config file's version is $version but the actual version is $hard_version" post_update # Executing post update script - conf_write # Writing variables in the config file (sourced from global.sh) start_retrodeck exit 0 fi @@ -84,7 +83,6 @@ then else echo "Lockfile not found" finit # Executing First/Force init - conf_write # Writing variables in the config file (sourced from global.sh) exit 0 fi From c250f8e33baeaf49b8e95e8ab57f025afbe6cde5 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 18 Nov 2022 23:02:50 -0500 Subject: [PATCH 25/46] Fix dir_prep of Wii saves for new install --- functions.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/functions.sh b/functions.sh index 7b564d2c..899140dc 100644 --- a/functions.sh +++ b/functions.sh @@ -515,6 +515,7 @@ dolphin_init() { dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" + mkdir -pv /var/data/dolphin-emu/Wii/ dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" } @@ -730,8 +731,8 @@ ra_init() { echo "-----------------------------------------------------------" wget "http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip" -P $rdhome/bios/MSX unzip -q "$rdhome/bios/MSX/blueMSXv282full.zip" -d $rdhome/bios/MSX - mv -rfv $rdhome/bios/MSX/Databases $rdhome/bios/Databases - mv -rfv $rdhome/bios/MSX/Machines $rdhome/bios/Machines + mv -fv $rdhome/bios/MSX/Databases $rdhome/bios/Databases + mv -fv $rdhome/bios/MSX/Machines $rdhome/bios/Machines rm -rfv $rdhome/bios/MSX } From 53cb70c7b4744ac6d8692efb705bc6600a5fd388 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sat, 19 Nov 2022 15:47:49 -0500 Subject: [PATCH 26/46] Remove debug and unused functions --- tools/configurator.sh | 84 ++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/tools/configurator.sh b/tools/configurator.sh index d5857b7d..ba5a586a 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -14,19 +14,10 @@ source /app/libexec/functions.sh # uncomment for flatpak testing # Welcome # - Move Directories -# - Migrate ROM directory -# - Migrate BIOS directory -# - Migrate downloaded_media # - Migrate everything # - Change Emulator Options # - RetroArch # - Change Rewind Setting -# - Enable/disable borders -# - Enable disable widescreen -# - Add or Update Files -# - Add specific cores -# - Grab all missing cores -# - Update all cores to nightly # - RetroAchivement login # - Login prompt # - Reset RetroDECK @@ -62,7 +53,7 @@ configurator_reset_dialog() { case $choice in "Reset RetroArch" ) - debug_dialog "ra_init" + ra_init configurator_process_complete_dialog "resetting RetroArch" ;; @@ -87,52 +78,52 @@ configurator_reset_dialog() { case $emulator_to_reset in "RetroArch" ) - debug_dialog "ra_init" + ra_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "Citra" ) - debug_dialog "citra_init" + citra_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "Dolphin" ) - debug_dialog "dolphin_init" + dolphin_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "Duckstation" ) - debug_dialog "duckstation_init" + duckstation_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "MelonDS" ) - debug_dialog "melonds_init" + melonds_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "PCSX2" ) - debug_dialog "pcsx2_init" + pcsx2_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "PPSSPP" ) - debug_dialog "ppssppsdl_init" + ppssppsdl_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "RPCS3" ) - debug_dialog "rpcs3_init" + rpcs3_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "XEMU" ) - debug_dialog "xemu_init" + xemu_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; "Yuzu" ) - debug_dialog "yuzu_init" + yuzu_init configurator_process_complete_dialog "resetting $emulator_to_reset" ;; @@ -144,12 +135,12 @@ configurator_reset_dialog() { ;; "Reset All Standalones" ) - debug_dialog "standalones_init" + standalones_init configurator_process_complete_dialog "resetting standalone emulators" ;; "Reset Tools" ) - debug_dialog "tools_init" + tools_init configurator_process_complete_dialog "resetting the tools menu" ;; @@ -158,7 +149,7 @@ configurator_reset_dialog() { --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Reset RetroDECK" \ --text="You are resetting RetroDECK to its default state.\n\nAfter the process is complete you will need to exit RetroDECK and run it again." - debug_dialog "rm -f "$lockfile"" + rm -f "$lockfile" configurator_process_complete_dialog "resetting RetroDECK" ;; @@ -170,9 +161,9 @@ configurator_reset_dialog() { } configurator_retroachivement_dialog() { - login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroAchievements Login" --cancel-label="Back" \ + login=$(zenity --forms --title="RetroDECK Configurator Utility - RetroArch RetroAchievements Login" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --text="Enter your RetroAchievements Account details.\n\nBe aware that this tool cannot verify your login details.\nFor registration and more info visit\nhttps://retroachievements.org/\n" \ + --text="Enter your RetroAchievements Account details.\n\nBe aware that this tool cannot verify your login details and currently only supports logging in with RetroArch.\nFor registration and more info visit\nhttps://retroachievements.org/\n" \ --separator="=SEP=" \ --add-entry="Username" \ --add-password="Password") @@ -186,13 +177,11 @@ configurator_retroachivement_dialog() { user=${arrIN[0]} pass=${arrIN[1]} - #set_setting_value $raconf cheevos_enable true retroarch - #set_setting_value $raconf cheevos_username $user retroarch - #set_setting_value $raconf cheevos_password $pass retroarch + set_setting_value $raconf cheevos_enable true retroarch + set_setting_value $raconf cheevos_username $user retroarch + set_setting_value $raconf cheevos_password $pass retroarch - debug_dialog "set_setting_value $raconf cheevos_enable true retroarch\n\nset_setting_value $raconf cheevos_username $user retroarch\n\nset_setting_value $raconf cheevos_password $pass retroarch" - - configurator_process_complete_dialog "logging in to RetroAchievements" + configurator_process_complete_dialog "logging in to RetroArch RetroAchievements" } configurator_update_dialog() { @@ -290,7 +279,7 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then - debug_dialog "set_setting_value $raconf rewind_enable true retroarch" + set_setting_value $raconf rewind_enable true retroarch configurator_process_complete_dialog "enabling Rewind" else configurator_options_dialog @@ -303,7 +292,7 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then - debug_dialog "set_setting_value $raconf rewind_enable false retroarch" + set_setting_value $raconf rewind_enable false retroarch configurator_process_complete_dialog "disabling Rewind" else configurator_options_dialog @@ -368,11 +357,11 @@ configurator_move_dialog() { configurator_move_dialog else configurator_generic_dialog "Moving RetroDECK data folder to $destination" - debug_dialog "unlink /home/deck/retrodeck" # Remove symlink for $rdhome - debug_dialog "move $sdcard/retrodeck "/home/deck/"" - debug_dialog "roms_folder="$rdhome/roms"" - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" + unlink /home/deck/retrodeck # Remove symlink for $rdhome + move $sdcard/retrodeck "/home/deck/" + roms_folder="$rdhome/roms" + dir_prep $roms_folder "/var/config/emulationstation/ROMs" + conf_write configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" fi ;; @@ -387,12 +376,12 @@ configurator_move_dialog() { else configurator_generic_dialog "Moving RetroDECK data folder to $destination" if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created - debug dialog "unlink $rdhome/roms" + unlink $rdhome/roms fi - debug_dialog "dir_prep "$sdcard/retrodeck" $rdhome" - debug_dialog "roms_folder="$sdcard/retrodeck/roms"" - debug_dialog "dir_prep $roms_folder "/var/config/emulationstation/ROMs"" - debug_dialog "conf_write" + dir_prep "$sdcard/retrodeck" $rdhome + roms_folder="$sdcard/retrodeck/roms" + dir_prep $roms_folder "/var/config/emulationstation/ROMs" + conf_write configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" fi fi @@ -405,8 +394,8 @@ configurator_move_dialog() { esac else configurator_generic_dialog "The RetroDECK data folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the RetroDECK data folder." - debug_dialog "rdhome=$(browse "RetroDECK directory location")" - debug_dialog "conf_write" + rdhome=$(browse "RetroDECK directory location") + conf_write configurator_generic_dialog "RetroDECK data folder now configured at $rdhome. Please start the moving process again." configurator_move_dialog fi @@ -425,7 +414,6 @@ configurator_welcome_dialog() { --column="Choice" --column="Action" \ "Move Files" "Move files between internal/SD card or to custom locations" \ "Change Options" "Adjust how RetroDECK behaves" \ - "Update" "Update parts of RetroDECK" \ "RetroAchivements" "Log in to RetroAchievements" \ "Reset" "Reset parts of RetroDECK" ) @@ -439,10 +427,6 @@ configurator_welcome_dialog() { configurator_options_dialog ;; - "Update" ) - configurator_update_dialog - ;; - "RetroAchivements" ) configurator_retroachivement_dialog ;; From 6f93d55f7e7972713e443b365b4766466f47d7be Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sat, 19 Nov 2022 15:49:00 -0500 Subject: [PATCH 27/46] Revert Git source in manifest --- net.retrodeck.retrodeck.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index c9c822c5..2d8dfa67 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -1004,5 +1004,5 @@ modules: sources: - type: git - url: https://github.com/icenine451/RetroDECK.git - branch: cooker-configurator \ No newline at end of file + url: https://github.com/XargonWan/RetroDECK.git + branch: cooker-0.6.0b \ No newline at end of file From ba553982da94c6c68a56b6abcbdac6d335b49050 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sat, 19 Nov 2022 16:47:45 -0500 Subject: [PATCH 28/46] Remove debugs, expand FINIT --- functions.sh | 19 +++++++++++-------- global.sh | 1 - post_update.sh | 8 +++----- retrodeck.sh | 3 --- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/functions.sh b/functions.sh index 899140dc..aacf9b67 100644 --- a/functions.sh +++ b/functions.sh @@ -61,9 +61,9 @@ move() { if [[ $(verify_space $1 $2) ]]; then ( if [[ ! -d $2 ]]; then # Create destination directory if it doesn't already exist - debug_dialog "mkdir -pv $2" + mkdir -pv $2 fi - debug_dialog "mv -v -t $2 $1" + mv -v -t $2 $1 ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -759,11 +759,11 @@ old_browse(){ zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ --cancel-label="No" \ --ok-label "Yes" \ - --text="Your rom folder will be:\n\n$sdcard/retrodeck/roms\n\nis that ok?" + --text="Your RetroDECK data folder will be:\n\n$sdcard/retrodeck\n\nis that ok?" if [ $? == 0 ] #yes then path_selected == true - roms_folder="$sdcard/retrodeck/roms" + rdhome="$sdcard/retrodeck" break else zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" @@ -781,7 +781,7 @@ finit() { echo "Executing finit" # Internal or SD Card? - choice=$(configurator_destination_choice_dialog "ROMs" "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 roms folder to be located?" ) + 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 $choice" case $choice in @@ -793,7 +793,7 @@ finit() { "Internal Storage" ) # Internal echo "Internal selected" - roms_folder="$rdhome/roms" + rdhome="$HOME/retrodeck" ;; "SD Card" ) @@ -818,13 +818,16 @@ finit() { echo "Now quitting" exit 0 else - roms_folder="$sdcard/retrodeck/roms" # sdcard variable is correct as its given by browse function - echo "ROMs folder = $roms_folder" + rdhome="$sdcard/retrodeck" fi ;; esac + if [[ ! -d /home/deck/retrodeck && ! -L /home/deck/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified + dir_prep "$rdhome" "/home/deck/retrodeck" + fi + mkdir -pv $roms_folder # TODO: after the next update of ES-DE this will not be needed diff --git a/global.sh b/global.sh index 08487ba2..ca1c3e7c 100755 --- a/global.sh +++ b/global.sh @@ -54,7 +54,6 @@ 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" diff --git a/post_update.sh b/post_update.sh index 5f1d73c1..88ba34e2 100644 --- a/post_update.sh +++ b/post_update.sh @@ -5,9 +5,9 @@ post_update() { # post update script echo "Executing post-update script" - case $version in # Only run updates as needed + local prev_version=$(sed -e 's/[\.a-z]//g' <<< $version) - "0.5.4b" ) + if [[ $prev_version -le "054" ]]; then # Finding existing ROMs folder if [ -d "$default_sd/retrodeck" ] @@ -177,9 +177,7 @@ post_update() { else echo "Version" $version "is after the save and state organization was changed, no need to sort again" fi - ;; - - esac + fi # These commands are run every time, for now diff --git a/retrodeck.sh b/retrodeck.sh index a3362b2f..974a1be1 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -75,15 +75,12 @@ then then echo "Config file's version is $version but the actual version is $hard_version" post_update # Executing post update script - start_retrodeck - exit 0 fi # 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" finit # Executing First/Force init - exit 0 fi # Normal Startup From 5491a3728335b02065113eb9c16ae434871ab457 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sat, 19 Nov 2022 16:55:00 -0500 Subject: [PATCH 29/46] Fix FINIT logic --- functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions.sh b/functions.sh index aacf9b67..2b349952 100644 --- a/functions.sh +++ b/functions.sh @@ -824,7 +824,7 @@ finit() { esac - if [[ ! -d /home/deck/retrodeck && ! -L /home/deck/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified + if [[ "$rdhome" == "$sdcard/retrodeck" && ! -d /home/deck/retrodeck && ! -L /home/deck/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified dir_prep "$rdhome" "/home/deck/retrodeck" fi From 4af941398971ea91ea594dbe2cfce0440fdedd3b Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sat, 19 Nov 2022 19:13:21 -0500 Subject: [PATCH 30/46] More FINIT fixes --- functions.sh | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/functions.sh b/functions.sh index 2b349952..3dd01099 100644 --- a/functions.sh +++ b/functions.sh @@ -749,21 +749,20 @@ start_retrodeck() { emulationstation --home /var/config/emulationstation } -old_browse(){ +old_browse() { # Function for browsing the sd card path_selected=false while [ $path_selected == false ] do sdcard="$(zenity --file-selection --title="Choose SD card location" --directory)" - echo "Path chosen: $sdcard, answer=$?" zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ --cancel-label="No" \ --ok-label "Yes" \ --text="Your RetroDECK data folder will be:\n\n$sdcard/retrodeck\n\nis that ok?" if [ $? == 0 ] #yes then - path_selected == true - rdhome="$sdcard/retrodeck" + path_selected=true + echo "$sdcard/retrodeck" break else zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" @@ -794,6 +793,12 @@ finit() { "Internal Storage" ) # Internal echo "Internal selected" rdhome="$HOME/retrodeck" + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" ;; "SD Card" ) @@ -806,7 +811,13 @@ finit() { --title "RetroDECK" --cancel-label="Cancel" \ --ok-label "Browse" \ --text="SD Card was not find in the default location.\nPlease choose the SD Card root.\nA retrodeck/roms folder will be created starting from the directory that you selected." - old_browse # Calling the browse function + rdhome=$(old_browse) # Calling the browse function + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" elif [ ! -w "$sdcard" ] #SD card found but not writable then echo "Error: SD card found but not writable" @@ -819,13 +830,20 @@ finit() { exit 0 else rdhome="$sdcard/retrodeck" + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" fi ;; esac - if [[ "$rdhome" == "$sdcard/retrodeck" && ! -d /home/deck/retrodeck && ! -L /home/deck/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified - dir_prep "$rdhome" "/home/deck/retrodeck" + if [[ ! "$rdhome" == "$HOME/retrodeck" && ! -d $HOME/retrodeck && ! -L $HOME/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified + echo "Symlinking retrodeck directory to home directory" + dir_prep "$rdhome" "$HOME/retrodeck" fi mkdir -pv $roms_folder @@ -875,6 +893,7 @@ finit() { --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Finishing Initialization" \ --text="RetroDECK is finishing the initial setup process, please wait." + create_lock zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ From eb7a4abaf12c270cb3a7ab60cc4b7d6c6dc83258 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sun, 20 Nov 2022 16:09:13 -0500 Subject: [PATCH 31/46] More FINIT and MOVE fixes --- functions.sh | 193 +++++++++++++++++++++++++++++++----------- tools/configurator.sh | 114 +++++++++++++++++++++---- 2 files changed, 241 insertions(+), 66 deletions(-) diff --git a/functions.sh b/functions.sh index 3dd01099..fd6e5e33 100644 --- a/functions.sh +++ b/functions.sh @@ -58,24 +58,31 @@ move() { # Function to move a directory from one parent to another # USAGE: move $source_dir $dest_dir - if [[ $(verify_space $1 $2) ]]; then - ( - if [[ ! -d $2 ]]; then # Create destination directory if it doesn't already exist - mkdir -pv $2 - fi - mv -v -t $2 $1 - ) | - 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 - Move in Progress" \ - --text="Moving directory $1 to new location of $2, please wait." + if [[ ! -d "$2/$(basename $1)" ]]; then + if [[ $(verify_space $1 $2) ]]; then + ( + if [[ ! -d $2 ]]; then # Create destination directory if it doesn't already exist + mkdir -pv $2 + fi + mv -v -t $2 $1 + ) | + 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 - Move in Progress" \ + --text="Moving directory $1 to new location of $2, please wait." + else + zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move Directories" \ + --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." + + configurator_move_dialog + fi else zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Move Directories" \ - --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." - - configurator_move_dialog + --text="The destination directory you have selected already exists.\n\nPlease select a new destination." fi } @@ -609,21 +616,77 @@ duckstation_init() { } standalones_init() { - # This script is configuring the standalone emulators with the default files present in emuconfigs folder + # This script is configuring the standalone emulators with the default files present in emuconfigs folder - echo "----------------------" - echo "Initializing standalone emulators" - echo "----------------------" + echo "----------------------" + echo "Initializing standalone emulators" + echo "----------------------" - yuzu_init - citra_init - dolphin_init - melonds_init - pcsx2_init - ppssppsdl_init - rpcs3_init - xemu_init - duckstation_init + yuzu_init + citra_init + dolphin_init + melonds_init + pcsx2_init + ppssppsdl_init + rpcs3_init + xemu_init + duckstation_init +} + +emulators_post_move() { + # This script will redo the symlinks for all emulators after moving the $rdhome location without resetting other options + # FUTURE WORK: The sed commands here should be replaced with set_setting_value and dir_prep should be replaced with changing paths in config files directly where possible + + # ES section + dir_prep $roms_folder "/var/config/emulationstation/ROMs" + + # RA section + dir_prep "$rdhome/bios" "/var/config/retroarch/system" + dir_prep "$rdhome/.logs/retroarch" "/var/config/retroarch/logs" + dir_prep "$rdhome/shaders/retroarch" "/var/config/retroarch/shaders" + + # Yuzu section + dir_prep "$rdhome/bios/switch/keys" "/var/data/yuzu/keys" + dir_prep "$rdhome/bios/switch/registered" "/var/data/yuzu/nand/system/Contents/registered" + dir_prep "$rdhome/saves/switch/yuzu/nand" "/var/data/yuzu/nand" + dir_prep "$rdhome/saves/switch/yuzy/sdmc" "/var/data/yuzu/sdmc" + dir_prep "$rdhome/.logs/yuzu" "/var/data/yuzu/log" + dir_prep "$rdhome/screenshots" "/var/data/yuzu/screenshots" + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/yuzu/qt-config.ini + + # Dolphin section + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/dolphin-emu/Dolphin.ini + dir_prep "$rdhome/saves/gc/dolphin/EUR" "/var/data/dolphin-emu/GC/EUR" + dir_prep "$rdhome/saves/gc/dolphin/USA" "/var/data/dolphin-emu/GC/USA" + dir_prep "$rdhome/saves/gc/dolphin/JAP" "/var/data/dolphin-emu/GC/JAP" + dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" + dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" + dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" + + # PCSX2 section + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2_ui.ini + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/PCSX2/inis/PCSX2.ini + + # MelonDS section + dir_prep "$rdhome/bios" "/var/config/melonDS/bios" + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/melonDS/melonDS.ini + + # Citra section + dir_prep "$rdhome/bios/citra/sysdata" "/var/data/citra-emu/sysdata" + dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log" + sed -i 's#~/retrodeck#'$rdhome'#g' /var/config/citra-emu/qt-config.ini + + # RPCS3 section + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/rpcs3/vfs.yml + + # XEMU section + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/data/xemu/xemu.toml + + # PPSSPP Standalone section + sed -i 's#/home/deck/retrodeck#'$rdhome'#g' /var/config/ppsspp/PSP/SYSTEM/ppsspp.ini + + # Duckstation section + sed -i 's#/home/deck/retrodeck/bios#'$rdhome/bios'#g' /var/config/duckstation/settings.ini } #========================= @@ -750,11 +813,13 @@ start_retrodeck() { } old_browse() { - # Function for browsing the sd card - path_selected=false - while [ $path_selected == false ] - do - sdcard="$(zenity --file-selection --title="Choose SD card location" --directory)" +# Function for browsing the sd card +path_selected=false +while [ $path_selected == false ] +do + sdcard="$(zenity --file-selection --title="Choose RetroDECK data directory location" --directory)" + if [[ $? == 0 ]]; then + if [[ -w $sdcard ]]; then zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ --cancel-label="No" \ --ok-label "Yes" \ @@ -768,14 +833,23 @@ old_browse() { zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?" if [ $? == 0 ] # yes, quit then - exit 0 + exit 2 fi fi - done + fi + else + zenity --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --ok-label "Quit" \ + --text="No location was selected. Please run RetroDECK again to retry." + exit 2 + fi +done } finit() { - # Force/First init, depending on the situation +# Force/First init, depending on the situation echo "Executing finit" @@ -787,7 +861,7 @@ finit() { "" ) # Cancel or X button quits echo "Now quitting" - exit 0 + exit 2 ;; "Internal Storage" ) # Internal @@ -799,6 +873,9 @@ finit() { bios_folder="$rdhome/bios" media_folder="$rdhome/downloaded_media" themes_folder="$rdhome/themes" + if [[ -L $rdhome ]]; then #Remove old symlink from existing install, if it exists + unlink $rdhome + fi ;; "SD Card" ) @@ -806,12 +883,15 @@ finit() { if [ ! -d "$sdcard" ] # SD Card path is not existing then echo "Error: SD card not found" - zenity --question --no-wrap \ + zenity --error --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK" --cancel-label="Cancel" \ + --title "RetroDECK" \ --ok-label "Browse" \ - --text="SD Card was not find in the default location.\nPlease choose the SD Card root.\nA retrodeck/roms folder will be created starting from the directory that you selected." + --text="SD Card was not find in the default location.\nPlease choose the SD Card root.\nA retrodeck folder will be created starting from the directory that you selected." rdhome=$(old_browse) # Calling the browse function + if [[ -z $rdhome ]]; then # If user hit the cancel button + exit 2 + fi roms_folder="$rdhome/roms" saves_folder="$rdhome/saves" states_folder="$rdhome/states" @@ -827,7 +907,7 @@ finit() { --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." echo "Now quitting" - exit 0 + exit 2 else rdhome="$sdcard/retrodeck" roms_folder="$rdhome/roms" @@ -839,17 +919,34 @@ finit() { fi ;; + "Custom Location" ) + echo "Custom Location selected" + zenity --info --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK" \ + --ok-label "Browse" \ + --text="Please choose the root folder for the RetroDECK data.\nA retrodeck folder will be created starting from the directory that you selected." + rdhome=$(old_browse) # Calling the browse function + if [[ -z $rdhome ]]; then # If user hit the cancel button + exit 2 + fi + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" + ;; + esac - if [[ ! "$rdhome" == "$HOME/retrodeck" && ! -d $HOME/retrodeck && ! -L $HOME/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified + if [[ ! "$rdhome" == "$HOME/retrodeck" && ! -L $HOME/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified echo "Symlinking retrodeck directory to home directory" dir_prep "$rdhome" "$HOME/retrodeck" fi mkdir -pv $roms_folder - # TODO: after the next update of ES-DE this will not be needed - #zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --text="EmulationStation will now initialize the system.\nPlease DON'T EDIT THE ROMS LOCATION, just select:\n\nCREATE DIRECTORIES\nYES\nOK\nQUIT\n\nRetroDECK will manage the rest." 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.\nPlease wait up to one minute,\nanother message will notify when the process will be finished.\n\nPress OK to continue." # Recreating the folder @@ -868,8 +965,8 @@ finit() { # Initializing ROMs folder - Original in retrodeck home (or SD Card) dir_prep $roms_folder "/var/config/emulationstation/ROMs" - mkdir -pv $rdhome/saves - mkdir -pv $rdhome/states + mkdir -pv $saves_folder + mkdir -pv $states_folder mkdir -pv $rdhome/screenshots mkdir -pv $rdhome/bios/pico8 mkdir -pv $rdhome/.logs @@ -878,8 +975,8 @@ finit() { cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml # ES-DE preparing themes and scraped folders - dir_prep "$rdhome/downloaded_media" "/var/config/emulationstation/.emulationstation/downloaded_media" - dir_prep "$rdhome/themes" "/var/config/emulationstation/.emulationstation/themes" + dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" # PICO-8 dir_prep "$roms_folder/pico8" "$rdhome/bios/pico8/bbs/carts" #this is the folder where pico-8 is saving the carts @@ -899,6 +996,6 @@ finit() { zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK" \ - --text="Installation completed.\nPlease put your roms in:\n\n$roms_folder\n\nand your bioses in\n\n$rdhome/bios\n\nThen start the program again.\nIf you wish to change the roms location, you may use the tool located the tools section of RetroDECK.\n\nIMPORTANT NOTES:\n- RetroDECK must be manually added and launched from your Steam Library in order to work correctly.\n- It's recommended to use the 'RetroDECK Offical Controller Config' from Steam (under community layouts).\n- It's suggested to use BoilR to automatically add the SteamGridDB images to Steam (this will be automated soon).\nhttps://github.com/PhilipK/BoilR" + --text="Installation completed.\nPlease put your roms in:\n\n$roms_folder\n\nand your bioses in\n\n$bios_folder\n\nThen start the program again.\nIf you wish to change the roms location, you may use the tool located the tools section of RetroDECK.\n\nIMPORTANT NOTES:\n- RetroDECK must be manually added and launched from your Steam Library in order to work correctly.\n- It's recommended to use the 'RetroDECK Offical Controller Config' from Steam (under community layouts).\n- It's suggested to use BoilR to automatically add the SteamGridDB images to Steam (this will be automated soon).\nhttps://github.com/PhilipK/BoilR" # TODO: Replace the stuff above with BoilR code when ready } \ No newline at end of file diff --git a/tools/configurator.sh b/tools/configurator.sh index ba5a586a..ab05851e 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -13,7 +13,7 @@ source /app/libexec/functions.sh # uncomment for flatpak testing # Configurator Option Tree # Welcome -# - Move Directories +# - Move RetroDECK data directory # - Migrate everything # - Change Emulator Options # - RetroArch @@ -348,23 +348,37 @@ configurator_move_dialog() { configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." destination=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the RetroDECK data folder.") case $destination in + "Back" ) configurator_move_dialog ;; + "Internal Storage" ) - if [[ ! -L /home/deck/retrodeck && -d /home/deck/retrodeck ]]; then + if [[ ! -L "$HOME/retrodeck" && -d "$HOME/retrodeck" ]]; then configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." configurator_move_dialog else configurator_generic_dialog "Moving RetroDECK data folder to $destination" - unlink /home/deck/retrodeck # Remove symlink for $rdhome - move $sdcard/retrodeck "/home/deck/" - roms_folder="$rdhome/roms" - dir_prep $roms_folder "/var/config/emulationstation/ROMs" - conf_write - configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" + unlink $HOME/retrodeck # Remove symlink for $rdhome + move $rdhome "$HOME" + if [[ ! -d $rdhome && -d $HOME/retrodeck ]]; then # If the move succeeded + rdhome="$HOME/retrodeck" + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" + emulator_post_move + conf_write + + configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" + else + configurator_generic_dialog "The moving process was not completed, please try again." + fi fi ;; + "SD Card" ) if [[ -L $rdhome && -d $sdcard/retrodeck ]]; then configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." @@ -374,27 +388,91 @@ configurator_move_dialog() { configurator_generic_dialog "The SD card was found but is not writable\nThis can happen with cards formatted on PC or for other reasons.\nPlease format the SD card through the Steam Deck's Game Mode and try the moving process again." configurator_welcome_dialog else - configurator_generic_dialog "Moving RetroDECK data folder to $destination" - if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created - unlink $rdhome/roms + if [[ $(verify_space $rdhome $sdcard) == "true" ]];then + configurator_generic_dialog "Moving RetroDECK data folder to $destination" + if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created + unlink $rdhome/roms + fi + + ( + dir_prep "$sdcard/retrodeck" $rdhome + ) | + 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 - Move in Progress" \ + --text="Moving directory $rdhome to new location of $sdcard/retrodeck, please wait." + + rdhome="$sdcard/retrodeck" + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" + emulator_post_move + conf_write + configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" + else + zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move Directories" \ + --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." fi - dir_prep "$sdcard/retrodeck" $rdhome - roms_folder="$sdcard/retrodeck/roms" - dir_prep $roms_folder "/var/config/emulationstation/ROMs" - conf_write - configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" fi fi ;; "Custom Location" ) - configurator_generic_dialog "A custom location for the RetroDECK data folder is not currently supported.\nPlease choose another location." - configurator_move_dialog + configurator_generic_dialog "Select the root folder you would like to store the RetroDECK data folder in.\n\nA new folder \"retrodeck\" will be created in the destination chosen." + custom_dest=$(browse "RetroDECK directory location") + if [[ ! -w $custom_dest ]]; then + configurator_generic_dialog "The destination was found but is not writable\nThis can happen if RetroDECK does not have permission to write to this location. This can typically be solved through the utility Flatseal, please make the needed changes and try the moving process again." + configurator_welcome_dialog + else + if [[ $(verify_space $rdhome $custom_dest) ]];then + configurator_generic_dialog "Moving RetroDECK data folder to $custom_dest/retrodeck" + if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created + unlink $rdhome/roms + fi + + ( + dir_prep "$custom_dest/retrodeck" $rdhome + ) | + 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 - Move in Progress" \ + --text="Moving directory $rdhome to new location of $custom_dest/retrodeck, please wait." + + rdhome="$custom_dest/retrodeck" + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" + emulator_post_move + conf_write + configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" + else + zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move Directories" \ + --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." + fi + fi ;; + esac else configurator_generic_dialog "The RetroDECK data folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the RetroDECK data folder." rdhome=$(browse "RetroDECK directory location") + roms_folder="$rdhome/roms" + saves_folder="$rdhome/saves" + states_folder="$rdhome/states" + bios_folder="$rdhome/bios" + media_folder="$rdhome/downloaded_media" + themes_folder="$rdhome/themes" + emulator_post_move conf_write configurator_generic_dialog "RetroDECK data folder now configured at $rdhome. Please start the moving process again." configurator_move_dialog From f6d775c4a9660b93c5f10f39635d248f3a51500f Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sun, 20 Nov 2022 16:39:54 -0500 Subject: [PATCH 32/46] Quieted some moves --- functions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions.sh b/functions.sh index fd6e5e33..0fbf972c 100644 --- a/functions.sh +++ b/functions.sh @@ -779,7 +779,7 @@ ra_init() { #then wget "https://github.com/hrydgard/ppsspp/archive/refs/heads/master.zip" -P $rdhome/bios/PPSSPP unzip -q "$rdhome/bios/PPSSPP/master.zip" -d $rdhome/bios/PPSSPP/ - mv "$rdhome/bios/PPSSPP/ppsspp-master/assets/"* "$rdhome/bios/PPSSPP/" + mv -f "$rdhome/bios/PPSSPP/ppsspp-master/assets/"* "$rdhome/bios/PPSSPP/" rm -rfv "$rdhome/bios/PPSSPP/master.zip" rm -rfv "$rdhome/bios/PPSSPP/ppsspp-master" #fi @@ -794,8 +794,8 @@ ra_init() { echo "-----------------------------------------------------------" wget "http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip" -P $rdhome/bios/MSX unzip -q "$rdhome/bios/MSX/blueMSXv282full.zip" -d $rdhome/bios/MSX - mv -fv $rdhome/bios/MSX/Databases $rdhome/bios/Databases - mv -fv $rdhome/bios/MSX/Machines $rdhome/bios/Machines + mv -f $rdhome/bios/MSX/Databases $rdhome/bios/Databases + mv -f $rdhome/bios/MSX/Machines $rdhome/bios/Machines rm -rfv $rdhome/bios/MSX } From 57fefdb15cdb42dae49b1f5c373dec5a6398027e Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sun, 20 Nov 2022 18:48:02 -0500 Subject: [PATCH 33/46] Fix Dolphin dir_prep --- functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions.sh b/functions.sh index 0fbf972c..67751a52 100644 --- a/functions.sh +++ b/functions.sh @@ -523,7 +523,7 @@ dolphin_init() { dir_prep "$rdhome/screenshots" "/var/data/dolphin-emu/ScreenShots" dir_prep "$rdhome/states" "/var/data/dolphin-emu/StateSaves" mkdir -pv /var/data/dolphin-emu/Wii/ - dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii/" + dir_prep "$rdhome/saves/wii/dolphin" "/var/data/dolphin-emu/Wii" } pcsx2_init() { From 170ce1b534d3e0640e8af8d40b2f89f956104f21 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Sun, 20 Nov 2022 20:05:11 -0500 Subject: [PATCH 34/46] Configurator move function should finally work --- functions.sh | 4 ++-- net.retrodeck.retrodeck.yml | 2 +- tools/configurator.sh | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/functions.sh b/functions.sh index 67751a52..6254f4ba 100644 --- a/functions.sh +++ b/functions.sh @@ -460,7 +460,7 @@ dir_prep() { if [ -d "$symlink" ]; then echo "$symlink found" #DEBUG - mv -fv "$symlink" "$symlink.old" + mv -f "$symlink" "$symlink.old" fi # if the real dir doesn't exist we create it @@ -479,7 +479,7 @@ dir_prep() { if [ -d "$symlink.old" ]; then echo "Moving the data from $symlink.old to $real" #DEBUG - mv -fv "$symlink".old/* $real + mv -f "$symlink".old/* $real echo "Removing $symlink.old" #DEBUG rm -rf "$symlink.old" fi diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 2d8dfa67..4e516ac5 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -17,7 +17,7 @@ finish-args: - --share=ipc - --share=network - --device=all - - --filesystem=~/retrodeck:create + - --filesystem=home # Needed to be able to relocate / remove / create symlink at ~/retrodeck - --filesystem=/run/media - --filesystem=/media - --allow=multiarch diff --git a/tools/configurator.sh b/tools/configurator.sh index ab05851e..86da52a0 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -345,7 +345,6 @@ configurator_options_dialog() { configurator_move_dialog() { if [[ -d $rdhome ]]; then - configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." destination=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the RetroDECK data folder.") case $destination in @@ -369,7 +368,7 @@ configurator_move_dialog() { bios_folder="$rdhome/bios" media_folder="$rdhome/downloaded_media" themes_folder="$rdhome/themes" - emulator_post_move + emulators_post_move conf_write configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" @@ -380,8 +379,8 @@ configurator_move_dialog() { ;; "SD Card" ) - if [[ -L $rdhome && -d $sdcard/retrodeck ]]; then - configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." + if [[ -L "$HOME/retrodeck" && -d $sdcard/retrodeck && "$rdhome" == "$sdcard/retrodeck" ]]; then + configurator_generic_dialog "The RetroDECK data folder is already configured to that location, please pick a new one." configurator_move_dialog else if [[ ! -w $sdcard ]]; then @@ -390,12 +389,12 @@ configurator_move_dialog() { else if [[ $(verify_space $rdhome $sdcard) == "true" ]];then configurator_generic_dialog "Moving RetroDECK data folder to $destination" - if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created - unlink $rdhome/roms + if [[ -L "$HOME/retrodeck/roms" ]]; then # Check for ROMs symlink user may have created + unlink "$HOME/retrodeck/roms" fi ( - dir_prep "$sdcard/retrodeck" $rdhome + dir_prep "$sdcard/retrodeck" "$rdhome" ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -409,7 +408,7 @@ configurator_move_dialog() { bios_folder="$rdhome/bios" media_folder="$rdhome/downloaded_media" themes_folder="$rdhome/themes" - emulator_post_move + emulators_post_move conf_write configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" else @@ -436,7 +435,7 @@ configurator_move_dialog() { fi ( - dir_prep "$custom_dest/retrodeck" $rdhome + dir_prep "$custom_dest/retrodeck" "$rdhome" ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -450,7 +449,7 @@ configurator_move_dialog() { bios_folder="$rdhome/bios" media_folder="$rdhome/downloaded_media" themes_folder="$rdhome/themes" - emulator_post_move + emulators_post_move conf_write configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" else @@ -498,6 +497,7 @@ configurator_welcome_dialog() { case $choice in "Move Files" ) + configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." configurator_move_dialog ;; From 5efb4e3e4a91743838679d36666ef589a49f3d9a Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 21 Nov 2022 11:46:24 -0500 Subject: [PATCH 35/46] Primehack additions --- net.retrodeck.retrodeck.yml | 6 ++-- rd-submodules/primehack/appdata.xml | 27 ++++++++++++++++ rd-submodules/primehack/detectflatpak.patch | 34 ++++++++++++++++++++ rd-submodules/primehack/nodirtyversion.patch | 13 ++++++++ 4 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 rd-submodules/primehack/appdata.xml create mode 100644 rd-submodules/primehack/detectflatpak.patch create mode 100644 rd-submodules/primehack/nodirtyversion.patch diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 82610ae3..6e0f0bf4 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -841,12 +841,12 @@ modules: # in non-writable paths, typically happens when a user # has leftover files from a previous non-flatpak install - type: patch - path: rd-submodules/dolphin/detectflatpak.patch + path: rd-submodules/primehack/detectflatpak.patch # version strings must match exactly for online multiplayer - type: patch - path: rd-submodules/dolphin/nodirtyversion.patch + path: rd-submodules/primehack/nodirtyversion.patch - type: file - path: appdata.xml + path: rd-submodules/primehack/appdata.xml - type: script commands: - for i in {0..9}; do diff --git a/rd-submodules/primehack/appdata.xml b/rd-submodules/primehack/appdata.xml new file mode 100644 index 00000000..fd706d3e --- /dev/null +++ b/rd-submodules/primehack/appdata.xml @@ -0,0 +1,27 @@ + + + io.github.shiiion.primehack + PrimeHack +

Dolphin Emu fork for various Metroid Prime mods + Shiiion, SirMangler + CC0-1.0 + GPL-2.0+ + +

PrimeHack is a fork of Dolphin Emulator to bring modern Mouse and Keyboard controls, as well as Dual-Stick gamepad controls to the Metroid Prime Trilogy. PrimeHack also offers many other features such as increased FoV and various new cheats.

+ + https://raw.githubusercontent.com/flathub/io.github.shiiion.primehack/master/screenshots/1.png + https://raw.githubusercontent.com/flathub/io.github.shiiion.primehack/master/screenshots/2.png + https://raw.githubusercontent.com/flathub/io.github.shiiion.primehack/master/screenshots/3.png + + + dolphin-emu + io.github.shiiion.primehack.desktop + + + + + https://github.com/shiiion/dolphin + https://github.com/shiiion/dolphin/wiki + https://github.com/shiiion/dolphin/wiki/Frequently-Asked-Questions + https://github.com/shiiion/dolphin/issues + diff --git a/rd-submodules/primehack/detectflatpak.patch b/rd-submodules/primehack/detectflatpak.patch new file mode 100644 index 00000000..488e5a20 --- /dev/null +++ b/rd-submodules/primehack/detectflatpak.patch @@ -0,0 +1,34 @@ +From f2d3b349d8487cf0ee50b36ba024ac513d36f826 Mon Sep 17 00:00:00 2001 +From: Carles Pastor +Date: Sat, 20 Aug 2022 13:35:32 +0200 +Subject: [PATCH] Detect we are running inside a flatpak sandbox + +--- + Source/Core/UICommon/UICommon.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Source/Core/UICommon/UICommon.cpp b/Source/Core/UICommon/UICommon.cpp +index 8d9dc2abb8..8a9d39a3d5 100644 +--- a/Source/Core/UICommon/UICommon.cpp ++++ b/Source/Core/UICommon/UICommon.cpp +@@ -348,7 +348,7 @@ void SetUserDirectory(std::string custom_path) + // -> Use GetExeDirectory()/User + // 2. $DOLPHIN_EMU_USERPATH is set + // -> Use $DOLPHIN_EMU_USERPATH +- // 3. ~/.dolphin-emu directory exists ++ // 3. ~/.dolphin-emu directory exists, and we're not in flatpak + // -> Use ~/.dolphin-emu + // 4. Default + // -> Use XDG basedir, see +@@ -381,7 +381,7 @@ void SetUserDirectory(std::string custom_path) + { + user_path = home_path + "." DOLPHIN_DATA_DIR DIR_SEP; + +- if (!File::Exists(user_path)) ++ if (File::Exists("/.flatpak-info") || !File::Exists(user_path)) + { + const char* data_home = getenv("XDG_DATA_HOME"); + std::string data_path = +-- +2.37.1 + diff --git a/rd-submodules/primehack/nodirtyversion.patch b/rd-submodules/primehack/nodirtyversion.patch new file mode 100644 index 00000000..5b33a089 --- /dev/null +++ b/rd-submodules/primehack/nodirtyversion.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9af66009a1..2acd3bed9a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -149,7 +149,7 @@ if(GIT_FOUND) + OUTPUT_VARIABLE DOLPHIN_WC_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE) + # defines DOLPHIN_WC_DESCRIBE +- execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long --dirty ++ execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long + OUTPUT_VARIABLE DOLPHIN_WC_DESCRIBE + OUTPUT_STRIP_TRAILING_WHITESPACE) + From 4e1b0154a2aafaf3bd106302b26d46afd9eed473 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 21 Nov 2022 11:57:00 -0500 Subject: [PATCH 36/46] Remove unneeded Primehack files --- net.retrodeck.retrodeck.yml | 6 ++-- rd-submodules/primehack/appdata.xml | 27 ---------------- rd-submodules/primehack/detectflatpak.patch | 34 -------------------- rd-submodules/primehack/nodirtyversion.patch | 13 -------- 4 files changed, 2 insertions(+), 78 deletions(-) delete mode 100644 rd-submodules/primehack/appdata.xml delete mode 100644 rd-submodules/primehack/detectflatpak.patch delete mode 100644 rd-submodules/primehack/nodirtyversion.patch diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 6e0f0bf4..d1e33290 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -841,12 +841,10 @@ modules: # in non-writable paths, typically happens when a user # has leftover files from a previous non-flatpak install - type: patch - path: rd-submodules/primehack/detectflatpak.patch + path: rd-submodules/dolphin/detectflatpak.patch # version strings must match exactly for online multiplayer - type: patch - path: rd-submodules/primehack/nodirtyversion.patch - - type: file - path: rd-submodules/primehack/appdata.xml + path: rd-submodules/dolphin/nodirtyversion.patch - type: script commands: - for i in {0..9}; do diff --git a/rd-submodules/primehack/appdata.xml b/rd-submodules/primehack/appdata.xml deleted file mode 100644 index fd706d3e..00000000 --- a/rd-submodules/primehack/appdata.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - io.github.shiiion.primehack - PrimeHack - Dolphin Emu fork for various Metroid Prime mods - Shiiion, SirMangler - CC0-1.0 - GPL-2.0+ - -

PrimeHack is a fork of Dolphin Emulator to bring modern Mouse and Keyboard controls, as well as Dual-Stick gamepad controls to the Metroid Prime Trilogy. PrimeHack also offers many other features such as increased FoV and various new cheats.

- - https://raw.githubusercontent.com/flathub/io.github.shiiion.primehack/master/screenshots/1.png - https://raw.githubusercontent.com/flathub/io.github.shiiion.primehack/master/screenshots/2.png - https://raw.githubusercontent.com/flathub/io.github.shiiion.primehack/master/screenshots/3.png - - - dolphin-emu - io.github.shiiion.primehack.desktop - - - - - https://github.com/shiiion/dolphin - https://github.com/shiiion/dolphin/wiki - https://github.com/shiiion/dolphin/wiki/Frequently-Asked-Questions - https://github.com/shiiion/dolphin/issues -
diff --git a/rd-submodules/primehack/detectflatpak.patch b/rd-submodules/primehack/detectflatpak.patch deleted file mode 100644 index 488e5a20..00000000 --- a/rd-submodules/primehack/detectflatpak.patch +++ /dev/null @@ -1,34 +0,0 @@ -From f2d3b349d8487cf0ee50b36ba024ac513d36f826 Mon Sep 17 00:00:00 2001 -From: Carles Pastor -Date: Sat, 20 Aug 2022 13:35:32 +0200 -Subject: [PATCH] Detect we are running inside a flatpak sandbox - ---- - Source/Core/UICommon/UICommon.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/Source/Core/UICommon/UICommon.cpp b/Source/Core/UICommon/UICommon.cpp -index 8d9dc2abb8..8a9d39a3d5 100644 ---- a/Source/Core/UICommon/UICommon.cpp -+++ b/Source/Core/UICommon/UICommon.cpp -@@ -348,7 +348,7 @@ void SetUserDirectory(std::string custom_path) - // -> Use GetExeDirectory()/User - // 2. $DOLPHIN_EMU_USERPATH is set - // -> Use $DOLPHIN_EMU_USERPATH -- // 3. ~/.dolphin-emu directory exists -+ // 3. ~/.dolphin-emu directory exists, and we're not in flatpak - // -> Use ~/.dolphin-emu - // 4. Default - // -> Use XDG basedir, see -@@ -381,7 +381,7 @@ void SetUserDirectory(std::string custom_path) - { - user_path = home_path + "." DOLPHIN_DATA_DIR DIR_SEP; - -- if (!File::Exists(user_path)) -+ if (File::Exists("/.flatpak-info") || !File::Exists(user_path)) - { - const char* data_home = getenv("XDG_DATA_HOME"); - std::string data_path = --- -2.37.1 - diff --git a/rd-submodules/primehack/nodirtyversion.patch b/rd-submodules/primehack/nodirtyversion.patch deleted file mode 100644 index 5b33a089..00000000 --- a/rd-submodules/primehack/nodirtyversion.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 9af66009a1..2acd3bed9a 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -149,7 +149,7 @@ if(GIT_FOUND) - OUTPUT_VARIABLE DOLPHIN_WC_REVISION - OUTPUT_STRIP_TRAILING_WHITESPACE) - # defines DOLPHIN_WC_DESCRIBE -- execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long --dirty -+ execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long - OUTPUT_VARIABLE DOLPHIN_WC_DESCRIBE - OUTPUT_STRIP_TRAILING_WHITESPACE) - From 6e64317a573c5134f2bca5ac4b40f21fca0e213c Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 21 Nov 2022 14:02:19 -0500 Subject: [PATCH 37/46] More move function work --- functions.sh | 4 ++-- tools/configurator.sh | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/functions.sh b/functions.sh index 6254f4ba..b17333d4 100644 --- a/functions.sh +++ b/functions.sh @@ -243,7 +243,7 @@ enable_file() { mv $(realpath $1.disabled) $(realpath $(echo $1 | sed -e 's/\.disabled//')) } -generate_patch () { +generate_patch() { # generate_patch $original_file $modified_file $patch_file $system rm $3 # Remove old patch file (maybe change this to create a backup instead?) @@ -343,7 +343,7 @@ generate_patch () { done < $2 } -deploy_patch () { +deploy_patch() { # This function will take an "original" file and a patch file and generate a ready to use modified file # USAGE: deploy_patch $original_file $patch_file $output_file diff --git a/tools/configurator.sh b/tools/configurator.sh index 86da52a0..7c2e5075 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -379,7 +379,7 @@ configurator_move_dialog() { ;; "SD Card" ) - if [[ -L "$HOME/retrodeck" && -d $sdcard/retrodeck && "$rdhome" == "$sdcard/retrodeck" ]]; then + if [[ -L "$HOME/retrodeck" && -d "$sdcard/retrodeck" && "$rdhome" == "$sdcard/retrodeck" ]]; then configurator_generic_dialog "The RetroDECK data folder is already configured to that location, please pick a new one." configurator_move_dialog else @@ -401,6 +401,14 @@ configurator_move_dialog() { --title "RetroDECK Configurator Utility - Move in Progress" \ --text="Moving directory $rdhome to new location of $sdcard/retrodeck, please wait." + if [[ -L $rdhome && ! $rdhome == "$HOME/retrodeck" ]]; then # Clean up extraneus symlinks from previous moves + unlink $rdhome + fi + + if [[ ! -L "$HOME/retrodeck" ]]; then # Always link back to original directory + ln -svf "$sdcard/retrodeck" "$HOME/retrodeck" + fi + rdhome="$sdcard/retrodeck" roms_folder="$rdhome/roms" saves_folder="$rdhome/saves" @@ -442,6 +450,14 @@ configurator_move_dialog() { --title "RetroDECK Configurator Utility - Move in Progress" \ --text="Moving directory $rdhome to new location of $custom_dest/retrodeck, please wait." + if [[ -L $rdhome && ! $rdhome == "$HOME/retrodeck" ]]; then # Clean up extraneus symlinks from previous moves + unlink $rdhome + fi + + if [[ ! -L "$HOME/retrodeck" ]]; then + ln -svf "$custom_dest/retrodeck" "$HOME/retrodeck" + fi + rdhome="$custom_dest/retrodeck" roms_folder="$rdhome/roms" saves_folder="$rdhome/saves" From 1827bfecda4bd4e5ee7b14038cc70489e5eda5a0 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 21 Nov 2022 22:07:53 -0500 Subject: [PATCH 38/46] Fix regex, Zenity operations and cleanup --- functions.sh | 85 +++++++++++++++------ tools/configurator.sh | 167 +++++++++++++++++++++--------------------- 2 files changed, 145 insertions(+), 107 deletions(-) diff --git a/functions.sh b/functions.sh index b17333d4..ca70d297 100644 --- a/functions.sh +++ b/functions.sh @@ -96,18 +96,42 @@ set_setting_value() { case $4 in - "emulationstation" ) - sed -i "s%$setting_name_to_change\" \" value=\".*\"%$setting_name_to_change\" \" value=\"$setting_value_to_change\"" $1 + "retrodeck" | "citra" | "melonds" | "yuzu" ) + 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 ;; - * ) + "retroarch" ) if [[ -z $current_section_name ]]; then - sed -i -E 's^\b'"$setting_name_to_change"'(\s?[=:]\s?).*^'"$setting_name_to_change"'\1'"$setting_value_to_change"'^' $1 + sed -i 's^'"$setting_name_to_change"' = \".*\"^'"$setting_name_to_change"' = \"'"$setting_value_to_change"'\"^' $1 else - sed -i -E '\^\['"$current_section_name"'\]|\b'"$current_section"':$^,\^\b'"$setting_name_to_change"'.*^s^\b'"$setting_name_to_change"'(\s?[=:]\s?).*^'"$setting_name_to_change"'\1'"$setting_value_to_change"'^' $1 + sed -i '\^\['"$current_section_name"'\]^,\^'"$setting_name_to_change"'.*^s^'"$setting_name_to_change"' = \".*\"^'"$setting_name_to_change"' = \"'"$setting_value_to_change"'\"^' $1 fi ;; + "dolphin" | "duckstation" | "pcsx2" | "ppsspp" | "xemu" ) + 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 + ;; + + "rpcs3" ) # 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 + fi + ;; + + "emulationstation" ) + sed -i "s%$setting_name_to_change\" \" value=\".*\"%$setting_name_to_change\" \" value=\"$setting_value_to_change\"" $1 + ;; + esac } @@ -124,7 +148,6 @@ get_setting_name() { ;; "rpcs3" ) - #echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's%\\\\%\\%g' | sed -e 's/^[ \t]*//' echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g' ;; @@ -144,25 +167,41 @@ get_setting_value() { case $3 in + "retrodeck" | "citra" | "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 + sed -n '\^\['"$section_name"'\]^,\^'"$current_setting_name"'^{ \^\['"$section_name"'\]^! { \^'"$current_setting_name"'^ p } }' $1 | grep -o -P "(?<=^$current_setting_name=).*" + fi + ;; + + "retroarch" ) # For files with this syntax - setting_name = "setting_value" + if [[ -z $current_section_name ]]; then + echo $(grep -o -P "(?<=^$current_setting_name = \").*(?=\")" $1) + else + sed -n '\^\['"$section_name"'\]^,\^'"$current_setting_name"'^{ \^\['"$section_name"'\]^! { \^'"$current_setting_name"'^ p } }' $1 | grep -o -P "(?<=^$current_setting_name = \").*(?=\")" + fi + ;; + + "dolphin" | "duckstation" | "pcsx2" | "ppsspp" | "xemu" ) # For files with this syntax - setting_name = setting_value + if [[ -z $current_section_name ]]; then + echo $(grep -o -P "(?<=^$current_setting_name = ).*" $1) + else + sed -n '\^\['"$section_name"'\]^,\^'"$current_setting_name"'^{ \^\['"$section_name"'\]^! { \^'"$current_setting_name"'^ p } }' $1 | grep -o -P "(?<=^$current_setting_name = ).*" + fi + ;; + + "rpcs3" ) # For files with this syntax - setting_name: setting_value + if [[ -z $current_section_name ]]; then + echo $(grep -o -P "(?<=$current_setting_name: ).*" $1) + else + sed -n '\^\['"$section_name"'\]^,\^'"$current_setting_name"'^{ \^\['"$section_name"'\]^! { \^'"$current_setting_name"'^ p } }' $1 | grep -o -P "(?<=$current_setting_name: ).*" + fi + ;; + "emulationstation" ) echo $(grep -o -P "(?<=^$current_setting_name\" value=\").*(?=\")" $1) - ;; - - rpcs3 ) - if [[ -z $current_section_name ]]; then - sed -n -E 's^\s*\b'"$current_setting_name"'\s?:\s?(.*)^\1^p' $1 - else - sed -n -E '\^\b'"$current_section"':$^,\^'"$current_setting_name"'^{ \^\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^ p } }' $1 | sed -n -E 's^\s*\b.*\s?:\s?(.*)$^\1^p' - fi - ;; - - * ) - if [[ -z $current_section_name ]]; then - sed -n -E 's^\s*\b'"$current_setting_name"'\s?=\s?(.*)^\1^p' $1 - else - sed -n -E '\^\['"$current_section_name"'\]^,\^\b'"$current_setting_name"'^{ \^\['"$current_section_name"'\]^! { \^\b'"$current_setting_name"'^ p } }' $1 | sed -n -E 's^\s*\b.*\s?=\s?(.*)^\1^p' - fi - ;; + ;; esac } diff --git a/tools/configurator.sh b/tools/configurator.sh index 7c2e5075..0eb2600e 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -168,20 +168,20 @@ configurator_retroachivement_dialog() { --add-entry="Username" \ --add-password="Password") - if [ $? == 1 ] # Cancel button clicked - then + if [ $? == 0 ]; then # OK button clicked + arrIN=(${login//=SEP=/ }) + user=${arrIN[0]} + pass=${arrIN[1]} + + set_setting_value $raconf cheevos_enable true retroarch + set_setting_value $raconf cheevos_username $user retroarch + set_setting_value $raconf cheevos_password $pass retroarch + + configurator_process_complete_dialog "logging in to RetroArch RetroAchievements" + else configurator_welcome_dialog fi - arrIN=(${login//=SEP=/ }) - user=${arrIN[0]} - pass=${arrIN[1]} - - set_setting_value $raconf cheevos_enable true retroarch - set_setting_value $raconf cheevos_username $user retroarch - set_setting_value $raconf cheevos_password $pass retroarch - - configurator_process_complete_dialog "logging in to RetroArch RetroAchievements" } configurator_update_dialog() { @@ -194,80 +194,79 @@ configurator_power_user_changes_dialog() { --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates.\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?" - if [ $? == 1 ] # Cancel button clicked - then - configurator_options_dialog - fi + if [ $? == 0 ]; then # OK button clicked + emulator=$(zenity --list \ + --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --text="Which emulator do you want to configure?" \ + --hide-header \ + --column=emulator \ + "RetroArch" \ + "Citra" \ + "Dolphin" \ + "Duckstation" \ + "MelonDS" \ + "PCSX2-QT" \ + "PCSX2-Legacy" \ + "PPSSPP" \ + "RPCS3" \ + "XEMU" \ + "Yuzu") - emulator=$(zenity --list \ - --title "RetroDECK Configurator Utility - Power User Options" --cancel-label="Back" \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --text="Which emulator do you want to configure?" \ - --hide-header \ - --column=emulator \ - "RetroArch" \ - "Citra" \ - "Dolphin" \ - "Duckstation" \ - "MelonDS" \ - "PCSX2-QT" \ - "PCSX2-Legacy" \ - "PPSSPP" \ - "RPCS3" \ - "XEMU" \ - "Yuzu") + case $emulator in - case $emulator in - - "RetroArch" ) - retroarch - ;; - - "Citra" ) - citra-qt - ;; - - "Dolphin" ) - dolphin-emu - ;; - - "Duckstation" ) - duckstation-qt - ;; - - "MelonDS" ) - melonDS - ;; - - "PCSX2-QT" ) - pcsx2-qt - ;; - - "PCSX2-Legacy" ) - pcsx2 - ;; - - "PPSSPP" ) - PPSSPPSDL - ;; - - "RPCS3" ) - rpcs3 - ;; - - "XEMU" ) - xemu - ;; - - "Yuzu" ) - yuzu + "RetroArch" ) + retroarch ;; - "" ) # No selection made or Back button clicked - configurator_options_dialog - ;; + "Citra" ) + citra-qt + ;; - esac + "Dolphin" ) + dolphin-emu + ;; + + "Duckstation" ) + duckstation-qt + ;; + + "MelonDS" ) + melonDS + ;; + + "PCSX2-QT" ) + pcsx2-qt + ;; + + "PCSX2-Legacy" ) + pcsx2 + ;; + + "PPSSPP" ) + PPSSPPSDL + ;; + + "RPCS3" ) + rpcs3 + ;; + + "XEMU" ) + xemu + ;; + + "Yuzu" ) + yuzu + ;; + + "" ) # No selection made or Back button clicked + configurator_options_dialog + ;; + + esac + else + configurator_options_dialog + fi } configurator_retroarch_rewind_dialog() { @@ -279,8 +278,8 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then - set_setting_value $raconf rewind_enable true retroarch - configurator_process_complete_dialog "enabling Rewind" + set_setting_value $raconf "rewind_enable" "false" retroarch + configurator_process_complete_dialog "disabling Rewind" else configurator_options_dialog fi @@ -292,8 +291,8 @@ configurator_retroarch_rewind_dialog() { if [ $? == 0 ] then - set_setting_value $raconf rewind_enable false retroarch - configurator_process_complete_dialog "disabling Rewind" + set_setting_value $raconf "rewind_enable" "true" retroarch + configurator_process_complete_dialog "enabling Rewind" else configurator_options_dialog fi From d0315989025cddbfa8801f1405ac82c8830625f8 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Mon, 21 Nov 2022 23:52:02 -0500 Subject: [PATCH 39/46] Update Primehack commit --- net.retrodeck.retrodeck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index d1e33290..fc74c9aa 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -834,7 +834,7 @@ modules: sources: - type: git url: https://github.com/shiiion/dolphin.git - commit: efb99ebfd20b1bc16ea3e51fec409c91e354d8c2 + commit: 55330bfebbcde86c169715c25f2b693cbbe55a75 # detects whether dolphin is running in a flatpak sandbox # and makes it use xdg directories if it is. # prevents dolphin from attempting to write conf files From d8c9d70c62db478fa76653aee17c878a27d1e4e7 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 22 Nov 2022 15:38:28 -0500 Subject: [PATCH 40/46] Another Primehack attempt --- net.retrodeck.retrodeck.yml | 68 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 55730396..a25b2769 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -827,42 +827,44 @@ modules: # # https://github.com/flathub/io.github.shiiion.primehack # # Disabled because it's overwriting Dolphin - # - name: primehack - # buildsystem: cmake-ninja - # config-opts: - # - -DCMAKE_BUILD_TYPE=Release - # - -DENABLE_ALSA=OFF - # - -DENABLE_SDL=ON - # - -DENABLE_EVDEV=ON - # - -DDISTRIBUTOR=Flathub - # cleanup: - # - /share/man - # post-install: - # - install -D primehack-wrapper /app/bin/primehack-wrapper - # sources: - # - type: git - # url: https://github.com/shiiion/dolphin.git - # commit: efb99ebfd20b1bc16ea3e51fec409c91e354d8c2 - # # detects whether dolphin is running in a flatpak sandbox - # # and makes it use xdg directories if it is. - # # prevents dolphin from attempting to write conf files - # # in non-writable paths, typically happens when a user - # # has leftover files from a previous non-flatpak install - # - type: patch - # path: rd-submodules/dolphin/detectflatpak.patch - # # version strings must match exactly for online multiplayer - # - type: patch - # path: rd-submodules/dolphin/nodirtyversion.patch - # - type: script - # commands: - # - 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 - # - dolphin-emu "$@" - # dest-filename: primehack-wrapper + - name: primehack + buildsystem: cmake-ninja + config-opts: + - -DCMAKE_BUILD_TYPE=Release + - -DENABLE_ALSA=OFF + - -DENABLE_SDL=ON + - -DENABLE_EVDEV=ON + - -DDISTRIBUTOR=Flathub + cleanup: + - /share/man + post-install: + - install -D primehack-wrapper /app/bin/primehack-wrapper + sources: + - type: git + url: https://github.com/TheDrifter363/primehack.git + commit: 6295c695307a67f11ee202b05cbdd7b5c1edae5c + # detects whether dolphin is running in a flatpak sandbox + # and makes it use xdg directories if it is. + # prevents dolphin from attempting to write conf files + # in non-writable paths, typically happens when a user + # has leftover files from a previous non-flatpak install + - type: patch + path: rd-submodules/dolphin/detectflatpak.patch + # version strings must match exactly for online multiplayer + - type: patch + path: rd-submodules/dolphin/nodirtyversion.patch + - type: script + commands: + - 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 + - dolphin-emu "$@" + dest-filename: primehack-wrapper # # PRIMEHACK - END + # # PRIMEHACK APPIMAGE START + # Duckstation - START # https://github.com/flathub/org.duckstation.DuckStation # Disabled until we completely switch to QT6 From e2909f45fa87a6a3030740b89406d4639cca195f Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 22 Nov 2022 15:43:38 -0500 Subject: [PATCH 41/46] Formatting broke everything --- net.retrodeck.retrodeck.yml | 52 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index a25b2769..24ebd182 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -827,39 +827,39 @@ modules: # # https://github.com/flathub/io.github.shiiion.primehack # # Disabled because it's overwriting Dolphin - - name: primehack - buildsystem: cmake-ninja - config-opts: - - -DCMAKE_BUILD_TYPE=Release - - -DENABLE_ALSA=OFF - - -DENABLE_SDL=ON - - -DENABLE_EVDEV=ON - - -DDISTRIBUTOR=Flathub - cleanup: - - /share/man - post-install: - - install -D primehack-wrapper /app/bin/primehack-wrapper - sources: - - type: git - url: https://github.com/TheDrifter363/primehack.git + - name: primehack + buildsystem: cmake-ninja + config-opts: + - -DCMAKE_BUILD_TYPE=Release + - -DENABLE_ALSA=OFF + - -DENABLE_SDL=ON + - -DENABLE_EVDEV=ON + - -DDISTRIBUTOR=Flathub + cleanup: + - /share/man + post-install: + - install -D primehack-wrapper /app/bin/primehack-wrapper + sources: + - type: git + url: https://github.com/TheDrifter363/primehack.git commit: 6295c695307a67f11ee202b05cbdd7b5c1edae5c # detects whether dolphin is running in a flatpak sandbox # and makes it use xdg directories if it is. # prevents dolphin from attempting to write conf files # in non-writable paths, typically happens when a user # has leftover files from a previous non-flatpak install - - type: patch - path: rd-submodules/dolphin/detectflatpak.patch + - type: patch + path: rd-submodules/dolphin/detectflatpak.patch # version strings must match exactly for online multiplayer - - type: patch - path: rd-submodules/dolphin/nodirtyversion.patch - - type: script - commands: - - 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 - - dolphin-emu "$@" - dest-filename: primehack-wrapper + - type: patch + path: rd-submodules/dolphin/nodirtyversion.patch + - type: script + commands: + - 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 + - dolphin-emu "$@" + dest-filename: primehack-wrapper # # PRIMEHACK - END From 1451fc04e3de3dd3d833c3c72b8f2e2087b578c6 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 22 Nov 2022 15:44:39 -0500 Subject: [PATCH 42/46] Primehack compile fix --- net.retrodeck.retrodeck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 24ebd182..12e7677a 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -858,7 +858,7 @@ modules: - 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 - - dolphin-emu "$@" + - primehack "$@" dest-filename: primehack-wrapper # # PRIMEHACK - END From 5b4062f31b04db6d203beb644b3ba4b4e8a77943 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Wed, 23 Nov 2022 12:37:06 -0500 Subject: [PATCH 43/46] Package file named incorrectly --- net.retrodeck.retrodeck.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 12e7677a..2e17020d 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -949,9 +949,9 @@ modules: # from: https://github.com/flathub/com.ticktick.TickTick/blob/dc07865aca359148fbe15617db8f2d79312da898/com.ticktick.TickTick.yml buildsystem: simple build-commands: - - ar x libsepol*.deb data.tar.xz + - ar x libsepol*.deb data.tar.zst - rm libsepol*.deb - - tar -xf data.tar.xz / + - tar -xf data.tar.zst / sources: #from: https://launchpad.net/ubuntu/+source/libsepol - type: file From 2052ff7ab18ff26d1a55bba464c86399c69fa025 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Wed, 23 Nov 2022 13:15:49 -0500 Subject: [PATCH 44/46] Extra slash breaks things --- net.retrodeck.retrodeck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 2e17020d..b72a2f5f 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -951,7 +951,7 @@ modules: build-commands: - ar x libsepol*.deb data.tar.zst - rm libsepol*.deb - - tar -xf data.tar.zst / + - tar -xf data.tar.zst sources: #from: https://launchpad.net/ubuntu/+source/libsepol - type: file From ce5bd50cf1fed851a100357946414605cd6cc1ad Mon Sep 17 00:00:00 2001 From: icenine451 Date: Wed, 23 Nov 2022 18:55:45 -0500 Subject: [PATCH 45/46] libsepol-dev library --- net.retrodeck.retrodeck.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index f1a9bf0e..8749b3dc 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -945,6 +945,19 @@ modules: # Cemu - START # https://github.com/cemu-project/Cemu/releases + - name: libsepol-dev + # from: https://github.com/flathub/com.ticktick.TickTick/blob/dc07865aca359148fbe15617db8f2d79312da898/com.ticktick.TickTick.yml + buildsystem: simple + build-commands: + - ar x libsepol*.deb data.tar.zst + - rm libsepol*.deb + - tar -xf data.tar.zst + sources: + #from: https://launchpad.net/ubuntu/+source/libsepol + - type: file + url: https://launchpad.net/ubuntu/+archive/primary/+files/libsepol-dev_3.4-2_amd64.deb + sha256: 6cf60eb730f9a02a05a0f6e7c644347ad2948b2e1dc73750793ac58e1250d76c + - name: Cemu-binary buildsystem: simple build-commands: From dec2970f4fa318dec8727b50ee950025fbb7da33 Mon Sep 17 00:00:00 2001 From: XargonWan Date: Thu, 24 Nov 2022 09:08:02 +0100 Subject: [PATCH 46/46] Removed libsepol --- net.retrodeck.retrodeck.yml | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 8749b3dc..aa074bc1 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -945,19 +945,6 @@ modules: # Cemu - START # https://github.com/cemu-project/Cemu/releases - - name: libsepol-dev - # from: https://github.com/flathub/com.ticktick.TickTick/blob/dc07865aca359148fbe15617db8f2d79312da898/com.ticktick.TickTick.yml - buildsystem: simple - build-commands: - - ar x libsepol*.deb data.tar.zst - - rm libsepol*.deb - - tar -xf data.tar.zst - sources: - #from: https://launchpad.net/ubuntu/+source/libsepol - - type: file - url: https://launchpad.net/ubuntu/+archive/primary/+files/libsepol-dev_3.4-2_amd64.deb - sha256: 6cf60eb730f9a02a05a0f6e7c644347ad2948b2e1dc73750793ac58e1250d76c - - name: Cemu-binary buildsystem: simple build-commands: @@ -1029,4 +1016,4 @@ modules: sources: - type: git url: https://github.com/XargonWan/RetroDECK.git - branch: cooker-0.6.0b \ No newline at end of file + branch: cooker-0.6.0b

GjlH(-yPc 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≪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 Y53*{nj^W=9-~a#s07*qoM6N<$g61TxQ2+n{ diff --git a/overlays/borders/light/gb.png b/overlays/borders/light/gb.png deleted file mode 100644 index 37992d5c3cabc9b6b9fcb484a740928af699c01f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444603 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â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