From 2b3f6bc0d2e1c8b71306c85fd3da84b997fb6659 Mon Sep 17 00:00:00 2001 From: Allen Houchins Date: Tue, 9 Jun 2026 07:26:23 -0500 Subject: [PATCH] Add macOS Fleet-maintained apps (U) Adds 9 Fleet-maintained app(s) whose cask token starts with 'U': inputs, outputs, app icons (TSX + website PNG), and the matching index.ts and apps.json entries. Split out from #47121. --- .../inputs/homebrew/ua-connect.json | 10 +++ .../inputs/homebrew/ukelele.json | 10 +++ .../inputs/homebrew/ultimaker-cura.json | 10 +++ .../inputs/homebrew/unclutter.json | 10 +++ .../inputs/homebrew/unicodechecker.json | 10 +++ .../inputs/homebrew/unity-hub.json | 10 +++ ee/maintained-apps/inputs/homebrew/updf.json | 10 +++ .../inputs/homebrew/upscayl.json | 10 +++ .../inputs/homebrew/usage-app.json | 10 +++ ee/maintained-apps/outputs/apps.json | 63 ++++++++++++++++++ .../outputs/ua-connect/darwin.json | 22 ++++++ .../outputs/ukelele/darwin.json | 22 ++++++ .../outputs/ultimaker-cura/darwin.json | 22 ++++++ .../outputs/unclutter/darwin.json | 22 ++++++ .../outputs/unicodechecker/darwin.json | 22 ++++++ .../outputs/unity-hub/darwin.json | 22 ++++++ ee/maintained-apps/outputs/updf/darwin.json | 22 ++++++ .../outputs/upscayl/darwin.json | 22 ++++++ .../outputs/usage-app/darwin.json | 22 ++++++ .../components/icons/UaConnect.tsx | 14 ++++ .../SoftwarePage/components/icons/Ukelele.tsx | 14 ++++ .../components/icons/UltimakerCura.tsx | 14 ++++ .../components/icons/Unclutter.tsx | 14 ++++ .../components/icons/Unicodechecker.tsx | 14 ++++ .../components/icons/UnityHub.tsx | 14 ++++ .../SoftwarePage/components/icons/Updf.tsx | 14 ++++ .../SoftwarePage/components/icons/Upscayl.tsx | 14 ++++ .../components/icons/UsageApp.tsx | 14 ++++ .../SoftwarePage/components/icons/index.ts | 18 +++++ .../images/app-icon-ua-connect-60x60@2x.png | Bin 0 -> 9086 bytes .../images/app-icon-ukelele-60x60@2x.png | Bin 0 -> 8854 bytes .../app-icon-ultimaker-cura-60x60@2x.png | Bin 0 -> 10124 bytes .../images/app-icon-unclutter-60x60@2x.png | Bin 0 -> 18888 bytes .../app-icon-unicodechecker-60x60@2x.png | Bin 0 -> 11088 bytes .../images/app-icon-unity-hub-60x60@2x.png | Bin 0 -> 13714 bytes .../assets/images/app-icon-updf-60x60@2x.png | Bin 0 -> 9542 bytes .../images/app-icon-upscayl-60x60@2x.png | Bin 0 -> 8055 bytes .../images/app-icon-usage-app-60x60@2x.png | Bin 0 -> 7613 bytes 38 files changed, 495 insertions(+) create mode 100644 ee/maintained-apps/inputs/homebrew/ua-connect.json create mode 100644 ee/maintained-apps/inputs/homebrew/ukelele.json create mode 100644 ee/maintained-apps/inputs/homebrew/ultimaker-cura.json create mode 100644 ee/maintained-apps/inputs/homebrew/unclutter.json create mode 100644 ee/maintained-apps/inputs/homebrew/unicodechecker.json create mode 100644 ee/maintained-apps/inputs/homebrew/unity-hub.json create mode 100644 ee/maintained-apps/inputs/homebrew/updf.json create mode 100644 ee/maintained-apps/inputs/homebrew/upscayl.json create mode 100644 ee/maintained-apps/inputs/homebrew/usage-app.json create mode 100644 ee/maintained-apps/outputs/ua-connect/darwin.json create mode 100644 ee/maintained-apps/outputs/ukelele/darwin.json create mode 100644 ee/maintained-apps/outputs/ultimaker-cura/darwin.json create mode 100644 ee/maintained-apps/outputs/unclutter/darwin.json create mode 100644 ee/maintained-apps/outputs/unicodechecker/darwin.json create mode 100644 ee/maintained-apps/outputs/unity-hub/darwin.json create mode 100644 ee/maintained-apps/outputs/updf/darwin.json create mode 100644 ee/maintained-apps/outputs/upscayl/darwin.json create mode 100644 ee/maintained-apps/outputs/usage-app/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/UaConnect.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Ukelele.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/UltimakerCura.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Unclutter.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Unicodechecker.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/UnityHub.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Updf.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Upscayl.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/UsageApp.tsx create mode 100644 website/assets/images/app-icon-ua-connect-60x60@2x.png create mode 100644 website/assets/images/app-icon-ukelele-60x60@2x.png create mode 100644 website/assets/images/app-icon-ultimaker-cura-60x60@2x.png create mode 100644 website/assets/images/app-icon-unclutter-60x60@2x.png create mode 100644 website/assets/images/app-icon-unicodechecker-60x60@2x.png create mode 100644 website/assets/images/app-icon-unity-hub-60x60@2x.png create mode 100644 website/assets/images/app-icon-updf-60x60@2x.png create mode 100644 website/assets/images/app-icon-upscayl-60x60@2x.png create mode 100644 website/assets/images/app-icon-usage-app-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/ua-connect.json b/ee/maintained-apps/inputs/homebrew/ua-connect.json new file mode 100644 index 00000000000..e3872c71caa --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/ua-connect.json @@ -0,0 +1,10 @@ +{ + "name": "UA Connect", + "unique_identifier": "com.uaudio.ua-connect", + "token": "ua-connect", + "installer_format": "dmg", + "slug": "ua-connect/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/ukelele.json b/ee/maintained-apps/inputs/homebrew/ukelele.json new file mode 100644 index 00000000000..ea3632a6fb3 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/ukelele.json @@ -0,0 +1,10 @@ +{ + "name": "Ukelele", + "unique_identifier": "org.sil.ukelele", + "token": "ukelele", + "installer_format": "dmg", + "slug": "ukelele/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/ultimaker-cura.json b/ee/maintained-apps/inputs/homebrew/ultimaker-cura.json new file mode 100644 index 00000000000..8e922b95e78 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/ultimaker-cura.json @@ -0,0 +1,10 @@ +{ + "name": "UltiMaker Cura", + "unique_identifier": "nl.ultimaker.cura.dmg", + "token": "ultimaker-cura", + "installer_format": "dmg", + "slug": "ultimaker-cura/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/unclutter.json b/ee/maintained-apps/inputs/homebrew/unclutter.json new file mode 100644 index 00000000000..68ca53e036c --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/unclutter.json @@ -0,0 +1,10 @@ +{ + "name": "Unclutter", + "unique_identifier": "com.softwareambience.Unclutter", + "token": "unclutter", + "installer_format": "zip", + "slug": "unclutter/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/unicodechecker.json b/ee/maintained-apps/inputs/homebrew/unicodechecker.json new file mode 100644 index 00000000000..4041d69af11 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/unicodechecker.json @@ -0,0 +1,10 @@ +{ + "name": "UnicodeChecker", + "unique_identifier": "net.earthlingsoft.UnicodeChecker", + "token": "unicodechecker", + "installer_format": "zip", + "slug": "unicodechecker/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/unity-hub.json b/ee/maintained-apps/inputs/homebrew/unity-hub.json new file mode 100644 index 00000000000..86c78f82ffe --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/unity-hub.json @@ -0,0 +1,10 @@ +{ + "name": "Unity Hub", + "unique_identifier": "com.unity3d.unityhub", + "token": "unity-hub", + "installer_format": "dmg", + "slug": "unity-hub/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/updf.json b/ee/maintained-apps/inputs/homebrew/updf.json new file mode 100644 index 00000000000..b8ce8d3ed19 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/updf.json @@ -0,0 +1,10 @@ +{ + "name": "UPDF", + "unique_identifier": "com.superace.updf.mac", + "token": "updf", + "installer_format": "dmg", + "slug": "updf/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/upscayl.json b/ee/maintained-apps/inputs/homebrew/upscayl.json new file mode 100644 index 00000000000..6041227f7c8 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/upscayl.json @@ -0,0 +1,10 @@ +{ + "name": "Upscayl", + "unique_identifier": "org.upscayl.Upscayl", + "token": "upscayl", + "installer_format": "dmg", + "slug": "upscayl/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/usage-app.json b/ee/maintained-apps/inputs/homebrew/usage-app.json new file mode 100644 index 00000000000..c1b42b5d1e9 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/usage-app.json @@ -0,0 +1,10 @@ +{ + "name": "Usage", + "unique_identifier": "com.mediaatelier.Usage", + "token": "usage-app", + "installer_format": "dmg", + "slug": "usage-app/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index c6c822b710f..19ad7b5cb66 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -2948,6 +2948,69 @@ "unique_identifier": "Twingate", "description": "Twingate is a zero trust network access platform." }, + { + "name": "UA Connect", + "slug": "ua-connect/darwin", + "platform": "darwin", + "unique_identifier": "com.uaudio.ua-connect", + "description": "UA Connect is a software installer and device manager for Universal Audio products." + }, + { + "name": "Ukelele", + "slug": "ukelele/darwin", + "platform": "darwin", + "unique_identifier": "org.sil.ukelele", + "description": "Ukelele is a unicode keyboard layout editor." + }, + { + "name": "UltiMaker Cura", + "slug": "ultimaker-cura/darwin", + "platform": "darwin", + "unique_identifier": "nl.ultimaker.cura.dmg", + "description": "UltiMaker Cura is a 3D printer and slicing GUI." + }, + { + "name": "Unclutter", + "slug": "unclutter/darwin", + "platform": "darwin", + "unique_identifier": "com.softwareambience.Unclutter", + "description": "Unclutter is a desktop storage area for notes, files and pasteboard clips." + }, + { + "name": "UnicodeChecker", + "slug": "unicodechecker/darwin", + "platform": "darwin", + "unique_identifier": "net.earthlingsoft.UnicodeChecker", + "description": "UnicodeChecker is an explore and convert Unicode." + }, + { + "name": "Unity Hub", + "slug": "unity-hub/darwin", + "platform": "darwin", + "unique_identifier": "com.unity3d.unityhub", + "description": "Unity Hub is a management tool for Unity." + }, + { + "name": "UPDF", + "slug": "updf/darwin", + "platform": "darwin", + "unique_identifier": "com.superace.updf.mac", + "description": "UPDF is a PDF editor." + }, + { + "name": "Upscayl", + "slug": "upscayl/darwin", + "platform": "darwin", + "unique_identifier": "org.upscayl.Upscayl", + "description": "Upscayl is an AI image upscaler." + }, + { + "name": "Usage", + "slug": "usage-app/darwin", + "platform": "darwin", + "unique_identifier": "com.mediaatelier.Usage", + "description": "Usage is a tracks application usage." + }, { "name": "UTM", "slug": "utm/darwin", diff --git a/ee/maintained-apps/outputs/ua-connect/darwin.json b/ee/maintained-apps/outputs/ua-connect/darwin.json new file mode 100644 index 00000000000..759af63e3d1 --- /dev/null +++ b/ee/maintained-apps/outputs/ua-connect/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.9.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.uaudio.ua-connect';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.uaudio.ua-connect' AND version_compare(bundle_short_version, '1.9.3') < 0);" + }, + "installer_url": "https://builds.uaudio.com/apps/UA_Connect/UA_Connect_1_9_3_3672_Mac.dmg", + "install_script_ref": "3d09e295", + "uninstall_script_ref": "0e6f3643", + "sha256": "35d18872f42fd3be98ed6d1a2cac6378848f27b5da5f0d0dc8514195afe724d2", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0e6f3643": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.uaudio.bsd.helper'\nquit_application 'com.uaudio.ua-connect'\nsudo rm -rf '/Library/LaunchDaemons/com.uaudio.bsd.helper.plist'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.uaudio.bsd.helper'\nsudo rm -rf \"$APPDIR/UA Connect.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/UA Connect'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Universal Audio/UA Connect'\ntrash $LOGGED_IN_USER '~/Library/Logs/UA Connect'\ntrash $LOGGED_IN_USER '~/Library/Logs/Universal Audio/UA Connect.log'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.uaudio.ua-connect.plist'\n", + "3d09e295": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.uaudio.ua-connect'\nif [ -d \"$APPDIR/UA Connect.app\" ]; then\n\tsudo mv \"$APPDIR/UA Connect.app\" \"$TMPDIR/UA Connect.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/UA Connect.app\" \"$APPDIR\"\nrelaunch_application 'com.uaudio.ua-connect'\n" + } +} diff --git a/ee/maintained-apps/outputs/ukelele/darwin.json b/ee/maintained-apps/outputs/ukelele/darwin.json new file mode 100644 index 00000000000..8e05452e3f4 --- /dev/null +++ b/ee/maintained-apps/outputs/ukelele/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.6.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.sil.ukelele';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.sil.ukelele' AND version_compare(bundle_short_version, '3.6.1') < 0);" + }, + "installer_url": "https://software.sil.org/downloads/r/ukelele/Ukelele_3.6.1.dmg", + "install_script_ref": "cc892aec", + "uninstall_script_ref": "134f131d", + "sha256": "ffa11a15824f4ac9bf3cc9807e8bc9b0d4247efebf03d7a55d052dbfaafac501", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "134f131d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Ukelele.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/org.sil.ukelele.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/org.sil.Ukelele'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.sil.ukelele.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/Ukelele'\n", + "cc892aec": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'org.sil.ukelele'\nif [ -d \"$APPDIR/Ukelele.app\" ]; then\n\tsudo mv \"$APPDIR/Ukelele.app\" \"$TMPDIR/Ukelele.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Ukelele.app\" \"$APPDIR\"\nrelaunch_application 'org.sil.ukelele'\n" + } +} diff --git a/ee/maintained-apps/outputs/ultimaker-cura/darwin.json b/ee/maintained-apps/outputs/ultimaker-cura/darwin.json new file mode 100644 index 00000000000..e9c66a4f29f --- /dev/null +++ b/ee/maintained-apps/outputs/ultimaker-cura/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "5.13.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'nl.ultimaker.cura.dmg';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'nl.ultimaker.cura.dmg' AND version_compare(bundle_short_version, '5.13.0') < 0);" + }, + "installer_url": "https://github.com/Ultimaker/Cura/releases/download/5.13.0/UltiMaker-Cura-5.13.0-macos-ARM64.dmg", + "install_script_ref": "fe0414cc", + "uninstall_script_ref": "887d8525", + "sha256": "1483806486a19728bc0f363f847d75be3f179ea43c7f074bfc327f5b5c6e05ad", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "887d8525": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'nl.ultimaker.cura.dmg'\nsudo rm -rf \"$APPDIR/UltiMaker Cura.app\"\ntrash $LOGGED_IN_USER '~/.cura'\ntrash $LOGGED_IN_USER '~/Library/Application Support/cura'\ntrash $LOGGED_IN_USER '~/Library/Caches/Ultimaker B.V./Ultimaker-Cura'\ntrash $LOGGED_IN_USER '~/Library/Logs/cura'\ntrash $LOGGED_IN_USER '~/Library/Preferences/nl.ultimaker.cura.dmg.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/nl.ultimaker.cura.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/nl.ultimaker.cura.dmg.savedState'\n", + "fe0414cc": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'nl.ultimaker.cura.dmg'\nif [ -d \"$APPDIR/UltiMaker Cura.app\" ]; then\n\tsudo mv \"$APPDIR/UltiMaker Cura.app\" \"$TMPDIR/UltiMaker Cura.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/UltiMaker Cura.app\" \"$APPDIR\"\nrelaunch_application 'nl.ultimaker.cura.dmg'\n" + } +} diff --git a/ee/maintained-apps/outputs/unclutter/darwin.json b/ee/maintained-apps/outputs/unclutter/darwin.json new file mode 100644 index 00000000000..2f4a2935b0c --- /dev/null +++ b/ee/maintained-apps/outputs/unclutter/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.2.18d", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.softwareambience.Unclutter';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.softwareambience.Unclutter' AND version_compare(bundle_short_version, '2.2.18d') < 0);" + }, + "installer_url": "https://unclutterapp.com/files/Unclutter.zip", + "install_script_ref": "e2747ae2", + "uninstall_script_ref": "f4809b02", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "e2747ae2": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.softwareambience.Unclutter'\nif [ -d \"$APPDIR/Unclutter.app\" ]; then\n\tsudo mv \"$APPDIR/Unclutter.app\" \"$TMPDIR/Unclutter.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Unclutter.app\" \"$APPDIR\"\nrelaunch_application 'com.softwareambience.Unclutter'\n", + "f4809b02": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Unclutter.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/*.group.com.softwareambience.Unclutter'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.softwareambience.unclutter.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Unclutter'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.softwareambience.Unclutter'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.softwareambience.Unclutter'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.group.com.softwareambience.Unclutter'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.softwareambience.Unclutter'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.softwareambience.Unclutter.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/unicodechecker/darwin.json b/ee/maintained-apps/outputs/unicodechecker/darwin.json new file mode 100644 index 00000000000..9b4f2ec007c --- /dev/null +++ b/ee/maintained-apps/outputs/unicodechecker/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.25.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.earthlingsoft.UnicodeChecker';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.earthlingsoft.UnicodeChecker' AND version_compare(bundle_short_version, '1.25.1') < 0);" + }, + "installer_url": "https://earthlingsoft.net/UnicodeChecker/UnicodeChecker%201.25.1%20(862).zip", + "install_script_ref": "97c8470f", + "uninstall_script_ref": "b07c4637", + "sha256": "f6cc0c4e6904e3429e600db741a7bf26bbda2d7efb9eabac5f56b9475a6bfa6f", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "97c8470f": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'net.earthlingsoft.UnicodeChecker'\nif [ -d \"$APPDIR/UnicodeChecker.app\" ]; then\n\tsudo mv \"$APPDIR/UnicodeChecker.app\" \"$TMPDIR/UnicodeChecker.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/UnicodeChecker.app\" \"$APPDIR\"\nrelaunch_application 'net.earthlingsoft.UnicodeChecker'\n", + "b07c4637": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/UnicodeChecker.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/UnicodeChecker'\ntrash $LOGGED_IN_USER '~/Library/Caches/net.earthlingsoft.UnicodeChecker'\ntrash $LOGGED_IN_USER '~/Library/Preferences/net.earthlingsoft.UnicodeChecker.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/unity-hub/darwin.json b/ee/maintained-apps/outputs/unity-hub/darwin.json new file mode 100644 index 00000000000..aef34653db2 --- /dev/null +++ b/ee/maintained-apps/outputs/unity-hub/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.18.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.unity3d.unityhub';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.unity3d.unityhub' AND version_compare(bundle_short_version, '3.18.2') < 0);" + }, + "installer_url": "https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup-arm64.dmg", + "install_script_ref": "c26804cb", + "uninstall_script_ref": "5b95ff58", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "5b95ff58": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.unity3d.unityhub'\nsudo rm -rf \"$APPDIR/Unity Hub.app\"\nsudo rmdir '/Applications/Unity/Hub'\ntrash $LOGGED_IN_USER '~/Library/Application Support/UnityHub'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.unity3d.unityhub.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.unity3d.unityhub.plist'\n", + "c26804cb": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.unity3d.unityhub'\nif [ -d \"$APPDIR/Unity Hub.app\" ]; then\n\tsudo mv \"$APPDIR/Unity Hub.app\" \"$TMPDIR/Unity Hub.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Unity Hub.app\" \"$APPDIR\"\nrelaunch_application 'com.unity3d.unityhub'\n" + } +} diff --git a/ee/maintained-apps/outputs/updf/darwin.json b/ee/maintained-apps/outputs/updf/darwin.json new file mode 100644 index 00000000000..fa522b8f668 --- /dev/null +++ b/ee/maintained-apps/outputs/updf/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.5.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.superace.updf.mac';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.superace.updf.mac' AND version_compare(bundle_short_version, '2.5.3') < 0);" + }, + "installer_url": "https://download.updf.com/updf/basic/mac/apple/updf-mac-full.dmg", + "install_script_ref": "2bc5724d", + "uninstall_script_ref": "00530805", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "00530805": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/UPDF.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.superace.updf.installer'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.superace.updf.mac'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.superace.updf.installer'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.superace.updf.mac'\ntrash $LOGGED_IN_USER '~/Library/Caches/UPDF Installer'\ntrash $LOGGED_IN_USER '~/Library/Caches/UPDF'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.superace.updf.installer'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.superace.updf.mac'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.superace.updf.mac.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.superace.updf.installer.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.superace.updf.mac.file.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.superace.updf.mac.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.superace.updf.mac.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.superace.updf.mac'\n", + "2bc5724d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.superace.updf.mac'\nif [ -d \"$APPDIR/UPDF.app\" ]; then\n\tsudo mv \"$APPDIR/UPDF.app\" \"$TMPDIR/UPDF.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/UPDF.app\" \"$APPDIR\"\nrelaunch_application 'com.superace.updf.mac'\n" + } +} diff --git a/ee/maintained-apps/outputs/upscayl/darwin.json b/ee/maintained-apps/outputs/upscayl/darwin.json new file mode 100644 index 00000000000..d0fd12fd177 --- /dev/null +++ b/ee/maintained-apps/outputs/upscayl/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.15.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.upscayl.Upscayl';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.upscayl.Upscayl' AND version_compare(bundle_short_version, '2.15.0') < 0);" + }, + "installer_url": "https://github.com/upscayl/upscayl/releases/download/v2.15.0/upscayl-2.15.0-mac.dmg", + "install_script_ref": "ea37f146", + "uninstall_script_ref": "67ec9c31", + "sha256": "0e53c9ee8c1800cb3e2ce0f574e4e1a35a51945e19ff2b93f33928bbd7fd4c5a", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "67ec9c31": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Upscayl.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Upscayl'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.upscayl.app.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.upscayl.app.savedState'\n", + "ea37f146": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'org.upscayl.Upscayl'\nif [ -d \"$APPDIR/Upscayl.app\" ]; then\n\tsudo mv \"$APPDIR/Upscayl.app\" \"$TMPDIR/Upscayl.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Upscayl.app\" \"$APPDIR\"\nrelaunch_application 'org.upscayl.Upscayl'\n" + } +} diff --git a/ee/maintained-apps/outputs/usage-app/darwin.json b/ee/maintained-apps/outputs/usage-app/darwin.json new file mode 100644 index 00000000000..30b4d1450f0 --- /dev/null +++ b/ee/maintained-apps/outputs/usage-app/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.4.6", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.mediaatelier.Usage';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.mediaatelier.Usage' AND version_compare(bundle_short_version, '1.4.6') < 0);" + }, + "installer_url": "https://mediaatelier.com/Usage/Usage_1.4.6.dmg", + "install_script_ref": "85b735d2", + "uninstall_script_ref": "b71eb62e", + "sha256": "1a782b03b08b544eb1277c18576ce14e9388510f53f6e3bda4a6793bd2780c66", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "85b735d2": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.mediaatelier.Usage'\nif [ -d \"$APPDIR/Usage.app\" ]; then\n\tsudo mv \"$APPDIR/Usage.app\" \"$TMPDIR/Usage.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Usage.app\" \"$APPDIR\"\nrelaunch_application 'com.mediaatelier.Usage'\n", + "b71eb62e": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Usage.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.mediaatelier.Usage'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.mediaatelier.Usage'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.mediaatelier.Usage.plist'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/UaConnect.tsx b/frontend/pages/SoftwarePage/components/icons/UaConnect.tsx new file mode 100644 index 00000000000..0ef1fcdba69 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/UaConnect.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const UaConnect = (props: SVGProps) => ( + + + +); +export default UaConnect; diff --git a/frontend/pages/SoftwarePage/components/icons/Ukelele.tsx b/frontend/pages/SoftwarePage/components/icons/Ukelele.tsx new file mode 100644 index 00000000000..8d436c8b494 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Ukelele.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Ukelele = (props: SVGProps) => ( + + + +); +export default Ukelele; diff --git a/frontend/pages/SoftwarePage/components/icons/UltimakerCura.tsx b/frontend/pages/SoftwarePage/components/icons/UltimakerCura.tsx new file mode 100644 index 00000000000..d682372cac9 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/UltimakerCura.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const UltimakerCura = (props: SVGProps) => ( + + + +); +export default UltimakerCura; diff --git a/frontend/pages/SoftwarePage/components/icons/Unclutter.tsx b/frontend/pages/SoftwarePage/components/icons/Unclutter.tsx new file mode 100644 index 00000000000..bc5cc3b4d37 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Unclutter.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Unclutter = (props: SVGProps) => ( + + + +); +export default Unclutter; diff --git a/frontend/pages/SoftwarePage/components/icons/Unicodechecker.tsx b/frontend/pages/SoftwarePage/components/icons/Unicodechecker.tsx new file mode 100644 index 00000000000..048182cd1ca --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Unicodechecker.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Unicodechecker = (props: SVGProps) => ( + + + +); +export default Unicodechecker; diff --git a/frontend/pages/SoftwarePage/components/icons/UnityHub.tsx b/frontend/pages/SoftwarePage/components/icons/UnityHub.tsx new file mode 100644 index 00000000000..98b224d8de6 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/UnityHub.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const UnityHub = (props: SVGProps) => ( + + + +); +export default UnityHub; diff --git a/frontend/pages/SoftwarePage/components/icons/Updf.tsx b/frontend/pages/SoftwarePage/components/icons/Updf.tsx new file mode 100644 index 00000000000..7da92402654 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Updf.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Updf = (props: SVGProps) => ( + + + +); +export default Updf; diff --git a/frontend/pages/SoftwarePage/components/icons/Upscayl.tsx b/frontend/pages/SoftwarePage/components/icons/Upscayl.tsx new file mode 100644 index 00000000000..fe9970844ae --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Upscayl.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Upscayl = (props: SVGProps) => ( + + + +); +export default Upscayl; diff --git a/frontend/pages/SoftwarePage/components/icons/UsageApp.tsx b/frontend/pages/SoftwarePage/components/icons/UsageApp.tsx new file mode 100644 index 00000000000..0b21691a358 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/UsageApp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const UsageApp = (props: SVGProps) => ( + + + +); +export default UsageApp; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 42b3fbf8788..0d6cc3b705a 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -329,6 +329,15 @@ import Zoom from "./Zoom"; import ZoomRooms from "./ZoomRooms"; import Zotero from "./Zotero"; +import UaConnect from "./UaConnect"; +import Ukelele from "./Ukelele"; +import UltimakerCura from "./UltimakerCura"; +import Unclutter from "./Unclutter"; +import Unicodechecker from "./Unicodechecker"; +import UnityHub from "./UnityHub"; +import Updf from "./Updf"; +import Upscayl from "./Upscayl"; +import UsageApp from "./UsageApp"; // SOFTWARE_NAME_TO_ICON_MAP list "special" applications that have a defined // icon for them, keys refer to application names, and are intended to be fuzzy // matched in the application logic. @@ -669,6 +678,15 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { zeplin: Zeplin, "zoom rooms": ZoomRooms, zotero: Zotero, + "ua connect": UaConnect, + ukelele: Ukelele, + "ultimaker cura": UltimakerCura, + unclutter: Unclutter, + unicodechecker: Unicodechecker, + "unity hub": UnityHub, + updf: Updf, + upscayl: Upscayl, + usage: UsageApp, } as const; // Maps all known Linux platforms to the LinuxOS icon diff --git a/website/assets/images/app-icon-ua-connect-60x60@2x.png b/website/assets/images/app-icon-ua-connect-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc1e89499bc2688769ab08e88b39854420908bd GIT binary patch literal 9086 zcma)i2Q*yK_V-|PL5PT`Q4_sI8DkIYEKDu z;NL<)M!2^^UiJ_wpsk9o3II?ZO@027l<>@DrSVi30PyA~;NAiNr+@J)0Dy-$0I+5W z0Dw{e0A{!Jx+h?QKn-T1X``zP5G2qP0HRQP0FXct5z1{s0RTv{i2x*on&>YtoA}?- zz-*HL(0_p%Q9w@utjGSD3Bp8I2V~{yEc(*g^%YDM>Fo9w001LF1kxFXc*%uyc5;D( zkc!;@K!6DJU$z)G*FPW#M@4QE-N#(2uI?}{8BuXjac&3|7Z(@U-P#89RPE8f)Co_D z+;#|r8%Rvd)6-MbQ%cm;-BwIOUS3{ITvAL@QiOmIfqS_iULr+Y;5`2{@_+28!QfWz z_HGD!R~N3oc3-}7^*|_cbN_AV-`79;2}9cdrzIEozlKE^px9rDn1raf*uQNPRKb6_ zAXQficewvG{D1oPA6$ZSAyiQG+L$fceuV1CPT3ctM?aed*o0 zp-5#};%N#5&%pndxJp*HoR1%<74uuwhRe(#7rfxOzG=(DjfwR%{XL`N7x#UZekQ_; zAo3Ct67oGC=lBDUovIcU?7kc3X9zvv?D@0X3RgJc?r z6+SFl=@QwjA8|(o!k$mE5 z*DmM~5Dmw4d`o-lW`$^q9BumZX3AOilWwsfkE~KPu>kQHr?}VvqmfejIx7Av3r$25BMmuGiEA4yJq8C zKWE52A?H66w>o0}W@2gS9W^s#SkJU}q>B*~d{wi&ACS`BOW`lPmSUrkTVpSq3R|eM z=!}*;gH=T2M2_;yr0Pw0;WCoXmt~u3n|g00c1K7PMJXPRQ*ZcQ_5V)Q^r-sf7Fw!A z+)!TSb>AzZ82GLjc=S8DWSQ+DaW3QL>rVEgqnqaeEzhH>rOd(>mU{Ln#lDtwRO97W zyuKACOt}6O^MjR@Ku&Cgny(ue7=&B+?mRRKK1@r`RBh!4&=!GCS5W%ju~!3Ye~MPW zZDD>q%1#DS3sc@qiOh+!90%T|Roow#-stE%kg<|EXg=~F3uYnJlM)(I)Gr#&TeSW% zHvCQfV!mfJFpE2LwAh#R)0ha$YGM)YI_+KmXan;q!SUhdjKNmO#j5`7{?zQ{o3E_u ztJMW;b`;%cc~+;gX1?WL)svgUJ7&0dLMSU!aJgPuTzsUYJV!T`H;bF#^(;r6TUW?Y zDB{trB}IZgipX-CU(WO94!eIuT^p!qz7zW%6j~^H^`*;SS$dYA(%SKVWo!%?DO{2N zWD_#R1DQjM41)E1G3k)Gb{q_TUP07^OXP?S-z^tOYoUIGb~WgH&)2*)<=S*%Al7s) znICNQ#hF-VqZXIR>Rh*)XPm+~bw*pW`$8LdKXyz=h+C_j<7rUD9MGv5|Ab z!Ebd_Jl)9m#yG$V-GPqWWPy6hLh-yh^x**r#1lOUP2Tr9Yus9Gq1MX6T^H?Ku+P-X z;I7;MHm$(4(KKpg%1&bX%H=p;m$>W?T-Q4fW-%+j@l$0xB%SFWU=CP2E(f<$F~5Uw zlg|`{_HVBbEgh)W;dW%6MGvh1?4}ZsKMo5r56XBcXS8?u%>*1`nFhQIIh*Krar{U( z+Cj%N=*4mv!m#e3ZM2yV*+IUb6{xdZB+?HNX$7_tmTY)#n?e+G}X!U~XAkQ3ao^Yfl|wIJ9s58Q|GqHj+)cU!N7!-_jgT zHp7e*o@3BD&E?E>gOX)5H1DkVE3WOIp6VFIx~!}SE$m6Y@n)0bhtkQ69C{$U&m3BX zAldAd!u&og7jM)yzGhJ9G6Fc|uC^aN)KjO>eJK4sh@&%ml0R?Ut@T>|T)RH`CR4$D zuk5T2LQE)=&E@j^q#fNm z6estbElTH^va;K)Jr`^_mGPZP0Bhz_C*5xGn5cr|>QdF@h+}&xgQkOGS0;;-pT<-^ zTO#-Ux}3b15{*B?`xR@BS5VP$B4TtXSJbeL>dvNXK>fJi(ey!{?hrXA0s%P~F=!`c zHXAt7^j<`{#^#VYh;WgOr}DWcEmA&z-CB7Q4L>BW1{rZxGy^-uV# zQBX(M-{FzQ5@j=TL{7^w09G$@YrfDBe)L+SNII8v021u+ak0JTcD+rEBJ_YQAw4uU z8Z)VyJRfdxJ|CeLfv(aV@0FP*Bfm$GLHE59V@H-mt1|LPRt*H#ZJ*!$d*SxK1G9FQh@3>k~a>qSY?HqL$<={kRs-!61gU>Tgmrsf$VBuf;hkSXa2_kSAK zXkW?HQfWMgNd+whOd6?%L#>dTfFBmyIi0aB7v zQM}CT4wFWqvEdaBQM_ooSbb!Fp|_|#xC!BvZXMJGr?r(Lj~*k>0CJU;HlD6UybZ|$ zTJHTgn(<-oNhDf>*|hWpV>vh^ z+Ba7qq_2a^$FNQ<9Q4-K2F?>^5SVrG8QyS3@Gn!%jCbK5Ek9!th>OPS+gJ$srljc* z%ge19wJ~*pGP--Pxj~vFZh}10t zzohkMHBl}tX~tMwtQoh91)TKEHyq7q7Y6Q!MYo-_FgHH-U6#s9t!7DJSD7fBx|tQ4 zhq_v->ZB`>)dSop2)S-F*d`R}n`ZgdoV3B;B3jb03WPqcTuL&%dA3#W8nAlgzIerX zi4UD0Yr6E<>0oue(GNLux}wd&@eoyyzY3oZB%$pp;hvAYq;=5lQ;mOV*r%tnpP1M| zIbdqzz}nJX@L3PDusV)1?fBG zsfNhL8$R}hivEUCf5qG%q!c5Xa;e{>+QKo~O(b&INJqzV2AuEQ@Qr&XM0A#P+gG;qfu0D+~*NPbc>OX1Iccf>NP%uPv|7b&r3_=X0?3FP> z3BvjNwC1^=1Y8`94Y%I0{_(5+>herGp4Rk_o{fcyIcdP%-JUUcl}2(p*M8m?Lt-S4 z`^dtlk=W>vd4&X&&xQP19P``RJ;OPI!@es?nfnH>ynKhm29f6#)25Sg`0Wo?NiHsG z2pTb!P{eTN9sARu)GLY^lu5X4eSOC3*hrT5sl^n^H(}XN5-jCeR$3U-@6~UOh4Z#h zGnmcj4DHfow%7+25@nFJ(M5s|H&qC0KBj?aa7uagSN8+Q7ccmf4R}J1;Thd?Kld@~ z)Xrq)pzLo@vN@Ia+SLWjnwh@4-Bo7-D~)Z5M7OJ-nUI4Mnth zI+=tHGKDO8oDvmO2;CMJZH01rAj?*%FSzk%+f4xvw6l-{-L;ptN@vf@t-Iq`6#S1l z{Ez1n*s@MX@+(fgj$&~nha`_LE<*OzeOhFL_H*p*(*c8lWZ-$L`j7e<%=;DC1TKzJ zZ^A4V@PYYOyy`9uN3ugYaY_!>PbF$vNn5_u_q7<;O@!M+WnwiiLA&pojj&*-NB2+?8po`M$krDeoH&2IJ|;GZe~OO{ zRmG*l^{z@R_8Apddb_ndOX{~iZBgT&3Z|)3xi_{|=SS8-q#{jCZgspQ`{jRM>RRwV zz(d&Z0g3AnBKP2ny4=#_-)ZK>t-2SgOJtl7hb_z;?5#|zOgP*R=Gtq@~zz>G? z6huhF%;i*o{mn(Bq35!VJCXBUJkcBE7NFet=Uskh%uwW=9iFDm>Zv?!>9t)~vl!l` zG+^d^8XtYG)0MLqH8X2B9vgctw!Un7{aJSaS^1t^P>0VFiEXBr&7|_Q&vt`7 z8Jr^@ul1W&VI$@Zj;0858rTu&lQwQea(Fg-1zF{dl{&sxAX_(i-&kET#Lj$syT1Q!e3e6X^f2`)KFAs$5=A>%q{r!t zSIJuTNFE*34b(JaItdB@J96zDZ(N(I<@UF0%v^8|H(f9{y~Y!>z;^xz-p^F?$6fpN z@8`BKTUwi2KpQ5K4*riB^;Ae=jXQR=M6G>_M}Oj7#$$xjK^yg_h>OzPF!!o}eH15? z=ZqJw%JOGPc1;*fBOxh-*~5OW@~ez{{vjl5t4l)_yfK%rn~f;x$?b3ST~9A8Z3K~q z)W1f*)*g)5mnqZ7@UVl=KYOw4Pi?O;8AH8bO7d9Ty$qR%%q)<~tFYxII)?Xergsmg zT=PB2PSk!yC$I6oa{-H(lw}9#XO~<)*;yLPq}nu0)`aS?AN(i)Y4cfJLEXFgNROr_ zVjYcg!n27N=5|(&-WaNnIhHmUnfdOtul^}jBn}cF;$`-*%DNzK<_${uav8WaRep&L zp-X~J#{kC1igAl-y-I7w)<@-GRTXa*fXcCCKgZrN7JUvAc)-!_UL0_Fg3DJVYCfp! z+e2BjFZi)Pr#%}JZvUI$X8zuBC-eS(E~QHOeleG^OK^WcmF~cP{`y<>0}4&M87AHx zjR+0nG~lA?gY6JISlKVpt(?e-f%3W2Ezc&?^K+b% zezL!C;;&c4`7F_2$8=d)*?<{DOP4LWveOB)#EpZGSoyqm-0Zuts^Jh+$l0lI|72H~ z`WqPI3N<3QFOmbwj@yxxG5i`HYT63sTfD<43418RxBfC!huyaj7$X%duNu2N)yM(M zDQBQ}lhHVu_Oy7Bw<%yh+{?&O6~hbEAbC$igtKAjxj%M{u4?Z2WVSc8&5{TIu@R@X z5_&{fxpgWA>Gmsa2X@7ttL$`EcP`ADdrl{whV+^}QMxg}7TwtmeVduD>8JaGHYwP1 zNb*pwUN%5#LoR5cJd=J-pQ+R?nBk#pW&FC|n`7ZwGstUvI6E)ZyENrrGSJcGo28-? zSb>3+$ain&Sb$|k;(PM?LULkt_Af$?Ve zW3+BRxo!|Mo!rMUPMGy<>)rT-an638jFx6q^Y*cJp--W4NAz{c*LB^?MSRW21&PFO zhr0!5ZoO{Y@_N=k2$ws4$DBY*$0Jg$DCRLps#tQZbj;w3c3rzzO8ib0n|a+DX4l!4 zef1`I#%m4qc*(we)4oxZ*x`EAuRyVi~gx&N0)HS-~oDQII5neNE!%eQm z*l0wl|M*&?W8_N(Zd$!MC=E~~4RCM}yvCg$WELwtzzIWRQQJdAx*!ey$iz&+HIKt| zTDK6Yx_g6-i`M#^AVON1{VWPeBA=e$>1}?=X3-`w4ovB6JKSCmH_(&kYuM;kP9&W< z3jw2RnJ|0bM9-9I$)F(Q?QWF$j476c9tv8*s{E$&$A|1k5mDY@ADRHt^001JX#q;r z`VwG#Xnew8parhI{HM;-1z z>h@JChIk-cQfbEM@j*tU=;kf6z6+ox$ucaL{4Uz9N?wC_QT}Vl0#%UhDf(?o{Uusm zqfEX5&(2*M2p711#>+{5bfe_Q{Kxsa^%CvUyw_Pd8%qf*;l8_NAM-yhdn~R+GGfU1 zm2}-F*=YrsZVWVTuIpJpVuBFsiyuF_+8@@}=X@c_NQs`sHfzV~Hdj0^!H`hi%x4VN zj!7K_W??d@KutdT(iF_{-dM_l|Fqk{*S*JiZ|NA?a+4;GK>iZgJv05Y5@TjtLP{mO}+_mG!bwrg7r?#{`y6|^tk)VWgutC0TzSp>PqpI7V*D_F zw6-8|H*2-TVdwp|uM6Qg6*0|FKd3QI zN`^REq@n8LmWSa7%5r;$CVOIh+I~+FO8CBGiLJMhx&+|7WGhS{GlgS>UfD*H^Mm*} zFb$TmC(^C#Mk!3rs?t|~EDSVbuPwq}et60PSP*nna>-YAFTc05&)vKJ|ayxoO zE0~`$kYnTeas76q0%@k}&E|6Q9F5Wq>7dpK!@j7K`af|V2h88)-!qsIT%#;IQu5```k_Z@5tT(EpzAtORpBWgpq=F!{!apxYiQ0^0KG!mYG7ciDJ}LeG<-3{ln# zh1?MJ`sGiKL;5Yj##og8g2O`md7)#gb<*>u{eTch*GHd90F2daV%6*iq03mK+vqyI z5+TU>A{Sn;;0&`DK5N#u1HXS`ON#!3$6!Cdj1R=$u270{z|KZSH_)(}@p3%fr=MoC zi|d*oBG+DqZfN3dNf3|$q2l{WsrfQES|fGGmx?wMQ>c+CbCBm}&%-mNn?2#xFPgzD z8yi$(Pb_X}J)wYzKajZ2WdVynC}*-R#Nwc8`6 zABMTc<1+m!fUWt%;d=E{RA_f`MGAPjveG8swAF3cK$)uUg1#9p6BzDfi5n|>(p@1# zf?4A04%D4sDnhu6Fr=NT1~_?`s_FdF<+uKn>tS93iR~YG@TR!JacQh~CFEAApss?! z7onlGmA;)twr-2`?dC0a#p6rDn56nH81 zsqXev5x_}OylQBsuC`ZHX^X9j`Rn>GE(q+3tMT>VSki^00!M#})L|Ruv}Z_P=e9F| zCBIroc{avey~(l=L%BTgenut169(oPFg=~E5JSrWc)6a5wr@G45vX$ugo1Al*4%};yc;T|(-?-VjC2^x> zxt8?LF%`!8MJb@`Dc)hopJL~sOUbxlbF;hjlX@i{P9g?OwZ)agRo$hafgV2fB2qTM z-6@3$z+ShJQnfxHAVRr3uH_b(fWv0%sCVogd+S*kn6dkLAU{vnNroJg4Q__b(rt1Y zU)4|GaOx+?_ae8id}c#+0f>8){KAwR<-FL@ToPde+riWl8YSXi-mKc9=*wPcEYC6U zl0@N!*u}2H4NBz%P2!|GaaakT#C0YG_6^&xvK$&pBN&pYSgSG0EYX+!1(QDG*-(6l zydrRRs|IbK)(}v|eie}Vrz<#`4y6Iu*U=`PVnka;DOnnmPu+6HLCIRj5!^Vm)flAuV5d&Bbi~cc$@P@Ok?!SX2dF9<1UoKChzRWH zG78Ce%D>909=_tV@|&gYJ7H55JIg~^JjwvvU49y4OM}kUXNaLU9rt+~`huIymHp3H z)CofRW)kL#?n}}3@2iJzzz#u8y)N4`u2wtM>`uEThp88e1CtKwkcIo0@8`Eh#T z%L=nkD$MpYr>P3XWHpp$Yv2moMvXQ-=RMW+0W*DjVkUTI7QJRN_ivrfP(+09`v{-M z&#!3!gMYfB;kf|T5v^t_iGESeu}UjH?f11wx8P1O%aamQYxk~4kXr~uME!|)6_Pr$ zMO5&?P?rw+o_CGu7hofqN?l$aI^Onr*MC zkuL@nRq{9RRUnhJCG*f=Q7BJjenbVz1KgHLOA3B)!utVgQEG*YZ$km;dGS=jkHfI9 z=h=OfAoobtFYXpbyNlnlbhS;WgV*^g_pHg+(vJPFjtyY!9$^EBlAt6)th&8ke~+qY MKGahyd0-j*KMFak=>Px# literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-ukelele-60x60@2x.png b/website/assets/images/app-icon-ukelele-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb03f6683687725a7ca489a88a5efc4517e8cfa GIT binary patch literal 8854 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-unclutter-60x60@2x.png b/website/assets/images/app-icon-unclutter-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8c0c819083505660cb9a0d5991ee870867ef88 GIT binary patch literal 18888 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�|O}y4psXUekM);l-ABYnHO@lTDyA& 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-unity-hub-60x60@2x.png b/website/assets/images/app-icon-unity-hub-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5bccf8530448f29b9a7ab428b3ce549c4f1a647b GIT binary patch literal 13714 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-updf-60x60@2x.png b/website/assets/images/app-icon-updf-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..975aaa95fe29c93864415b932f589376e93d4e7f GIT binary patch literal 9542 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 UbM?LWd*n#rm6A+}6x9EJ0NP&B82|tP literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-upscayl-60x60@2x.png b/website/assets/images/app-icon-upscayl-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..12b7d13d08915b691aa0ede9065e0a4ba08e2c49 GIT binary patch literal 8055 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 a(fver{66EMKj?3bT2|_{WU08(yZ;50HP^%d literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-usage-app-60x60@2x.png b/website/assets/images/app-icon-usage-app-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4656859a9225a532e974ae51b9d40910d3c60ab5 GIT binary patch literal 7613 zcmZ{JWmH^2w)Mqbg1dWg3D!6P8VwpGxNGAs4Z%rBf)i+*#@(e8LPBs0PO#vC1P@O0 zk(qfjv%dA-U8`>GI%n@wb*j$&aaScg(^e(GrNIRNfB>wftoP7E|2AyQhxcb$>*0qE z-BCeH0RS4_;N4ndJdBxa)%3IgAeiHU7YzW{fBCxr;3o(GdsYA-l?4Elp1Ga6pa+Mt zy)oE9OAFw6z}NsvoHKy_fKVP9%|inKv;q_W?V(5cYb!wgw-;J~_8H+^X3$QT# zgW~Hd!(y!Uj7bUNZO`wW zgdgJVC?F&$DJdW*EFdh*_rT!u3G(o@4&?LjVf|;2|B0h)?_=xj?CI+a@nHHJ*V+c+ z=PSd)@^_+tKmS~(eW3GyX7cd)S6UAV3jFm52=NOF{5$r86!h0Br37(; zf9~x+tPh(jiwhF?_d&_x0x@e3;t& zxELsr1I65l7^oahOq)U?JHNv2{Za}CLBb+~BY9xq8`hER2V=kKy+ue(%iKy1SEe`F zfG(42Bpt?IP#~Zue>STkFkc8Vl1*P6HE=K%RmP}zL2clYB`Pmzu!(&_F-6_*Dgy)8 z{-qZD2WJHhI6>d8QeRo6W|eUI@_K7-a=!6Rba@)$oe=^R5a+SaIDns~mn5(`RqBaa zVAGVw$G$DH5nN7^J33?JHE;_0C@&JG6Pm+Yg(KJe4prchZ~@b0O*!@bOsZh=`Uvp;!VsqA~E|?eCJ~Z5NfFf};VFV}ROyJ^}r%!i(N4uts$YIT`v7d^7 zgn-0y=A*Z!He}COR}vL*3kEP=qikliZ>v&K>4m8&(#bPJ-hycdc7ilsnPF5+p6aC; zIYL+ug3Sm>QnsOw@>L=E?3$Ip6nL>_=TFPzJ`q6i*B_YU0)_vP!QnR^|x7)X}wgG1KK$bjD>4uflbmVh^S zf+euDthJGxY-0$fCihv835&(tj!uBRSo{01% z0t_4W1@G5c*P^buCaH~>K)T^j2#Z=&TaT`D+Ac*C9SB94)?)W9E;XIimZ`e}`B^ zSjC)5JR2*LDqaQ(I{Os+71gWrDwpx7gykWD!ORwvwK13r!z(^_*=2ESbkyK5~MWY;RTXd-z?(79B=&`tg8ab?}gQ8MNwO&UHyogUCd+8zB zU%53ZFyy&wps(egTb&bzhczG)yCsQB;-B;4oPaDdwj#;7hbBik`~YM42OR19{psy* z_JjFo3Opt;-KJ4?fv@YTV0d~CEO1OYIKMK&iI!|KAl?W9? zUTwMTz{Gvola2y9iJ)<0s%x@1Sg|o5GM{AsJk;HQ_k&&lOtsoD*PA;avK$!AA7Ec|r4h zz}l95@5>3dUCv`YY;@^GGNtxd`!VHLsx8{#s?dZ1kutsF9cdVd{GzND%_{qv4t%tHl(V@B+{UaIL!n3O)=et1zD9WoXv%SWoMR_YU^g+9c1CtSn zPEu`#(iMS*>3v24UyFRP2_LIy{g90J6AgHR`RjaSn_fGHrr%!&L_tx?THk4k{a^to z{Yke4)p5aT<&`$Y2d|TqPrI6;-P%#BNb6UKTkHhwG;HjLqOnxIrP~bciKkW=c>_I5 z9|GgTiTWVg@iv2G6u%dIn5c9jD{KdnxNWH@5;z?|E4ncmi%%NmtM6`^LiYPJmYi%zB3Y{s@m8ky+oz>Q(aF^)$FHOc>A;a)C{TkrzKH+ z=vAx5%CgJT?r}X7tG7x+RxykgGD^A25z^C%gEbnx>jn}mZK6v@QCzKIsaYq*VhP)M z5&+V0E6L_sqg>2pJPur^^Vjl&*0T zCE9QUSFA)AA0uG;UZ=m=t`YCOsv^-e5!-CM@>kwPqneti29+StCC8V8O@pL+C-NRJ4BB;^Ll0zBkhiXRS! zc9p#~KZ$5|J|PYiq{G&z+}j^Qy;w?%@FgOkj*;3Yy-0Wx7Z;4vQ`bj;Fo~lF3BszbGXv+ezk+gy+YmMg}7932Rr3BclDKY zI>8&u)iL3jqwk)(n4E~YTQTG7?1;z!ArYoEsGjvm37!W0i>vpGD4Xx8W@~m6D_ix& zlvmM}W}wlId-%y74G+VC4U5Ig#vcJj#QUN7A#;+D^E>rKskx-`CY$Q;OX9o@sDv)`~>w+*~cZ*E;y%% z+_c&(4h?_cTF}!w@%9j`nDB|?!M(1++QaJddBEye=jf`5Z89zJJH?3L3|~HZV(3h5 za7lNm8@*@B%Q~}2p$?-e*`8$P3WqAWh~M3_rpic0S|Ex)=8_Sve=7p;*LddT$+_w9 zk>ekDZG^K0nH|>WuPv{UbJ`&>s#^9?LHJo;iN7Ze6jE_N0mw$bwqs=Mf~)^fnz^iM zw3YusD4fOVzm7w7+>{Y`cXlwj#}?&C%=#(!=sNm?Di$Cefj;_e;YOEPY#()J;oFoU z)P0=tju|yhHi%2Y!qRFu+%`XE!#LmfB^e;%$Yn^KKBo(bLT;6>OPFuST_9P`kd|S( z2yOC>km^}R8~Cv00_s{_l;OsU$9{Mg=CcRq;c@gmo=va6)bt;E_YhrJpSC1 z`G`R)$C@1j^4eg_L!w7{X8zq2(i@vZmUyf3yZ*s)lF_4NXo8aDe*4+GfS?oZ_=jCJ z_xJZ$tM9>e`jgmUMY^gRMQOT5*q=LZn{pn-1}f$#4v0i6Y9;Hzc8z3FPdS|S@5;@d zGP@%Uetc*$c($~U(o>jlDE3;W2J|$ig#fLf(tu@;r$`M4z#tZSW9!QeokzmpM7lY_ zO}j*gLHMZY_s3d`Hkihb*l0-I{RK&Y_&SA{xSwwUUL+!F&jUsk7?&9P=X!+^6*U%x z87q99zFo$(1s^Rm7_*{KG?e(XRVfh@8d;CT+C`PW2l*ZC6}FV!L|qc;GH?`@Q*P)y zW<4yR7%y;roRDm5|cl==YBylOJ|XjT4XT}Uf2#%a!F}`FO;7lr!`*g@epWZ{vB&h9FL43n$Fjb;= z!+Nq=mJgU1MY-Z!#)hLWES2|hqv!Rq=K=uPpD7`vPo{W`M2K#7-8&Fs6-m_3r~)Wl z*=t$J0>nty_aA7B1VKA$5sU)YzBRE&s`~fzWwm0Nlr}J}!#_xWbK_{xM`;^yiGJQJ9^U4zm+>iQ&spP92)@d*72_lH zZjs#-V^-Mgm(yvKC*s@I?oWK7vOE~y)Hl$D-v9u)=yeRnS7V$yLG6Mpt~c_?$HR@L zZaI99UPn6W?xhr(WyDNc^0db^8#1jMz_}a>nSVb0|CPzkp!F}_mebwnj)lHeWOfep74(_dD_ zxPHdw9vG#GYwm17v{av;Mo3hM95D^dB`aXdV+1L zJ3U~99&hWr`SRMc`l&i_%x(k_dZR}sm(*j8_!m1ES$;!%fmd(^X=+wR6C!OO5*CHN zT-SJ~I;*-RoYoX(+AKe<#bi;Vk_&6_S~s~w3%(cZ8TnYSCf|UamtEoBraNGy#C0Sp z{1gNFV_>;cJBW-5)3n>5VQF4Cb>;WnX8Wk6zmUr1E>lKTyWq6nxiv4M4o`- zlyV5?)&=?#G>|(6r#YnVij7{Xuxui&jU_y`n|Gu-+?(SCG_^S)A{oQZ!s3N4X-({8 z0v}IlN^>8KEb-i^^00x$?d_%9KH~fMEB?K7AEj=@FJd=7*IXG-EUKdMb!&`g6?~|m z*I!$A0jqGX7L;Kszn@WTg4(e2`Bd2*Pz2xagD|}{>#ki&GyJuU(bJp>5U$*3~1brXhiaY_1N(85q7Mo{U-&4=e??%sn9Iu1M!#c$A zF?g?UK3*JY&F=(jcW&^0&fZt2<+ga$zIvci26)mmxXgJa@6lnld!W9YHJeR%+LpZP zZK8vzAeJT9xYa-PdhI5u84J;HNdygGXlS7S$jUE`0UQe!OiO99sdi`0(gILXE=bK` zPa~EAbjP_NDfQ&X zPfGp&kY#-&%yLcF6J<#~_00v)|Jxg5$ zI;Gxy4B@v_=qNwZ5LSpLo9n)hUGMhRSj#10C=x0V(Dy6sV?9<{hK@m}KvxXzF3qZ@ zvapsw!{-wV8hm9I&JohHe!a?~Xc`AhZ!V~D;X$9&s^6c4X}Ya#D)JCf+#WxYylJTW zMg2lGRVXs8(D3QfzR6}&YCq^||3)njF+_jphaU8$D3u5%%CwW9@m!8}|K0foDJDQ) z$18}rzQ#qQUAnFnFOtPZM<=TqDmX)Zat7(E5g?~mESYi&lehZn_@}|^C2m>LDPvNI z6yf zq$UJ}k#2D5S$YO_iQL=%_pr&r0(#-4^bz8Yr{CK4^}0frUy9nErej@;b#{%V1u)|8 z{@zJWrcW-mwa=H8%D`a^-6h=(rH#a_^WRaC{uMXhV%*4q`OM-yrZ^$NbyQINu+582 z+jNiSjSYgEkw7{U8BG6Y=M0SF%BpDP3ntv~TBJ%NNKG9}BD3S#qT&(02YH4NuH#Hz z7tEcKS&OkniWtE3yvcq+OoGab9-MnpZ0lv)oxye@-9}Mm z7dX@PWrs;E0S!z08?ZtU6Ja~^?t2Oax$rw&jw}4R1yMTa8J^&ch4zX2#c?#9!lbbO zNydk2x*e}ZVY_J6DueEj5#uw5WNG>OB-$9e@9o=%g?VG+XK86zlZWN~T|=QB4w)!D z0vbBVwnD65P{STeA227z+L10_{24cXc$ajaKOVsLVF79`d+?0Vh^$Lm*T0OXBY+eR zOwou^>Mb#Um7RKf6r#)Uivf^OvfPr5reArjK%S}s;@Z+P<(^Qt#lj0XpvaUV_iND+ z-U?s@Uc7Jd8b~o8?+j?m;^k$ah!uzaD9}U>#lhI(%Rk*=v zWI1PfW#N6`aY8n5`WAnH^UHJ@BN(~03n{?|auH{_rud~tl(lVq!9g8e=B0pii0LoO zHMi^8_@A}gq~{juDDpO?tHe0WI0Wb2%tp2pDf_@6LG+wYfoV+ zql%r+zT}*Gm3^4$YIU;A;@~^Jlw{}`4D^&LkVr6G8E&CJ??5S)Bo(3{VmTD4k*F70 zt7ft6dp{wjL*$lV7=HJa=?Oo0R=xcs0os zC(2?vSC|H)f0_toDlg;a(%0YEq~Sl6BFGBf8Tj<2m3pG6rwC~RwT^nw1S7WTLnv~JAT?jkZ1T(zd zw3;r~unfLd1^DVmg@iF=L55#C-H7+GSIu#bwNA@aJV$M=YP01t7kCZN9`X;5H{=a} zEXT*>=ZM5Hg&!^i(E$XN0-*|uJMucU`Wa;zT~^*ey~AbUM| z5iob69_ivUjifBCe+7mT`W+j1c#R0`Y3K=wxw58Zd)A#6Rr8OR^P&eFpF zK3$c1MhKR