From da9723fbf1aa08fa29ceea292f57c745feaebcef Mon Sep 17 00:00:00 2001 From: Chris Moeller Date: Fri, 31 Jul 2015 23:32:56 -0700 Subject: [PATCH] Removed Sparkle from main repository --- Frameworks/Sparkle/.clang-format | 45 - Frameworks/Sparkle/.gitignore | 36 - Frameworks/Sparkle/.travis.yml | 2 - Frameworks/Sparkle/CHANGELOG | 333 --- .../Configurations/ConfigBinaryDelta.xcconfig | 3 - .../ConfigBinaryDeltaDebug.xcconfig | 2 - .../ConfigBinaryDeltaRelease.xcconfig | 1 - .../Configurations/ConfigCommon.xcconfig | 77 - .../Configurations/ConfigCommonDebug.xcconfig | 11 - .../ConfigCommonRelease.xcconfig | 10 - .../Configurations/ConfigFramework.xcconfig | 13 - .../ConfigFrameworkDebug.xcconfig | 4 - .../ConfigFrameworkRelease.xcconfig | 2 - .../Configurations/ConfigRelaunch.xcconfig | 8 - .../ConfigRelaunchDebug.xcconfig | 1 - .../ConfigRelaunchRelease.xcconfig | 1 - .../Configurations/ConfigTestApp.xcconfig | 8 - .../ConfigTestAppDebug.xcconfig | 2 - .../ConfigTestAppRelease.xcconfig | 1 - .../Configurations/ConfigUnitTest.xcconfig | 10 - .../ConfigUnitTestDebug.xcconfig | 1 - .../ConfigUnitTestRelease.xcconfig | 1 - .../Configurations/make-release-package.sh | 27 - .../Configurations/set-git-version-info.sh | 28 - Frameworks/Sparkle/Documentation/.gitignore | 1 - Frameworks/Sparkle/Documentation/Doxyfile | 20 - .../Sparkle/Documentation/build-docs.sh | 11 - Frameworks/Sparkle/LICENSE | 60 - Frameworks/Sparkle/Makefile | 21 - Frameworks/Sparkle/README.markdown | 46 - .../AppIcon.appiconset/Contents.json | 65 - .../AppIcon.appiconset/icon_128x128.png | Bin 15615 -> 0 bytes .../AppIcon.appiconset/icon_128x128@2x.png | Bin 38179 -> 0 bytes .../AppIcon.appiconset/icon_16x16.png | Bin 754 -> 0 bytes .../AppIcon.appiconset/icon_16x16@2x.png | Bin 2112 -> 0 bytes .../AppIcon.appiconset/icon_256x256.png | Bin 38179 -> 0 bytes .../AppIcon.appiconset/icon_32x32.png | Bin 2110 -> 0 bytes .../AppIcon.appiconset/icon_32x32@2x.png | Bin 6076 -> 0 bytes .../Resources/SUModelTranslation.plist | 228 -- .../Sparkle/Resources/SampleAppcast.xml | 39 - Frameworks/Sparkle/Resources/Screenshot.png | Bin 45473 -> 0 bytes Frameworks/Sparkle/Resources/Sparkle.png | Bin 10794 -> 0 bytes Frameworks/Sparkle/Sparkle.podspec | 26 - .../Sparkle/Sparkle.xcodeproj/project.pbxproj | 1945 ----------------- .../contents.xcworkspacedata | 7 - .../xcschemes/Distribution.xcscheme | 96 - .../xcshareddata/xcschemes/Sparkle.xcscheme | 97 - .../Sparkle/Autoupdate/Autoupdate-Info.plist | 32 - .../Sparkle/Sparkle/Autoupdate/Autoupdate.m | 210 -- Frameworks/Sparkle/Sparkle/SUAppcast.h | 26 - Frameworks/Sparkle/Sparkle/SUAppcast.m | 281 --- Frameworks/Sparkle/Sparkle/SUAppcastItem.h | 42 - Frameworks/Sparkle/Sparkle/SUAppcastItem.m | 180 -- .../Sparkle/Sparkle/SUAutomaticUpdateAlert.h | 30 - .../Sparkle/Sparkle/SUAutomaticUpdateAlert.m | 89 - .../Sparkle/Sparkle/SUAutomaticUpdateDriver.h | 20 - .../Sparkle/Sparkle/SUAutomaticUpdateDriver.m | 196 -- .../Sparkle/Sparkle/SUBasicUpdateDriver.h | 56 - .../Sparkle/Sparkle/SUBasicUpdateDriver.m | 465 ---- .../Sparkle/Sparkle/SUBinaryDeltaApply.h | 15 - .../Sparkle/Sparkle/SUBinaryDeltaApply.m | 226 -- .../Sparkle/Sparkle/SUBinaryDeltaCommon.h | 81 - .../Sparkle/Sparkle/SUBinaryDeltaCommon.m | 238 -- .../Sparkle/Sparkle/SUBinaryDeltaCreate.h | 17 - .../Sparkle/Sparkle/SUBinaryDeltaCreate.m | 462 ---- .../Sparkle/Sparkle/SUBinaryDeltaTool.m | 218 -- .../Sparkle/Sparkle/SUBinaryDeltaUnarchiver.h | 19 - .../Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m | 55 - .../Sparkle/Sparkle/SUCodeSigningVerifier.h | 21 - .../Sparkle/Sparkle/SUCodeSigningVerifier.m | 198 -- Frameworks/Sparkle/Sparkle/SUConstants.h | 82 - Frameworks/Sparkle/Sparkle/SUConstants.m | 73 - Frameworks/Sparkle/Sparkle/SUDSAVerifier.h | 29 - Frameworks/Sparkle/Sparkle/SUDSAVerifier.m | 159 -- .../Sparkle/Sparkle/SUDiskImageUnarchiver.h | 19 - .../Sparkle/Sparkle/SUDiskImageUnarchiver.m | 168 -- Frameworks/Sparkle/Sparkle/SUErrors.h | 44 - Frameworks/Sparkle/Sparkle/SUExport.h | 18 - .../Sparkle/SUGuidedPackageInstaller.h | 35 - .../Sparkle/SUGuidedPackageInstaller.m | 139 -- Frameworks/Sparkle/Sparkle/SUHost.h | 40 - Frameworks/Sparkle/Sparkle/SUHost.m | 287 --- Frameworks/Sparkle/Sparkle/SUInstaller.h | 25 - Frameworks/Sparkle/Sparkle/SUInstaller.m | 187 -- Frameworks/Sparkle/Sparkle/SULog.h | 32 - Frameworks/Sparkle/Sparkle/SULog.m | 78 - .../Sparkle/Sparkle/SUPackageInstaller.h | 22 - .../Sparkle/Sparkle/SUPackageInstaller.m | 41 - .../Sparkle/Sparkle/SUPipedUnarchiver.h | 19 - .../Sparkle/Sparkle/SUPipedUnarchiver.m | 157 -- Frameworks/Sparkle/Sparkle/SUPlainInstaller.h | 28 - Frameworks/Sparkle/Sparkle/SUPlainInstaller.m | 61 - .../Sparkle/SUPlainInstallerInternals.h | 22 - .../Sparkle/SUPlainInstallerInternals.m | 628 ------ .../Sparkle/Sparkle/SUProbingUpdateDriver.h | 19 - .../Sparkle/Sparkle/SUProbingUpdateDriver.m | 39 - .../Sparkle/Sparkle/SUScheduledUpdateDriver.h | 19 - .../Sparkle/Sparkle/SUScheduledUpdateDriver.m | 60 - .../Sparkle/SUStandardVersionComparator.h | 37 - .../Sparkle/SUStandardVersionComparator.m | 170 -- Frameworks/Sparkle/Sparkle/SUStatus.xib | 94 - .../Sparkle/Sparkle/SUStatusController.h | 35 - .../Sparkle/Sparkle/SUStatusController.m | 120 - Frameworks/Sparkle/Sparkle/SUSystemProfiler.h | 20 - Frameworks/Sparkle/Sparkle/SUSystemProfiler.m | 169 -- .../Sparkle/Sparkle/SUUIBasedUpdateDriver.h | 26 - .../Sparkle/Sparkle/SUUIBasedUpdateDriver.m | 236 -- Frameworks/Sparkle/Sparkle/SUUnarchiver.h | 33 - Frameworks/Sparkle/Sparkle/SUUnarchiver.m | 93 - .../Sparkle/Sparkle/SUUnarchiver_Private.h | 26 - Frameworks/Sparkle/Sparkle/SUUpdateAlert.h | 37 - Frameworks/Sparkle/Sparkle/SUUpdateAlert.m | 281 --- Frameworks/Sparkle/Sparkle/SUUpdateDriver.h | 30 - Frameworks/Sparkle/Sparkle/SUUpdateDriver.m | 52 - .../Sparkle/SUUpdatePermissionPrompt.h | 33 - .../Sparkle/SUUpdatePermissionPrompt.m | 157 -- Frameworks/Sparkle/Sparkle/SUUpdater.h | 327 --- Frameworks/Sparkle/Sparkle/SUUpdater.m | 563 ----- .../Sparkle/Sparkle/SUUpdater_Private.h | 15 - .../Sparkle/SUUserInitiatedUpdateDriver.h | 19 - .../Sparkle/SUUserInitiatedUpdateDriver.m | 87 - .../Sparkle/SUVersionComparisonProtocol.h | 30 - .../Sparkle/SUVersionDisplayProtocol.h | 25 - .../Sparkle/Sparkle/SUWindowController.h | 20 - .../Sparkle/Sparkle/SUWindowController.m | 20 - Frameworks/Sparkle/Sparkle/Sparkle-Info.plist | 36 - Frameworks/Sparkle/Sparkle/Sparkle.h | 23 - Frameworks/Sparkle/Sparkle/Sparkle.pch | 17 - .../ar.lproj/SUAutomaticUpdateAlert.xib | 116 - .../Sparkle/ar.lproj/SUUpdateAlert.xib | 231 -- .../ar.lproj/SUUpdatePermissionPrompt.xib | 225 -- .../Sparkle/Sparkle/ar.lproj/Sparkle.strings | 79 - .../ca.lproj/SUAutomaticUpdateAlert.strings | 12 - .../Sparkle/ca.lproj/SUUpdateAlert.strings | 18 - .../Sparkle/Sparkle/ca.lproj/Sparkle.strings | 54 - .../cs.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/cs.lproj/SUUpdateAlert.xib | 231 -- .../cs.lproj/SUUpdatePermissionPrompt.xib | 227 -- .../Sparkle/Sparkle/cs.lproj/Sparkle.strings | 71 - .../Sparkle/Sparkle/cy.lproj/Sparkle.strings | 52 - .../da.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/da.lproj/SUUpdateAlert.xib | 231 -- .../da.lproj/SUUpdatePermissionPrompt.xib | 225 -- .../Sparkle/Sparkle/da.lproj/Sparkle.strings | 80 - .../de.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/de.lproj/SUUpdateAlert.xib | 231 -- .../de.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/de.lproj/Sparkle.strings | 75 - .../el.lproj/SUAutomaticUpdateAlert.xib | 116 - .../Sparkle/el.lproj/SUUpdateAlert.xib | 231 -- .../el.lproj/SUUpdatePermissionPrompt.xib | 225 -- .../Sparkle/Sparkle/el.lproj/Sparkle.strings | 71 - .../en.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/en.lproj/SUUpdateAlert.xib | 243 -- .../en.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/en.lproj/Sparkle.strings | 85 - .../es.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/es.lproj/SUUpdateAlert.xib | 231 -- .../es.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/es.lproj/Sparkle.strings | 75 - .../fi.lproj/SUAutomaticUpdateAlert.strings | 12 - .../Sparkle/fi.lproj/SUUpdateAlert.strings | 18 - .../Sparkle/Sparkle/fi.lproj/Sparkle.strings | 52 - .../fr.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/fr.lproj/SUUpdateAlert.xib | 231 -- .../fr.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/fr.lproj/Sparkle.strings | 77 - .../he.lproj/SUAutomaticUpdateAlert.strings | 12 - .../Sparkle/he.lproj/SUUpdateAlert.strings | 18 - .../Sparkle/Sparkle/he.lproj/Sparkle.strings | 52 - .../Sparkle/Sparkle/hu.lproj/Sparkle.strings | 52 - .../Sparkle/Sparkle/id.lproj/Sparkle.strings | 52 - .../is.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/is.lproj/SUUpdateAlert.xib | 231 -- .../is.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/is.lproj/Sparkle.strings | 52 - .../it.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/it.lproj/SUUpdateAlert.xib | 232 -- .../it.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/it.lproj/Sparkle.strings | 75 - .../ja.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/ja.lproj/SUUpdateAlert.xib | 231 -- .../ja.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/ja.lproj/Sparkle.strings | 85 - .../ko.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/ko.lproj/SUUpdateAlert.xib | 231 -- .../ko.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/ko.lproj/Sparkle.strings | 71 - .../nb.lproj/SUAutomaticUpdateAlert.xib | 116 - .../Sparkle/nb.lproj/SUUpdateAlert.xib | 232 -- .../nb.lproj/SUUpdatePermissionPrompt.xib | 225 -- .../Sparkle/Sparkle/nb.lproj/Sparkle.strings | 84 - .../nl.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/nl.lproj/SUUpdateAlert.xib | 232 -- .../nl.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/nl.lproj/Sparkle.strings | 80 - .../no.lproj/SUAutomaticUpdateAlert.strings | 12 - .../Sparkle/no.lproj/SUUpdateAlert.strings | 18 - .../Sparkle/Sparkle/no.lproj/Sparkle.strings | 52 - .../pl.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/pl.lproj/SUUpdateAlert.xib | 232 -- .../pl.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/pl.lproj/Sparkle.strings | 73 - .../pt_BR.lproj/SUAutomaticUpdateAlert.xib | 116 - .../Sparkle/pt_BR.lproj/SUUpdateAlert.xib | 232 -- .../pt_BR.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/pt_BR.lproj/Sparkle.strings | 71 - .../pt_PT.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/pt_PT.lproj/SUUpdateAlert.xib | 231 -- .../pt_PT.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/pt_PT.lproj/Sparkle.strings | 71 - .../ro.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/ro.lproj/SUUpdateAlert.xib | 232 -- .../ro.lproj/SUUpdatePermissionPrompt.xib | 225 -- .../Sparkle/Sparkle/ro.lproj/Sparkle.strings | 85 - .../ru.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/ru.lproj/SUUpdateAlert.xib | 232 -- .../ru.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/ru.lproj/Sparkle.strings | 75 - .../sk.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/sk.lproj/SUUpdateAlert.xib | 231 -- .../sk.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/sk.lproj/Sparkle.strings | 71 - .../sl.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/sl.lproj/SUUpdateAlert.xib | 232 -- .../sl.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/sl.lproj/Sparkle.strings | 70 - .../sv.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/sv.lproj/SUUpdateAlert.xib | 233 -- .../sv.lproj/SUUpdatePermissionPrompt.xib | 227 -- .../Sparkle/Sparkle/sv.lproj/Sparkle.strings | 75 - .../th.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/th.lproj/SUUpdateAlert.xib | 231 -- .../th.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/th.lproj/Sparkle.strings | 80 - .../tr.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/tr.lproj/SUUpdateAlert.xib | 231 -- .../tr.lproj/SUUpdatePermissionPrompt.xib | 222 -- .../Sparkle/Sparkle/tr.lproj/Sparkle.strings | 123 -- .../uk.lproj/SUAutomaticUpdateAlert.xib | 116 - .../Sparkle/uk.lproj/SUUpdateAlert.xib | 232 -- .../uk.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/Sparkle/uk.lproj/Sparkle.strings | 75 - .../zh_CN.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/zh_CN.lproj/SUUpdateAlert.xib | 231 -- .../zh_CN.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/zh_CN.lproj/Sparkle.strings | 75 - .../zh_TW.lproj/SUAutomaticUpdateAlert.xib | 115 - .../Sparkle/zh_TW.lproj/SUUpdateAlert.xib | 231 -- .../zh_TW.lproj/SUUpdatePermissionPrompt.xib | 226 -- .../Sparkle/zh_TW.lproj/Sparkle.strings | 70 - .../project.pbxproj | 283 --- .../Sparkle Updated Test App/AppDelegate.h | 15 - .../Sparkle Updated Test App/AppDelegate.m | 27 - .../Base.lproj/MainMenu.xib | 52 - .../Sparkle.appiconset/Contents.json | 64 - .../Sparkle.appiconset/icon_128x128.png | Bin 15615 -> 0 bytes .../Sparkle.appiconset/icon_128x128@2x.png | Bin 38179 -> 0 bytes .../Sparkle.appiconset/icon_16x16.png | Bin 754 -> 0 bytes .../Sparkle.appiconset/icon_16x16@2x.png | Bin 2137 -> 0 bytes .../Sparkle.appiconset/icon_32x32.png | Bin 2112 -> 0 bytes .../Sparkle.appiconset/icon_32x32@2x.png | Bin 6076 -> 0 bytes .../Sparkle Updated Test App/Info.plist | 36 - .../Sparkle Updated Test App/main.m | 6 - .../English.lproj/InfoPlist.strings | 4 - .../English.lproj/MainMenu.xib | 354 --- .../TestApplication-Info.plist | 32 - Frameworks/Sparkle/TestApplication/main.m | 14 - .../TestApplication/test_app_only_dsa_pub.pem | 20 - .../Resources/SparkleTestCodeSignApp.zip | Bin 1346234 -> 0 bytes .../Tests/Resources/signed-test-file.txt | 1 - .../Sparkle/Tests/Resources/test archive.zip | Bin 190 -> 0 bytes .../Sparkle/Tests/Resources/test-pubkey.pem | 36 - .../Tests/Resources/test.sparkle_guided.pkg | Bin 4956 -> 0 bytes Frameworks/Sparkle/Tests/SUBinaryDeltaTest.m | 933 -------- .../Sparkle/Tests/SUCodeSigningVerifierTest.m | 176 -- Frameworks/Sparkle/Tests/SUDSAVerifierTest.m | 85 - Frameworks/Sparkle/Tests/SUInstallerTest.m | 65 - .../Sparkle/Tests/SUPipedUnarchiverTest.m | 70 - Frameworks/Sparkle/Tests/SUUpdaterTest.m | 77 - .../Sparkle/Tests/SUVersionComparisonTest.m | 78 - .../Sparkle/Tests/SparkleTests-Info.plist | 20 - .../Vendor/CocoatechCore/NTSynchronousTask.h | 26 - .../Vendor/CocoatechCore/NTSynchronousTask.m | 174 -- Frameworks/Sparkle/Vendor/bsdiff/bsdiff.c | 370 ---- Frameworks/Sparkle/Vendor/bsdiff/bspatch.c | 271 --- Frameworks/Sparkle/Vendor/bsdiff/bspatch.h | 12 - Frameworks/Sparkle/Vendor/bsdiff/sais.c | 534 ----- Frameworks/Sparkle/Vendor/bsdiff/sais.h | 59 - Frameworks/Sparkle/bin/generate_keys.sh | 21 - Frameworks/Sparkle/bin/sign_update.sh | 9 - 291 files changed, 33776 deletions(-) delete mode 100644 Frameworks/Sparkle/.clang-format delete mode 100644 Frameworks/Sparkle/.gitignore delete mode 100644 Frameworks/Sparkle/.travis.yml delete mode 100644 Frameworks/Sparkle/CHANGELOG delete mode 100644 Frameworks/Sparkle/Configurations/ConfigBinaryDelta.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigBinaryDeltaDebug.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigBinaryDeltaRelease.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigCommonDebug.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigCommonRelease.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigFrameworkRelease.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigRelaunchDebug.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigRelaunchRelease.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigTestApp.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigTestAppDebug.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigTestAppRelease.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigUnitTest.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigUnitTestDebug.xcconfig delete mode 100644 Frameworks/Sparkle/Configurations/ConfigUnitTestRelease.xcconfig delete mode 100755 Frameworks/Sparkle/Configurations/make-release-package.sh delete mode 100755 Frameworks/Sparkle/Configurations/set-git-version-info.sh delete mode 100644 Frameworks/Sparkle/Documentation/.gitignore delete mode 100644 Frameworks/Sparkle/Documentation/Doxyfile delete mode 100755 Frameworks/Sparkle/Documentation/build-docs.sh delete mode 100644 Frameworks/Sparkle/LICENSE delete mode 100644 Frameworks/Sparkle/Makefile delete mode 100644 Frameworks/Sparkle/README.markdown delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128.png delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128@2x.png delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16.png delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_256x256.png delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32.png delete mode 100644 Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png delete mode 100644 Frameworks/Sparkle/Resources/SUModelTranslation.plist delete mode 100755 Frameworks/Sparkle/Resources/SampleAppcast.xml delete mode 100644 Frameworks/Sparkle/Resources/Screenshot.png delete mode 100644 Frameworks/Sparkle/Resources/Sparkle.png delete mode 100644 Frameworks/Sparkle/Sparkle.podspec delete mode 100644 Frameworks/Sparkle/Sparkle.xcodeproj/project.pbxproj delete mode 100644 Frameworks/Sparkle/Sparkle.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme delete mode 100644 Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Sparkle.xcscheme delete mode 100644 Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate-Info.plist delete mode 100644 Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUAppcast.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUAppcast.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUAppcastItem.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUAppcastItem.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUConstants.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUConstants.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUDSAVerifier.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUDSAVerifier.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUErrors.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUExport.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUHost.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUHost.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUInstaller.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUInstaller.m delete mode 100644 Frameworks/Sparkle/Sparkle/SULog.h delete mode 100644 Frameworks/Sparkle/Sparkle/SULog.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUPackageInstaller.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUPackageInstaller.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUPlainInstaller.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUPlainInstaller.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUStatus.xib delete mode 100644 Frameworks/Sparkle/Sparkle/SUStatusController.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUStatusController.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUSystemProfiler.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUSystemProfiler.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUUnarchiver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUnarchiver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdateAlert.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdateAlert.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdateDriver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdateDriver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdater.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdater.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUUpdater_Private.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m delete mode 100644 Frameworks/Sparkle/Sparkle/SUVersionComparisonProtocol.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUVersionDisplayProtocol.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUWindowController.h delete mode 100644 Frameworks/Sparkle/Sparkle/SUWindowController.m delete mode 100644 Frameworks/Sparkle/Sparkle/Sparkle-Info.plist delete mode 100644 Frameworks/Sparkle/Sparkle/Sparkle.h delete mode 100644 Frameworks/Sparkle/Sparkle/Sparkle.pch delete mode 100755 Frameworks/Sparkle/Sparkle/ar.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdateAlert.xib delete mode 100755 Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ar.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/ca.lproj/SUAutomaticUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/ca.lproj/SUUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/ca.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/cs.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/cs.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/cy.lproj/Sparkle.strings delete mode 100755 Frameworks/Sparkle/Sparkle/da.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/da.lproj/SUUpdateAlert.xib delete mode 100755 Frameworks/Sparkle/Sparkle/da.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/da.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/de.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/de.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/de.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/de.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/el.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/el.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/el.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/el.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/en.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/en.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/en.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/es.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/es.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/es.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/es.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/fi.lproj/SUAutomaticUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/fi.lproj/SUUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/fi.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/fr.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/fr.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/he.lproj/SUAutomaticUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/he.lproj/SUUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/he.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/hu.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/id.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/is.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/is.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/is.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/is.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/it.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/it.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/it.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/it.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/ja.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ja.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/ko.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ko.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/nb.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/nb.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/nl.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/nl.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/no.lproj/SUAutomaticUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/no.lproj/SUUpdateAlert.strings delete mode 100644 Frameworks/Sparkle/Sparkle/no.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/pl.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pl.lproj/Sparkle.strings delete mode 100755 Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdatePermissionPrompt.xib delete mode 100755 Frameworks/Sparkle/Sparkle/pt_BR.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/pt_PT.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/ro.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ro.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/ru.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/ru.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/sk.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sk.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/sl.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sl.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/sv.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/sv.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/th.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/th.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/th.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/th.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/tr.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/tr.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/uk.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/uk.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/zh_CN.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUAutomaticUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdateAlert.xib delete mode 100644 Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdatePermissionPrompt.xib delete mode 100644 Frameworks/Sparkle/Sparkle/zh_TW.lproj/Sparkle.strings delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App.xcodeproj/project.pbxproj delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.h delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.m delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Base.lproj/MainMenu.xib delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/Contents.json delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_128x128.png delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_128x128@2x.png delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_16x16.png delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_16x16@2x.png delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_32x32.png delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_32x32@2x.png delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Info.plist delete mode 100644 Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/main.m delete mode 100644 Frameworks/Sparkle/TestApplication/English.lproj/InfoPlist.strings delete mode 100644 Frameworks/Sparkle/TestApplication/English.lproj/MainMenu.xib delete mode 100644 Frameworks/Sparkle/TestApplication/TestApplication-Info.plist delete mode 100644 Frameworks/Sparkle/TestApplication/main.m delete mode 100644 Frameworks/Sparkle/TestApplication/test_app_only_dsa_pub.pem delete mode 100644 Frameworks/Sparkle/Tests/Resources/SparkleTestCodeSignApp.zip delete mode 100644 Frameworks/Sparkle/Tests/Resources/signed-test-file.txt delete mode 100644 Frameworks/Sparkle/Tests/Resources/test archive.zip delete mode 100644 Frameworks/Sparkle/Tests/Resources/test-pubkey.pem delete mode 100644 Frameworks/Sparkle/Tests/Resources/test.sparkle_guided.pkg delete mode 100644 Frameworks/Sparkle/Tests/SUBinaryDeltaTest.m delete mode 100644 Frameworks/Sparkle/Tests/SUCodeSigningVerifierTest.m delete mode 100644 Frameworks/Sparkle/Tests/SUDSAVerifierTest.m delete mode 100644 Frameworks/Sparkle/Tests/SUInstallerTest.m delete mode 100644 Frameworks/Sparkle/Tests/SUPipedUnarchiverTest.m delete mode 100644 Frameworks/Sparkle/Tests/SUUpdaterTest.m delete mode 100644 Frameworks/Sparkle/Tests/SUVersionComparisonTest.m delete mode 100644 Frameworks/Sparkle/Tests/SparkleTests-Info.plist delete mode 100644 Frameworks/Sparkle/Vendor/CocoatechCore/NTSynchronousTask.h delete mode 100644 Frameworks/Sparkle/Vendor/CocoatechCore/NTSynchronousTask.m delete mode 100644 Frameworks/Sparkle/Vendor/bsdiff/bsdiff.c delete mode 100644 Frameworks/Sparkle/Vendor/bsdiff/bspatch.c delete mode 100644 Frameworks/Sparkle/Vendor/bsdiff/bspatch.h delete mode 100644 Frameworks/Sparkle/Vendor/bsdiff/sais.c delete mode 100644 Frameworks/Sparkle/Vendor/bsdiff/sais.h delete mode 100755 Frameworks/Sparkle/bin/generate_keys.sh delete mode 100755 Frameworks/Sparkle/bin/sign_update.sh diff --git a/Frameworks/Sparkle/.clang-format b/Frameworks/Sparkle/.clang-format deleted file mode 100644 index 4d178a30f..000000000 --- a/Frameworks/Sparkle/.clang-format +++ /dev/null @@ -1,45 +0,0 @@ -AccessModifierOffset: -4 -AlignEscapedNewlinesLeft: true -AlignTrailingComments: false -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortBlocksOnASingleLine: false -AllowShortFunctionsOnASingleLine: None -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: false -BinPackParameters: true -BreakBeforeBinaryOperators: true -BreakBeforeBraces: Linux -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -ColumnLimit: 0 -CommentPragmas: '^ IWYU pragma:' -ConstructorInitializerAllOnOneLineOrOnePerLine: false -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: false -#DerivePointerAlignment: false -DisableFormat: false -ForEachMacros: foreach,Q_FOREACH -IndentCaseLabels: true -IndentFunctionDeclarationAfterType: true -IndentWidth: 4 -KeepEmptyLinesAtTheStartOfBlocks: false -Language: Cpp -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: All -ObjCSpaceAfterProperty: true -ObjCSpaceBeforeProtocolList: true -#PointerAlignment: Right -SpaceBeforeAssignmentOperators: true -SpaceBeforeParens: ControlStatements -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 1 -SpacesInAngles: false -SpacesInCStyleCastParentheses: false -SpacesInContainerLiterals: false -SpacesInParentheses: false -Standard: Cpp03 -TabWidth: 4 -UseTab: Never diff --git a/Frameworks/Sparkle/.gitignore b/Frameworks/Sparkle/.gitignore deleted file mode 100644 index 8b390eb43..000000000 --- a/Frameworks/Sparkle/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.xcuserstate - -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear on external disk -.Spotlight-V100 -.Trashes - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk diff --git a/Frameworks/Sparkle/.travis.yml b/Frameworks/Sparkle/.travis.yml deleted file mode 100644 index 25bafc13f..000000000 --- a/Frameworks/Sparkle/.travis.yml +++ /dev/null @@ -1,2 +0,0 @@ -language: objective-c -script: make travis diff --git a/Frameworks/Sparkle/CHANGELOG b/Frameworks/Sparkle/CHANGELOG deleted file mode 100644 index d8896f4a4..000000000 --- a/Frameworks/Sparkle/CHANGELOG +++ /dev/null @@ -1,333 +0,0 @@ -# 1.10.0 - -* Massive improvements to the BinaryDelta tool (Zorg) - - Ability to track file permissions (Zorg) - - Nicely formatted log output (Zorg) - - Numerous bug fixes in handling of symlinks, empty directories, case-insensitive names, etc. (Zorg) - - Refactored and modernized code (Zorg) - - libxar is no longer weak-linked (C.W. Betts) -* Double-check the code signature of the the app after installation (Isaac Wankerl) -* Added headless guided package installation (Graham Miln) -* Added ability to inject custom HTTP headers in appcast request (Mattias Gunneras) -* Changes to make unarching more reliable (Zorg, Kornel Lesiński) -* Have Sparkle build a framework module (C.W. Betts) -* Stdout used for non error outputs (JDuquennoy) -* French locale update (Kent Sutherland) - -# 1.9.0 - -* Added SUUpdater delegate method for failures. (Benjamin Gordon) -* Make the error definitions public (C.W. Betts) -* Add support for lzma compressed tarballs (Kyle Fuller) -* Back to SKIP_INSTALL=YES by default (Tony Arnold) -* Properly set install names and rpaths for targets (Jake Petroules) -* Use Library/Caches rather than app support directory (Kornel Lesiński) -* Check for a modal window being onscreen before trying to put up the Sparkle prompt (Alf Watt) -* Fixed crashes on 10.7 (Chris Campbell, Ger Teunis) -* Fixed Sparkle tags parsing (Tamás Lustyik) -* SULog code cleanups (Kevin Wojniak) -* Make sure CFBundleVersion is a semantic version number. (Jake Petroules) -* Replace typedef enums with typedef NS_ENUM to make Swift happier (C.W. Betts) -* Fix warnings under Xcode 6.1 relating the SUUpdateAlert XIB (Tony Arnold) -* Prefer string constants to strings (Jake Petroules) -* Use Info.plist keys instead of macros (Jake Petroules) -* Only export public symbols. (Jake Petroules) -* BinaryDelta: avoid crash with bad paths (Jake Petroules) -* Fixing Swedish translations (Erik Vikström) -* Turkish localization fixes (Emir) -* Proofing of Ukrainian localization (Vera Tkachenko) - -# 1.8.0 - -* New SUDSAVerifier based on up-to-date OS X APIs (Zachary Waldowski) -* Detailed error log for failed signature checks (Kornel Lesiński) -* Converted Sparkle to ARC (C.W. Betts) -* Converted ivars to properties. (Jake Petroules) -* Cocoapod support (Xhacker Liu) -* Quarantine removal on OS X 10.10 (C.W. Betts) -* Updated Japanese localization (1024jp) -* Added Greek localization - -# 1.7.1 - -* Removed option to install unverified updates (Kornel Lesiński) -* Added detailed log when code signing verification fails (Sam Deane) -* Restored original Sparkle icon. (Jake Petroules) -* Switched SUUpdateAlert.xib to AutoLayout (Kornel Lesiński) -* Replace references to andymatuschak.org with sparkle-project.org. (Jake Petroules) -* Several code cleanups, modernizations, fixed warnings and improved code formatting (Jake Petroules) -* Make the repository significantly more organized. (Jake Petroules) -* Xcode project: set organization name and class prefix. (Jake Petroules) -* Link to Foundation and AppKit instead of Cocoa. (Jake Petroules) -* Use new operatingSystemVersion API when available. (Jake Petroules) -* Add .clang-format configuration file for source code formatting. (Jake Petroules) -* Add a target to build Sparkle API documentation using Doxygen. (Jake Petroules) - -# 1.7.0 - -* Dropped support for OS X 10.6. Sparkle now supports 10.7 and newer (including 10.10 Yosemite) on 64-bit Intel Macs (the last 32-bit Mac was released in 2006). -* Removed use of deprecated functions (Zachary Waldowski) -* Switched to modern Obj-C runtime and new literals syntax -* Removed pre-10.7 code. (C.W. Betts) -* Use more Blocks/libdispatch code. (C.W. Betts) -* Cleaned up and improved security of `generate_keys`/`sign_update` scripts - -# 1.6.1 - -* Removed archive password prompt (Kornel Lesiński) -* (Re)fixes bug where URLs are naively double escaped (Andrew Madsen) -* Fixed typo that caused crashes in BinaryDelta (Tamas Lustyik) -* SUStandardVersionComparator.h is public (Vincent CARLIER) -* Remove pre-10.6-specific code. (C.W. Betts) -* Objective C 2 getters and setters. (C.W. Betts) -* Define correct dependencies on locale scripts (Antonin Hildebrand) - -# 1.6.0 - -* Cleaned up and deleted redundant strings files (Kornel Lesiński) -* Modern Objective C syntax, properties where possible. (C.W. Betts) -* Make SUAppcastDelegate a formal protocol. (C.W. Betts) -* Fixed default font in release notes WebView (Kornel Lesiński) -* Configurable name for finish_installation.app (Kornel Lesiński) -* Removed code for 10.4 (Kornel Lesiński) -* Convert all strings files to UTF-8 (UTF-16 must die) (Kornel Lesiński) -* Removing GC target (Matt Thomas) -* finish_installation.app and pkg files will not removed when we use *.pkg installer and restart system in the installer (Takayama Fumihiko) -* Select Korean and Slovak for Sparkle.strings localization (Shon Frazier) -* Updated the Romanian translation (Gabe) -* pt-BR localization polishing (BR Lingo) -* update zh_CN (61) -* Shut up some warnings & make build with newer Xcode (Uli Kusterer) -* Less unsafety with format strings (Uli Kusterer) -* New icon (Rick Fillion) -* fixed a 'content rectangle not entirely onscreen' warning (Simone Manganelli) -* updated sends system profile to use info.plist if user defaults key isn't present (Jamie Pinkham) -* Support for notifications on some updater events (Doug Russell) -* Allow the delegate to trigger a silent install and relaunch (Matt Stevens) -* Support silent relaunches (Matt Stevens) -* Increment the sudden termination counter if installing on quit (Matt Stevens) -* Prompts the user to update after a week (rather than a day) if he doesn't quit the app (Andy Matuschak) -* Adding appcast item element, tag (Andy Matuschak) -* We have this check box that says "Automatically download and install updates in the future." But we only download them automatically. We still ask permission again before installing them. (Andy Matuschak) - -# 1.5.0-beta6 - -* Important Changes - * Sparkle now requires DSA signatures on your updates. Check the documentation for more information on how to set that up if you don't already sign your updates. You can bypass this requirement if you deliver both your appcast and your updates over SSL. -* Sparkle will no longer display release notes located at file:// URLs, since Javascript on such a page would be able to read files on your file system. -* For security reasons, Sparkle will refuse to install updates which appear to "downgrade" the app. -* SUUpdater now implements new keys: "automaticallyDownloadsUpdates", "lastUpdateCheckDate", and "sendsSystemProfile." -* Fixed a bug that could prevent SUProbingUpdateDriver from working. -* Fixed a bug that prevented the updaterWillRelaunchApplication: delegate method from getting called. -* Fixed displaying release notes transmitted "loose" in the key. -* Fixed Sparkle compilation on 10.4 systems. -* Fixed a bug that could cause window confusion if an app changed its LSUIElement at runtime. -* Added support for Sparkle 1.1's behavior of disabling updates when the check interval is 0. -* Sparkle can now handle appending parameters to URLs which already have parameters. -* If an update's sparkle:shortVersionString is the same as the host's CFBundleShortVersionString, the sparkle:version and CFBundleVersion will be presented in parentheticals. - -# 1.5.0-beta5 - -* Important Changes! - * Made every Sparkle class private except for SUUpdater, SUAppcast, SUAppcastItem, and the SUVersionComparisonProtocol. - * There is now a single SUUpdater singleton for every host bundle; instead of -[SUUpdater setHostBundle], you can use +[SUUpdater updaterForBundle]. - * Redefined the (entire) delegate protocol accordingly. - * Renamed -[SUUpdater updatePreferencesChanged] to -[SUUpdater resetUpdateCycle]. This provides better semantics for non-apps, which need to start the update cycle manually. - * -[SUUpdater checkForUpdatesWithDriver] is private. If you were using SUProbingUpdateDriver, you can now use -[SUUpdater checkForUpdateInformation] for a similar effect. - * All the user defaults keys are now private; instead, SUUpdater is KVC-compliant for automaticallyChecksForUpdates, updateCheckInterval, and feedURL. -* Reduced the size of the English-only framework by 25%. -* System profiling information is now only submitted to the server once per week; this will help normalize your statistics across users with different interval preferences. -* The feedParamatersForUpdater: delegate method now requires "displayKey" and "displayVersion" keys so that it can inform the user what's being sent. -* Added a delegate method called pathToRelaunchForUpdater: which can be used for plugins to provide the path which should be used when relaunching the client after installing an update. -* Added support for xml:lang to pick localized nodes in appcasts (for release notes, etc). -* Fixed a bug which would cause the "checking for updates" window to not disappear in certain extraordinary error conditions. -* Fixed a DSA signature checking bug for .tar.gz archives. -* Sparkle now refuses to update on any read-only volume, not just dmgs. -* Sparkle will clean up the host app's name and version before sending it as the user agent string; some non-ASCII characters were causing problems. -* Added an Italian localization courtesy Michele Longhi. -* Added a Swedish localization courtesy Daniel Bergman. -* Fixes to the French localization courtesy Ronald Leroux and Yann Ricqueberg. -* Fixes to the German localization courtesy Sven-S. Porst. -* Fixes to the Russian localization courtesy Alexander Bykov and Anton Sotkov. -* Fixed a number of issues related to archive format detection: I reverted back to extensions from UTIs. -* Focus behavior fixes for LSUIElement apps. -* The status window progress bar now animates even when indeterminate. -* Major refactorings to improve functionality for non-app bundles. - -# 1.5.0-beta4 - -* Fixed a critical bug which prevented non-.dmgs from unarchiving properly. -* Added reporting of 64-bit capability to the profiling system. - -# 1.5.0-beta3 - -* Added a new delegate method to SUUpdater.h to allow delegates to specify custom version comparators. -* Added a German localization, courtesy the Camino localizer team: Dominik Tobschall, Tobias Stohr, and Friedemann Bochow. -* Bug fixes: - * Fixed a serious bug which could cause a server to be DDoS'd (or the host app to crash!) if an appcast fails to be parsed. - * Fixed .tbz extraction if the archive was made with Stuffit. - * Fixed support for .tar.bz2 and .tar.gz; Sparkle has to assume the archive is a tar when it sees "bz2" and "gz"; don't use those without tarring. - * Fixed a typo which caused the shouldPromptForPermissionToCheckForUpdatesToHostBundle: method to not work in 1.5b2. - * Fixed .zip extraction on Tiger (Apple changed the UTI between releases) - * Fixed a crasher on Tiger. - * Fixed display of the default app icon when the host app doesn't have an icon. - * Sparkle now displays a sensible progress string and uses an indeterminate progress bar when the server doesn't report a file size. - * Fixed some memory leaks. - - # 1.5.0-beta2 - - * Compatibility Issues: - * Most of the delegate method selectors have changed to scale better. See SUUpdater.h for changes; you'll likely have to make changes if you implement any delegate methods. - * If you're using .tar.gz or .tar.bz2 archives, name them ".tbz" or ".tgz" instead; Sparkle now uses UTIs for archive detection, and it's not smart about double extensions. - * I'm no longer supporting 10.3. This may or may not work on Panther—probably not. - * Sparkle's no longer built for ppc64 by default. If you want to ship that, feel free to build your own, but this saves a few hundred k. -* Enhancements: - * Sparkle now detects if the preferences for automatic update checks or the time interval change mid-cycle. - * If your product is a non-.app, you need to clue Sparkle in on the change by calling [[SUUpdater sharedUpdater] updatePreferencesChanged]. - * Added a cancel to the "checking for updates..." dialog. - * Sparkle now cleans up all its litter in /tmp. - * Made SUUpdater's delegate an IBOutlet so you can hook it up in IB. -* Bug fixes: - * Sparkle no longer crashes on non-GC hosts when the user cancels an update's downloads. - * Sparkle no longer gets stuck in an inconsistent state or crashes when it can't parse the appcast on scheduled updates. - * Added the sharedUpdater method to SUUpdater, as it should have been. - * Fixed a bug where the "checking for updates..." window wouldn't go away if an error occurs while checking for updates. - * Made the dual-mode build configuration actually use the .xcconfig which builds it with GC support. (oops!) - * Fixed relaunching for prefpanes. - * Sparkle no longer fails to install updates on Snow Leopard (though there's still an issue with trashing the old version of the app, but it seems to be a 10.6 bug) - * Sparkle now handles redirects correctly under Tiger. - * Fixed the installation path for non-.app bundles. - * Fixed a bug which could crash Sparkle under non-English locales. - * Fixed a weird race condition which could cause the relaunch tool to never notice that its target relaunched. - * Fixed a bug where if the host app is inactive when an update occurs, the update alert sometimes doesn't become key. - * Minor textual fixes. -* Localizations: - * Dutch: Maarten Van Coile - * French: Yann Ricquebourg - * Spanish: Ernesto Gomez Cereijo - - # 1.5.0-beta1 - - * The most important things to know: - * The 10.3 support is untested at best; sketchy at worst. Test with it thoroughly before you use it. - * Sparkle now asks for permission to update on second launch; don't be surprised at that. You can change that behavior with a delegate method; read SUUpdater.h for more info. - * We no longer distinguish between "check on startup" and "scheduled updates"; everything is scheduled, with the default being every day. - * The test application is using the new profiling features, but that's only for demonstration: these are off by default. More on this later. - * There are no localizations yet. -* New features: - * Sparkle now supports .pkgs. Just name the .pkg the name of the app and put in the update archive. - * Sparkle now sends optional demographic profiling information; set SUEnableSystemProfiling to YES in your Info.plist and check out the GET data sent to your webserver when fetching the appcast. More on this in the documentation. The test application has this on so you can see the behavior. - * Sparkle now supports updating non-.apps. Just call -setHostBundle: on the global SUUpdater to let it know what you're trying to update. - * Sparkle now supports garbage collection in the host app. Use "Sparkle-with-GC.framework" for that, but be aware it's 10.5-only. - * Sparkle is now 64-bit compatible, compiling both ppc64 and x86_64. - * Sparkle now supports a sparkle:minimumSystemVersion key you can set on appcast items. It does what you think it does. - * Sparkle now checks to see if the host app is running from a disk image and refuses to update if it is. (10.4+ only) - * Added support for entities in enclosure paths. - * The file size output is now formatted prettily. - * Sparkle now gives visual indication that it's checking for updates when the update's user initiated. ie: it pops up a status controller saying "checking for updates..." - * Added support for an SUPublicDSAKeyFile, so people don't have to copy/paste their entire key into their Info.plist. Set this key in your Info.plist to the filename of the key in your Resources directory. - * Added an actually maintainable codebase. -* Changes: - * Sparkle version comparison is now dramatically less stupid and verified by a bunch of unit tests. If something doesn't work the way you think it should, add a test to SUVersionComparisonTest.m - * Added a minimum to the check interval so that developers don't accidentally release their apps into the wild with 60-second test check intervals and have DOS-attack-like results. It's an hour now for release mode; feel free to change it. - * The relaunching process now uses a separate helper app, which is a much more robust method. - * Changed CFBundleShortVersionString behavior: Sparkle no longer uses Apple's about box style of displaying ShortVersionString (CFBundleVersion) when the latter is available. - * No more MD5 checking. Use DSA: it's actually secure. - * The abomination that was SUStatusChecker is dead. Use SUProbingUpdateDriver instead. -* Bugfixes: - * Fixed a huge bug with fully-automatic updating: before, if the user chose to relaunch later, the app would be running from the trash for a while. Now the buttons are "install and relaunch" or "install later." - * Sparkle forces Spotlight to reindex the updated app so that it won't keep pointing to the one in the trash. - * Sparkle trims whitespace from around DSA signatures; this could cause crashes before. - * Fixed a bug where the user choosing to skip a version would inhibit future automatic updates until the next launch. - * Fixed a bug that could occur when the app has a localized CFBundleName. - * .dmgs now work on Leopard. - * The status controller's button now sizes appropriately to the localization. - * Sparkle now works correctly with LSUIElement apps: it focuses them before displaying the update alert. - * Sparkle now deletes failed partial downloads. - * The update alert no longer floats above everything in the app. - * Fixed varied and sundry memory leaks. -* A ton of other things that I've forgotten or were too small to mention! - -# 1.1 - -* Optimized framework size: now only 1.4mb with all localizations and 384kb with only English (an English-only version is in the Extras folder). -* Added a new SUStatusChecker class for programmatically determining if a new version is available (see the docs); thanks, Evan Schoenberg! -* Added support for apps using SIGCHLD; thanks, Augie Fackler! -* Added a zh_CN update from JT Lee -* Added a Polish update from Piotr Chylinski -* Fixed DMG support for images with /Applications symlinks. -* Fixed a really stupid interval-checking bug that could cause repeated hits to the appcast. -* Fixed a bug where the check interval would be inconsistent if a value of 0 was stored in the user defaults. - -# 1.0 - -* Additions: - * Added real version comparison courtesy Kevin Ballard: Sparkle now knows that 0.89 < 1.0a3 < 1.0. - * Added many localizations courtesy David Kocher's localization team. - * Added a much better installation mechanism courtesy Allan Odgaard. - * Added a user agent string to the RSS fetch request. - * Added support for CFBundleShortVersionString in addition to CFBundleVersion, and support for a sparkle:shortVersionString attribute on the enclosure. - * Added support for CFBundleDisplayName if available. -* Changes: - * Automatic updating is now allowed by default, but only if DSA signing is on. - * Pressing Escape or closing the update alert now reminds the user later. - * Now when there's a stored check interval, Sparkle doesn't check immediately on startup the first time the app is launched because the user hasn't consented to it yet. - * The update alert now remembers its size and floats. -* Bug Fixes: - * Fixed installation of DMGs with multiple files enclosed. - * Fixed a nasty memory leak. - * Fixed a bug wherein having no value for allowing automatic updates would display a checkbox for the updates but would not honor it. - * Fixed a bug in zip extraction that occurred in Panther. - * Fixed release notes caching. - * Fixed a bug wherein Sparkle refused to authenticate the installation if the user had cancelled authentication previously in that session. - * Fixed a weird bug that would cause a second help menu to appear on first launch. - * Fixed a bug that could occur when changing the scheduled check interval. - * Fixed a bug wherein the host app could crash if the user clicked Remind Me Later before the release notes finished loading. - * Fixed a bug wherein the behavior was undefined if the user manually initiated a check when an automatic one was already taking place. - * Fixed wrapping on the description field in the update alert. - -# 1.0-beta3 - -* Fixed a nasty crasher that occurred often when the user was not connected to the internet. - -# 1.0-beta2 - -* Major Improvements: - * Fully automatic updating! (see the Documentation: this is beta and off by default) - * Added support for DSA signatures (see the Documentation). - * Added support for MD5 sum verification. - * Added Security.framework-based authentication for installing to privileged directories. - * Huge refactoring of the codebase: there's now a Sparkle Xcode project, Sparkle is now a framework, and everything is modular / abstracted. And no more code-generated interface. -* Minor Improvements: - * A SUUpdaterWillRestartNotification is sent out before restarting now. - * Added key equivalents to alert panel buttons. - * Error handling is much prettier now: technical messages are not presented to the user anymore. - * There's now a test app for developers to see what Sparkle's like before using it. - * Wrote new, pretty, extremely thorough documentation. -* Bug Fixes: - * Relaunch behavior is much improved and shouldn't fail in huge apps anymore. - * Fixed a bug wherein a failing tar command could crash the host app. - * Sparkle now looks at InfoPlist.strings in addition to Info.plist. - * Fixed some stupid typos. - -# 1.0-beta1 - -* Major New Features: - * Sparkle now supports scheduled periodic updates—read the Readme for information on how to use it. - * Sparkle now supports WebKit-based release notes (for CSS and full HTML), which it displays in the main update alert, not a separate panel. The Readme has much more information. Sparkle will, of course, fall back on NSTextView if the host app does not include WebKit. -* Minor New Features: - * Added support for .zip update archives. - * Added support for .dmg update archives. - * Implemented Remind Me Later to replace simple update cancellation. - * Implemented Skip This Version functionality. - * Added support for multiple feeds via the user defaults SUFeedURL key taking precedent over the one in Info.plist. - * Added support for Sparkle's custom XML namespace, which is optional but may prove useful. See the Readme for more information. -* Bug Fixes: - * Sparkle will no longer enter an inconsistent state if the user tries to update again while one is already in progress. - * Sparkle now uses CFBundleName to determine the application's name instead of the app's filename. - * Sparkle no longer crashes if the user cancels during extraction. - * Lots of code refactoring. - -# 0.1 - -* Initial Release diff --git a/Frameworks/Sparkle/Configurations/ConfigBinaryDelta.xcconfig b/Frameworks/Sparkle/Configurations/ConfigBinaryDelta.xcconfig deleted file mode 100644 index 912b8190b..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigBinaryDelta.xcconfig +++ /dev/null @@ -1,3 +0,0 @@ -// BinaryDelta tool only - -PRODUCT_NAME = BinaryDelta diff --git a/Frameworks/Sparkle/Configurations/ConfigBinaryDeltaDebug.xcconfig b/Frameworks/Sparkle/Configurations/ConfigBinaryDeltaDebug.xcconfig deleted file mode 100644 index 3be980b11..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigBinaryDeltaDebug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "ConfigBinaryDelta.xcconfig" - diff --git a/Frameworks/Sparkle/Configurations/ConfigBinaryDeltaRelease.xcconfig b/Frameworks/Sparkle/Configurations/ConfigBinaryDeltaRelease.xcconfig deleted file mode 100644 index 3e22baaab..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigBinaryDeltaRelease.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ConfigBinaryDelta.xcconfig" diff --git a/Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig b/Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig deleted file mode 100644 index d8a107054..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigCommon.xcconfig +++ /dev/null @@ -1,77 +0,0 @@ -// Common - -SPARKLE_BUNDLE_IDENTIFIER = org.andymatuschak.Sparkle -SPARKLE_RELAUNCH_TOOL_NAME = Autoupdate - -SPARKLE_APPEND_VERSION_NUMBER = 1 - -// Sparkle usually doesn't allow downgrades as they're usually accidental, but -// if your app has a downgrade function or URL handler, turn this on -SPARKLE_AUTOMATED_DOWNGRADES = 0 - -// If your app file on disk is named "MyApp 1.1b4", Sparkle usually updates it -// in place, giving you an app named 1.1b4 that is actually 1.2. Turn the -// following on to always reset the name back to "MyApp": -SPARKLE_NORMALIZE_INSTALLED_APPLICATION_NAME = 0 - -SPARKLE_VERSION_MAJOR = 1 -SPARKLE_VERSION_MINOR = 10 -SPARKLE_VERSION_PATCH = 0 -SPARKLE_VERSION = $(SPARKLE_VERSION_MAJOR).$(SPARKLE_VERSION_MINOR).$(SPARKLE_VERSION_PATCH) - -CURRENT_PROJECT_VERSION = $(SPARKLE_VERSION) -ALWAYS_SEARCH_USER_PATHS = NO -GCC_PRECOMPILE_PREFIX_HEADER = YES -GCC_PREFIX_HEADER = Sparkle/Sparkle.pch -GCC_SYMBOLS_PRIVATE_EXTERN = YES -GCC_INLINES_ARE_PRIVATE_EXTERN = YES -ARCHS = $(ARCHS_STANDARD) -MACOSX_DEPLOYMENT_TARGET = 10.7 - -GCC_PREPROCESSOR_DEFINITIONS = SPARKLE_BUNDLE_IDENTIFIER=\"$(SPARKLE_BUNDLE_IDENTIFIER)\" SPARKLE_RELAUNCH_TOOL_NAME=\"$(SPARKLE_RELAUNCH_TOOL_NAME)\" -CLANG_ENABLE_OBJC_ARC = YES - -// Enable warnings -CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES -CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES -CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES -CLANG_ENABLE_MODULES = YES -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES -CLANG_WARN_DOCUMENTATION_COMMENTS = YES -CLANG_WARN_EMPTY_BODY = YES -CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES -CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES -CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES -CLANG_WARN_OBJC_RECEIVER_WEAK = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES -GCC_WARN_64_TO_32_BIT_CONVERSION = YES -GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES -GCC_WARN_ABOUT_MISSING_NEWLINE = YES -GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES -GCC_WARN_ABOUT_RETURN_TYPE = YES -GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES -GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES -GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES -GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES -GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES -GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES -GCC_WARN_PEDANTIC = YES -GCC_WARN_SHADOW = YES -GCC_WARN_SIGN_COMPARE = YES -GCC_WARN_STRICT_SELECTOR_MATCH = YES -GCC_WARN_UNDECLARED_SELECTOR = YES -GCC_WARN_UNKNOWN_PRAGMAS = YES -GCC_WARN_UNUSED_FUNCTION = YES -GCC_WARN_UNUSED_LABEL = YES -GCC_WARN_UNUSED_PARAMETER = YES -GCC_WARN_UNUSED_VARIABLE = YES - -// These should be removed once the conversion to ARC is complete -WARNING_CFLAGS_EXTRA = -Wno-custom-atomic-properties -Wno-implicit-atomic-properties - -// Turn on all warnings, then disable a few which are almost impossible to avoid -WARNING_CFLAGS = -Wall -Weverything -Wno-empty-translation-unit -Wno-unused-macros -Wno-gnu-statement-expression -Wno-receiver-is-weak -Wno-arc-repeated-use-of-weak -Wno-auto-import -Wno-cstring-format-directive $(WARNING_CFLAGS_EXTRA) diff --git a/Frameworks/Sparkle/Configurations/ConfigCommonDebug.xcconfig b/Frameworks/Sparkle/Configurations/ConfigCommonDebug.xcconfig deleted file mode 100644 index 90332131e..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigCommonDebug.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -#include "ConfigCommon.xcconfig" - -// Debug only - -GCC_OPTIMIZATION_LEVEL = 0 -DEBUG_INFORMATION_FORMAT = dwarf -GCC_GENERATE_DEBUGGING_SYMBOLS = YES -SPARKLE_EXTRA_DEBUG = -DDEBUG -OTHER_CFLAGS = $(SPARKLE_EXTRA_DEBUG) -ONLY_ACTIVE_ARCH = YES -COPY_PHASE_STRIP = NO diff --git a/Frameworks/Sparkle/Configurations/ConfigCommonRelease.xcconfig b/Frameworks/Sparkle/Configurations/ConfigCommonRelease.xcconfig deleted file mode 100644 index acffc466a..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigCommonRelease.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -#include "ConfigCommon.xcconfig" - -// Release only - -GCC_OPTIMIZATION_LEVEL = s -DEBUG_INFORMATION_FORMAT = dwarf-with-dsym -GCC_GENERATE_DEBUGGING_SYMBOLS = YES -DEAD_CODE_STRIPPING = YES -GCC_TREAT_WARNINGS_AS_ERRORS = NO -GCC_WARN_UNINITIALIZED_AUTOS = YES diff --git a/Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig b/Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig deleted file mode 100644 index ca9b25b63..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigFramework.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -// Framework only - -DYLIB_INSTALL_NAME_BASE = @loader_path/../Frameworks -DYLIB_COMPATIBILITY_VERSION = 1.6 -DYLIB_CURRENT_VERSION = $(SPARKLE_VERSION_MAJOR).$(SPARKLE_VERSION_MINOR).$(SPARKLE_VERSION_PATCH) -PRODUCT_NAME = Sparkle -WRAPPER_EXTENSION = framework -FRAMEWORK_VERSION = A -INFOPLIST_FILE = Sparkle/Sparkle-Info.plist -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BUILDING_SPARKLE=1 -OTHER_LDFLAGS = -Wl,-U,_NSURLQuarantinePropertiesKey -SKIP_INSTALL = YES -DEFINES_MODULE = YES diff --git a/Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig b/Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig deleted file mode 100644 index 184b8a7d4..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigFrameworkDebug.xcconfig +++ /dev/null @@ -1,4 +0,0 @@ -#include "ConfigFramework.xcconfig" - -// Unit tests need access to non-public classes -GCC_SYMBOLS_PRIVATE_EXTERN = NO diff --git a/Frameworks/Sparkle/Configurations/ConfigFrameworkRelease.xcconfig b/Frameworks/Sparkle/Configurations/ConfigFrameworkRelease.xcconfig deleted file mode 100644 index 58d6b5aa6..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigFrameworkRelease.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "ConfigFramework.xcconfig" - diff --git a/Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig b/Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig deleted file mode 100644 index 292437c93..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigRelaunch.xcconfig +++ /dev/null @@ -1,8 +0,0 @@ -// Relaunch Tool only - -INFOPLIST_FILE = Sparkle/Autoupdate/Autoupdate-Info.plist -PRODUCT_NAME = $(SPARKLE_RELAUNCH_TOOL_NAME) -SKIP_INSTALL = YES -ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon -CLANG_ENABLE_MODULES = NO -OTHER_LDFLAGS = -Wl,-U,_NSURLQuarantinePropertiesKey diff --git a/Frameworks/Sparkle/Configurations/ConfigRelaunchDebug.xcconfig b/Frameworks/Sparkle/Configurations/ConfigRelaunchDebug.xcconfig deleted file mode 100644 index 4ddb5d77d..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigRelaunchDebug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ConfigRelaunch.xcconfig" diff --git a/Frameworks/Sparkle/Configurations/ConfigRelaunchRelease.xcconfig b/Frameworks/Sparkle/Configurations/ConfigRelaunchRelease.xcconfig deleted file mode 100644 index 4ddb5d77d..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigRelaunchRelease.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ConfigRelaunch.xcconfig" diff --git a/Frameworks/Sparkle/Configurations/ConfigTestApp.xcconfig b/Frameworks/Sparkle/Configurations/ConfigTestApp.xcconfig deleted file mode 100644 index db13e9e71..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigTestApp.xcconfig +++ /dev/null @@ -1,8 +0,0 @@ -// Test Application only - -INFOPLIST_FILE = TestApplication/TestApplication-Info.plist -PRODUCT_NAME = Sparkle Test App -WRAPPER_EXTENSION = app -ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon -CLANG_ENABLE_OBJC_ARC = NO -LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks diff --git a/Frameworks/Sparkle/Configurations/ConfigTestAppDebug.xcconfig b/Frameworks/Sparkle/Configurations/ConfigTestAppDebug.xcconfig deleted file mode 100644 index 476c0f07a..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigTestAppDebug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "ConfigTestApp.xcconfig" - diff --git a/Frameworks/Sparkle/Configurations/ConfigTestAppRelease.xcconfig b/Frameworks/Sparkle/Configurations/ConfigTestAppRelease.xcconfig deleted file mode 100644 index de0d28023..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigTestAppRelease.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ConfigTestApp.xcconfig" diff --git a/Frameworks/Sparkle/Configurations/ConfigUnitTest.xcconfig b/Frameworks/Sparkle/Configurations/ConfigUnitTest.xcconfig deleted file mode 100644 index 73900ecae..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigUnitTest.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -// Unit Test only - -INFOPLIST_FILE = Tests/SparkleTests-Info.plist -PRODUCT_NAME = Sparkle Unit Tests -WRAPPER_EXTENSION = xctest -OTHER_CFLAGS = $(inherited) -iframework"$(DEVELOPER_FRAMEWORKS_DIR)" -iframework"$(PLATFORM_DIR)/Developer/Library/Frameworks" -GCC_SYMBOLS_PRIVATE_EXTERN = NO -WARNING_CFLAGS = $(inherited) -Wno-variadic-macros -Wno-gnu-zero-variadic-macro-arguments -FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) -LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks diff --git a/Frameworks/Sparkle/Configurations/ConfigUnitTestDebug.xcconfig b/Frameworks/Sparkle/Configurations/ConfigUnitTestDebug.xcconfig deleted file mode 100644 index e2481b5e4..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigUnitTestDebug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ConfigUnitTest.xcconfig" diff --git a/Frameworks/Sparkle/Configurations/ConfigUnitTestRelease.xcconfig b/Frameworks/Sparkle/Configurations/ConfigUnitTestRelease.xcconfig deleted file mode 100644 index e2481b5e4..000000000 --- a/Frameworks/Sparkle/Configurations/ConfigUnitTestRelease.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ConfigUnitTest.xcconfig" diff --git a/Frameworks/Sparkle/Configurations/make-release-package.sh b/Frameworks/Sparkle/Configurations/make-release-package.sh deleted file mode 100755 index 98cdd7b6b..000000000 --- a/Frameworks/Sparkle/Configurations/make-release-package.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -set -e - -if [ "$ACTION" = "" ] ; then - rm -rf "$CONFIGURATION_BUILD_DIR/staging" - rm -f "Sparkle-$CURRENT_PROJECT_VERSION.tar.bz2" - - mkdir -p "$CONFIGURATION_BUILD_DIR/staging" - cp "$SRCROOT/CHANGELOG" "$SRCROOT/LICENSE" "$SRCROOT/Resources/SampleAppcast.xml" "$CONFIGURATION_BUILD_DIR/staging" - cp -R "$SRCROOT/bin" "$CONFIGURATION_BUILD_DIR/staging" - cp "$CONFIGURATION_BUILD_DIR/BinaryDelta" "$CONFIGURATION_BUILD_DIR/staging/bin" - cp -R "$CONFIGURATION_BUILD_DIR/Sparkle Test App.app" "$CONFIGURATION_BUILD_DIR/staging" - cp -R "$CONFIGURATION_BUILD_DIR/Sparkle.framework" "$CONFIGURATION_BUILD_DIR/staging" - - # Only copy dSYMs for Release builds, but don't check for the presence of the actual files - # because missing dSYMs in a release build SHOULD trigger a build failure - if [ "$CONFIGURATION" = "Release" ] ; then - cp -R "$CONFIGURATION_BUILD_DIR/BinaryDelta.dSYM" "$CONFIGURATION_BUILD_DIR/staging/bin" - cp -R "$CONFIGURATION_BUILD_DIR/Sparkle Test App.app.dSYM" "$CONFIGURATION_BUILD_DIR/staging" - cp -R "$CONFIGURATION_BUILD_DIR/Sparkle.framework.dSYM" "$CONFIGURATION_BUILD_DIR/staging" - fi - - cd "$CONFIGURATION_BUILD_DIR/staging" - # Sorted file list groups similar files together, which improves tar compression - find . \! -type d | rev | sort | rev | tar cjvf "../Sparkle-$CURRENT_PROJECT_VERSION.tar.bz2" --files-from=- - rm -rf "$CONFIGURATION_BUILD_DIR/staging" -fi diff --git a/Frameworks/Sparkle/Configurations/set-git-version-info.sh b/Frameworks/Sparkle/Configurations/set-git-version-info.sh deleted file mode 100755 index 8a79052c3..000000000 --- a/Frameworks/Sparkle/Configurations/set-git-version-info.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -set -e - -if ! which -s git ; then - exit 0 -fi - -if [ -z "$SRCROOT" ] || \ - [ -z "$BUILT_PRODUCTS_DIR" ] || \ - [ -z "$INFOPLIST_PATH" ] || \ - [ -z "$CURRENT_PROJECT_VERSION" ]; then - echo "$0: Must be run from Xcode!" 1>&2 - exit 1 -fi - -# Get the current Git master hash -version=$(cd "$SRCROOT" ; git show-ref --abbrev heads/master | awk '{print $1}') -if [ -z "$version" ] ; then - echo "$0: Can't find a Git hash!" 1>&2 - exit 0 -fi - -version="$CURRENT_PROJECT_VERSION git-$version" - -# and use it to set the CFBundleShortVersionString value -export PATH="$PATH:/usr/libexec" -PlistBuddy -c "Set :CFBundleShortVersionString '$version'" \ - "$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH" diff --git a/Frameworks/Sparkle/Documentation/.gitignore b/Frameworks/Sparkle/Documentation/.gitignore deleted file mode 100644 index 1936cc1d4..000000000 --- a/Frameworks/Sparkle/Documentation/.gitignore +++ /dev/null @@ -1 +0,0 @@ -html diff --git a/Frameworks/Sparkle/Documentation/Doxyfile b/Frameworks/Sparkle/Documentation/Doxyfile deleted file mode 100644 index a2d21a3ee..000000000 --- a/Frameworks/Sparkle/Documentation/Doxyfile +++ /dev/null @@ -1,20 +0,0 @@ -PROJECT_NAME = Sparkle -PROJECT_NUMBER = 1.7.1 -PROJECT_BRIEF = "A software update framework for OS X" -PROJECT_LOGO = Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png - -RECURSIVE = YES -INPUT = Sparkle -OUTPUT_DIRECTORY = Documentation - -GENERATE_HTML = YES -GENERATE_LATEX = NO - -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST = YES -GENERATE_TODOLIST = YES - -ALPHABETICAL_INDEX = YES - -QT_AUTOBRIEF = YES -WARN_IF_UNDOCUMENTED = NO diff --git a/Frameworks/Sparkle/Documentation/build-docs.sh b/Frameworks/Sparkle/Documentation/build-docs.sh deleted file mode 100755 index 44b43bf4f..000000000 --- a/Frameworks/Sparkle/Documentation/build-docs.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -if [ "$ACTION" = "" ] ; then - if which -s doxygen ; then - doxygen Documentation/Doxyfile - else - echo "warning: Doxygen not found in PATH" - fi -elif [ "$ACTION" = "clean" ] ; then - rm -rf "$SRCROOT/Documentation/html" -fi diff --git a/Frameworks/Sparkle/LICENSE b/Frameworks/Sparkle/LICENSE deleted file mode 100644 index f4020f8d3..000000000 --- a/Frameworks/Sparkle/LICENSE +++ /dev/null @@ -1,60 +0,0 @@ -Copyright (c) 2006-2013 Andy Matuschak. -Copyright (c) 2009-2013 Elgato Systems GmbH. -Copyright (c) 2011-2014 Kornel Lesiński. -Copyright (c) 2014 C.W. Betts. -Copyright (c) 2014 Petroules Corporation. -Copyright (c) 2014 Big Nerd Ranch. -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -================= -EXTERNAL LICENSES -================= - -bspatch.c and bsdiff.c, from bsdiff 4.3 : - Copyright (c) 2003-2005 Colin Percival. - -sais.c and sais.c, from sais-lite (2010/08/07) : - Copyright (c) 2008-2010 Yuta Mori. - -SUDSAVerifier.m: - Copyright (c) 2011 Mark Hamlin. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted providing that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/Frameworks/Sparkle/Makefile b/Frameworks/Sparkle/Makefile deleted file mode 100644 index 8dfd43bc9..000000000 --- a/Frameworks/Sparkle/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -.PHONY: all localizable-strings release build test travis - -BUILDDIR := $(shell mktemp -d "$(TMPDIR)/Sparkle.XXXXXX") - -localizable-strings: - rm -f Sparkle/en.lproj/Sparkle.strings - genstrings -o Sparkle/en.lproj -s SULocalizedString Sparkle/*.m Sparkle/*.h - iconv -f UTF-16 -t UTF-8 < Sparkle/en.lproj/Localizable.strings > Sparkle/en.lproj/Sparkle.strings - rm Sparkle/en.lproj/Localizable.strings - -release: - xcodebuild -scheme Distribution -configuration Release -derivedDataPath "$(BUILDDIR)" build - open -R "$(BUILDDIR)/Build/Products/Release/Sparkle-"*.tar.bz2 - -build: - xcodebuild clean build - -test: - xcodebuild -scheme Distribution -configuration Debug test - -travis: test diff --git a/Frameworks/Sparkle/README.markdown b/Frameworks/Sparkle/README.markdown deleted file mode 100644 index 0e557c536..000000000 --- a/Frameworks/Sparkle/README.markdown +++ /dev/null @@ -1,46 +0,0 @@ -# Sparkle [![Build Status](https://travis-ci.org/sparkle-project/Sparkle.svg?branch=master)](https://travis-ci.org/sparkle-project/Sparkle) - -An easy-to-use software update framework for Cocoa developers. - -Sparkle shows familiar update window with release notes - -## Changes since 1.5b - -* Up-to-date with 10.10 SDK and Xcode 6. Supports OS X 10.7+. -* Cleaned up and modernized code, using ARC and Autolayout. -* Merged bugfixes, security fixes and some features from multiple Sparkle forks. -* Truly automatic background updates (no UI at all) when user agreed to "Automatically download and install updates in the future." -* Ability to mark updates as critical. -* Progress and status notifications for the host app. -* Name of finish_installation.app can be configured to match your app's name. - -## Features - -* True self-updating—the user can choose to automatically download and install all updates. -* Displays a detailed progress window to the user. -* Supports authentication for installing in secure locations. -* Supports Apple code signing and DSA signatures for ultra-secure updates. -* Easy to install. Sparkle requires no code in your app, so it's trivial to upgrade or remove the framework. -* Uses appcasts for release information. Appcasts are supported by 3rd party update-tracking programs and websites. -* Displays release notes to the user via WebKit. -* Sparkle doesn't bug the user until second launch for better first impressions. -* Seamless integration—there's no mention of Sparkle; your icons and app name are used. -* Deep delegate support to make Sparkle work exactly as you need. -* Optionally sends system information to the server when checking for updates. -* Supports bundles, preference panes, plugins, and other non-.app software. Can install .pkg files for more complicated products. -* Supports branches due to minimum OS version requirements. - -## Developers - -Building Sparkle requires Xcode 5 or above. - -### API - -Sparkle is built with `-fvisibility=hidden -fvisibility-inlines-hidden` which means no symbols are exported by default. -If you are adding a symbol to the public API you must decorate the declaration with the `SU_EXPORT` macro (grep the source code for examples). - -### Building the distribution package - -`cd` to the root of the Sparkle source tree and run `make release`. Sparkle-*VERSION*.tar.bz2 will be created in a temporary directory and revealed in Finder after the build has completed. - -Alternatively, build the Distribution scheme in the Xcode UI. diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 5ddf68b46..000000000 --- a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "icon_16x16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "icon_16x16@2x.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "icon_32x32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "icon_32x32@2x.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "icon_128x128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "icon_128x128@2x.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "icon_256x256.png", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_128x128.png deleted file mode 100644 index 4d7985201d08d85342b12171ac3bbe1757936135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15615 zcmV48h0Dd3j9XM`7leV~%6X7Fe>_ zf?a8)Wx6oa^_Tx!=iE7SuB_E+o!IZ^I;T$e%w65>?fQ0Ab#+&X=jnNRo}Q=Y>3Mpd z{+}e_Sw#2#q&o=ma~G)kR+KzQ0jPkEBMc$F8z}QEC6TaQy`P0r1Ze;Q&{2d5aqcK^ zoM#!y1KX6JC4KDg|9!!?Hg9}Umi}uqjY~J=+UG8C8Etg|83_gTipIooSqI~i@2(8( z+NHUrx6IAne;2TwpCNtlEt%j$AARDYO7p9(iN|)lsA1j86P`#@SfFOdp@x!fA`mcDnBK1+1Ac)-dlJ} z-1dsMwa=e>LBp(od>4cbo-i-CEQo^y0Ptm{I_@a-LHT&Zcwc2#6MMh5DEFg(2lntY zB6-DI{)wL^_4XcHzpHZN?={a`^_tG*1clk2T@HneZKvbzt*|9adFFH$aQ!!jRGcc65}^Q6CG71 zf!q(n2ZjCv@xbVlcYbn-`=7r8dig1noO{{3_-W9>xk2!~&F6h+-UaXbQ0Fq58y9;r zErN3(#u6AyeeXnljq!j&byOMab`0%@BU|tM%u+u8exQ#TroD#-Hv}vH`tN3~Sn#5@ zZM~aUo``$xk0EYKDj&3{tcxCq= z+yvau4AEfethX(`^nHKdwv5)srJk^0fXzSl4R$8aM=rP{PUI-UK-|s zgf`wR1Q|gx_AUwDvKwL2(RAKahFuX@5`XB!5 z8-VX0x%)dpML|!w^;Miqwm{?M@BQGyjW_;9+Zs>4b5hV@4qP@d{)FJ=RAaYs8&7I5 z8+%-t1aWl)26i|`_jZ4+=eBF#1XP|`0JN^&0CE7t z%U|*KcLa;y`KiuzUh-Wa83=9cE(bvdoQ>T$Np&?qTAO*(3UOorE<;>ZDnl^1-7&J` z-j5&p;T1On$}>b^G`f?SCnqhJ-SN@(#jTe$F7cDLGQ*_cb2>SBB8Y-`a8h6BNs`n` z5(RX!bpU}PIY1%y(6k7mG1_|Kzy0J5i{EzL*x*QSLrYVJSOuW2mCiWuR9^GmB^Udy zcm7?+Qk9&o{4fhHr;{2i5S)$Og#WafEB%W^?Y##uM>4C30V3N3O-nplx%@pH7ykPu z;9s6G0G#**%rp)3_PnWc#pUmASm+7!rXoXQ0la{Mn!Wc5Nd48r$+Un%@|}1AQCtQz z20XMZ@svke*57;dxBlpXpWOVuYp#j|#5puAClo>Baw+=6=fc*l6My=TElX)`n5#H} zAWZlv2zW@sNICWR(;6&c$_&gh3E~V8L9QKgvy|EAzw6JQ{O-@)4Qzcz08l#e17?y2 z_ivuH?DY@)QLfXIX|@&O4CMe`P!m2DC_$JWX~MR85EVdi0U!_-pmn~dclRaly8ZF% zzjgllZ~mZdR(pcNI_ILM`5tHE7Gr$vcj0U`GXvw-Nfs}N zC=vh>6z3@Y19Bo(_Q!v^_v;tF7Kmrw1RVc9Gf9o>|K{dgd&}~CXN-uTHi>E~PZe-B zmjdXSO&|iviBuH?odlgiu>(qd1V29djt_2r;?5txsJ$AC3j-8Mu70hQDtByJvU<-*Z@Q;@mtPFrJEH(N@uf4f`nP>8>{$M?*9Cb9GKORmzBkLIqKL?holUE?k`TTV zo$Tu*48C20Zdz3>xHnOlpNX4)o*ysj051rm(C0Tp4hS~*S_IAmsJ!X5%E$1 zZ|YM}($bdcAVDF$`W@gMIIwM6LJJf8AqLI^u9xO(${Uf2YT%oqS3 z|L)Dq1WEIi=LFfX-Gy;d_%>NUkPh^uWG&Ow1PS4*q`pVN#efPDKqd=&1}-`4Sodcy zZEtwuLmGt3s>3|m-Lv*%{pD5baybYCK~!z^nc#g*I6kp`)2Yf|nVQx}hrA;Lfrl{k zl-z<9?F-Id13WZi066i5%mh_hUv`dUY-<;pL}G9WCrTvw2O847+Dfx`n&5O~Eg5Gw zEA9fp1wa5e$RxtD;sMhH&Q2Re_44+{9ap!kylFPsH$dqhUeGae+mbNI6@m=7D2XZfKdmVnzXQ;tM%b z+WqjSGIL*e^9pgbgBo$*QM3v%pmFUpJfNuwN=%e6brMmWgCKw~0L?%qgB{S= zZ{mU8n|ZQ&Az|cECIub)guoLT#bbRvh00gZlYk-(4Ad5jl9&wpD3-}F7T&BUtlNU4qB*4(Drt(tD+tm?1peay1Z2(BD(VFAu1f0Ehu_A!?f{P+v zcEO($&VD245@6WAWDK~7=7pDX-I71&UpIZ3AQaoNB%DhWhiz+3@ZJQa2{oo^;n#n6 z@?C>!?K@*L1F`KufJlQTVCDe8%upcWGI;QjB7p#=9<_Gjr=lSC>;Y1mAl;Ipw5c$5 ziQnN=2z(6$0#swi+UDCiZ}muUk^>H7o5Kvazc2mqc<0C4J~iVfICZ-*wXCLCM!;7rKI zX`L?EzYFcXZN>2R^GU{RCrP1$Bs77>@PZ}(PJY&<;1_~UFi90415AK!pmV_-E}Hw_ zd~@#~5DLk70?rGuSDe{o#AYv4L~IvQ5qt?$QmS7K07=YQTXzRwU{b|Epr|>~QDve6 z@N5GB8cht7M6aqH_X=tNz=UGYs68jm0@(YUq8Sis>QEv27!SXvG|9cR}Km>Bw%s?aP0`SeybUl|W`y#jO`!KQQ0FS63-pq>!??Ey^pfzEd zun83vL8HW~Pip}MQtwF$o`mpKle;4{fbz(p{%0cq;;4MA$Nsp)!H-4%JhtKmZ<@eK z4FsCpwgHl{39VX-0U@K{Kq>+r1he_xTAgH3#d%vX5u7{cD=b))2R$E{067Ts8C3dA zmoEdklC{e}&a#K@Vf)Z^WCM@)ic|33?l5E(5j8N>gzOUsQ$&+ZTKGN%fYi#j_Xt?HRm->Y8gRP%{x!*2x1^kn}8a7wawE07h9IFG0M+cjk>J$x(zSn1ZuS+Ri-04*NCIU^8U>DlUO?B91zfr8WBm7ye<7Du z#DpGTKVWg{G~p*d*A6JYgO{BD``mT-7wImoBXreC5I7TjQeBHoYA_)7 zfHK)nnJ!HW+E}M_mMo}8M-P1AUSRaLy9Q>?2RQL%oGHEI&2ydtz{tpf&)wa+_Wf^^ zpqM9V2I?I2xXJg{rux`QOL+PY2qss(0l>n)&Ol)P1foPfq#+#Q=Pv#L+1WRMUjjN{ zUcWw#2^|3)1b+z~OV8%@XT6_)_{nz>C%D7~19b^i0K^su5EH1k&%IB`R1(f2bxdNy z+^MF-AB2?qH|;;+06qegpLM%{&-~931xnT7osW$k{PKe>E8cO1Mp5F%6$S*U3ETQ6 zIGnvts(T3%p1ugq1aB>2t)GYi2$2_Fz4jxlJGTV#CeSfp2qM|m(7$tM_s!%pRh-$e&`C1ZU@Ulxdw4M)(F7hVIO~hU{GOUAR1`>R6%r(fgP~pj z`~!_Ao;+c)%fPeF2Vm~(Y-#(>@uMR<|K?jw3vam8g~c2iV}~6!VQK;wob{a(oWle! z*lGvsi(o&OY?UA(cw6{5l!++E###Tt4KMgOH2gLAoNfL306oPHN**d@LL<$J9-JZpoGIgGNMTh&^{J4G~s*2fI#5EJ3B#Codij3Cy;O!6$E>>-9?zC z-1q3A@dKZ~1sGblrlHCVl3adC3o}KJZW(PYPsC@po%_chXWBJXXFSk`cWPu;YsmX)R z1=@iu@K5a8w242tSvEo&rZ#3aEsrq#<`2AA^KmmfaAibcoKph0X#`=pt#z(T(@(*|X z7rTdFKt3~yBgO;H4mz+gItN}cVJc3sqYTB1P6{3H>L)>B&#`F}aSjcdnK*vmq0#Lh z`CM~zxPRSQ%|q{g+Z@)P-()zM84CaQV=FmhDtV!*vV3VlUV3fY#1F*v96I>O{o`BT zH^1flPrum(nIND<;1m&0m@ol>lSx1z=I9Avf>uTG2sID@_TEv78fXf7dE>f2;`J~5 zZ*p_r3i>k8F%!rTFbL6ps7^6aSXv>!3g`zy&=xzK_!U;4_i28=>3TkW=Wp|)LpKpi zmaLmFSOp*s!E_RK2BM01wF@#PeCvDlc%SekybwFVy9TNwI|jzL-u$1o5FE&N?T8;zz)*wLp)vz)p_| z(M>%8MJ=~XV*B?FDB8b&7o97Y^8U_0;NpkA$yYajke!2U7LhRX917vu0asUpNUwX0=-!=xw4Tg-x} zL&OnFBYyCKBYx-mzt)!Bb^nspv!A^DlH%Zn=M^=V5y@m6sLrejKxa+^basSNuBe2e zlS?mZsx~!dj&9nLFCIF0UuI(8P2;lQ!&e8bm(LHRjQW_!hn5|zSQe3~L$k)=C>@!D zG-rEQ*7+D`&%2+qmuzMJLI*7yLEZz}1zJux#{;(IGl^rdS>-e+HueUB!=Rl&3or)0 z1%mg`w0Iv^FSwhlF8V!o?fFZ#?7x&9-IsD`Xf1sciy16+T3A@{nt+$d5K#h&ksuFV ziI0AEd)WPVx6W-H-n?|_tbG@qm+xD>A{)0f1=8LcNUubhcERItzPg$@S3Dc$DU1Kh1@H z@|jVJxe;>V7_E){bhM2!tD{Vzxd_G8koiBLD?kh2BUAMNC6EDg{=^s{G7vCD(i8wN zVf6q*pzT23bo_j9Z$Ub*XI1BBR&973#{Y(qp)!YhnmIPm#lUzcrD`MN}hA) z=7D1mZ_7R&HneYEyMiMtmIeKDW(840Q6!fY!ce5K(fk;gVG}Tuq>#y1wd14_(rhq|y{wSa}#E17r;dSx^B2pc!bN><55h1QZ0olV_B<^ZJ>4)^53Y zhO1ONyExvWsB>QmZ4vsopV zmr6buo827r+>oFD))2oDqKXM~A~Ew-3)`AtCFzhE<4-4#EOEJhirU{{cHdHRo|YmT z?~pw^W5HVEoQ0%wiL;0dFb`M=g)5k~<_jI`qs=!~i?i;?=e^5>kj;uZr;^LMgz%ru z01$z&;)7gVDa7iD)aUcWjj?1Znd)G5L`R7QC>bY(IA+JS@eG$Vwjg{A=oA2;DIegp z$e-j)cN7HE7OgbK;G4;1N>NK&c_N>S1)+qKDj6z>#P~p|W}dYG@PJ1(+IMhK zOW#Q6;y~#1N|X1}(E`PhMqlx@4-Hm{XIccLB=G z(uCa@NeVIpuAAz>9e&U87jD(cIp?9i(R<=BUL=Sg19X$k8W*h(qdb>DNdSrXc z!n?M=^os7mMc3>*w&J`|-#$NAq$Qgr6K3qp9-@|Dc{`e*Q!$V(sN7-k8AyQoAp<01znNnq(-sWs? z&x$$w@0-=Q>-Os}zVmKih#4Tc?Y5hkE`9h<+4#ih%{MnKyzs^OR^}ADpk+2RG5MU;zYscd9PV<89{NjC)Xx~Ry#Kov4qXq@ogZGZBR!1 zBL2PSJKW4GS-tX8kb5KeqFJK`U})y+hr}MDsmjO_91&oq0niL&0Rh(s6aURakFVvE z$G?GZZzhitDTpnYAZr_v1_;}gro|9VK&hXV!v`%ablAOrq)i~sR&YhJuKRq)vgKR(5w z-~wd=5eg62g~+@FkhIr;t%a zGkLyI{danIuHy}hK1}1hLC_1aP^*C;K0^?A2oyr5<^yCBI|uX(SG}`HW)TGNx6pTR z7yo_W(>$7aGnpcY3E$b|cnk=MtROKE#0CJ#Sc=?JEK1W7PuPUy8?OIA@3v(N2Y>wb zDHoa!ckVsH)6qnfU%dF*?|r>}O;fGlbC@ppT&w$=6n3ELtKSI*fR?(UF-V0D_q?0SbiR&E|`O{{e^h_wvb}@3TL@k-TY7 zb&$L^?$m@1W&#Wp4gzak2tLHJm4vvW2=@vT=TLM!e8bmg?*BO&knO&wL6ownt)R4tG#z78z)L31CPsV`FQs?xQSQMzCeKU zZAmnN8$1IL2m}hjQ~?0s&tOaHfvgEXu+*sAcuM&He&hrQ3L7W}TAPzp@`&l3bh=m~ z-OZjIXttItA!VRRX_TTfWQx=*Iv+-f-(ePMR=3RN)M~ib?rd04b zSs+0K6l1$4O+o{xfH%3=#8W`oSGbn{I`(DW>0U$A{37_}fP!xXHvm)tdHRqq)=vr* zKXnrj*e*cpWOIm2apgBAwte?=WdC74e&iN9GBRkJbO6ulG%ji#EQyaf$_>)%wY#4h7UFGy$NtCB)cKbAB2_WoP(uzH#&~ zxv}tT1no`WTMYyarU^WCNgR}ipl>UPrgi~k$W8S|&^R2sHw7YvTqks_ImLpK$#J44 zon4G}Z{|O{zs;fS1>{jo@Mt1uAO_-u(7h(Lfn_0|ZlUQeMb^Cg&xY@N^V1fZ4z>R_ z($u|w%dGj=-u*}U(<=C!N^~*X=1sVPy>m5lVDBwbn6r6S<;TIVGWWnET$B4M6kh|1 zIaGO&k@}KUZzVwsQ0}R%_BiFwX$nJzKuDE!mUQLL1Sq_Nz`)=I(*&kjGT?p9&I#~?%EwrK=tnGB`6zIn)l18O3xUc> z>az>9tbx75Ffj&|+O+{H2_QrXK!gd`A`4`I0+0uCKt`Z*HRRhtt51{Amj$1(qv{YU zck|%B>$p$fPgWEcLR^J7O0N1Edv7hE)+V&Y^b1XwSG;oJc_%M49iI4*B<+6WOLJ!} zzTvbBK1-sLTu`{$BJ(D6(*lrzFjK3-C1A2phJy~i*Z(KHr|)fqol8IqwM&~aQCqqS z#1-)45D$Wkfv>_2Amr3{0b^=3k(lkk+E#%%qfkBot_hskLz1dQK{K`8gB)P6XN2#M z{WU)42)xHzrjyF#a3h7-gdVAxgOutg34rMqn$99kE8qLeJHK*K-9po0PpVjS)6!pm zO}4rDvPxG0lR{ z>D6Cf6NCj&nH0XGw&K-IvNu2k*uPQFuy14Yv1?e?{s|;Z9@`%@xb&7!H zKsd#6Oz|*`Z-we1;_?uW4*eWnCs)6zWz6X_+iwgILR_xZ8T8aEE;$2*rh^45TIQaY zE;LPe;w4~|d+})&e4b>i;Ir7XB+IA@pmyoEnkWY0AP6CJkO>7JLM8x=9kmeYj`5dM z8UF;i)`UQGic!5Kz!Rro3L;=O(8|=0kk$IpAU#JL*Nz%x~7I#De8(I0(0Gv@_2O}XH+`jjJ_-1?TvVjAIB&s!PE;r zlP>(M>Gz3Oq4i_%m|_tFiJFQ`oF!=0oJK$$4Cx&DN9Qx2-JqNv#Xu)83Y1Q9BpjLW z!_xska@zw(MwT%=R3s}A=JXNyNv`@@-y18S*4L>6U|NNytKpn^nSf-SVZuxR0Oe>J z1)tL`>30bvCY&jsto55Hp`spqU==wnEu6?R61Ouv-UaMt+B6q91h}UGN;}XDc&0^K zh5m^}#N*&Y@J{iGA`+VL_~SSc@|}=LbOC!ZO_%~d z0nTdsB`arnhxr3GF%G=i``C&}s;5#78Lu?jtW4vwumX9Y4Hy8zliUO7nC3MAt%bx# zD;=nfT}|U@vPwv-m|*ac5SKx#HZN(x*DEm1nH8FjJpl;{V}JSup8*2{fPIFM*nGGI z5Nr^V5hSSDt=PWPJ6rt;ASAbx8bifrK$$+p=Gc|emE!EVV=Aiu)c-GR6y?weQ|YzU z?_(2wB*YO!5ya+8Aql}tLh#8pxzf*|(6slEq|p1*FZi4kKB)*E1_tq|?O_B`Hssi< zHz$wSOpOac?VStkJ8ef2Xas5JPp2WQc8d~9DrQi${^^n?Sir>N$NFr0EtzXTp0W1PuhWZJ;`3`()pFA1A$TSEgt0@rEvU%$Nk3>KOW zr%~{^rUjA$7a=WZaj8I&CU+7wq;B%c;C0P#;v;Edj zhl;fZ4j&{Bic%oAizbC^AI%L00077I$$&)@P)Z#ZO_!XRxDeX2hahQ2t#8i>EnxOp z!Kddq?fsK}H~m7>PnR1QSEpL=SwJ=A^jSaotdc$@w0>gG@691pFJ=}J6KA2*2G>Jp z!|<64DtRF!FxwxewA^$kA-LJCduhrXV=U?djcQ=<)+S7VF=^*7Nviex(=9X&L?;D+ z#^tFMd`^;@a1$#(Nm@tvDz(Eigt~%HIzx-w9-tu)_-UT*`2_1JR z;Yt^dNWo4!mls%=@puOIv*eg(gmNV{@9GDt(0t5-tv_?qVE3=8N_F3dZTC;~(*0l*_%B%n6 z>HT7y1`5_{T5BYMFa^-XkSV~L&fB=>@XZ7$s){1XUsKjEavd>NxTgKv@R$#VH%K=*(NKJoD_awy8~FA26Yj%p=w!9^i?h?23~5!Yrk}M-PrZ`MF!{V7z)N0K~x12}kh3!6*Li){b+2=M}N9V!x>FiH{(l z^`kSI*a8SzCw`(}6QC%j4soj35h^RYZl!4IA5E;vldbyXPQgQE4EiVFNNE*^{P_&H zl}yN7Mr08cZKOeZXwpLzwTD@L3-dCMF(=Z}V?`*+*kLfe}EbQXymv=pNku7hfvO zx%Qkw=Vc3hG>VOy8VOiYV=zt)UR2ToPwXTVu^^JIklOxP?0dauamyxL4v6chX04ON zW7nel`eE0|g>2&ubZ4(-v|$ycY%|UQiKu38YPC034$wHhla+&CWPSc?EN(eYwwM4y zwT@ZviSa446_f=n53zgbas-bWvhkA8de&EYifhwH5)h!L4F72zTjY>TfuSA$aQArk zcW<%Vk>#nDh>3wdAB{bJ?4g@KJO8R5{JP6_6i++@dJ?oc>n3u+>cNeqZBR=ZvC`?W zn&81Zhx!c7*&gP$?gOcFSyQZ^iVY0(!$W;9Ih~v96p`r2cmH5v0wg2E6jBDk=LiKF)%JpR~6{u|g23<7#OHG;;0!y z{QTR+Wde=IK^0X`T3rc(BK9ox_ecoNq^syO!I_f5@J~>v07r<`O~&BzbSX&bsj^5epgog_sVe9zKoY(y^u5SE0 z7Ilo+p^K8@ z;JZGh(b#6-C{Q`wB2nHBPWO-Z{P4TI55BY5b|S-dtWg-w(z9mG&_IbNE5g8{Th#CevL{)E4d7ac!;g^Jn3WA z`bp=4-Bk95D^;>UlyB$W%pb9H?Df20|L^j`S>L3oIi-P8<7(p3{_NQIhN8ynmU=&k z`WRwwr*qyM(ONVRNejRJr9UM>39YLV5M-LD3~lQ>djDHLTOHYTA8-H|nQoP^DsTkI zj~)8Pw|r%&(sj{4-4GV$H^!AAES5V<06j;g0{k5mjCl}bts3ZhC@ z;aK5ZzFPhU+qyr^D~5lYwX?dBY@Gm;LdK1aHunG4*ZWJyU#_jMUG23*tffgHc#rq7 z`8|qi-8oCnTm8?)p#+EvahWD2dha^i`_TJ77me+|8`x`$I6hqfXre6vhk#(B_fC55 zeC1Hbxqo(jVeWNHG@3x;an$r#+9stzA?Z{uC#X170^9p%KpKh1_6$q!U*6rB`N@NG z<`xIW$1>N`RqY_CNw72yTf3KW```!I=5B&QNG|Y*g&A!HQ;qFc1e#alU5uppd5 z)O-wh5{Ro~`>IFof6MXaC2xCC%c@_zG%PM^@XBQo0DIp;GMouA)dsZ?eBiT@ZL=)L!VpY^`WXuW2M1bK)@P}8EC3=_iB z%$q~(3b2GloXb)kc%*k=`(OQN;^^)7+x_RA3A?YHg5(sRIpY8*TAs`@U}=z_y|!t| zTQ6#u|EjfN-q+YzSa~Wg{9+v}`0eOl8NeDlY z|Cvvuu-A#mIlH=DE!C-JlAa`Q!Kw(f43(;5+&lW@7dDR``r1!4p4eq7e?QP~n%f)ev^0Q`PwfnPtR09;NBahMe01;d zo=+^vcU-cfIQL~MvMp<7g~f$UF540ShH4{2uEr&zQqM>Q{ zB}bb`tyZXd2(yWg)6s2bxq6kv?C73{|6mkx?HX?~C(TcgsEvFhlaAz$eqs*djK1?>Z#;$EQJ+F@JuaZ>nieB&EA6$r$B z=%n<;FMd(dCLslcMxYI7H&8SIMJ&4>NaPh!HVrbC%>+Y*LNM6Yni*QUxG=hYT|;I4 z+6G;|B+sl_88^Etlw#4jOejI%BK`L5Oi{6K!Inj2 zBAb&^XM0##v@jR1T9NmQ7i5{$6-sAkAf4@jA}NL^-$AR0>_R;917)zFV5Yfu{iBJfU$Al!7|q77H{{OFc7Yl(vh z-_#hydV;D|^`qkv6XPk^NR&3r%HrFM4SFLl?!RK;0 zZoKivDIXe#9UUD^f%F~kcn1$Z{IG1$IgM(5}u5 z^X6t*v>+!-7v<>e$VfITE(pct^CE;Id-j)j^vQEq`MiXY_ed2a0RXY&Qb}n5QWr3) z;}A4}1PYch6OCF(!vu}7BwBHhPJO@wi6l(#!3!K1SiXM8E)CYK^%MELXsM)H$UA=m z+`d%KYN;ISz)&Q;$12snen;RKjbnm3HxQ_E+7YK5JD+G-zkWS{o{$q$rSNoq7|^GF z3DGXLY%e8)(vo0zvRm`X{s}rUDH&O}y2zT91(q$zNkh>|F6X4F$@ws}LxvbOZ5|5` z4=!J+b0LaB%iz?69~%GwEUCrE*0)xDVgwE(X9F)O#Hqmv2njJrBInK}s-a4vc7mCL zSYf0xYtg31gTmD>st&hw<|#V$*{rC7cC?4;eO{fQm9l4Guqr1^fu;kKCyfQyXD++! zvT4`U7yHN4qS2wvvgPqH>I=LM08&xeYp!UMmt5V>`R6vuf(1DiFU(0kABdd~Lm)CX z9LcYKcw6DFzW@4MVady1l5LK0nVQ{KpH75GsBcLLwI0>Gg`2*jjXhHY_bQpX7oKP0R!}wS>}ltbzgJX(^X;TzW|}tCkk{$cGj)zavAo7znX~Cd8I? zJh^8=-te}ETaI>p>l=;BUa~RFMd_U-A_76eVWW=lPqDnx03Zzpj8et@G_L)euLfvo zVj#QY)vx)`O?&VCxwkBalCMRg9pFTdc9#M41HZdh4j!p+{{usm%bruw`m-A7=(561 zGemOb6>U5l=#HG<6bG00c=q z*B3fzAuIUA{RPz|DC+0m;T;;4hKBEb*$r>J?(sW5_IKyNcr2t>@Uw_S2d?1RPSSQ) z*SxEK_}#`u*IlT-iUf(`2uU{8ELb0VuBTrmE%cLvK{fe#LipAaW2brn5={*5|Lzqx zT)uAGoq+Nzr|_EVALKbfzC3{@u1{+!c{S;|J4hF;sDDyj|8lBP>c+D5>n33;cDVyz zEtM-1qoryUc}@VJTIIPwKCX`RnaWM9LanWO5t50jNLt{hF7=x>0jhNXqChhFGNBQ~ z3DJ1>h?WiyxgZpt0~ER-}zh!gGK&tZ&Rbx@C05oXfxPFHK9{c!iHrsFjmE$~6Dl zsitZrUWm(38Q$4__?FB5Ph9E09~ggbn1JU1J$0Z0430ecKR;?*{KhLxsh=`eG5ub2 zdh(yj?p*>H@BYq@PYC}&YfD(=IYM$`usj!Na42e#uwmnZ>+bv4T-!N|G_IVPQj@fR zrwa|Mc^^+y4*u}6U#|>p`SOdeZtn%28z$hyV0kXk4{z_!0ZW>f-}LLVFa7v?eN+Ke z>XJ-L_fOp!NRoidd4M-0Ed9+c>p{!Q~;LeyDoq8{Ht#Hph^(n ztBJi?ouY;IEO1(fZd!l8m-_dPAY0(r!|(s{iTjZs1GWJ}JY)1c036T-oYQvJM}DPa z!=JvwS4Tl(RF$-VBwg5$sYZeT)jIijB)(U0*=9x$d}Z6wd*AfOs?meM!Dn{$KMw!_ za=>Dd;F4LFeDXJ%mcIR*xYD02zmZb=#>xIkDHZrnJtyMM1eq4fLtA@$?tJ-2qlxZY zfL*}YGw=L84*&-=0V^daTt54<|N4c71=p|e{QJP;KtB*a4}fQu#5e@nfi)5~T+(&nKfa@B(a)`kD?{KbC&{#t z>F)zY5FAKAkZY$ru&MXx1Mm8;>c|tf1KSd5So%Bwo_R`MOYZ{KAmN7gbsv6h%gSH8 zRB@t_`2|U{FjcvvOoxc2T?YkRP-OJ**LU?j`oXWnrQQdC?Laq{iSs-Fe!5y90J1ro;Xq(+VxNO5AFWf zTS2#49$pVHkZ9t1^|F2l1)k{>~i1Op|2j)cr3^?E^iNWT^S?*V$ga;bdA%e zgc3}y_^=6$C#quyzqI4{Bfs+P@uRoi0hsVP3Y32OtNwWnkOYA<&H#8|AQCr~yz%igVk%w1JX6hL8ya{+VjK6;JY7Quxd1y8O zGyvI?B(6>XBMBZeJ0GR;A~ltL`y3_94t}oF&Ye5u(MKOmYlC!wi;QsyWK%hK-fVh= zwP`hD1Vg2VkiTyGEE9m_5&zJk}zaKzOlCPL<aL5?76U`u&n6OYHf77m590|0`+#{{3>AzK_;__rI5fdi4C?tNcGg Z{~t#Y)0yq$!_w)UI^UusV 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 diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_16x16@2x.png deleted file mode 100644 index fa1e0dacdb6058bdbb640d6232c7b1af718570b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2112 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 diff --git a/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/Frameworks/Sparkle/Resources/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png deleted file mode 100644 index f44f9779822d5b6d66a8c87a3160dc9e674b331a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6076 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
  • g9jS2AUi5e4RpWp#?wg346R~Cfy-1oU}0B_() zCTuz7BA!g1v*OW$EspF}#{x~XGQI=9t!AhQK)h<_@d{4y!=yT7B!K+zraqnmM7pow z$tGwxs8DM_6>q>)LlgrFTd!UD9N_m)z5(^e@noZ9uUc~XJ>OQF zR3nmVqXKfEwF@;L3nFrR9@#az`uNj;tvty{Hk;zfCO7F8&pLb6?e*O&7r3}s)BQ4S z3-Op#ir&?4{&vIYS6>fUo@AuEohP0CA*61`+3%fw<}Dw0HU>@nI4}s_1er1hrmW&j zn58)KuYp~+pL`kcH=Y8-L|L8+Ts%3iZNq;Z2D*=MkUI(dO2NitUH=#-14L)$? zcP4vp_$aU&;QurO1jqoVG%tDWJ6o2&?JS8JjmBdYBh=Mw-}~Va)?>m3iX&_G4*m1p zKPnDC^i5y*-2agVc+~-iMU6|I-L&Y6i|e{hUmB!4Qi!P;7V?BC@x-=~$)4Z;eSF8y zf33D~3(#9#!Tq0!00u|{vw?F>s`b5fou~f1apBAEYCh!6_ct$n{e9WF&$=nqe8e?K za5Zo|&pM^ptH_#&h0000 diff --git a/Frameworks/Sparkle/Resources/SUModelTranslation.plist b/Frameworks/Sparkle/Resources/SUModelTranslation.plist deleted file mode 100644 index 74db0ff07..000000000 --- a/Frameworks/Sparkle/Resources/SUModelTranslation.plist +++ /dev/null @@ -1,228 +0,0 @@ - - - - - ADP2,1 - Developer Transition Kit - iMac1,1 - iMac G3 (Rev A-D) - iMac4,1 - iMac (Core Duo) - iMac4,2 - iMac for Education (17 inch, Core Duo) - iMac5,1 - iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) - iMac5,2 - iMac (Core 2 Duo, 17 inch, Combo Drive) - iMac6,1 - iMac (Core 2 Duo, 24 inch, SuperDrive) - iMac8,1 - iMac (Core 2 Duo, 20 or 24 inch, Early 2008 ) - iMac9,1 - iMac (Core 2 Duo, 20 or 24 inch, Early or Mid 2009 ) - iMac10,1 - iMac (Core 2 Duo, 21.5 or 27 inch, Late 2009 ) - iMac11,1 - iMac (Core i5 or i7, 27 inch Late 2009) - iMac11,2 - iMac (Core i3 or i5, 27 inch Mid 2010) - iMac11,3 - iMac (Core i5 or i7, 27 inch Mid 2010) - iMac12,1 - iMac (Core i3 or i5 or i7, 21.5 inch Mid 2010 or Late 2011) - iMac12,2 - iMac (Core i5 or i7, 27 inch Mid 2011) - iMac13,1 - iMac (Core i3 or i5 or i7, 21.5 inch Late 2012 or Early 2013) - iMac13,2 - iMac (Core i5 or i7, 27 inch Late 2012) - iMac14,1 - iMac (Core i5, 21.5 inch Late 2013) - iMac14,2 - iMac (Core i5 or i7, 27 inch Late 2013) - iMac14,3 - iMac (Core i5 or i7, 21.5 inch Late 2013) - MacBook1,1 - MacBook (Core Duo) - MacBook2,1 - MacBook (Core 2 Duo) - MacBook4,1 - MacBook (Core 2 Duo Feb 2008) - MacBook5,1 - MacBook (Core 2 Duo, Late 2008, Unibody) - MacBook5,2 - MacBook (Core 2 Duo, Early 2009, White) - MacBook6,1 - MacBook (Core 2 Duo, Late 2009, Unibody) - MacBook7,1 - MacBook (Core 2 Duo, Mid 2010, White) - MacBookAir1,1 - MacBook Air (Core 2 Duo, 13 inch, Early 2008) - MacBookAir2,1 - MacBook Air (Core 2 Duo, 13 inch, Mid 2009) - MacBookAir3,1 - MacBook Air (Core 2 Duo, 11 inch, Late 2010) - MacBookAir3,2 - MacBook Air (Core 2 Duo, 13 inch, Late 2010) - MacBookAir4,1 - MacBook Air (Core i5 or i7, 11 inch, Mid 2011) - MacBookAir4,2 - MacBook Air (Core i5 or i7, 13 inch, Mid 2011) - MacBookAir5,1 - MacBook Air (Core i5 or i7, 11 inch, Mid 2012) - MacBookAir5,2 - MacBook Air (Core i5 or i7, 13 inch, Mid 2012) - MacBookAir6,1 - MacBook Air (Core i5 or i7, 11 inch, Mid 2013 or Early 2014) - MacBookAir6,2 - MacBook Air (Core i5 or i7, 13 inch, Mid 2013 or Early 2014) - MacBookPro1,1 - MacBook Pro Core Duo (15-inch) - MacBookPro1,2 - MacBook Pro Core Duo (17-inch) - MacBookPro2,1 - MacBook Pro Core 2 Duo (17-inch) - MacBookPro2,2 - MacBook Pro Core 2 Duo (15-inch) - MacBookPro3,1 - MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) - MacBookPro3,2 - MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) - MacBookPro4,1 - MacBook Pro (Core 2 Duo Feb 2008) - Macmini1,1 - Mac Mini (Core Solo/Duo) - MacPro1,1 - Mac Pro (four-core) - MacPro2,1 - Mac Pro (eight-core) - MacPro3,1 - Mac Pro (January 2008 4- or 8- core "Harpertown") - MacPro4,1 - Mac Pro (March 2009) - MacPro5,1 - Mac Pro (August 2010) - PowerBook1,1 - PowerBook G3 - PowerBook2,1 - iBook G3 - PowerBook2,2 - iBook G3 (FireWire) - PowerBook2,3 - iBook G3 - PowerBook2,4 - iBook G3 - PowerBook3,1 - PowerBook G3 (FireWire) - PowerBook3,2 - PowerBook G4 - PowerBook3,3 - PowerBook G4 (Gigabit Ethernet) - PowerBook3,4 - PowerBook G4 (DVI) - PowerBook3,5 - PowerBook G4 (1GHz / 867MHz) - PowerBook4,1 - iBook G3 (Dual USB, Late 2001) - PowerBook4,2 - iBook G3 (16MB VRAM) - PowerBook4,3 - iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) - PowerBook5,1 - PowerBook G4 (17 inch) - PowerBook5,2 - PowerBook G4 (15 inch FW 800) - PowerBook5,3 - PowerBook G4 (17-inch 1.33GHz) - PowerBook5,4 - PowerBook G4 (15 inch 1.5/1.33GHz) - PowerBook5,5 - PowerBook G4 (17-inch 1.5GHz) - PowerBook5,6 - PowerBook G4 (15 inch 1.67GHz/1.5GHz) - PowerBook5,7 - PowerBook G4 (17-inch 1.67GHz) - PowerBook5,8 - PowerBook G4 (Double layer SD, 15 inch) - PowerBook5,9 - PowerBook G4 (Double layer SD, 17 inch) - PowerBook6,1 - PowerBook G4 (12 inch) - PowerBook6,2 - PowerBook G4 (12 inch, DVI) - PowerBook6,3 - iBook G4 - PowerBook6,4 - PowerBook G4 (12 inch 1.33GHz) - PowerBook6,5 - iBook G4 (Early-Late 2004) - PowerBook6,7 - iBook G4 (Mid 2005) - PowerBook6,8 - PowerBook G4 (12 inch 1.5GHz) - PowerMac1,1 - Power Macintosh G3 (Blue & White) - PowerMac1,2 - Power Macintosh G4 (PCI Graphics) - PowerMac10,1 - Mac Mini G4 - PowerMac10,2 - Mac Mini (Late 2005) - PowerMac11,2 - Power Macintosh G5 (Late 2005) - PowerMac12,1 - iMac G5 (iSight) - PowerMac2,1 - iMac G3 (Slot-loading CD-ROM) - PowerMac2,2 - iMac G3 (Summer 2000) - PowerMac3,1 - Power Macintosh G4 (AGP Graphics) - PowerMac3,2 - Power Macintosh G4 (AGP Graphics) - PowerMac3,3 - Power Macintosh G4 (Gigabit Ethernet) - PowerMac3,4 - Power Macintosh G4 (Digital Audio) - PowerMac3,5 - Power Macintosh G4 (Quick Silver) - PowerMac3,6 - Power Macintosh G4 (Mirrored Drive Door) - PowerMac4,1 - iMac G3 (Early/Summer 2001) - PowerMac4,2 - iMac G4 (Flat Panel) - PowerMac4,4 - eMac - PowerMac4,5 - iMac G4 (17-inch Flat Panel) - PowerMac5,1 - Power Macintosh G4 Cube - PowerMac6,1 - iMac G4 (USB 2.0) - PowerMac6,3 - iMac G4 (20-inch Flat Panel) - PowerMac6,4 - eMac (USB 2.0, 2005) - PowerMac7,2 - Power Macintosh G5 - PowerMac7,3 - Power Macintosh G5 - PowerMac8,1 - iMac G5 - PowerMac8,2 - iMac G5 (Ambient Light Sensor) - PowerMac9,1 - Power Macintosh G5 (Late 2005) - RackMac1,1 - Xserve G4 - RackMac1,2 - Xserve G4 (slot-loading, cluster node) - RackMac3,1 - Xserve G5 - Xserve1,1 - Xserve (Intel Xeon) - Xserve2,1 - Xserve (January 2008 quad-core) - - diff --git a/Frameworks/Sparkle/Resources/SampleAppcast.xml b/Frameworks/Sparkle/Resources/SampleAppcast.xml deleted file mode 100755 index 1abb2c2cc..000000000 --- a/Frameworks/Sparkle/Resources/SampleAppcast.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - Your Great App's Changelog - http://you.com/app/appcast.xml - Most recent changes with links to updates. - en - - Version 2.0 (2 bugs fixed; 3 new features) - - http://you.com/app/2.0.html - - Wed, 09 Jan 2006 19:20:11 +0000 - - 10.7 - - - - Version 1.5 (8 bugs fixed; 2 new features) - - http://you.com/app/1.5.html - - Wed, 01 Jan 2006 12:20:11 +0000 - - 10.7 - - - - - Version 1.4 (5 bugs fixed; 2 new features) - - http://you.com/app/1.4.html - - Wed, 25 Dec 2005 12:20:11 +0000 - - 10.7 - - - diff --git a/Frameworks/Sparkle/Resources/Screenshot.png b/Frameworks/Sparkle/Resources/Screenshot.png deleted file mode 100644 index 19c755d449e4883e0b4b06de89bc105129ed5480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45473 zcmd4&g;QM56E==6AxMHJxQ0N0z+#KLhG4;E7q`WO2X}X82^I(h2o8&Ta9P})Ad5?Y z09o|M=lj0DTXpYWa8K1%?KyL%yPxi-XS!zQM5(EK#Cu8k5&!_;Dagxe000;;005m8 z8~y1Cll3+l0PyTuO{rmUk z=H|r21QLmypPye?SeTiaSzBA1ot<4>U0q&YuB@y)JUr~~?q*0z(>={TN;UMrTp95T{QjD+qJ&9G!+1!<*k6a_O-Vs zTTPP}kMb1{HMMo8kB@540mnycC{xJkWa{zZ_Dg_{Zui6cQ7M(?huhU>;Dqs=qvP9$ zM~P0*&;c+YIP^W^SH{>-&K;_>#zaBpw_ z{(QhLt$(f6|2>2418VWMlie|YmPRG}Xn(prR_Oq_&Z)kA`%m%i=5u-J&-cbZ%~`0> z0qoiRTk(BoKb>iT%F}JFt<$|VUrnhW9+0m9E;D1@f36>Ta_lyjMs6;`K6fN!+bxPfRalZdP&}&oF z_UmmyHtV^~t3a)++a80~;V!1CWwXFa{_AkBa+Z%NzL`DF1A)`j`8KpHBd-gxU!2$A zNHUGR?h%zsTUOB7JPwp=oEDW%zfi{~K{b&Fs%2f6R%#+;Q(Jv}@zM7xFO*F=+K0tH zk#1fF$zP{7pKuKnP=7xEL1_%&NV%cra1|WkE4w2{swK~Q;N{KN@JfU>o2Bo@y6_C9 zF9LYCM6JFm=?YC)2(94{y5^0fwfg#S5F;g%IRR`heh3lo#MQ1)A>~p?n(-%gaSAKP{bm@V%YcQoxq5`73wy@G8Ngxl(&fOtVR# zg&#v4+t*ulb+0C=MeQKp$a7SON7`LavXyR~1bLD@xoa_as*tjUBk9Ak!)NTG&Ofk& z-}GMdlJFRFF*ENp>FgBRmu_nbi($Z1N2;@5KQ|p2#8rZUFsAlXOEQJH2d-U$`#|PU zR;1g`x$Ca6=UE>P_55=w!uTK@YR-;--Kbp-t0}FKw)B+u>01gEP8yiS8jC|z)7Mr; zWY48M!!w#C{LDdF!RZk00Y@$gO&ul;alRxW2|q{76(4@0=TcnBnc}$_f*<}$(5s*ITuPmBvRBbA>zI~Ddn$_KxBSXp975vn}rIYHS! zhBf#2P%!GUU1(tL5AA2@{?~%dGo7-p8T&P*GM(VbdgyBRzl-D7A#bp|bH7l9M5DNj z#2ZNEeAz;x5Yx3)-^ia3Sr&7uW=9_)x9rVvZIGH`Q{&_7;!;oU8j;9tcu6&d7?|%i zS&Jzs1buDsKD>G%P569cZub3+Aw@6Z4JK{QQ@bNW6Q(pqX9M|SquK#)cW=iqHu_@tmsV0-U5g#Fc zx-D@12rrk)F+*CjlSFi;%lR!}V95_wPnVU2lR3JRVCS3ts6|1+A|P>jN=N&o4`)Xk z7iW4F@5{n<6LApi|io72DN`y#%$0$~4(W=Q_P_R4NDyfnaMdPtF7*#92i)NGE>k z{5FXg^Plsy-lDhH#Q=Gq%Q+HGj4;-l3}c%lqH*~C`H!F zfETSZIAJIkuL_0o^7a*jtr+As0vaSwR9po3!sc<>aldq0T$$;xy^}+|gn5#qv9B`L z6V`0NQOstv8?O%#0E;k`(Aep$ky`7+`>yjl*sYU#YlY4P0;bRd2L^FO@-}VSyi`Y6i|fLY%Mj{oq-}ZkVJMUWokC`wPBs%iF3A#&}$0ol>{7h zJ)?g~{eInCxx~^mS4T%V>MF-Iyv867gZj5_Gs-ey+NRQ9LRCfnbq**#l2Tpa?)ud& z-HKEz;U2eTax@;1zqq#gxy+L(MJ{5bu7`=`h2lMgb`R!W6R|zgSwZCx>+N(y9=w$l z6-cJIfsm?_8x~@Y|t0YZGXC11y1@3>o%cudFl;ciC$5f@h$cEWa7egrr zY?`yFr5~mTzMC=_a}+EZ%t^Y%f3r5hCfeL%4RYtw)6EBp7{(6IR#e183WDngP6r5q<9Vl@m`i;SJ$(Z*$?U_}z}n&SON|4vR_)ssZKc6yf1Iohe5B zvdQRo)+=((hABn86?|A$?Ut-b^3ap2)|#3j4QbG1oeilr4X1jS#~_Z^y=hh*vdF1K z+34xf9OJV$F&m#bTsCo;l?jOP)(SD1eNS;9RXt^F#zYvreZ#Z>7&3A1u_Ww|VADew zF!aC>lsoLr>NXjUroE+UT{C@bUfs92yzxHUAGgF!2btr4YmuTOC9qzN*wwwi@UmXS z6*$j(={Fyu-B>n)Dsf?9l32yZWtGP<{N$bZv#Zx856bBn81@;I=g@rN^U8!@67+So z`YBKw!+j-g<=z>N=CMYI-eGQAByZ#l=sK7>Zp$dKzFh?{ds>z~b+P|+xG?z3hmyLdsrXC$?jhf(r)c$jXz*!w-GCb%!H z(ukno)RTWO-0ZWP4z}@@yG?yLVpng0r?GO~2Gf;`;`!wHq!&f(xfh++%76gZuhc2H zjF-eKtH3=1V}kw<0sod1UP>*p8-R9cpYPAm+vbgnQg?^HSakwWk|l7LSkgw=zOWp5 z`N>=bp~#sKb%^t^XorP1YXtc{e2;;P#;@Mh~yy6 zn$_k_A@OLrtvA4lyDamTA|QZNxLuO?*^^J2<%fl=(vO;GPT+PgI3qP+XD)XxURrt$ zYr7Tp-*v)M>tXF^`5g<>F>elH#0ob5`};b%fRd%7{9m7HtDv)3RhW6rKUo?bSJr2G za*U;ONOrnn;pgcyHOB|7CUK9}L^09WtABVS4LEMFS11Pcd_Ngu>-=5){;$;^S@Yt< z;MMX&v3G|Q&%)||CZMsi{Y*En=U#B}`Z0b>&W3IaErlLHZK2)2=YOXF`VnTxP!#Xp zba=RWf~`r*T`l7IOQlCR!);x|%*Hygyqg zcwP_9`j))_xOATI0HZ>l7D5TU64tz#>)f=ic!*vG3+Nt$wC&)un$dgLZ@wEe|JxilJ(& zevcx3x2;+YyeAv~t4lsnb6P?zkd_QkDK0(IP#GHt(K^DH%G^zlNoPl&d}de?AtWUq zu18qj0lV$N4xR#Cg4X-sD2k;HY=tNh+u1ops7LbNbmK3&ND(-Vc#K~>%zM9 zA$34TdF?tN?sp`)QTU4r7+)K#izpy9loO^&*+0C?RJBeNYT-G0eJ=xi9eUVV<3ZMv ztR+R=?_BIN=WSV8=_5+>F8+e4NycqG#Ol{pQ#;lJ?FfDS4-jg7IH<$wg#GF^zZ~aQ zsZb^N+X?pu+=w&A8B%S}*P@_NWBN!FPSwy$hxh9=Q!r$ z5yy}@f`R5fxR#f=g?UD#iPu-9^m}iJ1mpZSXnRlMuAd&V`y8j_?ORr$T{^NPcfqXA z0%gh#{HSVLUSa_DXVR9H4TGM-snglHInpVssmr-U5iVgH+D0{ZTBVVZIzXRvBxO%6 zbvbuYEwv-;vYNV7lx{5UNusd8h06gi zQsYMZfw}|;JJwz3f7Y!cmzuJAh;`dqN#HtOOn-BLZ@UAvT&;zCr6D?m*pguATmKaiCQUHtaeM>D5Qs zQ&Zl6n1;l!(~uD$6rtcTav~s3`qqEG{A2|YuLBa?{e9U(b6o*GF%dGBtzM}BUk&(s z$I%nqQzLZrpR{;~nX+=WmhFCgo3EAAxx_vSZSN=KXtWX%|ARAr+csRC&HEO7#W7Iq ze>34oi3oQYaq;XLmk8S+MIi8DJaW$wt5X%}_tWGX+MSV5yKcMa-o8Vp+HzfTLxB*a zJyF+r`C%`m%;$7u6LqItr6N)owq=U?VPNWp4%~gh5usAat%AAbG6Hveiy*i&>>iQpKI`>=gpMRn?hw>=ASdo5ZVD zmZgBu3b*$sI`%sO)A4hW5#=`#u)gZHI#aKOaOm475?z^WoomD*v=cZ~?;>9X!Ob9T zA}Wrs)tBabrWujvH7f)Tao-yen_@1(P&;7+-?(XLg6YD`f@)u9#%$EsfH-MSvOsX4K_y*!0y@Gr%oLa#_CNIy zb4UeuJQZT|JJP9k<+SGsiMdxNK_lXP5^3J$($qs9i)>GdWYPBNKPR;3j{gchQyI4g zyR+efneu-CZ;xGgIbs@p8Z1$3da!vN^8Rz^Q-j5^AwO(>j{FO-%60(miQdtq{S0B@azEEikb&|sHT ze?qQJ|CKR5Ma~OyrK=cxZMNsJAz&r6VA_l2|MXM{5>Ig7&E8L6dpDs4`vf)j!bHfX zCLuFw>^W4;n*SO@_*3~12ST`yHtOEsZ^uv6czVZ*X#m;nq9FQ~>?sAHi)xjYDDEdu zhy)=AY#|(c=8%A$`nJtock-h1tFgkffYoBviktJMJH<6$o9vlsI0EQw}L&&P{X zBh0ZIymTy-&anrN(* zXl97zIJVD1_{V(bxY-}?T;oD?kw|!)wRD<;A7XMY0;3p)y8j@vT{|?Jeq?)R*Yeqi z;|!V;_PleD&m!~k4I*uD>ZUqVU{o;T$$G6vP4Tx+Kffj-exGMdCr_qw1=Vj}F#10G-?QB1fJY2|nKGbAK zSX1mSnROC}CBS099Zc1+dbmiJu_5GQpUa7ezZUJTCQ2+2`9s!Ab^VaoK#WbN9E=>1 z4dBj&pT1M>~V2>e5-0T0*v_Bw$8DdB?9Y7H;Z5G-(@vJEp>q+5aF)P zr>Idrm;@R!QSV_Vp~?n$Y8@r%M)r=3!@xUaT7Vk_;@*$EaZiZF#c%RI94^G$;V^1( z*{HK&({FM59%Hl=ZF!e(9ybRx6g(Cl$K{~pGNct?mwBV^h8j*QGgRovEWx5I@83I_ z8XSzY=d3XD8_^%^-v~<|s+le?r#rO2^v_Bj8qIsLN_KSdK%E_k2httCV5s6X2v^F5 z6taPLkX(&ip~6E(+j%3I2LEEc6ze#1-H+3s!B!4MH}Ha?7A=aaMPrO};@lfFYjNt} znA3`|e;@QO4TAOE@$o%cEDgy{puj`h-H#54$Aj)ZOyQ zg~d@^Q**{zL$RN)OGW56&?V4?W=}CHE+$!{1cKGJGjC|2}m6;njj0K4d5( zoy4zFyV(7KBgcwC z=#pcBGe<86rFzo`68>An7}Zr-ZIU7KBFc1MxEqetnE9om{&B&rA0))1MjR1Rl0y^p zK_rReyG}QJR)|ZXcxSd-`+f1xZZnjRDR4Oj0eD)=LTw3|F6z~n3*izVj9t!)Hg;q; zccM$Z3rdI2JvX<1r3L?{nkpzfJ6GH{RzFMJCb0 z%gfg0d6+x5$oau!s1F^kKUBm68_EcB>h>@?!|&n!^%(ijAzJSR;)oig@Lr`XtYpVZ z9b+b46lh1*2L*-XdtxDyEC>KwoJcjq^$wPmfHz_AuekfUYu z6cXj;-p|3jgAuf&;nMPkzU6&m{>=1d%qOSF9G;7H^Vy@hNy_cd8URsjXf+aO zT_6fsy4zD9()6>rP8@$)4sI7N)c3EW#(_0!HfGRa=AV<{FS{U>)EVfWG85gjxD1t3_pEJE9G8e#F?cvye+O|;t0CXh{sTm=0c{aV+59-{q zLP_JQ3FU(Q|D;VVvC<6(1o}?Fm@{>u3FRMOBaJ)`j49~EcDFw@g%$hi{k`Hb#*H=V zi^GcL6*<2y@;SREa%~JI6#T@>5RH-0m4qKLuvwkUfVnE*{XV<{T)u6DRN^ur+mr># zdCk!LR*;sYMw`}B{mO*x$1UV-|K~;Kii99{(-_*_U!rOina}Ib`#_w`Y%rOeUp0-G z4tveqq*U(puX_C76Q4~on^I<}fGw>sDXFNbsX-E5re3hZY|4p@|3&qN%LG5qc;Vfu zHGAnFFlIXH{*VhMHtGnps|JD}}_$xcbf%ulbU6g+}|8Ld7p{By%yB&Tw4pS6xI3j)|79?=U;a_g>N$!;|z@- zUw92};`?|C#01andSs-qp_f)55KSq0{K&}d=R4_bG+2mfG;+cPZYDHi)1G~>S%}7w zSZnz5%K?X|#)4am&i06Mg}3jY@i^<{w;{`fS*p%#=0Zo=Zb=i@rwlFh|RIeq1!4EEVY|;+KC0?xNC~rhG9&YZ>fYXKDU` zxQRdtNrHD?);Q-Fc(Qm-nZ+wlu)x0K_kq|4f{|*)Ma&F|p_{hh_Zrqoe=5t1Uc(kM z-d5NWP5%j9s9X5K{4^|r$9Aas6xvDL74VL-9G~Vlo@O(YjB5~*z-zdkFvNv?{Z7iL zy3L8Wrb=2zAqL<%7-c!wJ4|x9V*Cr2W4D+QJt@N$r&BNwyjIqZ%Uh?%cB#tw+*bz6 z?%Utr>U7qkItAkBYxfbsFh3n&3U@pUY8*kdK4uT**Rrt}{dSd0{A-OAnuXap@nO__ zizpA=pDi4ioY1rkA=DyHAuI|3090~i7h;<{h3xXGFD@n zp%arJM5CgP(SJ_Rp#X_BP~yhr+{J*QXe97p7r{tv<}F$1jtejaq0%y=h9YQq&_3Jw znSy2Wg_uN$>xEyc92pQyxUD*;)N-|UStOsY-I!<5bRIik`F4nU-^-GkNMGOb6+`kA zBPLbBPLHMCE17<}A;zLtc!Q3xYe0md6?zJmyL^U2aT#?n(xS(uX*y)bYVpFV_x%C- zZQ(?05F_`XTQ^8VGgQ5uj8tUOM3GvG&H)Onb=|HOUb$H(YUkEbW+$UXP;y-O_+#{d z^2)&t^8@c;AvB%iJ5-3t9octKMwSG1AD5a9XHW*OR!7a>og22Rs@UQS?K*>dCO65b zbPNQxved6-f>rOsE=-A?XI1wLXb#_kY-})0`3QKDP=HljwuDORLn_ z^9q0;7|j=r>a&@F#`38QVE*iTbndy=o9pq`8pMXbcfS`V-6#nQi)R<-Bd=m3P+rik+FoLT~zEawt zi~ixbCvqT?`G1jpb15vUU~tO%VcYZ{zlc({spNoD+hnSIAc*QO3Vm5UTyz-K7!z;?K3Qn)Xe985%wa{KNbV0AVF`vEU|!Br@B0_ zDKhq_jzOLdZn7RX6)dOI2{XK=9HMG%Y=YC-bhSfY!x0OGln^`Dow)$PJ1T-7t6qc> z1>{q(KUu0@RPSdmY?_g+pdZCalc;X1uMgAd2Z=gmNiV`EHA%K?`ipD~-i3%`qDNFL{6 zs)tQ;sdot^z>8&C%}NaqbZiFS8gq(_7ub$zp*6AI2HHMM95wD@CIj&DLYZo1M9ovl z@@1bl@3br$x?K2McWmgXViD2Qr`XYO__jI61?w48zbvwUq`7#B_yF`VxN@=_I49d7 zfJt+IQ=ab10m-c0hJUY z06(0^@*wI-w6%4+&Z`c#_Bno@T6~_JtufH1;&k58nVhYGFW{kQmuu^OSa`G)&wHIH* z(l6-Kpls<1*ES^5L0SjtB{TbK-__pCpElaynF?uTj++dE!XdTg&B}h`<0rq6?&hfI z5;K$=ms{fj{KJ=Y9E^Nm?m$ihuRCv%~McE1dTIN`&GB*?5W;2Gnk*_h3)qp zG=v&^L+)17z1gQg>-e}c+aV#`aMOw~;Iv3O6)|vf9tKLHtfkE% zUhTyvE`x84*qUzf``_aBBtj4V9yXYxB6#}GHycBK!{3cQ(|UdFs+X1xD6vejj=v1< zG9QGeKiQ01{~ED730(h;fyl+0{U=BN8)nw5r7ftUPVCUBRZ+XLP&G1*q2NUY8)DFha_{JfNpP~_6T)1}q=k=_J zzu(D!fl7G59o@mmm{s`Qv`aNn)x15OT&xm{?F*H1b&+(N#P7$sKr=4fp3GX`8VrPP z9UtQFxNgoX7@03z%z7jk>8rIt9GPN#N-+SBvao&=2Q(+=7lQ5Q!k69yjZfbpVy4iE zi`z)QP|JNPF9Wg}JjKYuM9BK!LS$>C*OWXQXq*6~idpvp%0n$6f#;@SnildK+tvw_ zP_;!ZFYb{4UQy+LY=>mElRwic?dMJV{#>`@h4vIlo;S6@Y49w3#~PNVsQvqgr`&fv#9w`ORdS`jqj_eBPhlBXHf&IjCu6r zLu7%5^b_uUzh74Ei9|cXfBJq=WA<>_&sF;dMF2TlctrB-N(+=r?!1-J((pLgeuLU0 zGS=}i2(BMT#+Av#O$X0020=ONr%IhSu{-D3j5BO$iot5}{lv+P{+h}jLM37VN)*#V zSdzZ@Kmvz3`PH!{N;DHmwF1Xwz1@=7=X^G-R+6N4^AW5e4<~n!1v5oWQa5+5$rl{o z@l-kd?Mr%sdj#nSvP89wnWI3N$QUtGudZ`@=g?wx9X4Gyco94a8U36?X+y7LrWfk} zd-kC@<|&(dj=&vXEm3fHE7aQo;QA2^iFM-}WItJceqz7}WVMCM*5Gm>%<6QQXcIg# z0&Zs?$Vf&11Y#hbKnaLgqVgAqU5uG>{4Ot&M2kKJa9N8JB3Mn zRGM|YjtCztOIP#?HMrbo@Q9NkZb8w*RSaC8QUKM)S&vL4isJ~!l| zP;=-8{VJDGj80;p8bHZ6U^(r~qkBkYLcm$b`oVJog zf90QMyV-^p`&>fBZ6wToUQTF)ET&X@Z{#Cr1HIh8ZGFa6+MC@|!u#BGU)E^!jTNSl z(|zd5cK-J!IaW!_Uh1Oi5^EQ&3_eNibeNk!rv<_pMNA(LGPNVXMK^L!{14ey` zKZ+4Y?8ALeZHS*yZBY!AZieH?J9+ikq_-)1V0>YGqwjaVq479kIo=W+J+8k9Pg#2T zhnoDL;u6sb*K1v^@x5$}MP`YbqR>oGQ3U4ExC)2Mm< z1?+7lMS+cWvxU8ds2wrB8j>HR5bPwgV}{d)kgQN51itVhbd}#DdZEuQBDh~dqmgpl zB{sr{w?B`*A+hFaI;Z*nRSx{lNuYv#vKNOwO3&Qu&jq24VI6&>WFqJm-BY7Jgkr`a zrpU1Wf~HB8tG2*bk3v2xe_=<&J}jV*74vP-N6b?JNCVc|fOw~eH#mIuFc6u;g8+$9 z>OsAz?1}%a6RAGUiss-B7glgMtvnP|P>|tgswOn|7QsCVeZNxJ0WKOZ9O4or=+a$% z`I(FTpG~M2eU3j*w`7K!FhG~~&uW+GA8Fz9fUC-o#yAF?$FRIDwF~CDlex*d3 zjv{~yo8yR}MLiWvN0jb=_Mt>kmDry7^N+cUaJIt*$6|9kf2W$EZbjV=J(kFqfsO%Z zJ*lOc=G9Vb*wgZi7$2PJeeyIao7mt?^S5FJ!vwJJ=e8){pZKOQhG6_Gq!>s`v-QgN;|005eCYm70L@LWul_U%W!D2gHIC@=o znr0BU{Br~sr$ZOUFxk&qseGh*n=^>$OB4bBI{>10mgi(DVBm0h68-OQ@u7ZkJbH(q zGP`0%zz+HLV1~>=ef0cqoTl#TyA*9O$Nr6zMGZHlv;V$9Tc{{1SL{bj5d{07fC!8Usv z3iihk8lL_XKJ);%_E;7gm7I9bJ@3_*qVM$&b^P@@bo#z1c3a)~81ISu)XK zXp*=l|1D-IL|c`gUU~>{8qy%jH%QB2CMzzAM=~jV@(+Tr7J9>@8bOF4YW^!ZaF$1P zAM|(~Sx{cM^QGOvvpmF5UxTq?&z9{=ep1BY-`2w)(9D#od{5WmQ(mmi{&OG9=X@q7 z{O~s~cHR8;Az&ZEs%VyUK}YDKPsE^PHSWbGDO=l{Ep@Af13!VGA5#SRN3Rl9n!N|w zg$21*_i$f|{Zu{2&J8E@s43GdW(CxpB=k_D2DRJgM6ECARdFJ5F{*50py)J7)pA1(sCm+C3Z0aSrtU&ckvK|Gck{+5aR(1P=uZ^E zPC8$A>#&>18-_O+45W7BW5Br#O5YgX2jmBYL*2rcnLP>&zYCk=!xW0B`@VV5;*$=~ z3Y=J|RTuq_e3RjZIUl2DY2~Jj+Q3KeKYdciof{}NBZ2AS!>V$dQ5(01{_J(GRv-Ed zNisS!>HeUcn+1V%X$^~Et*or9?k6iY!WFHZ@mG=iMi>;5I4{G_E>QZ7mfg#jh3j-&Nn;5lzpVA% zGTY!s=5n=_Ppp)o`h%pw!PmswBbqM3F3^)Jzr!@8AJqunMxhSIC2?$yBB0OXlJ!+< z>jwXsROg;MYcFio6&0Q|c`QrfrUredr-n?RBcdoH8BWhw4TQpw1C_Xl*|-JLv!As# zDY1&vU*5wMpt_W)4@>jKFempvYFRER=f3X=YP*doT&`gN#S?0Iosf3-+$-05i1%Wx{Gg^f#o|86W?s-D6xP^ER6_z{M zbK41F_TvwL9z*fM-GyLUFsZ|q(B+e>nm4Pn%klqw`CEqG!I&P zlz&Q`WRD5XtTdPpG|+6VFjBr@)9Jils4-uTc$NjtYIkEg5sE?!NPx)&8C7!Use%8b zXl#;XA6|612y}rA?h9~IzUBODm%}BqWROLh8(!U~H{eyF_c6)ExkQF7HhTH7n1FX& z=DN(Adw;bmpXa#Qm*QzGDA*yU#KAkDWF7FTL&5>*$zR_d?ggAbOVeAk&#e;A6uX`6@JU7XS4MtKB*&F{Nv_2V&Yt3X5mm)D;iN44`J6# z$jvn+zxmt5q=n%rX9Hm%CW5gd#<5RyWR?J75UY|QdtJ0!D15b@NBERdRwwOC^vcb2 zSO~T3S$eQ#hGb^yGn^egt`mCiJXLs&Zcl!-@-vfA|K`?!JHPxRfo% z{kvaAk1=hwqQS>u13uo_O_UIE0v}O!N^}&SqF1XgJh^XKSEgP$T5p8s?#(ktvPhZg z`v=Y>sA4SGI53NEQKwxhuoTuk%@*@xq`dsR-{iAzIO}9`vo>{iJv5)ztaa?9jVvUvF%Y zl5+eW5aPLpxJj1*PQREe!CwV_BU+#g;5833a!_*!m4|1=wb#h46oD+$HAP|RNoW@R z9I3`NfH^e-V3&a_M4YTv-z>E-AqFZO`-HW^M_Yl=H}VcqR_6p(Tpr{wq>Z3tsx{3l zdrf}h57FwQI}UYkLj||vFFQYWP2NDih3fyPt8+VC9IzfrAfcDAiE&XZoknYB{1n>@ z8%l+|5A z+H*-~_HwZV;ug}u6!ZZ58I<6Go>?qJO;>K5(`IA}f{dywK=7*|{qaIDBQ@s(kuRC{ z7~WV)7l{dll~*-^^Z^&JR{0GwL?*Sj-eg6rdgLh={3uBypsxVYc$n;FvneujVd`@^ zdSOVCU?doR<(~)d25o`5KrG9IFAMl?Bs!|$_?~I=A>{zb$ zx031Y^#*NQ)WxXD|i5gN+WRmXIq^+xPB^&<}k$|Z5ll`z+0#H63jvgu811E9Ts1z z-wk)STJwQINg?1oq4SrZp_hmg;!?@@_5h>c?#YEkak2(NV8IT>ehs%^#58uwsG(r7 z<%*}n*3bTC=K57ZP&o5PrLj5kl79+YcS)mEcom<%%Tam)FJDb{s>lqol%^(>+xX8O ziFlh(2xrrN<}cRJ18#0we#O6riv>D<-CX$6;xMgbyip$A4N6aWs%P zeT8-~8uT(r&@z0K01;E@H;(q+6$*BTq5a(eY?KL3><&|Rfj)Df7{C1@wb;n6R5MPM z`nWOtf;K(jhwx4aAsEw|8A4N`_c*phJoNk-oo7>xQf4!0Y%3NF@-(=p%G8100V3uSvJejar7BO&FQ#;(PT~={y=##nL0)?#T&99v-}t; z9g#TzjX!)wLEoGdmKGFTl2)Vr_)U}!SVpnr%4QJQml8^EPaw*W$opp7TGilbIDuew zBJX$;m{3LA?OGDR+B(1+a9C4#7pPPyg$vjNYNjdS)-u6?JC(C#%~WN_dtw87LcG1( z4_0s*-(*PkV&O%y#kG?Cf5RnytCApAb@1zNS#=wzdc`alO5O8jxChy3dEpFcKs}_Y zo{x07xJz+o+}0IuZ+~48QMy50=3yj6B@r8#;QND??Iazr8&9+6Y4EnJo8GPl`RJ;4 zQ#~eB71s=16WQVi&-V!!crCF<^N9p~$#Gf^N1v4+JAd5+3g-J!geD|2@xgUW$B0>W zoUWaj`%Okigy{XJufdr;CO+G|%6i(9sFk`P@;~Uh91=~f{;da3MF^A8H&uzUon<>8 zDn@YS{8K8~PV^a2JbcH~kP-$XxuV$6)rCt)U{+7An3%;I4N6E#!Pis?sF7%m3-HZx z3-4j~^zfOHBC30rAvs3k&2edZm%)}GLPh+v&GP?Y0tC<&Di+R%m%gW8V(mo&69~|A zr!!ehdR7;L{G3L~W>x!gSaDI*Ks;FqxL#k-P0y{q8giXJ3OxSnVvi8(Y`4;?VRcsG zJs2DP94FVyJ*N`>8}s0Ee5iJmoKlsmicX8W>!7K4G|St`QRi_@BK3yy)r0lm`~4;B zuar^jR7x^y5z7peNzdOj@X8<{5t}gmHdAPe2JNK2LlmdNQb4sUr}$?B8@hqVQf~4s z3p~s6CFw1rH?{a*?dC}#@1nJ}qBrw+$#zSvXY{4xEM{VIO4ZdJluEXnSQ^eTA%)Pw zHrO*;>k~zr5+J?X>P0pMX8geP8{pH2skgUB4(UQXR^dN}bUzO8Z))1zu-6zlJdVDj zq7qwv=!-kDxm3I=@60}ae6`&^%FfFq{>7?OLCU39DjJ380PXXi43OLkGgp99;Mj!*0v#zYJs%(0euqAfyUG`nNRDg zK9u{|$EUPQZ!9u|s^5R}sS9rrM=(zVFj(oLAkIT>nn^Bz$?Nb_U0srZciD%OdS2@UWDp|b=+ zxQG}q>FLb#YX?`LsKIa9mnhA9{ zjQqZ(*RqJgM&(I814zQyjdC?pv8|3lFESwU1ATWo6)wJSz8U^z8J?XV%61v!{Lem8 zDH!yf*{f^N5+qv{8`1zw-+}?j_Re23t3-Z^k0eG4!EphDE+k#hFj-ms&5>tH8TFPz z4iF#}MEv_}GoZ#-xiC`VIpt-U@J8Y4Tz{y#G+HKa?lpv}H@da$iIdiUAPBq&2)Tffde?*Gw$ zqO4cb*XkSW%f-eIX0&L&n;C(dISS<|{7*QkXXOG3%AAKa_2e}B*~5Qxi(t+xv+Y@HjvSRUP0EH#$-pTW!*9O*7zI-d^D-G$TJ`7hnQ z8rpUY_9%~zscC511zY&~LmvaIPJb7oKt87{i)HgK`}S>PPKSIs3cXiE5a($};R_gt zoSS<5w;H7{Rv%kr<1eZJCLT{o2k&nwFUsztpdWGL(sV1TRHmVmaJxDxWGMrUgT7P8 z2#fgmw35bm+@E|u+tRIqx}p>|99|P6&FD!N)YFD!28wPq!ZxPy2jE(-TOMyk|K-A~ zR20%qgm5Hc6`sO=Dh(?^eA`i;gN%%;DL1>_xO5D{hINbkhi3mslYPmc7BcJqhdp0L zMQsqdMq5-?JflV5IOt%x_SuEW*bU~(&QW?E4_B_?T`eCuU#E_D)%f)9K4Hl+1AhO2 zR-*Hy!7)Vnmb@~Ll1<39ug}*%d}x;}X6*lA?yaMu`l7#K6(mGL5ReurfuXyV6iEpg z1nHr>8R6{_Jzl zwM-I}Qa9cYBF=-=cLYVg!r}6ab#yvStIN_AL$LdV{z>p>+48M(t%Z$imUlV;A}am_ zF7)jfcBTCt{R>f zbxFrv<2rP^`rL;cPUzDoTAEv(bbZwH=Bw9a+^{&SpBE}UG6slcdG5y~tWVU`9N+|N z^7edCZX$vSlg89B>H;>dH96%$vj&l!*D)}|?wJ12{Xcwi-n|t!4l(@kVr*kzC>Qa-5zNTb7d(}utp-{RtqLLvyuy}{kO+cOcXVHfzx7N~dL_$S zCtS)mI*<^iWQF7Ywy&{|$Jp&AFbb~4K+$h$ zy#oUb;rG8~M6bU|otNS)Y!W)O2=wB*>r@=96fWs_M50L{=6ni&15G2Q=h~h9!o9Gk zi%U>EForqGR3@*%)LTX(6#jnqU#3?8!_D0?c?FN(1&dt0Ms!dD562l%vb(5rN zA27=4Zd%$bD9{lqu06H-l2tNTIk9ar6^@vIs@8!es6C|TL8`?rm>#O@!=ueWl%9$yoLj+C5x_gYy5-+`@=qA-xXO@H}m?8BHnZT}IO zSM}k-H+J>4Fuz&dXs%@F>+mv+QE;1PjkBn^ktX@Iy4b}}leoLfo9~Wib2i7 zT(+hJd*rvudu$| z=n!>yCizBmM%j+5SIq-Fw59cY=vhF!aA{5|$WA_b{TBoxW?TgBJt$l%ulOid&KCbH zU>94k+NruRa@)%|6<5`Vjbv`p1SjF36K|tpg7a9@JD?>xkB8fIv<6}I+7dZ_4lnlA zW$6>YFg1qr{l4`(U>e4$+zN{V*;%d=wWzgt8W}oVRN{8FhiZb|Oa=gHoJt6FZjRQ^ zAFWb9!uSby#~5V%C~2Z=q!`j^luy|oeoky^_0eQ4ck9p|{Uak1P2)FD(!0@|M;7E$D&^ruFS2Ss%a7@g z?wpc&z}jC?oHUYi9YId=BeU|yQJPWgQ(F!hWbF&5gy@YEc^SRADm`O;O6GPsn(if% zJtkZ>-yQYc$ckzh(mpDC2i{pe1qFoOFa~6)7Y}NRdix2=&ef-Rl~4^Jpiy_;qQl8- za{0Rr9ube|k~JHcUdV0Wlv+RMMDh^-;G*vNqSJQSC3Os?^V@!r!PIj3p5hhC(;oOTmmjy1IIWn#OifX9SDf6@ak6&7v)5nH`=C(n^d{hJ2SoyyPt} zsg7M{Lo_$em$@!b#I)8uUZ&Z2^J^st$)9We7!dj+B>rG=PRqLLOllj`C!Pn^Mv0Tf zErQQs(Fm>Vrgu2Tu(CJ$wB2N3wkUzXW|TgobpmjdkjviR)$H+n$qj7OFy2Q$;exic z3UBACwxhO_L3a}hXZK1MLM+};F=J!RS7TyA3v0sNO4yaydKFnd7myUgqt&3&mdPQj zMjPu3GEw-9T*&hwGAPl;D7xAo-(5&l>0vW`;mL2#ilTgnzBBnMXx0K3p)ytYOe7u3 z_Ts>py@f-o1tmS%#5Y~{fG8rK<(Wp`Ie5*W!oE7yh%YuGZ123c)>N-C`Qq7yiv$u_ zN=(I;G6qhOfX7HX60|LpD}rjDlJCTBh3P(dg!dYD`ucz+JN(Rkl9r$bh+~TX=o{j( zP_!ld!hPnqV;qsFk6t5sl~^3(Ep9C6i_rvtT`(V2gaH~RcC(@r*lBB~U#W~Lrs;y6 zQ4nkRcf};cPLYY=41Y`8vNRBIfP=I;@B&NuywR#sfwuh9c}@hZBKmFr^*5ve%EH(2 zB)P^wJrw{}YeC#i^l&$i#;<`yC9MW|2`*^#_K33`E(!t{7|raNM-cwtl1>PCOPrGb zttY&T^AV65=CpT2soSgBuaq;;^!&=em?M6Gn=ieu;n^ciX+*5VUVI1G0kCeEu;%uz z!xKF@;;mHuSPPI+eEw}O(oh7web1xXC+N_%`bM=M5ycW_N7tp}tR5i@kB>7Gx^Op@ zG$F5*9}D`JpTLG^X>MzgS0RF&=>|RL21ug^DavDYZ0;IY5mvs8MhB!br!;1Aknn@S z&l|L{ttsJG8Z(zZ&mVn2GlDJ}WmrWEm@7d zKyY5b)s}PF?)Zxa6#SdJ4Bg%sEWs>t3h{b|rxB@KksHzC`4)(7l=#i-= z>>IfHp+)o=;@{QJ|F;9-EMu%d$QcGg9TbX|lG=p?r%ZR`EA{9RJQT#>G_+3F(Mw9KWj(7Y)qsAiO z?AmD0QPc^NbJh5Gp>pcW&~cH;-fdqhkH-O`Du}6`*whkBTaa|V=}^&8b-6XN!a)MY zhMkHvJZp%qe=DYyx8vr%PUFHPtHw9)8L%S5oocXDwZa%Wcj+T)S5;HP|4V!&j}y{??l3(Y>>VH-%g7xJ9F!dT?Uifq`u=& zOzyF1u$nRKnE5WF1XJCwzDB8-M=l2oE+;%<(hUnZpVhlM-I#|2#Q9I)@bY|RSyf>k z&oMTJ1!Pkj2wd9MXg5Q!=A*oxZ%IPU7%?HKR;2gTK^c43g?49g^8tH{%yDUyHs)8X z4PxmXv!8jsnlfoyh095O19IxOyN6Im4x6@5P*p6!^VscGX~HNqr9eR!sX3&I<22RSRgnKQA=m!oQkH5a;WN(xe=(*@c5ZJjj)K{;m(f( z`nwW;`ls{6_((jZATd(h0IM#rBdw}B|8N@G6R_0DIp}jfQLVTc;d1f4U{N5oaJ0?K zX$m^YoEplQ;!@%f>0Jn_O!M{YqTO<^c3j!I^ci@;N(t+6DBAG0i>M}%#8_KV-Sk9p zJ-8!G`w|R4y?)2Qm!J%ruq9@#$lKoed9FsPs6ZaJsPooW^zU7kV38G1=YBwLwmCPX zYWP|!)fbPdyBk+0rEvz;uKs|(7(P!I*syUuAznKZXnI7=Z&2F2sQG4}5(R3% z{{77U`E>;4%-&?6dH*fB^&MG#RKjyuAbhrJxsk{l3l>MI?QywNQ`y{#fG`o4kzRDQ zk-7UL5jQm2T*b6Q6lQtA{RQ~Yc%|u%KoyOwVd5X#m>%aRDRBeUvH_Ty4gC-&AOFZ`p zI&pRr#nxi3<;R_M&ik@1PfqoI?N_)3Dmn#_SI2uU8ks{YUx=^`9!5hd*;=90PQ9@} zp<4vG!JzMW{N3iU+r>*jCE3Fw{!B=&KK%;De|rtxamBe;+?S0$RCg!IYReCm>+u-$ z(xqje)W3XEP`kz%TJ={2Fm^ReGUeXX7q~qb;lJ%5`er!)=|n@@8-7Y!6Ob-Oh`1Ts ziSgjOU9`vauG5l z&s2BAPGkhhdpO<5lt`apR1SNT_fCEXF-GbqlBk9^@_7^QX-3_Kx*7g)sQF z1Az!XRYL@jb5j7K9cdlh*yhm#T>O>#!%^GBYru_i&LbN=ny52XMu>eUWMDoJzMpDP z@}G6g9wjv^ApK3mW_y>JPoB{DF&S_}NikWg#Pgdb8k)>`xfj!o%7i-|3hX@j`qkJB zV&^uF$smgfokDs4Vx`&_EHI6zfW&}51~_qPQ3@?$k9`e~3d1vco;?@<&|qiqdj*~v zVEJ#H1l~tG4tE(?=O~`hf>Axey^wNGaPA>H7E>LY@1~=7zm-3zrZK>aq3JJ3M<_BN z?Pm2_E%`|5#ipPU+Uhfro~uj>94nKWH7I65QzsQgrfjC>mWY-4jxCl%KZ7PV>=WSp zwH(IHGo~y56Q{uW?RTaY>w)i$^hqA4&)@}NiPQdhM%Y4-X>omLaFl_JH+yJMEUWP0 zzWE9V83#;C##if@GC%5U?0X}Uj=N^db|Vz&_EPTbPlr2v-|WwApO@L#lAg@F_~ z$rqdnc(j(E@QuRL*1Vt8NA6>h)?ZlC<%b0nf?maXykezk^-D7(<(s71vo-aQurBuY zXIxwD?^F^{fEWmz=vd`^S^MZ(mmulMIcj4(D3A-p+0|L#InG+YpI(p<7rjxjFGTV6 zicV6)LyT)>W6MU4o233Lg@mvHGz*BcFnu`^DyC+DQ0UwmZA!#;&tAto;OaYgT-ENt z*Z=@x6z=*K5>t5-^@l>N;YVqgXY-1#5KyyhJ}Q+bTNy4;+fe$Ge8lUhEd5$@1N@$V zm=g2-@c5ropifpu`rh?-kf=crX?a$gWzdNzNc9U!&o|p~1{(MTr-JGwd^lVS%JiG@ zgq{~~ngJ^Nv`xH?6UDyCrChcCw(?%JRob%8dfAY|mc*a-1E>~Fcpgh!LLS{e$=-L%R-_v6x2HNOb!C*L=h%ZuWh zH4j@2KbiC0kj820jZD1GD%v@;P_4IEKU^{B^IWqK;17}a`xunH2jWXM&8eRjP37J~ zN_e?Z68AhUxayO~n-uf;NS~zKggI@`*Q?Nx*PQACG{A0;7*bpraRWYigbYVu0=6_A zadr3kFkb9TAICFvvI6{EPKc6^sIO#RBdfxG*->Df_BUMx@C9Te*Nzr9fa#^9I8&zjz#O=X2S~>n0&CC&ceaFac0l6 z(x&jhgWALg*tv-{8=V+(X#3u&LHjO3Vb*p4?_*90n+7+cUVF>WXX_LFGj1 zFLmACuhWZl_*iZciIDf@Vm+!8Q4j)nPPUQp^<5_xqvv%)GVli~DQSkp);c1AXVo1r zTdWqEF-!=DmvHd8yJr;#^BacnPmeoRC$Lkgy#hbhm0IWydKVNoV=#f&4w3#TS|6{C zX+rlDBbBh-x1QCfZNt&mOCK*W2+gZTJD;K1a2%@iDQjMeXROK+H% za3#uU36~-pCa5sYDi6k%|}}< zc1C&w+KlhQu;>YJz@pP-(O$A>q$|4b~Up-i*cr!@;5xr5o|Hy8}vYm@K8={9&38b;=@=r#vOjnCW1@Jap0PU8d7 z2NhV`QFW&etp7%Kv1P9SfB$|-ATyLMsLHjCb_)Y3M^ntM;>N>E|ZPl$SbnRrlPO$|4?-zy!{oJ@mls)TH%aAVmg1L0Q&GhiT` z!k(Dubp9yK{oJ2RuZph7tj}iOOS^M?p|8Amo>Qp=mK6(G$?1;=pm-{`Qqr=zMy$RB zMuNiWRzG*C7Yy&V8f0W>;v1g0U%heF6<)^xYo<)U+CVF9RFo2=!i>eHgXT?n1qh*M zf2fb)2z&vMxB*iGCncAgQkM-ac&HqXIn8TFzN zT9TM7@o#g^#riITgZ+0vtq2y01hEY#)1M+^>YQB!$wTd}?cCP}9}PV!nedM`98}P; zFm?U-auv0mEr=!EYdJFkGpW(q9+!-?#Oq^+@W{e8m*-33u)qz}U=@!2&)i%hqSyIz z3_g!lNZo91SciCZ$?qC}g#>Dof$dbdC`|Xcst2P{nGoY3l%F2k)MSj_@9bg!0T+T_ zpC6<}=xO5HF*W0r;K;p%ZEFYd`~Y3X=?~BC{?x_<(>(=5qo`Xb>&q5BD;o3aPN!~8 z{PB|t;Vv!%*1uPn>tUNsm2MJEEjoxf`x~ax#rrj>t_ZiTgm>J3{#0IM+)iJhg6?Rh zejf_1Tb49Lg?-_eD`q{~JWD4TRG1*3!bb}GJOd#s3OJDz^4`H)4PiFCVRXb~*I9_^ z772W_@=H&XAgW0e`cFO?3qwF=Wr7-iAz~d^JOk3A7fk-T@O^QtdNQoMRK$3B*?|m< zfaC3qT8Tjxa;VZE?Aa*5Z3#+cf~C&GQcg<-GpD!AC~8=aYu+kYNTZk{uq%HIt~RKd zJJdNx!gb;Cm#~|pVfW1-2{TegFwZ)q?55NXP)LWZMrLmRsq3D$R_R9;V#NZP!HL0w zdYUOarXc-9Qip}m1e-~1M(`yy8SExD9MsOchLFiJ_mTq{ri4SN+xy{^gV{MgZ)R>^ zcn4uk*_^k}+waaVXEL_Sa1iizR8i1rRNaQu>2Z@Gkob%>$#qWx6&y7qRZ;Xz>ZOr^ zrUdwHpu0B#%vA9xj}Dug3>Js`Q`=edpENXJo)svk5qk-h?+sH;Cm8|>#MUkTkB6ft}}Le95*jjSq}DslgZwm zX()T8AXZM)0LOkX8ou`7^QNvY(J4bs!(K<2&9KIYSDs?~pH;9QKVc8O{SF!=HT~V5 zc$0vYswpBq1zSPWsHXKbHWbi2>pcyR;~!1g6`SxPbdS!5VGNlh*xsJn{t8ao z84nPXh_r6FZ0#y5DwkZyDf4vPUf#sHc~`kV)|D8NX0J~s6KG# zT(Reks*U(Nh7cuT$kF1&(vf_?_M-!R;AD!loWs*++(-_(m_?RMVW_A% zq9mOvw=){G{slN@(=rmq&GOO3B$MMMK(*N89aUISEs3nZo`B=mAgKlEpm#E%aThii z)Om;#)Mfu!lP0kH1@7@bcZ^nWxdJ3ZB1(0B3^u^(Sp4)&-4L|xaOY&CT8P7aC{DbX z_FxA(!SwDRfT{sqf6pNZ9Tz7cXi>%3h`?kO1>K8kuySFuX=H5s2}6#H*Qz`zESLjd zuCrL!Q{+m)BUi!=&f0`P%RW^6Tl2o!bzcJCpPB2@8ZBB5&+($24RaL+jr(JZPRx0I z1(^L((T&;JG%IwkV^DcnAHx%f*nCO|TM7KWK)0O8%k!d>6Y~AT<8pl<&J|*%j38FZ zXdxU=Tsh%Kd{Iz;k=$dkuV94BLj~OXKPJ6RNc+Nxi*VZz2vtNi!f$Ka3^ZO2-8(wb zHQv!xYaeM(txO$;*nBhdbntoG*RtrEK&Vb*Q}ws=6IX?-6A!Nq^T)SA4YLNU#*4#K zZF#HZd2G)6)#PD&Y*$JHU#C9=EY?xo^HxT^q!87P{h8g7I6?DtPNV9WdiV=BpZ&!E z@J*G_2**4SnShYuQ?HgCGO5h}IG&Z3lfdK9s0Nw#sI{Z;FmYaW@If4SC`q@qjx!Cd z5dP1mWF3~-n^oFf<%&p*;0ke~%X$wq@AdTkE~eZ=)Yb;qMPwv zxm|7T*#_-e97mM_*&oa#Rk&1W#lm)iG_;YN*G!q`Zz$D0d_H9!?Yz4;V>D`X)<$A9 z%&1SPZyEA@Z7s)X0!@?gF!!!p2IjeQauOv9IeR%_w9> zO6EE2U$@Dh@0Lki^p>3(>2h{L#VzSNpI=B{Bq01udtbeNab%!c|xV(2%bW@r*HB~0=5s*l=SR*Ug z2bWS*N>eT?uR6VljeSL8>+Y1Xu&MvQx&F!oRnhqv4du8$`fE5?y}Ip)KDG4;uo?eV z3=4WcP3r7I%K^{@uCynqs9m;(U!7OU{BWQ56_FM7KMK*M#qnX&dGVicG8g_&y~>&A z0p*mixBCk;**!*J@p4b*9>UbBydkKUHosuU2?GL_tdy48*IAqTO@Q{$n*tJ?=U^)7k);KwQ_>zZ7B+Qzv_rCA+&ppo+%?(uB8S4zd=V=pAO;% znYYa@bg)_?w!&4RI5tgFlT8&&yA8d*WBgXJ~>uo@x&6?ZP~V6lE^^k^Jz9B ze=W{veg5tpCe z!KZVF-Ug-A%FpM7(;i#pmj70)gQxlkUg|EAL)pYx2G=TyJS$9Y3NpBZVJ(zWI95G# z*kAIZ6#6{15YlGgNjjcU5D|A+)EmNe7efSZaa>$>8Z^*2wN+Z(gRXQM%|6g?J1w+_ z-Zyi?)n{9WXL0heE)?Dho317}F4c7Rzl;}6`%ixQH2q~4p>?1MS~8M~F)M`q{|O5E z7_*)KO>>Ss{lDof>0i|CV`^~o5skl@=)}3rPVP?H!7H1DfsG*s8oJ1=9~;JpwNf`Y zL{yXTp4PwkbI%xozb`xplI(nSO$Q2`11^JE-|wuFSP>~ zFF7CVL$P>{&yn7H^~FrF2fpc?7IdJeLNY2prN!rQ49y=rp>xEM7Ew#B$iiDwU5w!% zG?Jin>!1bz=5t#{7C*$k90=){?ZRhA#}wd~QbdYFyy5ph<)Z&10e}m$qFoLK^~%lb zN`cU+q}zM0aAx68j#PJ6a!i%*OF|#nIqqL2rP%+hsM%b*rhjxV362Ei~52TZSiFqWJILO_NADSQ?bK)h@rUh%ld1K*GZ zSx0gk&8i=yI3tqx&QGI0m@#lzgy^{$3qAj%{L}>UY9RP#1TBuyYV1^M;?K)95;o#R z3pw>KnALQ$-$4VfR7+%~iH5x>#m#bmfN+w#+df}nzM5Q93r$E6S6wkrLh6XH%rmQV z;;4Jxw+pqjwzOaZ#oZ**PjN+X98n+J055Rq+8liZ4q>uci{dS|7F}D{`G`!1T=~f~ z_EvIg-p+{Z3Vqwrv(ts{{8?fqlp001(1sHdfeZJP0!fBV?PT5!OtDtK-rdI+_1tNn zui({?txEqJfD_KEehxi8$o8g$kUK;ud;q(4M+x}%6SilkbOPw2WS^5TIT7J!lDybc zU|?M^Hf0(9B-y&Psa$T4c6VtQKr35L&PmTWMSE|f!%PdaR!Q#O0Q2Brpf8e8+PTY{ zzgRMYbtB^4kul<+6J(*zb!MIuOtLaM%5S`&;j%DW0^dGsmzrun9~IMC=%`G;VslUwx@!~&_`5_ajtYVSDiyP~tyxkOyY9L0~?;;Ce@K@ore)967 zJz8Uy5vOLocYz;M0y<5lC3`xp3ls?bTeyV}rQa`&1mte65IlozuJ-&8iOzZnrZbGT zm*xB{y1C@HLJL&GQU=X#&sVJ~kUh5O56#SAkX>52zhkG>y&`JF6E-tEI5?@Dmqup{m8JN<0nVjXT2s ztgJUBGUH79@}e$M?DL0cR9JqPSszcY1$K@6lNmhK99tvAU4RMexSO|MBG!~{ zL(urNtIhSrVx>WE+ZSkrd63;tX>#$OIQCL&gC)!QrE1--I@C|$4-=-RNDk{ngM?gf^OAOz^+V+p&DmcW2vjDt z8-b$8u7TSBZQDJkARZ7DI zHs&l6LF?!ekaemnHH1+_bI3yJNkAIWGO6i~q&@buIFzn{DMOV|eoaFp3daT<*Jls- z$aTJ-{d#!Brv^_;-h4Ji0xY>SztrU_msibuv(MMbsgx1(0w5C_@ahk)w`5;?1vjy5 zmEL4zB}R=|{$~JgN?QlXn8;&TA_*}-PAFU;cKjPWqN-9kgXGhmlVr_VFF_d+8zrQl zm8KMVM3AgVMFM42h`>B>h>@5{W#t%l;n-V*|AG8&tsrW$K?+tb`@H{hku@MGNHELt zT;_tBE&_BLC@`K0ob=++7l2dFiA$wuNtYFs00#j%OjLT}0o50Nk%KH2$CiLf1L0YI zaMV^L#}Ij0a@=2AhQLVW|4}DlikU7qO~G08J=wdE>cuYhUya5G#L4#vE+XU;ZzM=w zwFKDhd3`S_J&rI#QW;bj!Xb``B2y9A&3X@vwkM>SBSn6_QFmQ2tWr27&`o8f$GNLw zzwjw+`;JqQoiOvy8jp5b3migpK_}dh@P*#A+t#-#{v4j-_!u@zuEeyqu^bkO4 z^%9onB;|7yYLZ+hjd$@H;o2BO^fUv1404MOV5Ew#aPeTCQ@j>FzE%a&JNz}&zv$~S z!kcTf#FoX6hj1uBX%kfmri&HVfRp^OO$a$Zc`%+x66hgka2wm+eTP%&1$o+jl6J+~ zh9?IJf{}R2$5O5HceC5}ll4y_!MG}yjOYBj$Vy~3uFHZ34S2#!$XHV&I?7?iKK#># zYvcyLFgE)KETcBsU6Yrp9=BE&mz#I=_{(d5YLbFufI3q*G@^$TA!kvA&iIkPS?EZu zc)?M%erXMd^*{Q+OFrtPecEavRcvPLw}GA}79b zDSf1L45Gw&`FHq3%cADy-#l3ZhYy@Nh#=KLJRdxU0p^Lo0G}p|zmc5rs^{nWs~Ukh z?TJ8Idv^E});&-jQSLL=L3^JUw_GJ^zvbSsdCrw?b5KPUc(yXovyb$5d_4ylCZc)8 z;W*)9>^L}3|DZXE%d^K24GeVX{Ja#ve_BAWgo(TN0%53M1uMreO+M3PHzNzbSEumP? zPhBxD9Qy#zX)$6lBf#9~^rwj#I^Fina4IO4g8G5D*Lnldp@eF3; zB}1K#Y6^lZ%0$pcb@}b2bNa^yh7fZ$dlQfIMamz)Sce7IBj-Z?QE28;mCKX-qMvbg zHrIw}03;^D3~)TwMIZ+0bI1#BhYowoc`1?~F4--KkL><&8uRfTM@1r{-|%Y7lWn)f%s=+Re5yF4{=^*jmwXA~P$vm{Lwk_T)}Q z#{;Kuua?*hENCj}MJ9tu^8eCo%ZEEbF%ON16IycOC6O$I{^iE)rFO+BXr@9(lBN`q z7$9?;dwIZ+2=wAYtmXDp}~1bY1S_yv4L zMa33|d((SKY}fl4+2>FjXPPPe`>0b?k&N~xf%ITf{5z-LlN*1Tbc&iTL=<0pnYtez zQ~CHfe5@2V~NeqVmC zF*44`Xa8BYDha)zNUB;nqK%d3i(`Yk{&KNO!{@3GDL4+5Rc=NidmC-dO1F&ps@Q(Z zCAMPmI6Ze`q7oU>TyFPjrAu@4BuEL79ktemk-N8hV}9@XQ~HP9dPb@R?;wx!@W223 zpKRk*W2rwoZM|BJIJzo?m7B2S>fJ`O>Gw=M|CFDmT@~vl5pId;m;WlA(XJHeS-R4| zCkEvaP{F92ZMquEecM;Avd|5|#SwX#QEB_UC^_+9&}qNlFw(4J3*m>XA4`H?=ma-b zGBm!s2)v$Rp!4M4rmmc`(ftEtZkvN$IxqBXPHXRBR%W+_S!Zm&;?+XGzos>8sTEi$ zT(PjPSI-k4d%mvq^5Y4|wdu*sadkH9jSqUT-*Ego-V&5KN#$wu^AC6`6~{D*m8Hom zGfP1~s0CBBa42Hqbvb`FD-wenrF8ep3Gj=7;Ndz>g3(wkwpWx^vYq)6D1bf;xp!|T zIW!n%)tWkqo{-_7urbDK_Xt7uKFochO*FM?HAByzeVM=hNjrQz$u*ckrz z5Alb$2ay`*zmEpl`Jgfx9%4q!j_iBCo!Ep~^taw!Kqt56|KjK-rPR^+%C*pm^<#~p zmfVjXK4MEC&K1PTW26B*P6zgAr+iTTi{Exc!~GnEN~HukxNBNNV@4wo`>*c10R+FEeXK{Vb|(UJWwn+Uq~1V@Xvewy*pB z+H^b&D7-NQZH_jfq1oz0cPATs0UYhqkY(fJ5d5Q?9-&0qG>Z#Noe%ITIpqQbKem_G zBmG4&G2ETDCS;^q=qiiGG;!nA{W{BE4j1k8FX63;c8g>@;z-O_sB23an4El1VVSn< zfjN2Mio2bCPWV={6&o_d-X*c|1;#IO1+is~^*Gz{@j{*YCqlT@*?z#G5Dk-*<&2i|CoG?eq*WZ6Yx?r}Fo(T8k&gzD-6-$CL zWR3A%v`&i&-^U06KDXlZ6~+;i$>sPC@UZAN>3)9&9h>?fZ0sq~Z2c}@u{Bef=NMoT z1~J(a%`>H~RrhAohb??9g}6&(sc`(6aVDK;UqgJ!w=V!eGrsQ+Y9umZEJ1Gqyg#_G znkr=ZoAQ)Kr(u9)7Rg$)2*3jEeNsd_355h!kZ@4mDG9ocY6;1}wrLIx#m9kkNmk5| za5`M^K7yPHTEueIJOsN5fzKq{7;q@B^o9;@H%4SqB=RwEN+}O_5}L2uP50 zJl{+)+!j-?279Cc#2aFG8B(fA0Pa96>gETFAF~7)j)I30Dw?yjIUyq>;S>S95Qz|N ze0&m^EuJ+F(iekt(9WGPrfuy-1P%_glmTm!S9UeZ>SOqF6%R$vzIrU3czZi?TZu0d z5eUh`K}Gxb6E}{yBDEgm+VKj-Ph`=A^Gv_Wp~8j}c63njxa%zenHb%1!wmZGiT7|v z3gDIikI&VMmn+KHz#Ocz($4@ngkW;fKwXs*l5iJCLz(pOb>*@m%n-!8^ZrTS5Rp>B zz(4MXfNHOFY*QxLlD<5BMzVZ1b4V=r(VxHQNHww{?t^0sPi>=;S4FXbfMg+#@+;D$7;e3m;=e6EAKTA+|g00<&SU0cxjGq$pdLwR8(QQnV?K0&d) zkpfETl)6>K8xxFT-R0y@9t4$4LSUY`S|zJskSx@QdvT;L^8;Bg()7|PPKzD{);=d& z_g8m8vzLX_;sBFzmim*|yh1ICNMVCdQ=X-=CK*7|sg)q@^0%rVVWAOPoJl ziC<|3AvRIW$=!h)DEKx*8OKN5c6Vz1qu|Feg_SPWh^cj9+tu(r*yaQqH(X5Y)ZcC<5I%_YAfAE0wJH(-AO zkgH;ZL8yicT$c4tQ8p<*y9@|3`etm$Qe^_c-+-?TOBAcj*ggC-<~4!fSPSVjig3Y< zEQFoBneulPT1`Y>q1R@40Q7f`M+st1yG}ZFhsWnr4QU}OFhh+J2Zcn<*UCQcvO?F z8}*pwv4B6Gm*;223_}+Z3Zb_V{1v58xp8=y6)+`eYX#|{oWK2N$>5VkMG*wh_EU z53DjEOgM8qeorCnhYT`Pg&@ALd$3)^WsJv3(wX8aiC}31D8|I^@BNod|kj2J; z&s}aI^9o4HwGf+U%ITsy-|*0iITp#SGZ#oNn$n<8gjuS54Ih~MF?)5WKSNz? zppKy5wO6t;5hk`~kThjqR@oAaizqslsq$8T{ET+TcTf63wiz0lsNR(sx~Z1~g$bP{ z(F_O_7eC03&H&G~6T7oYRmq)M`}MdB5%!H-iqAfcAT@!&G^RK__6orf6_ox+C`{z8 zdQC*gMsd$g0gctVUNN;FIWn9TeqiK#uwf*E>(Vw$&3}@~YHl93?GJnvHDxx(0#J7? zO-Q$t|7%ph*X3$f?{aCsciX-)XjE>V)xUh$Ao<_6#{WqQjNAkM)r*)b&*Qh%7XEE> zJiSkBrkubfVkL|reu14J?<0T=c1hlH5h2}rDYG5$D@!LPGXIZ#`K6U`L%P=UWVA~zt-=ygqCsp zZ{Ix*fQD40JxaA^8e$7XW9U+L_gm5n}NhGNZ;X{@IQZatys0{9cLFYoQ?dVH04 zh?rzX@a}P_pLjT!#^l~2a*mlYVb`IS_by89E}sNl(mRG|ZGb(QL*Zp~f_R*TZ)cfjvl1cN?dK|4ab=4tS-TVh&Fvf~whUei2+)U1< z*ngw)v=Ja4uq(zEv0(RF`c$kj`EeexRn0fb@?_AisBx{iey6akEsspwqjH4W^D3LW zadBkbU|!sG1>4rH`5Op`D|oOpXX7plLM${gu$Gvd^HtX%lSrNEV5F~Gsvq&^g0l5l zqD)Ud(Q?m6w4xiOU#>q|Q?&^^{~377dzMc#)c|X8xwo8uqBZ;t08-eI5ju*T%y1u^ zB1_T{MJgu{RMg)ghd6d^ZnN(7buoE<@Yn11J~>l=9=dkn4$g!Kw2peyJOei?>#T(~ z)$u1nf?t0T!CwrL>oU3XpPm5TZ)}1ka z(6V~eZfuxXh@=0asV*SA{JE_|uPdUIjl>mDpCc^V#@)B<1O$zbJL7M8c*OqdMp{05 zXYBVJP>F3uR$WF7Hd`orD5B|xT!UrX&r`1d#r1Q2J}NW^XsyUj%Hj1vl8z$8p;XUHncaA0{KrVzKOJlqB?^~apY0QaP+~4u{8j7Y7SGN*zKROZr zTL|j*ReGq&-Pr4}T!+jf$&RK7A^&oQ`2xEle{=!GWZADQ5=bxW#mbFACXptzxF;_o zrr-0Y=i()zo3?L}@HNp*lx0zbayJ!qbduzg*pSrB7}BL3suk&NgdZ+af6`dH*FR`3 zeiQiQ5e8Af`Qn_iQ*v+VQ#ki~loPuJycOyM`PvhbCWC#ML|G!^o!Bh;ESgJT#Gf_`mb9UkGvkUm-F67a^bgFJpW3{~g;e zNyOCLBby#+q9Gsp3HpZme|&{AM>z;)O9KoA?(w`<1UH;9#Dpddbhsq(5y$l2kq*_C1 zvt}qBBZDnkPA;BW*5cS;$BmDY>Reu|ag(t{f+FDn(mxzcetv!}7isgMI%8aVS^HXA zTdMQ9qBmv6quD}U21Aqvr?nH(x<9ZnDu0n>btz1d@h&LVDl%Vn2eExjgeV+Ps3v(m zo2H7AQ4#M4S`6i$!r|q+<;m~IteU=+tJ%y|RYBa1iobrI5Bj`UBpbhf5<(%+Z;nQV z%D3nG45H>YUbp4mvF*Gy$rzrP^A(GWCuvbAhnEZ-;B!@^2)s5gOrDL`Kyw3l0LZ>D zVqrtJXdRO$#l!7L%K8;UZ|ClPfQnYnMZVt8lqGK+eA>NlbR1sKGSrkQ+l9dlXAA`z zbPguU=CAA7pE>WIezmZ0RM?Cl{bOJ9vdXG|dZ0$d@oFicy>hf!s`tjD`LJJLmA0}# z`Hv3~>6rbqh=@9BKti=9Y6@qVpk|HJ;Rim#Lb++DFaMMR;%+dt3NBwRYptfq*Yc&(dXlyd-Gx_r2YT>1!<7axr}pFY1?|gnQvIzlBp}Yh1~w@pxB1NuTGN zH*NrFNTV?LcCjJ??z=9%dNlmp%7|$5kKLd2l-s$2fY!i;KW3mvfX;kJVJ=zZVcF+E zH^**XV+B|~iPW>t05wg%muOeiVKL_0=}kJb_Z!-45XGgc;X;|gck5I+B14$7P6CE| zMMB!SfB$}4vwtrZ8=g04*0N2AR?Pj*!(*gS&a0k>hd$aqCS1W#ng!LOT65C2N;BNS zg4(%6H#96QHm0di6;{3jD!{wSAlD+Gac+Eve~kiDG7wP->`v8BNe}b-`vzKiL5Avk z2APa_%h6bYR22!W*~wF(8kGpImaeIsdsrlV0xmkES#7EX5Q zG34NB-#?im1#YLdY~sXxS5v6JQW~mmrb8FnMe_rCFFz7$P`5}!I~3D!R_kD29kics z8EBDtYY&R~^_+g*<4(9o0npgbjlTC4f_ZZG9 z`hCuC66b3T6DoN8{`m4iMO44V9?(~J!QB2aKy0V9qulsys= z{cH(w{`BYwowGmru*_bI@jWq#6#X^Sc^m$FZ!VdnxnEpM;gRcjwCDb7_E_1g_Q<>o+N0jY)r!DU{kS8pmw#3E7wS<|Q;QGxZu9d%{gu@IGp!mYc?+QiB z*q@S@#^2e(-S(UhwYa)VVUz3juOwbF59ORS|5oS}bPq@HLTZINAQ=#C&1Ix2hJE z)2TOFDA&&TS>y>roog$N=nWWpG+-`_n0x_gDEB`NA^WTGe8jQ$-bcYIgiXUo?>{#Y zhfNxuo>P*()>_#a-L}{a@3fiXMSMKw@@Oyv)T2xvXh-#D=V%>$?-C0K+cq~^B#L{N zH5&do-Y!Qx*_}(V@$8TOS74=XfXQHY1aSG8T7?6)ZIOzELJRQSX}H_h$7jmbJ~LMF zy;L_I_e_`Y{TIPa(e}l5)oVjgQS{amF=g_!YeuSt4w{3_WrOmE z>cQ`?CE{DVzx>p)t*f&4KprNVsU~Q{?_;jU@e#v{n=u;Fbv@+uTXtK=Y7>K0>_s8B^zwUNoRkwb6dVd% zfZf+8domw;ixh;tcN1zso!EzX*snzlTZ}w5c4e*`Dp0LjXjg5Pt0|2bD6p&(s+YeV zd5F3dp88E{>&Y>WDQsDk{$4NDQ)P(ApADZ+Jm)G0b@_SHj>AHW=5!Ot1%J1)TOI#jD9pqY%s(iKOcah;cMX5&0sDG_h`%w0-C@G@0%Jio|RkT&KYqwD=iVcb@Tlm(5v<@ox{FMCv z#oh%N8Yl}FK5g7(BzQ2Sx0&HU{gLkWA?u}uV7aGN*5w#y5N4_ zO$FS-`nT8I5f8W@e7jXn+kO&bDdx5Uo~~9zn%iR|f9xh6Mda9c5V(t&=KFg-irLSE zA!eURCqc1e-|$lti|?=YdD@IqO@~ja2Z#0gD%X9~4SSfFmVBvs9@aLWAj_9AuhlDA zKpyw8tSx&qT+PcBCs8Y+)Mm0Y_xdwx;aF93ZSlP`IB!)}D^)JU{P;dx!7ht2*N-b+ z!Z#<6x=ifUFEojj^8`d$hjxzk6)^oxKgx>HUqu5r+qlLahooW`p3p0SXsqPw(ZG-+ zGxXf{MHXfSWA6PX-`8E~BC~lk<4hR)h$+)#!c5M07PETFBx#ADZmHuVr)0>@j*gDa z_3{m!AB=;YTh0?Rt?|xSdn9{yC;QRn%4H|R;(1iqb;Zo$-oAiMjI~B#SHzEa>6XET zz`5$%+23oe@9BE3nndtG;sqXxYD zY{!%o=3DBxxz$)w%=YwFo0Al1<1yE?7QFaMrFw&hb*4QS0pfezy=|Rm+K@&@yyPD& zy`IOs2<=yh9jIJRLYKuxJN0cS-X-vy&9+6!dB5eE`nP{5FagT2b<5$tdVYaba`+F{ z4!(NKzeP@eY@16y7TC^P{MEW~kyOsRI-0o1g@fYzXy-spt}sa&LItX=n1 zjX19QiqwIqS-p(%tuwq*y-=fzkb6%3mG@k?XvG($utcVkwz61KM3h47OgJNUUUy}G zOl9rzR}}@{_w%lLf|Rr?L?;9LxOxp#DzuYOXPw!3seT(n^z2~$yo}(R_>3cO3_6ur zNpxMVKOf74QT%O7#^bBG3g#U$)0cA@n6WtKij!v4=Vzu9*RFX=Y&@^=Q#~=F)q($0 zAsVB2)Su#|lUE({biyY+ZcYX)rn7M9#VhAXQ@Sgp;dd$&Wm%B2ITjCK=N+MIoa)DG zarG)coF~6etntnq`^B3qb8n)3=V@;?a~nRO)BeDVOHe z$$ClAA+_CdPvfqZmz~KyOHQlQdtbkt#`ZHoR~_wH-_fHcbV}%fwE3R z3T#6bt2Bn$75w`{k$;w%oTk~E%Coc8HU0l+-Qm@|G2!JICH{S?L;)hF)<&UZ`mDzN zrF8Nbea=)TF5@ZtOu{uuYlh=cZs`}pUq^>$o4b=&1>0ZD+g^x0ST51@$0=3wSEm~s?tTpQq+|P zU&=%gvGt8>UE)go#zyvO#O%ADD4Q(&AhJ>w=px3%gl^dYQUz#b;wnOfm|7?X@<8u( zu@&J`={;aFUl{%y?1kty$^Cn@m(P6T)Lwh`x45lzCtF@8A#d;gRodcHUhBp7&+LNr z?(R6zsUNfKm3(QjR_y+LL+kB)B0ntFzXfPmND#SOYkB-H8!0SKIlmGA^>a#^H{lSC zpl4&}aAfb6zRN8b=wox8)!~A@mG~KdV&MLHtVf#|*UEg&&0D_2*U%cLE+}hqy?Pmc z<%#x0hP)lYar(J%9j)n?g3YePpT1e;o30Lj#%~05Ne|-A6!w0TS}x{q!k-t`H^sTm zf0+}hJTKt1jD`gYOv;#2kj=m4d9`ny*Bguy?1OVMR`A&>%7_O{J0&VT!&QFjm`|E$WeSB+mPmWend%geO8}EzFq>yDdumN%I>Uv> zz;B;pVSj?P6$9ooEy<}<|Ed|46WQB9>djMGS_3o-V*|I(uLEM z**!i*xS2iD@v`r;M@09r*X>o(4#l31n8O|a_1cFVQC|0I{5X$Vc7w=hUCH|dGx?4J z-!}yg3|-A=x}nsQ0nTrCZk*F5w!XY|{i=oURYUnUyyQ(|6Rm?1xA&>vP;fnVR{_Ua z4j;M}Qf|zfWOX?TIRE&2N;Es*m+zO9m(6Qm%Q8y{S8I+7I#z_5i6ZcL=c z4Z{$=D&j4=*mAQ#l>dWvjYSL}*fNl&rnLeb$;EF-x5Z zbJA~CNO6nCPJ3O>40XnL-kxq;vKHw0hwe_rtXll|P6_E<;!56E>5$~pelbsVbn_K1 zRo!7kAtVU(o14I+W-2Ci>37x*o4=2vpXB7-l@kM5oM7%k5s8&NstRqqjtX+gblfPXD=QSBMN zu#gk(Y?RfdZjhr&RLWcXHswV)XJwGKex@tLuG6;6rOfh@c0)yW2Zo*8sx~o# z+4(+@zu~SBn6;ukT8BFdUC?(uTkJKJyFbw=ahmFOYu zbaD%R4Bx}xpH!91wJW{wxH9aeuQOrk(YNp6aYBec+;#&2N5~zUm14_3p1m=O;NcUKlsR_9}sl_7nk=hW4pf8XJ{w>-Z;eCrYQBS+M4f9buCO2mR6lvgjy zi+FvDpLIssE!b1>ZFN3;SXs+E6Cfu8E9TDs<@+unQoMg}zMWKiKlFD#?Oy!dW?)@DakO>rptg15CujLY9KM}H93CWGtq`;%f8P7O9xWOkE zzbp3_`38go*8HxEx{qUW@}9^EfaHwh>;Hy5?m_oyM!hzVV$K1!)fcW0XgiNHU%V6P zM8~S9{4J}y0wKx{i+B?fcsY`LboQJ7#F@iiMAx7s4Sr za--s#CwQD#>=bWwgveq0-#@X_EnYgBJJEaM;!>avqTcSP73AR zz_bM?8pV9oEV=a6OK{;O66%lL>wH$+0m~nqjHpt=eNAXe9dQv#4Z5z#2=7q1b}kx{ zbcO$zHM-K(@<8mrXyQ@Red_?qq)pJgJH{(CPxpe~5Mm}H>6c|BmrW~Q4 zDT@Y*Y;4cw)?&yxm^N0R@Q57Id-~oB;O3wJz3O=Qy;2 zUl-vUpcNN)A*G`3I3jMM$gwP{6DjP9nd92ou0kLt4|#m67a_9OJ#F_y zzwL%(VcQcPzQsgOwSTKF?e08gWUC1jA4<;qF@F7+XG;ANieUcf4`#l~If>58_2l6r zh=)mkhY}Opk4xRI%7l}~-voULI2sSoQo$yC>W(`)H58a{8n}G0O7X0Gx6n1usi4P? zBqoD3TnF|Mfh_g$IJn!Nifja8NpFyCmS(WTTf2{_sXD`C+$!jI{t(f`Qqwu{>R6UG z{RDV|s}+;S6?gDalBwE@>iER$JWFODZ)uW;k+}ywqO6E#_JghQ?|qX(Y(tItmuzw5 z5MK20}EcdI<_j$p6wGNnjX+{Y{U|cH=oeK(x*FS7;dtC$v>h;S_kmvE?Pu(Py5ARF`7fsbIVqE1ynXhEQ&XDqL z^hwLbA_uHlXpznngULllzqB{*vkDm4U9UaHo=avccia)rW3=1{0EqO9^wFxvR~DRT zxAh|UiC2<)yPq-TFWqiNHJEUC80|!ynzADIy?b`J3(lE1tya?!p)u}2$Vw?k$RD5& zHuMZ*`M|puKYx%Rn*IAx_3e()TZ}xuwyz)D9{6Q7!WOpE6q-7(5ujyX6Lec`DBC+b_m%e4%T9(g@_aoHEuhx=}5&>90IgjO;93G0-e;8;h^@f)hT+N zK3?fJ<|~ZIe9oYk+uQ2N^^P?pH=cYg93d{Jb76U_#s-lcwCBFDKu3r>1O(*X_a--9 zd5-|2W9vJjGP~>YX2-=^^+SN+Om8F}o?=mxBEH zUz&J@WB=%Z8BcuBGS28Xw~fq^RzkD2xIVH)8i!NY$E!P$ediWR?xO7!bg|*VP}BKh z5zVkmrF@#4-H8s>_(xGwxel*t+Hwe`D#sOOM7^z!g(7%-C#4>*KOn*DV_hojxgO=o zzw&(DOlii)?gb;!=pbN8&!$ps^ud1OG3(-8QFuTm)t2#py$N&QKWt8#LqWJ~{{wDl zfB5>jew`25a%FXSx@K>egUMC8;pUtcXb1R%8zKmc^Ta>>is`EY6?^?$Bkvgv44|E# zX33S9jx5hL?nlI&d!^w2dT!v)12M1?eU6x2YjN-Dn?7H~{`KT_(UF>uj_;R$y~daO zr#7>4de8q^C`X(*9@=_W;&!IQy@#RTy?cR00AkEq9%F(iY-~sQKHZ{xwl9t;FrDD3 zs;j5&C?&c{%C)fOB2R$h_#3wHyERXC){ma6FMaRWy1rGIgdBw?Lezi#UgPc8_fXyp zK6!IL@gl_jt=Tn+t0iM&>go;&M)7X1p{(4n?bSJz7`bur8b^`m+@F(J+PKD?$E zT_2o(XQ$xzE92(K1T_1BwqNrPB*JQ!J(Msd56)i7ersgW|Bi?hcp=pI7aAp5d0o$M zHMmbhXs_+#Nf$wD?A}wF(%i2%JC6O`GNoKOSbD#g*eSQM^xKeiyuLiuPMWn1m^tI?s4<4 znMr$~KN9-8@sD{p@}56*Vz1^o5!mCDE(F&}5S%9702rQ(UUwpAEI_w1rEK~@A;%;jPoZ4vJjE^Sm6wW#bG>-Ar6)6U-HO6>@XeK zeiWC(928@yy9;7RpQyh70&zz<9+)NwQR-$mD6_gIJ;MloQ=&AEaXJWLy6Jmf0mr5@ zb44oJ5e7Jh2#4LjWF~`U7^Qau$EYy9M4a2xL2*lcvmYyrgEwh)uuQu^O6`;ZkyC_5 zsrWhY4#BSu{wBPhqd{wiM$e&a>Mv1>43s-i92MC95D{St;y1+~`l|%f#ky!k+}TJ$ z@TUV~xJ?VJZeZ>^(NlSxEK|RBQOQ3HEeeGMe0}+^yc|15ThB)ld^P< zrdZT|=&RdAF9q?Sq9~v$ty{61qbVwqKn{Fwsr_*{0l^(s&N-)>9X(gxu?ku!SMX%vd11!cwnl zb}M~Ma$gV58tK~2k@eM8n5knJVmq<*%4Tbja#K6N<~8&C^21Ji+SM(45pjvkmuKd@ z-s*Ea{?MBk{r<3rzo=kjKtkJVW=h{5MLNDqCe*!Rwjn_5v&WIM*v8Chwyly(guUu< z@6R`*+9y}i7rXC>T9^<;Ih$0VPm8?Mb-fK|zQQA-V~-fdN*W2}2k05)$V783M`t=M z*SH>>Y^gx>cd@oTu?-9O<0IE!OM;Y!y)|-PiT9Q3&NcLvJdd6^+|KcF@L%|suO(4# z0)+=HWE&oq$BG&zNZ$Bb{I7vZ2MB>9h@CHG2)}@cL!V=;`t8JjDg8nHQH}iKz-Jrz zLR?PVp|W$Q(pN&G|BQw3^RFh>$JwN~)s3-i77XcS$ zDRz6vk3Ko-z^>RrOqSZi!1YTeHc0wW{V7Tnj8sVehO=O_vxb#6`zZBLJKDd;l&x_D zJaJi;#|GKx*{b0|kfx!JQl;e@JzK^Lfu}EjAOf8vz{8j}4-!-sE4UhgJV1-Zx|EPF z=XHj#3aBDrmEAs2@4eoge{qPw{lu}mddL{C1w|K;M@Dv|6WjmDEj?F8#8AO}rWqU& zNRR-xwHy1Yqnz-QD7!owXBYWXveaQ{pXsDR_feIBfw7_%~^p2Z}-}NvS7a%j-;|-XS@V zBsRO{`Oq}wHXuwhwVr%gEx`cLwi^`S$_L6e`xKyJnw##eYiF@j zmOe@Qm%gNRqs_$+bY5Vfr=Zx^_*tMOaB|fQ5!mCwuCLxy@nze51)7XWTs3l0&M31` zs@u1BR6Rd8MBs!offsZuuGrMKgL}fKfhyx<1IO={Xzn;W)Xh+;2EqZs59(Rs2sZ=5 znVr}biG=Y8WjE!2Q5TbVr{YMeP8I0H4tDFk`7Mw9~o9&NK99C*#ouF=D8{Auy^+IE+ z>&8*Gp|rm=@`Q*K7n3_tnK*r5+@{uU)``>(G_gHd;; z?AVL-3phk+#b&V;;!mIqJc%7CWSK;08@JXKqj4>DAk+-J(R(u^bfiqV_|2xw+xCYf z0oz2}9q6ecJQt{zw3F${u#%#kQMn)5jYcnuNXB$tz(N4q4wL{_D|F(RnHdzC0sbNK zwquXz*CM$Hx?yN1zuc0?uq>$8H|P*Tpj*dXff!8k#l_?^1`3>R~70 zUbM1ttRX9zRzTzDLAL?y@0jg2OvZCyGY5wusRflQY&y@r;?jl!W3y0i*hxlP_dAdrVCF$^VMx!bznMxYOEwRvw+2RTpPi(iy zASgo905rM|S)tz~$Klcxl@iMnna@u-FfhW2XUlZ{>KV*fZii1;bG9UA&%wM z*bH7MW)?(OO}oQV4?tSbTK?FJJ+e zhD8HA{A)OpjExgvYX+iEFZRz^&g67Q-Wu|!K|>y@G%t)yJKVOO%RB(Uk(qQRcM_)x zPB_I3ofrp;4`w~1<~zXU+;D``;3Vr9j?u8*MZiK)B33iC@VECa`v@mam${5>G_f`l zE^ixuy+X|QByQChC&kc}f3aXwTo9sE+da|6kjL4vIGH5s9roJ35V;M2ggDF`z{&=$6ahqH8X-r$VxmNCke(p5X*!WN3~F*0QPugCIIoVP1~Ak(tZ^nuj^+u zIYRU{F2y)O?*_1a4i>Oj8^_#r^54*`!3hv&4C_@we%5}F0Qn*}@D3pz^`g8k38;(P7@nfk>V%MzU{oE|UPtK~a!&H;1D&d* z)kqSxgz}0>|EuLH4;FgDAyU*?NTTzoNbiCk3Qg##zp*+}o-&yxOhPFvk?;v40hU(G zTEH?v5J|U{qQw$i^121R&@YsA#N*m=IkbYhB2+tNOsS+IDjG3lNnAo%PT7h>{Qd=& zTA&g+OWryD1g;ahs}S*BC{sj@1 z$nEFh1P}92Djw683PeGC*#h`UR*tjw(@v{A;`xF`M=M{3dI8ClzMGAi%wicpz5_zB zj!VUghjwP^OOb|?H@cdSV^=f5D71J&0c(JJQRE2@2(e`#jx$u3DglxPG33OC6vlQ|{V zG+Ay{L{c%UNDf?W5R=%HvcpbMYNDE9$)}dSz|xX}|Azw-bbcD7^(ep&`|E>nDR>NW z+W+Y%t-upw!CkiE_uq;y!f&&mQSsPO8l*w^mZzfAICVy)ket(Y1ZzwzsLP`0MGv*J)(H&DjOM5lOC7M3;3cgd z^wG~8aES4$Wa)Q=6ORc(&$l6*U<{B?1yXyCCpys&f;S}xaSuu*{IDyf0TZm%KH!rv z$$7~;t57aV7Ij04N@lHIVG1-#Vz&&#Yd7JRx)QXYU9*LHT3RHAbHrX`CBqT`xfp5y zhS=^gglY4}T6b21&q=8GUCO0uNa##L_~9Oe2j_*A@igI}Rpa zRB>te?QB$aHkdpL+(yXJ};`pmB+6&FC3?WgUk_}4){v+VJ zVCGwu(0RZT#j)#@^N=PU8pk=KZnkaN+sT9b9n`@9Yhj3wt06%57^e@!m5@*7wM!C= zr*2I_nq-#MWitODJ(ai|Ax*z=X*ZLs7)94RtRaoI>%aK>0)#)_a9a9#_5=+Iazfn}H^l!xB~@P&z7rv=f_0DX7Z?R#LzqIE3SIf9@GF->%OU9+espAFfSubp5uL#EpCk|cX^>C{2$G0f;3tMW7Og0vfm8HMCM?I+<<{1CV*k%e_* zfGA4TF&?gAvrAfo7ek>aBq*Z(4o2((;ItqH&L_QoyoApxrlAT-L-SE+XtmzEgzA%$ z4t0V0BO1TUsHKH4;%cUHzm-q2;gaC4)(t7SbtSCr!%!sq&w1^ZLdoQlsB6{+40OW_ zz?Wg?Lu#oe>+;~#8D{2*t7Wv38ibO*<6s?WnjGQqayOQ6CkC_5`@xl3fF>B};u12u zP%hGN*Dr38WJ=wb8_;a0DklBK{*d`>c}Y^*)XGALQy?GqNwI=}K|SyDS`5&$okf%2 zP(EUtM|)3bq@xqtj*z6d05f)IF^o6@gfXNmdi~R9$PsqZ*icIDtXw=ZbzbB!lp!UM zG~5cw5ffiIy2QuE%}tn{StCbwqhSH$G?*50!ctZ89*Z%?t;Jy z$nlQ^1uHsXDHYXZ*Mo4$-k;tOnHEEQ9L8`SE%ih*%j0JupYCRDArCuJjZ;^bETQZ) zZUmR*-$84c-q!J=GO}YUb zrDrourcO?$!jdzQ(89`dH~mSTHDuSD8u7B8=)QCSkFr2ZK~_ggN_(OK){=7xIpQZI z-}T*(%Yu++U5JMKVA3D@X)>XNEL!rbgxpa~{(ryLc}K67b%dQVP~m`HhF453mt3-a G_J074UVljd diff --git a/Frameworks/Sparkle/Resources/Sparkle.png b/Frameworks/Sparkle/Resources/Sparkle.png deleted file mode 100644 index 13d59cd27b5849de524f93dda49369de84daae76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10794 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

    K;UOHm2*3k>epb!mCx7*+VFCQarPP2}QH@s; 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 diff --git a/Frameworks/Sparkle/Sparkle.podspec b/Frameworks/Sparkle/Sparkle.podspec deleted file mode 100644 index be51c9447..000000000 --- a/Frameworks/Sparkle/Sparkle.podspec +++ /dev/null @@ -1,26 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Sparkle" - s.version = "1.9.0" - s.summary = "A software update framework for OS X" - s.description = "Sparkle is an easy-to-use software update framework for Cocoa developers." - s.homepage = "http://sparkle-project.org" - s.license = { - :type => 'MIT', - :file => 'LICENSE' - } - s.authors = { - 'Andy Matuschak' => 'andy@andymatuschak.org', - 'Kornel Lesiński' => 'pornel@pornel.net', - 'C.W. Betts' => 'computers57@hotmail.com', - 'Jake Petroules' => 'jake.petroules@petroules.com', - } - - s.platform = :osx, '10.7' - s.source = { :http => "https://github.com/sparkle-project/Sparkle/releases/download/#{s.version}/Sparkle-#{s.version}.tar.bz2" } - - s.public_header_files = 'Sparkle.framework/Headers/*.h' - s.vendored_framework = 'Sparkle.framework' - s.resources = 'Sparkle.framework' - s.xcconfig = { 'FRAMEWORK_SEARCH_PATHS' => '"${PODS_ROOT}/Sparkle"' } - s.requires_arc = true -end diff --git a/Frameworks/Sparkle/Sparkle.xcodeproj/project.pbxproj b/Frameworks/Sparkle/Sparkle.xcodeproj/project.pbxproj deleted file mode 100644 index fc1c0c1ee..000000000 --- a/Frameworks/Sparkle/Sparkle.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1945 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - 1495005F195FB89400BC5B5B /* All */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 14950060195FB89500BC5B5B /* Build configuration list for PBXAggregateTarget "All" */; - buildPhases = ( - ); - dependencies = ( - 14950064195FB8A600BC5B5B /* PBXTargetDependency */, - 14950066195FB8A600BC5B5B /* PBXTargetDependency */, - 14950068195FB8A600BC5B5B /* PBXTargetDependency */, - 1495006A195FB8A600BC5B5B /* PBXTargetDependency */, - 1495006C195FB8A600BC5B5B /* PBXTargetDependency */, - ); - name = All; - productName = All; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 1420DF50196247F900203BB0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1420DF4F196247F900203BB0 /* Images.xcassets */; }; - 1420DF51196247F900203BB0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1420DF4F196247F900203BB0 /* Images.xcassets */; }; - 142E0E0019A6954400E4312B /* Sparkle.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 142E0E0219A6A14700E4312B /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 142E0E0419A6A26F00E4312B /* Autoupdate.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 55C14BB7136EEF1500649790 /* Autoupdate.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 142E0E0919A83AAC00E4312B /* SUBinaryDeltaTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 142E0E0819A83AAC00E4312B /* SUBinaryDeltaTest.m */; }; - 14652F7C19A9725300959E44 /* SUBinaryDeltaCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8E20FD68CC7005AE3F6 /* SUBinaryDeltaCommon.m */; }; - 14652F7D19A9726700959E44 /* SUBinaryDeltaApply.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8E00FD68CC7005AE3F6 /* SUBinaryDeltaApply.m */; }; - 14652F7E19A9728A00959E44 /* bspatch.c in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8DC0FD68CB9005AE3F6 /* bspatch.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 14652F8019A9740F00959E44 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5F8F609C4CEB300B25A18 /* Security.framework */; }; - 14652F8219A9746000959E44 /* SULog.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C14F05136EF6DB00649790 /* SULog.m */; }; - 14652F8419A978C200959E44 /* SUExport.h in Headers */ = {isa = PBXBuildFile; fileRef = 14652F8319A9759F00959E44 /* SUExport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 14732BC01960F2C200593899 /* test_app_only_dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 14732BBF1960F0AC00593899 /* test_app_only_dsa_pub.pem */; }; - 14732BD019610A0D00593899 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; - 14732BD119610A1200593899 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; - 14732BD319610A1800593899 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14732BD219610A1800593899 /* XCTest.framework */; }; - 1495006E195FCE1100BC5B5B /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; - 1495006F195FCE1800BC5B5B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; - 14950070195FCE3A00BC5B5B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; - 14950071195FCE3D00BC5B5B /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; - 14950072195FCE4B00BC5B5B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; - 14950073195FCE4E00BC5B5B /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; - 14958C6E19AEBC950061B14F /* signed-test-file.txt in Resources */ = {isa = PBXBuildFile; fileRef = 14958C6B19AEBC530061B14F /* signed-test-file.txt */; }; - 14958C6F19AEBC980061B14F /* test-pubkey.pem in Resources */ = {isa = PBXBuildFile; fileRef = 14958C6C19AEBC610061B14F /* test-pubkey.pem */; }; - 3772FEA913DE0B6B00F79537 /* SUVersionDisplayProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 3772FEA813DE0B6B00F79537 /* SUVersionDisplayProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 55C14BD4136EEFCE00649790 /* Autoupdate.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C14BD3136EEFCE00649790 /* Autoupdate.m */; }; - 55C14BD9136EF00C00649790 /* SUStatus.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55C14BD8136EF00C00649790 /* SUStatus.xib */; }; - 55C14BEE136EF20D00649790 /* SUAutomaticUpdateAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55C14BDA136EF20D00649790 /* SUAutomaticUpdateAlert.xib */; }; - 55C14BEF136EF21700649790 /* SUStatus.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55C14BD8136EF00C00649790 /* SUStatus.xib */; }; - 55C14C04136EF26100649790 /* SUUpdateAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55C14BF0136EF26100649790 /* SUUpdateAlert.xib */; }; - 55C14C19136EF2C700649790 /* SUUpdatePermissionPrompt.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55C14C05136EF2C700649790 /* SUUpdatePermissionPrompt.xib */; }; - 55C14F00136EF6B700649790 /* SUConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A5F09CA6EB100B7442F /* SUConstants.m */; }; - 55C14F06136EF6DB00649790 /* SULog.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C14F04136EF6DB00649790 /* SULog.h */; }; - 55C14F07136EF6DB00649790 /* SULog.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C14F05136EF6DB00649790 /* SULog.m */; }; - 55C14F08136EF6DB00649790 /* SULog.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C14F05136EF6DB00649790 /* SULog.m */; }; - 55C14F0C136EF6EA00649790 /* SUHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 61EF67550E25B58D00F754E0 /* SUHost.m */; }; - 55C14F0D136EF6F200649790 /* SUInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5000DAE88B40026945C /* SUInstaller.m */; }; - 55C14F20136EF84300649790 /* SUStatusController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6196CFE409C71ADE000DC222 /* SUStatusController.m */; }; - 55C14F21136EF84D00649790 /* SUPlainInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */; }; - 55C14F22136EF86000649790 /* SUStandardVersionComparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */; }; - 55C14F23136EF86700649790 /* SUSystemProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */; }; - 55C14F24136EF86F00649790 /* SUPackageInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */; }; - 55C14F2A136EF9A900649790 /* SUWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61180BC90D64138900B4E0D1 /* SUWindowController.m */; }; - 55C14F32136EFC2400649790 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55C14F31136EFC2400649790 /* SystemConfiguration.framework */; }; - 55C14F7E136F005000649790 /* SUPlainInstallerInternals.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */; }; - 55C14F9A136F045400649790 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5F8F609C4CEB300B25A18 /* Security.framework */; }; - 55C14FC7136F05E100649790 /* Sparkle.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8220A321A7F00D8810D /* Sparkle.strings */; }; - 55E6F33319EC9F6C00005E76 /* SUErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 55E6F33219EC9F6C00005E76 /* SUErrors.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5AF6C1E51AE86A410014A3AB /* SUPipedUnarchiverTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AF6C1EA1AE870A90014A3AB /* SUPipedUnarchiverTest.m */; }; - 5AF6C1E91AE86E270014A3AB /* test archive.zip in Resources */ = {isa = PBXBuildFile; fileRef = 5AF6C1E81AE86E270014A3AB /* test archive.zip */; }; - 5AF6C74F1AEA46D10014A3AB /* test.sparkle_guided.pkg in Resources */ = {isa = PBXBuildFile; fileRef = 5AF6C74E1AEA46D10014A3AB /* test.sparkle_guided.pkg */; }; - 5AF6C7541AEA49840014A3AB /* SUInstallerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AF6C74C1AEA40760014A3AB /* SUInstallerTest.m */; }; - 5AF9DC3C1981DBEE001EA135 /* SUDSAVerifierTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AF9DC3B1981DBEE001EA135 /* SUDSAVerifierTest.m */; }; - 5D06E8E90FD68CDB005AE3F6 /* bsdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8DB0FD68CB9005AE3F6 /* bsdiff.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 5D06E8EA0FD68CDB005AE3F6 /* SUBinaryDeltaTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8E30FD68CC7005AE3F6 /* SUBinaryDeltaTool.m */; }; - 5D06E8EB0FD68CE4005AE3F6 /* bspatch.c in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8DC0FD68CB9005AE3F6 /* bspatch.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 5D06E8EC0FD68CE4005AE3F6 /* SUBinaryDeltaApply.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8E00FD68CC7005AE3F6 /* SUBinaryDeltaApply.m */; }; - 5D06E8ED0FD68CE4005AE3F6 /* SUBinaryDeltaCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8E20FD68CC7005AE3F6 /* SUBinaryDeltaCommon.m */; }; - 5D06E8FD0FD68D6B005AE3F6 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D06E8FB0FD68D61005AE3F6 /* libbz2.dylib */; }; - 5D06E8FF0FD68D6D005AE3F6 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D06E8FB0FD68D61005AE3F6 /* libbz2.dylib */; }; - 5D06E9050FD68D7D005AE3F6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; - 5D06E9390FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D06E9370FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.h */; }; - 5D06E93A0FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E9380FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.m */; }; - 5D1AF58A0FD7678C0065DB48 /* libxar.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D1AF5890FD7678C0065DB48 /* libxar.1.dylib */; }; - 5D1AF58B0FD7678C0065DB48 /* libxar.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D1AF5890FD7678C0065DB48 /* libxar.1.dylib */; }; - 5D1AF5900FD767AD0065DB48 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D1AF58F0FD767AD0065DB48 /* libxml2.dylib */; }; - 5D1AF59A0FD767E50065DB48 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D1AF5990FD767E50065DB48 /* libz.dylib */; }; - 5D1AF82B0FD768180065DB48 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D1AF5990FD767E50065DB48 /* libz.dylib */; }; - 610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134710DD250470049ACDF /* SUUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; - 610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 610134720DD250470049ACDF /* SUUpdateDriver.m */; }; - 6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; - 6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */; }; - 6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; - 6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; - 6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */; }; - 6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */; settings = {ATTRIBUTES = (); }; }; - 610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */; }; - 611142E910FB1BE5009810AA /* bspatch.h in Headers */ = {isa = PBXBuildFile; fileRef = 611142E810FB1BE5009810AA /* bspatch.h */; }; - 61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6117796E0D1112E000749C97 /* IOKit.framework */; }; - 61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 61180BC80D64138900B4E0D1 /* SUWindowController.h */; settings = {ATTRIBUTES = (); }; }; - 61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61180BC90D64138900B4E0D1 /* SUWindowController.m */; }; - 6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */; settings = {ATTRIBUTES = (); }; }; - 6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */; }; - 61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */; settings = {ATTRIBUTES = (); }; }; - 61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; }; - 61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */ = {isa = PBXBuildFile; fileRef = 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */; settings = {ATTRIBUTES = (); }; }; - 61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A5B09CA6D4500B7442F /* SUConstants.h */; settings = {ATTRIBUTES = (); }; }; - 61299A6009CA6EB100B7442F /* SUConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A5F09CA6EB100B7442F /* SUConstants.m */; }; - 61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A8B09CA790200B7442F /* SUUnarchiver.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A8C09CA790200B7442F /* SUUnarchiver.m */; }; - 61299B3609CB04E000B7442F /* Sparkle.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299B3509CB04E000B7442F /* Sparkle.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */ = {isa = PBXBuildFile; fileRef = 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */; settings = {ATTRIBUTES = (); }; }; - 612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */ = {isa = PBXBuildFile; fileRef = 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */; }; - 6158A1C5137904B300487EC1 /* SUUpdater_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6158A1C4137904B300487EC1 /* SUUpdater_Private.h */; }; - 615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */; }; - 6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */; settings = {ATTRIBUTES = (); }; }; - 618FA5010DAE88B40026945C /* SUInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA4FF0DAE88B40026945C /* SUInstaller.h */; settings = {ATTRIBUTES = (); }; }; - 618FA5020DAE88B40026945C /* SUInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5000DAE88B40026945C /* SUInstaller.m */; }; - 618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */; settings = {ATTRIBUTES = (); }; }; - 618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */; }; - 618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */; settings = {ATTRIBUTES = (); }; }; - 618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */; }; - 6196CFF909C72148000DC222 /* SUStatusController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6196CFE309C71ADE000DC222 /* SUStatusController.h */; settings = {ATTRIBUTES = (); }; }; - 6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6196CFE409C71ADE000DC222 /* SUStatusController.m */; }; - 61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */; }; - 61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */; settings = {ATTRIBUTES = (); }; }; - 61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */; }; - 61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; - 61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */; }; - 61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8220A321A7F00D8810D /* Sparkle.strings */; }; - 61B078CE15A5FB6100600039 /* SUCodeSigningVerifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B078CC15A5FB6100600039 /* SUCodeSigningVerifier.h */; }; - 61B078CF15A5FB6100600039 /* SUCodeSigningVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B078CD15A5FB6100600039 /* SUCodeSigningVerifier.m */; }; - 61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */; }; - 61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */; }; - 61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5F8F609C4CEB300B25A18 /* Security.framework */; }; - 61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; }; - 61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */; }; - 61B5F92F09C4CFD800B25A18 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92C09C4CFD800B25A18 /* MainMenu.xib */; }; - 61B5F93009C4CFDC00B25A18 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F92409C4CFC900B25A18 /* main.m */; }; - 61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FB9509C4F04600B25A18 /* SUAppcast.m */; }; - 61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FB9409C4F04600B25A18 /* SUAppcast.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */; }; - 61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */; }; - 61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */; }; - 61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */; settings = {ATTRIBUTES = (); }; }; - 61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; - 61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */; }; - 61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; - 61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */; }; - 61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; - 61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */; }; - 61CFB3290E385186007A1735 /* Sparkle.pch in Headers */ = {isa = PBXBuildFile; fileRef = 61CFB3280E385186007A1735 /* Sparkle.pch */; }; - 61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */; }; - 61EF67560E25B58D00F754E0 /* SUHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 61EF67550E25B58D00F754E0 /* SUHost.m */; }; - 61EF67590E25C5B400F754E0 /* SUHost.h in Headers */ = {isa = PBXBuildFile; fileRef = 61EF67580E25C5B400F754E0 /* SUHost.h */; }; - 61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */; }; - 61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; - 61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; settings = {ATTRIBUTES = (Required, ); }; }; - 721CF1A71AD7643600D9AC09 /* bsdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8DB0FD68CB9005AE3F6 /* bsdiff.c */; }; - 721CF1A81AD7644100D9AC09 /* bspatch.c in Sources */ = {isa = PBXBuildFile; fileRef = 5D06E8DC0FD68CB9005AE3F6 /* bspatch.c */; }; - 721CF1A91AD7644C00D9AC09 /* sais.c in Sources */ = {isa = PBXBuildFile; fileRef = 7223E7611AD1AEFF008E3161 /* sais.c */; }; - 721CF1AA1AD7647000D9AC09 /* libxar.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D1AF5890FD7678C0065DB48 /* libxar.1.dylib */; }; - 721CF1AB1AD764EB00D9AC09 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D06E8FB0FD68D61005AE3F6 /* libbz2.dylib */; }; - 7223E7631AD1AEFF008E3161 /* sais.c in Sources */ = {isa = PBXBuildFile; fileRef = 7223E7611AD1AEFF008E3161 /* sais.c */; }; - 7268AC631AD634C200C3E0C1 /* SUBinaryDeltaCreate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7268AC621AD634C200C3E0C1 /* SUBinaryDeltaCreate.m */; }; - 72D4DAA11AD7632900B211E2 /* SUBinaryDeltaCreate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7268AC621AD634C200C3E0C1 /* SUBinaryDeltaCreate.m */; }; - 767B61AC1972D488004E0C3C /* SUGuidedPackageInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 767B61AA1972D488004E0C3C /* SUGuidedPackageInstaller.h */; }; - 767B61AD1972D488004E0C3C /* SUGuidedPackageInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 767B61AB1972D488004E0C3C /* SUGuidedPackageInstaller.m */; }; - 767B61AE1972D488004E0C3C /* SUGuidedPackageInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 767B61AB1972D488004E0C3C /* SUGuidedPackageInstaller.m */; }; - F8761EB11ADC5068000C9034 /* SUCodeSigningVerifierTest.m in Sources */ = {isa = PBXBuildFile; fileRef = F8761EB01ADC5068000C9034 /* SUCodeSigningVerifierTest.m */; }; - F8761EB31ADC50EB000C9034 /* SparkleTestCodeSignApp.zip in Resources */ = {isa = PBXBuildFile; fileRef = F8761EB21ADC50EB000C9034 /* SparkleTestCodeSignApp.zip */; }; - F8761EB61ADC5E7A000C9034 /* SUCodeSigningVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B078CD15A5FB6100600039 /* SUCodeSigningVerifier.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1454BA1519637EDB00344E57 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 61B5F90109C4CEE200B25A18; - remoteInfo = "Sparkle Test App"; - }; - 1454BA1719637EE900344E57 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1420DF491962329200203BB0; - remoteInfo = Documentation; - }; - 14732BCA1960F73500593899 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8DC2EF4F0486A6940098B216; - remoteInfo = Sparkle; - }; - 14732BCE1960F73500593899 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5D06E8CF0FD68C7C005AE3F6; - remoteInfo = BinaryDelta; - }; - 14950063195FB8A600BC5B5B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8DC2EF4F0486A6940098B216; - remoteInfo = Sparkle; - }; - 14950065195FB8A600BC5B5B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 61B5F90109C4CEE200B25A18; - remoteInfo = "Sparkle Test App"; - }; - 14950067195FB8A600BC5B5B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 612279D80DB5470200AB99EA; - remoteInfo = "Sparkle Unit Tests"; - }; - 14950069195FB8A600BC5B5B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5D06E8CF0FD68C7C005AE3F6; - remoteInfo = BinaryDelta; - }; - 1495006B195FB8A600BC5B5B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 55C14BB6136EEF1500649790; - remoteInfo = Autoupdate; - }; - 55C14F96136F044100649790 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 55C14BB6136EEF1500649790; - remoteInfo = Autoupdate; - }; - 5D06E8D50FD68C86005AE3F6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8DC2EF4F0486A6940098B216; - remoteInfo = Sparkle; - }; - 61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8DC2EF4F0486A6940098B216; - remoteInfo = Sparkle; - }; - 61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8DC2EF4F0486A6940098B216; - remoteInfo = Sparkle; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 142E0E0119A6A13300E4312B /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 142E0E0219A6A14700E4312B /* Sparkle.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 142E0E0319A6A24100E4312B /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 12; - files = ( - 142E0E0419A6A26F00E4312B /* Autoupdate.app in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61B5FB4D09C4E9FA00B25A18 /* Copy Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 142E0E0019A6954400E4312B /* Sparkle.framework in Copy Frameworks */, - ); - name = "Copy Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 004A8652192A492B00C9730D /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Sparkle.strings; sourceTree = ""; }; - 004A8653192A492B00C9730D /* ro */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ro; path = ro.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 004A8654192A492B00C9730D /* ro */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ro; path = ro.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 004A8655192A492B00C9730D /* ro */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ro; path = ro.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 0263187214FEBB31005EBF43 /* uk */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Sparkle.strings; sourceTree = ""; }; - 0263187514FEBB42005EBF43 /* uk */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = uk; path = uk.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 0263187614FEBB42005EBF43 /* uk */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = uk; path = uk.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 0263187714FEBB42005EBF43 /* uk */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = uk; path = uk.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - 1420DF4D196247B500203BB0 /* build-docs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-docs.sh"; sourceTree = ""; }; - 1420DF4E196247B500203BB0 /* Doxyfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Doxyfile; sourceTree = ""; }; - 1420DF4F196247F900203BB0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 142E0E0819A83AAC00E4312B /* SUBinaryDeltaTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBinaryDeltaTest.m; sourceTree = ""; }; - 14652F7919A93E5F00959E44 /* set-git-version-info.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "set-git-version-info.sh"; sourceTree = ""; }; - 14652F8319A9759F00959E44 /* SUExport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SUExport.h; sourceTree = ""; }; - 146EC84E19A68CF8004A50C5 /* Sparkle.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = Sparkle.podspec; sourceTree = SOURCE_ROOT; }; - 14732BB1195FF6B700593899 /* .clang-format */ = {isa = PBXFileReference; lastKnownFileType = text; path = ".clang-format"; sourceTree = SOURCE_ROOT; }; - 14732BB91960EEEE00593899 /* SampleAppcast.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = SampleAppcast.xml; sourceTree = ""; }; - 14732BBA1960EF7100593899 /* CHANGELOG */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGELOG; sourceTree = SOURCE_ROOT; }; - 14732BBC1960EFB500593899 /* README.markdown */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.markdown; sourceTree = SOURCE_ROOT; }; - 14732BBF1960F0AC00593899 /* test_app_only_dsa_pub.pem */ = {isa = PBXFileReference; lastKnownFileType = text; path = test_app_only_dsa_pub.pem; sourceTree = ""; }; - 14732BC11960F3B200593899 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = SOURCE_ROOT; usesTabs = 1; }; - 14732BC31960F3FF00593899 /* generate_keys.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = generate_keys.sh; sourceTree = ""; }; - 14732BC41960F3FF00593899 /* sign_update.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = sign_update.sh; sourceTree = ""; }; - 14732BC91960F70A00593899 /* make-release-package.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "make-release-package.sh"; sourceTree = ""; }; - 14732BD219610A1800593899 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 14950074195FDF5900BC5B5B /* SUUpdaterTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdaterTest.m; sourceTree = ""; usesTabs = 0; }; - 14958C6B19AEBC530061B14F /* signed-test-file.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "signed-test-file.txt"; sourceTree = ""; }; - 14958C6C19AEBC610061B14F /* test-pubkey.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "test-pubkey.pem"; sourceTree = ""; }; - 3772FEA813DE0B6B00F79537 /* SUVersionDisplayProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUVersionDisplayProtocol.h; sourceTree = ""; }; - 4607BEA21948443800EF8DA4 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Sparkle.strings; sourceTree = ""; }; - 4607BEA31948443800EF8DA4 /* nb */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nb; path = nb.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 4607BEA41948443800EF8DA4 /* nb */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nb; path = nb.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 4607BEA51948443800EF8DA4 /* nb */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nb; path = nb.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 525A278F133D6AE900FD8D70 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 555CF29A196C52330000B31E /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Sparkle.strings; sourceTree = ""; }; - 555CF29B196C523E0000B31E /* el */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = el; path = el.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 555CF29C196C52460000B31E /* el */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = el; path = el.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 555CF29D196C524C0000B31E /* el */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = el; path = el.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14BB7136EEF1500649790 /* Autoupdate.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Autoupdate.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 55C14BB9136EEF1500649790 /* Autoupdate-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Autoupdate-Info.plist"; sourceTree = ""; }; - 55C14BD3136EEFCE00649790 /* Autoupdate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Autoupdate.m; sourceTree = ""; }; - 55C14BD8136EF00C00649790 /* SUStatus.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SUStatus.xib; sourceTree = ""; }; - 55C14BDB136EF20D00649790 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = cs.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BDC136EF20D00649790 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = da.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BDD136EF20D00649790 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BDE136EF20D00649790 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BDF136EF20D00649790 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE0136EF20D00649790 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE1136EF20D00649790 /* is */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = is; path = is.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE2136EF20D00649790 /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = it.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE3136EF20D00649790 /* ja */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ja; path = ja.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE4136EF20D00649790 /* ko */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ko; path = ko.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE5136EF20D00649790 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = nl.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE6136EF20D00649790 /* pl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pl; path = pl.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE7136EF20D00649790 /* pt_BR */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_BR; path = pt_BR.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BE9136EF20D00649790 /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = ru.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BEA136EF20D00649790 /* sk */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sk; path = sk.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BEB136EF20D00649790 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BEC136EF20D00649790 /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = zh_CN; path = zh_CN.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BED136EF20D00649790 /* zh_TW */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = zh_TW; path = zh_TW.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 55C14BF1136EF26100649790 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = cs.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF2136EF26100649790 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = da.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF3136EF26100649790 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF4136EF26100649790 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF5136EF26100649790 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF6136EF26100649790 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF7136EF26100649790 /* is */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = is; path = is.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF8136EF26100649790 /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = it.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BF9136EF26100649790 /* ja */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ja; path = ja.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BFA136EF26100649790 /* ko */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ko; path = ko.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BFB136EF26100649790 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = nl.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BFC136EF26100649790 /* pl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pl; path = pl.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BFD136EF26100649790 /* pt_BR */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_BR; path = pt_BR.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14BFF136EF26100649790 /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = ru.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14C00136EF26100649790 /* sk */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sk; path = sk.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14C01136EF26100649790 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14C02136EF26100649790 /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = zh_CN; path = zh_CN.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14C03136EF26100649790 /* zh_TW */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = zh_TW; path = zh_TW.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 55C14C06136EF2C700649790 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = cs.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C07136EF2C700649790 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = da.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C08136EF2C700649790 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C09136EF2C700649790 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C0A136EF2C700649790 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = es.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C0B136EF2C700649790 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C0C136EF2C700649790 /* is */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = is; path = is.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C0D136EF2C700649790 /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = it.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C0E136EF2C700649790 /* ja */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ja; path = ja.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C0F136EF2C700649790 /* ko */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ko; path = ko.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C10136EF2C700649790 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = nl.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C11136EF2C700649790 /* pl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pl; path = pl.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C12136EF2C700649790 /* pt_BR */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_BR; path = pt_BR.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C14136EF2C700649790 /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = ru.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C15136EF2C700649790 /* sk */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sk; path = sk.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C16136EF2C700649790 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C17136EF2C700649790 /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = zh_CN; path = zh_CN.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14C18136EF2C700649790 /* zh_TW */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = zh_TW; path = zh_TW.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 55C14F04136EF6DB00649790 /* SULog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SULog.h; sourceTree = ""; }; - 55C14F05136EF6DB00649790 /* SULog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SULog.m; sourceTree = ""; }; - 55C14F31136EFC2400649790 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 55E6F33219EC9F6C00005E76 /* SUErrors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUErrors.h; sourceTree = ""; }; - 5AEF45D9189D1CC90030D7DC /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Sparkle.strings; sourceTree = ""; }; - 5AF6C1E81AE86E270014A3AB /* test archive.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = "test archive.zip"; sourceTree = ""; }; - 5AF6C1EA1AE870A90014A3AB /* SUPipedUnarchiverTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPipedUnarchiverTest.m; sourceTree = ""; }; - 5AF6C74C1AEA40760014A3AB /* SUInstallerTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUInstallerTest.m; sourceTree = ""; }; - 5AF6C74E1AEA46D10014A3AB /* test.sparkle_guided.pkg */ = {isa = PBXFileReference; lastKnownFileType = file; path = test.sparkle_guided.pkg; sourceTree = ""; }; - 5AF9DC3B1981DBEE001EA135 /* SUDSAVerifierTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDSAVerifierTest.m; sourceTree = ""; }; - 5D06E8D00FD68C7C005AE3F6 /* BinaryDelta */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BinaryDelta; sourceTree = BUILT_PRODUCTS_DIR; }; - 5D06E8DB0FD68CB9005AE3F6 /* bsdiff.c */ = {isa = PBXFileReference; comments = "-Wno-shorten-64-to-32"; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bsdiff.c; sourceTree = ""; }; - 5D06E8DC0FD68CB9005AE3F6 /* bspatch.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bspatch.c; sourceTree = ""; }; - 5D06E8DF0FD68CC7005AE3F6 /* SUBinaryDeltaApply.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBinaryDeltaApply.h; sourceTree = ""; }; - 5D06E8E00FD68CC7005AE3F6 /* SUBinaryDeltaApply.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBinaryDeltaApply.m; sourceTree = ""; }; - 5D06E8E10FD68CC7005AE3F6 /* SUBinaryDeltaCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBinaryDeltaCommon.h; sourceTree = ""; }; - 5D06E8E20FD68CC7005AE3F6 /* SUBinaryDeltaCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBinaryDeltaCommon.m; sourceTree = ""; }; - 5D06E8E30FD68CC7005AE3F6 /* SUBinaryDeltaTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBinaryDeltaTool.m; sourceTree = ""; usesTabs = 0; }; - 5D06E8F10FD68D21005AE3F6 /* ConfigBinaryDelta.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigBinaryDelta.xcconfig; sourceTree = ""; }; - 5D06E8F20FD68D21005AE3F6 /* ConfigBinaryDeltaDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigBinaryDeltaDebug.xcconfig; sourceTree = ""; }; - 5D06E8F30FD68D21005AE3F6 /* ConfigBinaryDeltaRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigBinaryDeltaRelease.xcconfig; sourceTree = ""; }; - 5D06E8FB0FD68D61005AE3F6 /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; }; - 5D06E9370FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBinaryDeltaUnarchiver.h; sourceTree = ""; }; - 5D06E9380FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBinaryDeltaUnarchiver.m; sourceTree = ""; }; - 5D1AF5890FD7678C0065DB48 /* libxar.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxar.1.dylib; path = usr/lib/libxar.1.dylib; sourceTree = SDKROOT; }; - 5D1AF58F0FD767AD0065DB48 /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; - 5D1AF5990FD767E50065DB48 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; - 610134710DD250470049ACDF /* SUUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateDriver.h; sourceTree = ""; }; - 610134720DD250470049ACDF /* SUUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateDriver.m; sourceTree = ""; }; - 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUProbingUpdateDriver.h; sourceTree = ""; }; - 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUProbingUpdateDriver.m; sourceTree = ""; }; - 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPipedUnarchiver.h; sourceTree = ""; }; - 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDiskImageUnarchiver.h; sourceTree = ""; }; - 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDiskImageUnarchiver.m; sourceTree = ""; }; - 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver_Private.h; sourceTree = ""; }; - 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NTSynchronousTask.m; sourceTree = ""; }; - 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NTSynchronousTask.h; sourceTree = ""; }; - 611142E810FB1BE5009810AA /* bspatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bspatch.h; sourceTree = ""; }; - 61131A050F846CE600E97AF6 /* da */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Sparkle.strings; sourceTree = ""; }; - 61131A090F846D0A00E97AF6 /* zh_CN */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = zh_CN; path = zh_CN.lproj/Sparkle.strings; sourceTree = ""; }; - 61131A0A0F846D1100E97AF6 /* zh_TW */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = zh_TW; path = zh_TW.lproj/Sparkle.strings; sourceTree = ""; }; - 6117796E0D1112E000749C97 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 61180BC80D64138900B4E0D1 /* SUWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUWindowController.h; sourceTree = ""; }; - 61180BC90D64138900B4E0D1 /* SUWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUWindowController.m; sourceTree = ""; }; - 611A904210240DD300CC659E /* pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Sparkle.strings; sourceTree = ""; }; - 611A904610240DF700CC659E /* ja */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Sparkle.strings; sourceTree = ""; }; - 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateAlert.h; sourceTree = ""; }; - 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateAlert.m; sourceTree = ""; }; - 612279D90DB5470200AB99EA /* Sparkle Unit Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Sparkle Unit Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 612279DA0DB5470200AB99EA /* SparkleTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SparkleTests-Info.plist"; sourceTree = ""; }; - 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUVersionComparisonTest.m; sourceTree = ""; }; - 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstallerInternals.h; sourceTree = ""; }; - 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDSAVerifier.h; sourceTree = ""; }; - 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDSAVerifier.m; sourceTree = ""; }; - 61299A5B09CA6D4500B7442F /* SUConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUConstants.h; sourceTree = ""; }; - 61299A5F09CA6EB100B7442F /* SUConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUConstants.m; sourceTree = ""; }; - 61299A8B09CA790200B7442F /* SUUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver.h; sourceTree = ""; }; - 61299A8C09CA790200B7442F /* SUUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUnarchiver.m; sourceTree = ""; }; - 61299B3509CB04E000B7442F /* Sparkle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.h; sourceTree = ""; }; - 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPipedUnarchiver.m; sourceTree = ""; }; - 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdatePermissionPrompt.h; sourceTree = ""; }; - 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdatePermissionPrompt.m; sourceTree = ""; }; - 613151B20FB4946A000DCD59 /* is */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Sparkle.strings; sourceTree = ""; }; - 6149E6EA1601ABAC008A351E /* ar */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Sparkle.strings; sourceTree = ""; }; - 6149E6ED1601ABAC008A351E /* ar */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ar; path = ar.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 6149E6EF1601ABAC008A351E /* ar */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ar; path = ar.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 6149E6F01601ABAC008A351E /* ar */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ar; path = ar.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 615409C4103BBC4000125AF1 /* cs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Sparkle.strings; sourceTree = ""; }; - 6158A1B81378F64700487EC1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = pt_PT.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 6158A1BA1378F68100487EC1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = pt_PT.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 6158A1BB1378F68100487EC1 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = pt_PT.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 6158A1BE1378F8BB00487EC1 /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = tr.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 6158A1BF1378F8BB00487EC1 /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = tr.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 6158A1C01378F8BB00487EC1 /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = tr.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 6158A1C4137904B300487EC1 /* SUUpdater_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdater_Private.h; sourceTree = ""; }; - 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SUModelTranslation.plist; sourceTree = ""; }; - 6186554310D7484E00B1E074 /* pt_PT */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = pt_PT; path = pt_PT.lproj/Sparkle.strings; sourceTree = ""; }; - 618915730E35937600B5E981 /* sv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Sparkle.strings; sourceTree = ""; }; - 618FA4FF0DAE88B40026945C /* SUInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUInstaller.h; sourceTree = ""; }; - 618FA5000DAE88B40026945C /* SUInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUInstaller.m; sourceTree = ""; }; - 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstaller.h; sourceTree = ""; }; - 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstaller.m; sourceTree = ""; }; - 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPackageInstaller.h; sourceTree = ""; }; - 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPackageInstaller.m; sourceTree = ""; }; - 6195D4920E404AD700D41A50 /* ru */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Sparkle.strings; sourceTree = ""; }; - 6196CFE309C71ADE000DC222 /* SUStatusController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStatusController.h; sourceTree = ""; }; - 6196CFE409C71ADE000DC222 /* SUStatusController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStatusController.m; sourceTree = ""; }; - 619B17200E1E9D0800E72754 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Sparkle.strings; sourceTree = ""; }; - 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUVersionComparisonProtocol.h; sourceTree = ""; }; - 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStandardVersionComparator.h; sourceTree = ""; }; - 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStandardVersionComparator.m; sourceTree = ""; }; - 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUSystemProfiler.h; sourceTree = ""; }; - 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUSystemProfiler.m; sourceTree = ""; }; - 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUserInitiatedUpdateDriver.h; sourceTree = ""; }; - 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUserInitiatedUpdateDriver.m; sourceTree = ""; }; - 61AAE8230A321A7F00D8810D /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Sparkle.strings; sourceTree = ""; }; - 61AAE84F0A321AF700D8810D /* es */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Sparkle.strings; sourceTree = ""; }; - 61AAE8590A321B0400D8810D /* fr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Sparkle.strings; sourceTree = ""; }; - 61AAE8710A321F7700D8810D /* nl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Sparkle.strings; sourceTree = ""; }; - 61B078CC15A5FB6100600039 /* SUCodeSigningVerifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUCodeSigningVerifier.h; sourceTree = ""; }; - 61B078CD15A5FB6100600039 /* SUCodeSigningVerifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUCodeSigningVerifier.m; sourceTree = ""; }; - 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SUUpdater.h; sourceTree = ""; }; - 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUUpdater.m; sourceTree = ""; }; - 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstallerInternals.m; sourceTree = ""; }; - 61B5F8F609C4CEB300B25A18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Sparkle Test App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 61B5F90409C4CEE200B25A18 /* TestApplication-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TestApplication-Info.plist"; sourceTree = ""; }; - 61B5F92409C4CFC900B25A18 /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 61B5F92B09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 61B5F92D09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; - 61B5FB9409C4F04600B25A18 /* SUAppcast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcast.h; sourceTree = ""; }; - 61B5FB9509C4F04600B25A18 /* SUAppcast.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcast.m; sourceTree = ""; }; - 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcastItem.h; sourceTree = ""; }; - 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcastItem.m; sourceTree = ""; }; - 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateAlert.h; sourceTree = ""; }; - 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateAlert.m; sourceTree = ""; }; - 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUIBasedUpdateDriver.h; sourceTree = ""; }; - 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUIBasedUpdateDriver.m; sourceTree = ""; }; - 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateDriver.h; sourceTree = ""; }; - 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateDriver.m; sourceTree = ""; }; - 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUScheduledUpdateDriver.h; sourceTree = ""; }; - 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUScheduledUpdateDriver.m; sourceTree = ""; }; - 61BA66CC14BDFA0400D02D86 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Sparkle.strings; sourceTree = ""; }; - 61BA66DA14BDFC5500D02D86 /* sl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sl; path = sl.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 61BA66DB14BDFC5500D02D86 /* sl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sl; path = sl.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 61BA66DC14BDFC5500D02D86 /* sl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sl; path = sl.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 61C268090E2DB5D000175E6C /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = SOURCE_ROOT; }; - 61CFB3280E385186007A1735 /* Sparkle.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.pch; sourceTree = ""; }; - 61E31A80103299500051D188 /* pt_BR */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = pt_BR; path = pt_BR.lproj/Sparkle.strings; sourceTree = ""; }; - 61EF67550E25B58D00F754E0 /* SUHost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUHost.m; sourceTree = ""; }; - 61EF67580E25C5B400F754E0 /* SUHost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUHost.h; sourceTree = ""; }; - 61F3AC1215C22D4A00260CA2 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Sparkle.strings; sourceTree = ""; }; - 61F3AC1415C22D5900260CA2 /* th */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = th; path = th.lproj/SUAutomaticUpdateAlert.xib; sourceTree = ""; }; - 61F3AC1615C22D5900260CA2 /* th */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = th; path = th.lproj/SUUpdateAlert.xib; sourceTree = ""; }; - 61F3AC1715C22D5900260CA2 /* th */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = th; path = th.lproj/SUUpdatePermissionPrompt.xib; sourceTree = ""; }; - 61F614540E24A12D009F47E7 /* it */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Sparkle.strings; sourceTree = ""; }; - 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBasicUpdateDriver.h; sourceTree = ""; }; - 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBasicUpdateDriver.m; sourceTree = ""; }; - 7223E7611AD1AEFF008E3161 /* sais.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sais.c; sourceTree = ""; }; - 7223E7621AD1AEFF008E3161 /* sais.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sais.h; sourceTree = ""; }; - 7268AC621AD634C200C3E0C1 /* SUBinaryDeltaCreate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBinaryDeltaCreate.m; sourceTree = ""; }; - 7268AC641AD634E400C3E0C1 /* SUBinaryDeltaCreate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBinaryDeltaCreate.h; sourceTree = ""; }; - 767B61AA1972D488004E0C3C /* SUGuidedPackageInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUGuidedPackageInstaller.h; sourceTree = ""; }; - 767B61AB1972D488004E0C3C /* SUGuidedPackageInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUGuidedPackageInstaller.m; sourceTree = ""; }; - 8DC2EF5A0486A6940098B216 /* Sparkle-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Sparkle-Info.plist"; sourceTree = ""; }; - 8DC2EF5B0486A6940098B216 /* Sparkle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sparkle.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F8761EB01ADC5068000C9034 /* SUCodeSigningVerifierTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUCodeSigningVerifierTest.m; sourceTree = ""; }; - F8761EB21ADC50EB000C9034 /* SparkleTestCodeSignApp.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = SparkleTestCodeSignApp.zip; sourceTree = ""; }; - FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkDebug.xcconfig; sourceTree = ""; }; - FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppDebug.xcconfig; sourceTree = ""; }; - FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonRelease.xcconfig; sourceTree = ""; }; - FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestApp.xcconfig; sourceTree = ""; }; - FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunch.xcconfig; sourceTree = ""; }; - FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonDebug.xcconfig; sourceTree = ""; }; - FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommon.xcconfig; sourceTree = ""; }; - FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFramework.xcconfig; sourceTree = ""; }; - FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppRelease.xcconfig; sourceTree = ""; }; - FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchDebug.xcconfig; sourceTree = ""; }; - FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchRelease.xcconfig; sourceTree = ""; }; - FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkRelease.xcconfig; sourceTree = ""; }; - FA3AAF391050B273004B3130 /* ConfigUnitTestRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigUnitTestRelease.xcconfig; sourceTree = ""; }; - FA3AAF3A1050B273004B3130 /* ConfigUnitTestDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigUnitTestDebug.xcconfig; sourceTree = ""; }; - FA3AAF3B1050B273004B3130 /* ConfigUnitTest.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigUnitTest.xcconfig; sourceTree = ""; }; - FE5536F517A2C6A7007CB333 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Sparkle.strings; sourceTree = ""; }; - FE5536F617A2C6AB007CB333 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Sparkle.strings; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 55C14BB5136EEF1500649790 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 14950071195FCE3D00BC5B5B /* AppKit.framework in Frameworks */, - 14950070195FCE3A00BC5B5B /* Foundation.framework in Frameworks */, - 55C14F9A136F045400649790 /* Security.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5D06E8CE0FD68C7C005AE3F6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5D06E9050FD68D7D005AE3F6 /* Foundation.framework in Frameworks */, - 5D06E8FF0FD68D6D005AE3F6 /* libbz2.dylib in Frameworks */, - 5D1AF58B0FD7678C0065DB48 /* libxar.1.dylib in Frameworks */, - 5D1AF5900FD767AD0065DB48 /* libxml2.dylib in Frameworks */, - 5D1AF59A0FD767E50065DB48 /* libz.dylib in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 612279D60DB5470200AB99EA /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 14732BD119610A1200593899 /* AppKit.framework in Frameworks */, - 14732BD019610A0D00593899 /* Foundation.framework in Frameworks */, - 721CF1AB1AD764EB00D9AC09 /* libbz2.dylib in Frameworks */, - 721CF1AA1AD7647000D9AC09 /* libxar.1.dylib in Frameworks */, - 14652F8019A9740F00959E44 /* Security.framework in Frameworks */, - 61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */, - 14732BD319610A1800593899 /* XCTest.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61B5F90009C4CEE200B25A18 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 14950073195FCE4E00BC5B5B /* AppKit.framework in Frameworks */, - 14950072195FCE4B00BC5B5B /* Foundation.framework in Frameworks */, - 61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8DC2EF560486A6940098B216 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1495006E195FCE1100BC5B5B /* AppKit.framework in Frameworks */, - 1495006F195FCE1800BC5B5B /* Foundation.framework in Frameworks */, - 61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */, - 5D06E8FD0FD68D6B005AE3F6 /* libbz2.dylib in Frameworks */, - 5D1AF58A0FD7678C0065DB48 /* libxar.1.dylib in Frameworks */, - 5D1AF82B0FD768180065DB48 /* libz.dylib in Frameworks */, - 61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */, - 55C14F32136EFC2400649790 /* SystemConfiguration.framework in Frameworks */, - 61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 5D06E8D00FD68C7C005AE3F6 /* BinaryDelta */, - 55C14BB7136EEF1500649790 /* Autoupdate.app */, - 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */, - 612279D90DB5470200AB99EA /* Sparkle Unit Tests.xctest */, - 8DC2EF5B0486A6940098B216 /* Sparkle.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Sparkle */ = { - isa = PBXGroup; - children = ( - 1495006D195FBBBD00BC5B5B /* Sparkle */, - 14732BB81960EEB600593899 /* Resources */, - 61227A100DB5484000AB99EA /* Tests */, - 61B5F91D09C4CF7F00B25A18 /* Test Application */, - 14732BB51960ECBA00593899 /* Third Party */, - 1420DE391962322200203BB0 /* Documentation */, - FA1941C40D94A6EA00DD942E /* Configurations */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - name = Sparkle; - sourceTree = ""; - usesTabs = 0; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 0867D6A5FE840307C02AAC07 /* AppKit.framework */, - 525A278F133D6AE900FD8D70 /* Cocoa.framework */, - 0867D69BFE84028FC02AAC07 /* Foundation.framework */, - 6117796E0D1112E000749C97 /* IOKit.framework */, - 5D06E8FB0FD68D61005AE3F6 /* libbz2.dylib */, - 5D1AF5890FD7678C0065DB48 /* libxar.1.dylib */, - 5D1AF58F0FD767AD0065DB48 /* libxml2.dylib */, - 5D1AF5990FD767E50065DB48 /* libz.dylib */, - 61B5F8F609C4CEB300B25A18 /* Security.framework */, - 55C14F31136EFC2400649790 /* SystemConfiguration.framework */, - 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */, - 14732BD219610A1800593899 /* XCTest.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 089C1665FE841158C02AAC07 /* Framework Resources */ = { - isa = PBXGroup; - children = ( - 8DC2EF5A0486A6940098B216 /* Sparkle-Info.plist */, - 61AAE8220A321A7F00D8810D /* Sparkle.strings */, - 55C14BDA136EF20D00649790 /* SUAutomaticUpdateAlert.xib */, - 55C14BD8136EF00C00649790 /* SUStatus.xib */, - 55C14BF0136EF26100649790 /* SUUpdateAlert.xib */, - 55C14C05136EF2C700649790 /* SUUpdatePermissionPrompt.xib */, - ); - name = "Framework Resources"; - sourceTree = ""; - }; - 1420DE391962322200203BB0 /* Documentation */ = { - isa = PBXGroup; - children = ( - 1420DF4E196247B500203BB0 /* Doxyfile */, - 1420DF4D196247B500203BB0 /* build-docs.sh */, - ); - path = Documentation; - sourceTree = ""; - }; - 14732BB51960ECBA00593899 /* Third Party */ = { - isa = PBXGroup; - children = ( - 14732BB61960ECE800593899 /* bsdiff */, - 14732BB71960ECF000593899 /* CocoatechCore */, - ); - name = "Third Party"; - path = Vendor; - sourceTree = ""; - }; - 14732BB61960ECE800593899 /* bsdiff */ = { - isa = PBXGroup; - children = ( - 5D06E8DB0FD68CB9005AE3F6 /* bsdiff.c */, - 5D06E8DC0FD68CB9005AE3F6 /* bspatch.c */, - 611142E810FB1BE5009810AA /* bspatch.h */, - 7223E7611AD1AEFF008E3161 /* sais.c */, - 7223E7621AD1AEFF008E3161 /* sais.h */, - ); - path = bsdiff; - sourceTree = ""; - }; - 14732BB71960ECF000593899 /* CocoatechCore */ = { - isa = PBXGroup; - children = ( - 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */, - 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */, - ); - path = CocoatechCore; - sourceTree = ""; - }; - 14732BB81960EEB600593899 /* Resources */ = { - isa = PBXGroup; - children = ( - 14732BC21960F3FF00593899 /* bin */, - 14732BBA1960EF7100593899 /* CHANGELOG */, - 61C268090E2DB5D000175E6C /* LICENSE */, - 14732BC11960F3B200593899 /* Makefile */, - 1420DF4F196247F900203BB0 /* Images.xcassets */, - 14732BBC1960EFB500593899 /* README.markdown */, - 14732BB91960EEEE00593899 /* SampleAppcast.xml */, - 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 14732BC21960F3FF00593899 /* bin */ = { - isa = PBXGroup; - children = ( - 14732BC31960F3FF00593899 /* generate_keys.sh */, - 14732BC41960F3FF00593899 /* sign_update.sh */, - ); - path = bin; - sourceTree = SOURCE_ROOT; - }; - 1495006D195FBBBD00BC5B5B /* Sparkle */ = { - isa = PBXGroup; - children = ( - 61299B3909CB055000B7442F /* Appcast Support */, - 55C14BD5136EEFD000649790 /* Autoupdate */, - 089C1665FE841158C02AAC07 /* Framework Resources */, - 618FA6DB0DB485440026945C /* Installation */, - 61B5F8F309C4CE5900B25A18 /* Other Sources */, - 6101354A0DD25B7F0049ACDF /* Unarchiving */, - 61F83F6E0DBFE07A006FDD30 /* Update Control */, - 61299B3A09CB056100B7442F /* User Interface */, - ); - path = Sparkle; - sourceTree = ""; - }; - 14958C7019AEBE350061B14F /* Resources */ = { - isa = PBXGroup; - children = ( - 14958C6B19AEBC530061B14F /* signed-test-file.txt */, - F8761EB21ADC50EB000C9034 /* SparkleTestCodeSignApp.zip */, - 5AF6C1E81AE86E270014A3AB /* test archive.zip */, - 14958C6C19AEBC610061B14F /* test-pubkey.pem */, - 5AF6C74E1AEA46D10014A3AB /* test.sparkle_guided.pkg */, - ); - path = Resources; - sourceTree = ""; - }; - 55C14BD5136EEFD000649790 /* Autoupdate */ = { - isa = PBXGroup; - children = ( - 55C14BB9136EEF1500649790 /* Autoupdate-Info.plist */, - 55C14BD3136EEFCE00649790 /* Autoupdate.m */, - ); - path = Autoupdate; - sourceTree = ""; - }; - 5D06E8D90FD68C95005AE3F6 /* Binary Delta */ = { - isa = PBXGroup; - children = ( - 5D06E8DF0FD68CC7005AE3F6 /* SUBinaryDeltaApply.h */, - 5D06E8E00FD68CC7005AE3F6 /* SUBinaryDeltaApply.m */, - 5D06E8E10FD68CC7005AE3F6 /* SUBinaryDeltaCommon.h */, - 5D06E8E20FD68CC7005AE3F6 /* SUBinaryDeltaCommon.m */, - 7268AC641AD634E400C3E0C1 /* SUBinaryDeltaCreate.h */, - 7268AC621AD634C200C3E0C1 /* SUBinaryDeltaCreate.m */, - 5D06E8E30FD68CC7005AE3F6 /* SUBinaryDeltaTool.m */, - 5D06E9370FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.h */, - 5D06E9380FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.m */, - ); - name = "Binary Delta"; - sourceTree = ""; - }; - 6101354A0DD25B7F0049ACDF /* Unarchiving */ = { - isa = PBXGroup; - children = ( - 5D06E8D90FD68C95005AE3F6 /* Binary Delta */, - 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */, - 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */, - 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */, - 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */, - 61299A8B09CA790200B7442F /* SUUnarchiver.h */, - 61299A8C09CA790200B7442F /* SUUnarchiver.m */, - 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */, - ); - name = Unarchiving; - sourceTree = ""; - }; - 61227A100DB5484000AB99EA /* Tests */ = { - isa = PBXGroup; - children = ( - 14958C7019AEBE350061B14F /* Resources */, - 612279DA0DB5470200AB99EA /* SparkleTests-Info.plist */, - 142E0E0819A83AAC00E4312B /* SUBinaryDeltaTest.m */, - F8761EB01ADC5068000C9034 /* SUCodeSigningVerifierTest.m */, - 5AF9DC3B1981DBEE001EA135 /* SUDSAVerifierTest.m */, - 5AF6C74C1AEA40760014A3AB /* SUInstallerTest.m */, - 5AF6C1EA1AE870A90014A3AB /* SUPipedUnarchiverTest.m */, - 14950074195FDF5900BC5B5B /* SUUpdaterTest.m */, - 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */, - ); - path = Tests; - sourceTree = ""; - }; - 61299B3909CB055000B7442F /* Appcast Support */ = { - isa = PBXGroup; - children = ( - 61B5FB9409C4F04600B25A18 /* SUAppcast.h */, - 61B5FB9509C4F04600B25A18 /* SUAppcast.m */, - 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */, - 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */, - 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */, - 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */, - 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */, - 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */, - 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */, - 3772FEA813DE0B6B00F79537 /* SUVersionDisplayProtocol.h */, - ); - name = "Appcast Support"; - sourceTree = ""; - }; - 61299B3A09CB056100B7442F /* User Interface */ = { - isa = PBXGroup; - children = ( - 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */, - 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */, - 6196CFE309C71ADE000DC222 /* SUStatusController.h */, - 6196CFE409C71ADE000DC222 /* SUStatusController.m */, - 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */, - 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */, - 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */, - 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */, - 61180BC80D64138900B4E0D1 /* SUWindowController.h */, - 61180BC90D64138900B4E0D1 /* SUWindowController.m */, - ); - name = "User Interface"; - sourceTree = ""; - }; - 618FA6DB0DB485440026945C /* Installation */ = { - isa = PBXGroup; - children = ( - 767B61AA1972D488004E0C3C /* SUGuidedPackageInstaller.h */, - 767B61AB1972D488004E0C3C /* SUGuidedPackageInstaller.m */, - 618FA4FF0DAE88B40026945C /* SUInstaller.h */, - 618FA5000DAE88B40026945C /* SUInstaller.m */, - 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */, - 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */, - 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */, - 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */, - 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */, - 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */, - ); - name = Installation; - sourceTree = ""; - }; - 61B5F8F309C4CE5900B25A18 /* Other Sources */ = { - isa = PBXGroup; - children = ( - 61299B3509CB04E000B7442F /* Sparkle.h */, - 61CFB3280E385186007A1735 /* Sparkle.pch */, - 61299A5B09CA6D4500B7442F /* SUConstants.h */, - 61299A5F09CA6EB100B7442F /* SUConstants.m */, - 55E6F33219EC9F6C00005E76 /* SUErrors.h */, - 14652F8319A9759F00959E44 /* SUExport.h */, - 61EF67580E25C5B400F754E0 /* SUHost.h */, - 61EF67550E25B58D00F754E0 /* SUHost.m */, - 55C14F04136EF6DB00649790 /* SULog.h */, - 55C14F05136EF6DB00649790 /* SULog.m */, - ); - includeInIndex = 1; - name = "Other Sources"; - sourceTree = ""; - }; - 61B5F91D09C4CF7F00B25A18 /* Test Application */ = { - isa = PBXGroup; - children = ( - 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */, - 61B5F92409C4CFC900B25A18 /* main.m */, - 61B5F92C09C4CFD800B25A18 /* MainMenu.xib */, - 14732BBF1960F0AC00593899 /* test_app_only_dsa_pub.pem */, - 61B5F90409C4CEE200B25A18 /* TestApplication-Info.plist */, - ); - name = "Test Application"; - path = TestApplication; - sourceTree = ""; - }; - 61CFB2C10E384958007A1735 /* Support */ = { - isa = PBXGroup; - children = ( - 61B078CC15A5FB6100600039 /* SUCodeSigningVerifier.h */, - 61B078CD15A5FB6100600039 /* SUCodeSigningVerifier.m */, - 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */, - 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */, - ); - name = Support; - sourceTree = ""; - }; - 61CFB2C20E38496B007A1735 /* Drivers */ = { - isa = PBXGroup; - children = ( - 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */, - 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */, - 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */, - 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */, - 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */, - 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */, - 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */, - 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */, - 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */, - 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */, - 610134710DD250470049ACDF /* SUUpdateDriver.h */, - 610134720DD250470049ACDF /* SUUpdateDriver.m */, - 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */, - 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */, - ); - name = Drivers; - sourceTree = ""; - }; - 61F83F6E0DBFE07A006FDD30 /* Update Control */ = { - isa = PBXGroup; - children = ( - 61CFB2C20E38496B007A1735 /* Drivers */, - 61CFB2C10E384958007A1735 /* Support */, - 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */, - 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */, - 6158A1C4137904B300487EC1 /* SUUpdater_Private.h */, - ); - name = "Update Control"; - sourceTree = ""; - }; - FA1941C40D94A6EA00DD942E /* Configurations */ = { - isa = PBXGroup; - children = ( - 14732BB1195FF6B700593899 /* .clang-format */, - 5D06E8F10FD68D21005AE3F6 /* ConfigBinaryDelta.xcconfig */, - 5D06E8F20FD68D21005AE3F6 /* ConfigBinaryDeltaDebug.xcconfig */, - 5D06E8F30FD68D21005AE3F6 /* ConfigBinaryDeltaRelease.xcconfig */, - FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */, - FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */, - FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */, - FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */, - FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */, - FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */, - FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */, - FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */, - FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */, - FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */, - FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */, - FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */, - FA3AAF3B1050B273004B3130 /* ConfigUnitTest.xcconfig */, - FA3AAF3A1050B273004B3130 /* ConfigUnitTestDebug.xcconfig */, - FA3AAF391050B273004B3130 /* ConfigUnitTestRelease.xcconfig */, - 14732BC91960F70A00593899 /* make-release-package.sh */, - 14652F7919A93E5F00959E44 /* set-git-version-info.sh */, - 146EC84E19A68CF8004A50C5 /* Sparkle.podspec */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 8DC2EF500486A6940098B216 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 611142E910FB1BE5009810AA /* bspatch.h in Headers */, - 6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */, - 61299B3609CB04E000B7442F /* Sparkle.h in Headers */, - 61CFB3290E385186007A1735 /* Sparkle.pch in Headers */, - 61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */, - 61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */, - 6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */, - 61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */, - 61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */, - 5D06E9390FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.h in Headers */, - 61B078CE15A5FB6100600039 /* SUCodeSigningVerifier.h in Headers */, - 61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */, - 6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */, - 61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */, - 55E6F33319EC9F6C00005E76 /* SUErrors.h in Headers */, - 14652F8419A978C200959E44 /* SUExport.h in Headers */, - 767B61AC1972D488004E0C3C /* SUGuidedPackageInstaller.h in Headers */, - 61EF67590E25C5B400F754E0 /* SUHost.h in Headers */, - 618FA5010DAE88B40026945C /* SUInstaller.h in Headers */, - 55C14F06136EF6DB00649790 /* SULog.h in Headers */, - 618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */, - 6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */, - 618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */, - 61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */, - 6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */, - 61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */, - 61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */, - 6196CFF909C72148000DC222 /* SUStatusController.h in Headers */, - 61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */, - 61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */, - 61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */, - 6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */, - 61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */, - 610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */, - 612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */, - 61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */, - 6158A1C5137904B300487EC1 /* SUUpdater_Private.h in Headers */, - 61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */, - 61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */, - 3772FEA913DE0B6B00F79537 /* SUVersionDisplayProtocol.h in Headers */, - 61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXLegacyTarget section */ - 1420DF491962329200203BB0 /* Documentation */ = { - isa = PBXLegacyTarget; - buildArgumentsString = "\"$(SRCROOT)/Documentation/build-docs.sh\" $(ACTION)"; - buildConfigurationList = 1420DF4A1962329200203BB0 /* Build configuration list for PBXLegacyTarget "Documentation" */; - buildPhases = ( - ); - buildToolPath = bash; - buildWorkingDirectory = ""; - dependencies = ( - ); - name = Documentation; - passBuildSettingsInEnvironment = 1; - productName = Documentation; - }; - 14732BC51960F69300593899 /* Distribution */ = { - isa = PBXLegacyTarget; - buildArgumentsString = "$(SRCROOT)/Configurations/make-release-package.sh $(ACTION)"; - buildConfigurationList = 14732BC61960F69300593899 /* Build configuration list for PBXLegacyTarget "Distribution" */; - buildPhases = ( - ); - buildToolPath = bash; - buildWorkingDirectory = ""; - dependencies = ( - 14732BCB1960F73500593899 /* PBXTargetDependency */, - 1454BA1619637EDB00344E57 /* PBXTargetDependency */, - 14732BCF1960F73500593899 /* PBXTargetDependency */, - 1454BA1819637EE900344E57 /* PBXTargetDependency */, - ); - name = Distribution; - passBuildSettingsInEnvironment = 1; - productName = Distribution; - }; -/* End PBXLegacyTarget section */ - -/* Begin PBXNativeTarget section */ - 55C14BB6136EEF1500649790 /* Autoupdate */ = { - isa = PBXNativeTarget; - buildConfigurationList = 55C14BBE136EEF1500649790 /* Build configuration list for PBXNativeTarget "Autoupdate" */; - buildPhases = ( - 55C14BB3136EEF1500649790 /* Resources */, - 55C14BB4136EEF1500649790 /* Sources */, - 55C14BB5136EEF1500649790 /* Frameworks */, - 14652F7B19A945D600959E44 /* Run Script: Set Git Version Info */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Autoupdate; - productName = Autoupdate; - productReference = 55C14BB7136EEF1500649790 /* Autoupdate.app */; - productType = "com.apple.product-type.application"; - }; - 5D06E8CF0FD68C7C005AE3F6 /* BinaryDelta */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5D06E8DA0FD68C95005AE3F6 /* Build configuration list for PBXNativeTarget "BinaryDelta" */; - buildPhases = ( - 5D06E8CD0FD68C7C005AE3F6 /* Sources */, - 5D06E8CE0FD68C7C005AE3F6 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 5D06E8D60FD68C86005AE3F6 /* PBXTargetDependency */, - ); - name = BinaryDelta; - productName = BinaryDelta; - productReference = 5D06E8D00FD68C7C005AE3F6 /* BinaryDelta */; - productType = "com.apple.product-type.tool"; - }; - 612279D80DB5470200AB99EA /* Sparkle Unit Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */; - buildPhases = ( - 612279D50DB5470200AB99EA /* Sources */, - 612279D60DB5470200AB99EA /* Frameworks */, - 14958C6D19AEBC890061B14F /* Resources */, - 142E0E0119A6A13300E4312B /* CopyFiles */, - 612279D70DB5470200AB99EA /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */, - ); - name = "Sparkle Unit Tests"; - productName = "Sparkle Unit Tests"; - productReference = 612279D90DB5470200AB99EA /* Sparkle Unit Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 61B5F90109C4CEE200B25A18 /* Sparkle Test App */ = { - isa = PBXNativeTarget; - buildConfigurationList = 61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */; - buildPhases = ( - 61B5F8FE09C4CEE200B25A18 /* Resources */, - 61B5F8FF09C4CEE200B25A18 /* Sources */, - 61B5F90009C4CEE200B25A18 /* Frameworks */, - 61B5FB4D09C4E9FA00B25A18 /* Copy Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */, - ); - name = "Sparkle Test App"; - productName = "Test Application"; - productReference = 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */; - productType = "com.apple.product-type.application"; - }; - 8DC2EF4F0486A6940098B216 /* Sparkle */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */; - buildPhases = ( - 8DC2EF500486A6940098B216 /* Headers */, - 8DC2EF520486A6940098B216 /* Resources */, - 142E0E0319A6A24100E4312B /* CopyFiles */, - 8DC2EF540486A6940098B216 /* Sources */, - 8DC2EF560486A6940098B216 /* Frameworks */, - 6131B1910DDCDE32005215F0 /* Run Script: Set Git Version Info */, - 6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */, - 61E31A85103299750051D188 /* Run Script: Link pt to pt_BR */, - ); - buildRules = ( - ); - dependencies = ( - 55C14F97136F044100649790 /* PBXTargetDependency */, - ); - name = Sparkle; - productInstallPath = "$(HOME)/Library/Frameworks"; - productName = Sparkle; - productReference = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = SU; - LastUpgradeCheck = 0630; - ORGANIZATIONNAME = "Sparkle Project"; - TargetAttributes = { - 612279D80DB5470200AB99EA = { - TestTargetID = 8DC2EF4F0486A6940098B216; - }; - }; - }; - buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - Italian, - zh_TW, - en, - ca, - cs, - cy, - da, - de, - es, - fi, - fr, - he, - hu, - id, - is, - it, - ja, - ko, - nl, - no, - pl, - ru, - sk, - sv, - th, - tr, - zh_CN, - fr_ca, - pt_BR, - pt_PT, - pt, - ro, - sl, - uk, - ar, - nb, - el, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Sparkle */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8DC2EF4F0486A6940098B216 /* Sparkle */, - 61B5F90109C4CEE200B25A18 /* Sparkle Test App */, - 612279D80DB5470200AB99EA /* Sparkle Unit Tests */, - 5D06E8CF0FD68C7C005AE3F6 /* BinaryDelta */, - 55C14BB6136EEF1500649790 /* Autoupdate */, - 14732BC51960F69300593899 /* Distribution */, - 1420DF491962329200203BB0 /* Documentation */, - 1495005F195FB89400BC5B5B /* All */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 14958C6D19AEBC890061B14F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 14958C6E19AEBC950061B14F /* signed-test-file.txt in Resources */, - F8761EB31ADC50EB000C9034 /* SparkleTestCodeSignApp.zip in Resources */, - 5AF6C1E91AE86E270014A3AB /* test archive.zip in Resources */, - 14958C6F19AEBC980061B14F /* test-pubkey.pem in Resources */, - 5AF6C74F1AEA46D10014A3AB /* test.sparkle_guided.pkg in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 55C14BB3136EEF1500649790 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1420DF51196247F900203BB0 /* Images.xcassets in Resources */, - 55C14FC7136F05E100649790 /* Sparkle.strings in Resources */, - 55C14BD9136EF00C00649790 /* SUStatus.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61B5F8FE09C4CEE200B25A18 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1420DF50196247F900203BB0 /* Images.xcassets in Resources */, - 61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */, - 61B5F92F09C4CFD800B25A18 /* MainMenu.xib in Resources */, - 14732BC01960F2C200593899 /* test_app_only_dsa_pub.pem in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8DC2EF520486A6940098B216 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */, - 55C14BEE136EF20D00649790 /* SUAutomaticUpdateAlert.xib in Resources */, - 615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */, - 55C14BEF136EF21700649790 /* SUStatus.xib in Resources */, - 55C14C04136EF26100649790 /* SUUpdateAlert.xib in Resources */, - 55C14C19136EF2C700649790 /* SUUpdatePermissionPrompt.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 14652F7B19A945D600959E44 /* Run Script: Set Git Version Info */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script: Set Git Version Info"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$SRCROOT/Configurations/set-git-version-info.sh\""; - showEnvVarsInLog = 0; - }; - 612279D70DB5470200AB99EA /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - showEnvVarsInLog = 0; - }; - 6131B1910DDCDE32005215F0 /* Run Script: Set Git Version Info */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 12; - files = ( - ); - inputPaths = ( - ); - name = "Run Script: Set Git Version Info"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$SRCROOT/Configurations/set-git-version-info.sh\""; - showEnvVarsInLog = 0; - }; - 6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/fr.lproj", - ); - name = "Run Script: Link fr_CA to fr"; - outputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/fr_CA.lproj", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = "/usr/bin/env sh"; - shellScript = "ln -sfh \"fr.lproj\" \"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/fr_CA.lproj\""; - showEnvVarsInLog = 0; - }; - 61E31A85103299750051D188 /* Run Script: Link pt to pt_BR */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/pt_BR.lproj", - ); - name = "Run Script: Link pt to pt_BR"; - outputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/pt.lproj", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = "/usr/bin/env sh"; - shellScript = "ln -sfh \"pt_BR.lproj\" \"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/pt.lproj\""; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 55C14BB4136EEF1500649790 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 55C14BD4136EEFCE00649790 /* Autoupdate.m in Sources */, - F8761EB61ADC5E7A000C9034 /* SUCodeSigningVerifier.m in Sources */, - 55C14F00136EF6B700649790 /* SUConstants.m in Sources */, - 767B61AE1972D488004E0C3C /* SUGuidedPackageInstaller.m in Sources */, - 55C14F0C136EF6EA00649790 /* SUHost.m in Sources */, - 55C14F0D136EF6F200649790 /* SUInstaller.m in Sources */, - 55C14F08136EF6DB00649790 /* SULog.m in Sources */, - 55C14F24136EF86F00649790 /* SUPackageInstaller.m in Sources */, - 55C14F21136EF84D00649790 /* SUPlainInstaller.m in Sources */, - 55C14F7E136F005000649790 /* SUPlainInstallerInternals.m in Sources */, - 55C14F22136EF86000649790 /* SUStandardVersionComparator.m in Sources */, - 55C14F20136EF84300649790 /* SUStatusController.m in Sources */, - 55C14F23136EF86700649790 /* SUSystemProfiler.m in Sources */, - 55C14F2A136EF9A900649790 /* SUWindowController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5D06E8CD0FD68C7C005AE3F6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5D06E8E90FD68CDB005AE3F6 /* bsdiff.c in Sources */, - 14652F7E19A9728A00959E44 /* bspatch.c in Sources */, - 7223E7631AD1AEFF008E3161 /* sais.c in Sources */, - 14652F7D19A9726700959E44 /* SUBinaryDeltaApply.m in Sources */, - 14652F7C19A9725300959E44 /* SUBinaryDeltaCommon.m in Sources */, - 7268AC631AD634C200C3E0C1 /* SUBinaryDeltaCreate.m in Sources */, - 5D06E8EA0FD68CDB005AE3F6 /* SUBinaryDeltaTool.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 612279D50DB5470200AB99EA /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 721CF1A71AD7643600D9AC09 /* bsdiff.c in Sources */, - 721CF1A81AD7644100D9AC09 /* bspatch.c in Sources */, - 721CF1A91AD7644C00D9AC09 /* sais.c in Sources */, - 72D4DAA11AD7632900B211E2 /* SUBinaryDeltaCreate.m in Sources */, - 142E0E0919A83AAC00E4312B /* SUBinaryDeltaTest.m in Sources */, - F8761EB11ADC5068000C9034 /* SUCodeSigningVerifierTest.m in Sources */, - 5AF9DC3C1981DBEE001EA135 /* SUDSAVerifierTest.m in Sources */, - 5AF6C7541AEA49840014A3AB /* SUInstallerTest.m in Sources */, - 14652F8219A9746000959E44 /* SULog.m in Sources */, - 5AF6C1E51AE86A410014A3AB /* SUPipedUnarchiverTest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61B5F8FF09C4CEE200B25A18 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 61B5F93009C4CFDC00B25A18 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8DC2EF540486A6940098B216 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5D06E8EB0FD68CE4005AE3F6 /* bspatch.c in Sources */, - 610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */, - 61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */, - 61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */, - 6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */, - 61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */, - 61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */, - 5D06E8EC0FD68CE4005AE3F6 /* SUBinaryDeltaApply.m in Sources */, - 5D06E8ED0FD68CE4005AE3F6 /* SUBinaryDeltaCommon.m in Sources */, - 5D06E93A0FD69271005AE3F6 /* SUBinaryDeltaUnarchiver.m in Sources */, - 61B078CF15A5FB6100600039 /* SUCodeSigningVerifier.m in Sources */, - 61299A6009CA6EB100B7442F /* SUConstants.m in Sources */, - 6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */, - 61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */, - 767B61AD1972D488004E0C3C /* SUGuidedPackageInstaller.m in Sources */, - 61EF67560E25B58D00F754E0 /* SUHost.m in Sources */, - 618FA5020DAE88B40026945C /* SUInstaller.m in Sources */, - 55C14F07136EF6DB00649790 /* SULog.m in Sources */, - 618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */, - 61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */, - 618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */, - 61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */, - 6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */, - 61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */, - 61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */, - 6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */, - 61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */, - 61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */, - 61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */, - 61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */, - 610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */, - 612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */, - 61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */, - 61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */, - 61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1454BA1619637EDB00344E57 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 61B5F90109C4CEE200B25A18 /* Sparkle Test App */; - targetProxy = 1454BA1519637EDB00344E57 /* PBXContainerItemProxy */; - }; - 1454BA1819637EE900344E57 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1420DF491962329200203BB0 /* Documentation */; - targetProxy = 1454BA1719637EE900344E57 /* PBXContainerItemProxy */; - }; - 14732BCB1960F73500593899 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8DC2EF4F0486A6940098B216 /* Sparkle */; - targetProxy = 14732BCA1960F73500593899 /* PBXContainerItemProxy */; - }; - 14732BCF1960F73500593899 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5D06E8CF0FD68C7C005AE3F6 /* BinaryDelta */; - targetProxy = 14732BCE1960F73500593899 /* PBXContainerItemProxy */; - }; - 14950064195FB8A600BC5B5B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8DC2EF4F0486A6940098B216 /* Sparkle */; - targetProxy = 14950063195FB8A600BC5B5B /* PBXContainerItemProxy */; - }; - 14950066195FB8A600BC5B5B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 61B5F90109C4CEE200B25A18 /* Sparkle Test App */; - targetProxy = 14950065195FB8A600BC5B5B /* PBXContainerItemProxy */; - }; - 14950068195FB8A600BC5B5B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 612279D80DB5470200AB99EA /* Sparkle Unit Tests */; - targetProxy = 14950067195FB8A600BC5B5B /* PBXContainerItemProxy */; - }; - 1495006A195FB8A600BC5B5B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5D06E8CF0FD68C7C005AE3F6 /* BinaryDelta */; - targetProxy = 14950069195FB8A600BC5B5B /* PBXContainerItemProxy */; - }; - 1495006C195FB8A600BC5B5B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 55C14BB6136EEF1500649790 /* Autoupdate */; - targetProxy = 1495006B195FB8A600BC5B5B /* PBXContainerItemProxy */; - }; - 55C14F97136F044100649790 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 55C14BB6136EEF1500649790 /* Autoupdate */; - targetProxy = 55C14F96136F044100649790 /* PBXContainerItemProxy */; - }; - 5D06E8D60FD68C86005AE3F6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8DC2EF4F0486A6940098B216 /* Sparkle */; - targetProxy = 5D06E8D50FD68C86005AE3F6 /* PBXContainerItemProxy */; - }; - 61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8DC2EF4F0486A6940098B216 /* Sparkle */; - targetProxy = 61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */; - }; - 61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8DC2EF4F0486A6940098B216 /* Sparkle */; - targetProxy = 61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 55C14BDA136EF20D00649790 /* SUAutomaticUpdateAlert.xib */ = { - isa = PBXVariantGroup; - children = ( - 6149E6ED1601ABAC008A351E /* ar */, - 55C14BDB136EF20D00649790 /* cs */, - 55C14BDC136EF20D00649790 /* da */, - 55C14BDD136EF20D00649790 /* de */, - 555CF29B196C523E0000B31E /* el */, - 55C14BDE136EF20D00649790 /* en */, - 55C14BDF136EF20D00649790 /* es */, - 55C14BE0136EF20D00649790 /* fr */, - 55C14BE1136EF20D00649790 /* is */, - 55C14BE2136EF20D00649790 /* it */, - 55C14BE3136EF20D00649790 /* ja */, - 55C14BE4136EF20D00649790 /* ko */, - 4607BEA31948443800EF8DA4 /* nb */, - 55C14BE5136EF20D00649790 /* nl */, - 55C14BE6136EF20D00649790 /* pl */, - 55C14BE7136EF20D00649790 /* pt_BR */, - 6158A1BA1378F68100487EC1 /* pt_PT */, - 004A8653192A492B00C9730D /* ro */, - 55C14BE9136EF20D00649790 /* ru */, - 55C14BEA136EF20D00649790 /* sk */, - 61BA66DA14BDFC5500D02D86 /* sl */, - 55C14BEB136EF20D00649790 /* sv */, - 61F3AC1415C22D5900260CA2 /* th */, - 6158A1BE1378F8BB00487EC1 /* tr */, - 0263187514FEBB42005EBF43 /* uk */, - 55C14BEC136EF20D00649790 /* zh_CN */, - 55C14BED136EF20D00649790 /* zh_TW */, - ); - name = SUAutomaticUpdateAlert.xib; - sourceTree = ""; - }; - 55C14BF0136EF26100649790 /* SUUpdateAlert.xib */ = { - isa = PBXVariantGroup; - children = ( - 6149E6EF1601ABAC008A351E /* ar */, - 55C14BF1136EF26100649790 /* cs */, - 55C14BF2136EF26100649790 /* da */, - 55C14BF3136EF26100649790 /* de */, - 555CF29C196C52460000B31E /* el */, - 55C14BF4136EF26100649790 /* en */, - 55C14BF5136EF26100649790 /* es */, - 55C14BF6136EF26100649790 /* fr */, - 55C14BF7136EF26100649790 /* is */, - 55C14BF8136EF26100649790 /* it */, - 55C14BF9136EF26100649790 /* ja */, - 55C14BFA136EF26100649790 /* ko */, - 4607BEA41948443800EF8DA4 /* nb */, - 55C14BFB136EF26100649790 /* nl */, - 55C14BFC136EF26100649790 /* pl */, - 55C14BFD136EF26100649790 /* pt_BR */, - 6158A1BB1378F68100487EC1 /* pt_PT */, - 004A8654192A492B00C9730D /* ro */, - 55C14BFF136EF26100649790 /* ru */, - 55C14C00136EF26100649790 /* sk */, - 61BA66DB14BDFC5500D02D86 /* sl */, - 55C14C01136EF26100649790 /* sv */, - 61F3AC1615C22D5900260CA2 /* th */, - 6158A1BF1378F8BB00487EC1 /* tr */, - 0263187614FEBB42005EBF43 /* uk */, - 55C14C02136EF26100649790 /* zh_CN */, - 55C14C03136EF26100649790 /* zh_TW */, - ); - name = SUUpdateAlert.xib; - sourceTree = ""; - }; - 55C14C05136EF2C700649790 /* SUUpdatePermissionPrompt.xib */ = { - isa = PBXVariantGroup; - children = ( - 6149E6F01601ABAC008A351E /* ar */, - 55C14C06136EF2C700649790 /* cs */, - 55C14C07136EF2C700649790 /* da */, - 55C14C08136EF2C700649790 /* de */, - 555CF29D196C524C0000B31E /* el */, - 55C14C09136EF2C700649790 /* en */, - 55C14C0A136EF2C700649790 /* es */, - 55C14C0B136EF2C700649790 /* fr */, - 55C14C0C136EF2C700649790 /* is */, - 55C14C0D136EF2C700649790 /* it */, - 55C14C0E136EF2C700649790 /* ja */, - 55C14C0F136EF2C700649790 /* ko */, - 4607BEA51948443800EF8DA4 /* nb */, - 55C14C10136EF2C700649790 /* nl */, - 55C14C11136EF2C700649790 /* pl */, - 55C14C12136EF2C700649790 /* pt_BR */, - 6158A1B81378F64700487EC1 /* pt_PT */, - 004A8655192A492B00C9730D /* ro */, - 55C14C14136EF2C700649790 /* ru */, - 55C14C15136EF2C700649790 /* sk */, - 61BA66DC14BDFC5500D02D86 /* sl */, - 55C14C16136EF2C700649790 /* sv */, - 61F3AC1715C22D5900260CA2 /* th */, - 6158A1C01378F8BB00487EC1 /* tr */, - 0263187714FEBB42005EBF43 /* uk */, - 55C14C17136EF2C700649790 /* zh_CN */, - 55C14C18136EF2C700649790 /* zh_TW */, - ); - name = SUUpdatePermissionPrompt.xib; - sourceTree = ""; - }; - 61AAE8220A321A7F00D8810D /* Sparkle.strings */ = { - isa = PBXVariantGroup; - children = ( - 6149E6EA1601ABAC008A351E /* ar */, - 615409C4103BBC4000125AF1 /* cs */, - 61131A050F846CE600E97AF6 /* da */, - 619B17200E1E9D0800E72754 /* de */, - 555CF29A196C52330000B31E /* el */, - 61AAE8230A321A7F00D8810D /* en */, - 61AAE84F0A321AF700D8810D /* es */, - 61AAE8590A321B0400D8810D /* fr */, - 613151B20FB4946A000DCD59 /* is */, - 61F614540E24A12D009F47E7 /* it */, - 611A904610240DF700CC659E /* ja */, - FE5536F517A2C6A7007CB333 /* ko */, - 4607BEA21948443800EF8DA4 /* nb */, - 61AAE8710A321F7700D8810D /* nl */, - 611A904210240DD300CC659E /* pl */, - 61E31A80103299500051D188 /* pt_BR */, - 6186554310D7484E00B1E074 /* pt_PT */, - 004A8652192A492B00C9730D /* ro */, - 6195D4920E404AD700D41A50 /* ru */, - FE5536F617A2C6AB007CB333 /* sk */, - 61BA66CC14BDFA0400D02D86 /* sl */, - 618915730E35937600B5E981 /* sv */, - 61F3AC1215C22D4A00260CA2 /* th */, - 5AEF45D9189D1CC90030D7DC /* tr */, - 0263187214FEBB31005EBF43 /* uk */, - 61131A090F846D0A00E97AF6 /* zh_CN */, - 61131A0A0F846D1100E97AF6 /* zh_TW */, - ); - name = Sparkle.strings; - sourceTree = ""; - }; - 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 61B5F92B09C4CFD800B25A18 /* English */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 61B5F92C09C4CFD800B25A18 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 61B5F92D09C4CFD800B25A18 /* English */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1420DF4B1962329200203BB0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Debug; - }; - 1420DF4C1962329200203BB0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Release; - }; - 14732BC71960F69300593899 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Debug; - }; - 14732BC81960F69300593899 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Release; - }; - 14950061195FB89500BC5B5B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 14950062195FB89500BC5B5B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 1DEB91AE08733DA50010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - 1DEB91AF08733DA50010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "Developer ID Application"; - }; - name = Release; - }; - 1DEB91B208733DA50010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - 1DEB91B308733DA50010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */; - buildSettings = { - }; - name = Release; - }; - 55C14BBB136EEF1500649790 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - 55C14BBC136EEF1500649790 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */; - buildSettings = { - }; - name = Release; - }; - 5D06E8D20FD68C7D005AE3F6 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5D06E8F20FD68D21005AE3F6 /* ConfigBinaryDeltaDebug.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - 5D06E8D30FD68C7D005AE3F6 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5D06E8F30FD68D21005AE3F6 /* ConfigBinaryDeltaRelease.xcconfig */; - buildSettings = { - }; - name = Release; - }; - 612279DB0DB5470300AB99EA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA3AAF3A1050B273004B3130 /* ConfigUnitTestDebug.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - 612279DC0DB5470300AB99EA /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA3AAF391050B273004B3130 /* ConfigUnitTestRelease.xcconfig */; - buildSettings = { - }; - name = Release; - }; - 61B5F90609C4CEE300B25A18 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - 61B5F90709C4CEE300B25A18 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */; - buildSettings = { - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1420DF4A1962329200203BB0 /* Build configuration list for PBXLegacyTarget "Documentation" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1420DF4B1962329200203BB0 /* Debug */, - 1420DF4C1962329200203BB0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 14732BC61960F69300593899 /* Build configuration list for PBXLegacyTarget "Distribution" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 14732BC71960F69300593899 /* Debug */, - 14732BC81960F69300593899 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 14950060195FB89500BC5B5B /* Build configuration list for PBXAggregateTarget "All" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 14950061195FB89500BC5B5B /* Debug */, - 14950062195FB89500BC5B5B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB91AE08733DA50010E9CD /* Debug */, - 1DEB91AF08733DA50010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB91B208733DA50010E9CD /* Debug */, - 1DEB91B308733DA50010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 55C14BBE136EEF1500649790 /* Build configuration list for PBXNativeTarget "Autoupdate" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 55C14BBB136EEF1500649790 /* Debug */, - 55C14BBC136EEF1500649790 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5D06E8DA0FD68C95005AE3F6 /* Build configuration list for PBXNativeTarget "BinaryDelta" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5D06E8D20FD68C7D005AE3F6 /* Debug */, - 5D06E8D30FD68C7D005AE3F6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 612279DB0DB5470300AB99EA /* Debug */, - 612279DC0DB5470300AB99EA /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 61B5F90609C4CEE300B25A18 /* Debug */, - 61B5F90709C4CEE300B25A18 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/Frameworks/Sparkle/Sparkle.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Frameworks/Sparkle/Sparkle.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 192f73264..000000000 --- a/Frameworks/Sparkle/Sparkle.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme b/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme deleted file mode 100644 index d7da85d75..000000000 --- a/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Sparkle.xcscheme b/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Sparkle.xcscheme deleted file mode 100644 index 11a3ffe16..000000000 --- a/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Sparkle.xcscheme +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate-Info.plist b/Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate-Info.plist deleted file mode 100644 index dee39c1bf..000000000 --- a/Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate-Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - org.sparkle-project.Sparkle.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleShortVersionString - ${CURRENT_PROJECT_VERSION} - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - LSBackgroundOnly - 1 - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} - LSUIElement - 1 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate.m b/Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate.m deleted file mode 100644 index 11887adfa..000000000 --- a/Frameworks/Sparkle/Sparkle/Autoupdate/Autoupdate.m +++ /dev/null @@ -1,210 +0,0 @@ -#import -#import "SUInstaller.h" -#import "SUHost.h" -#import "SUStandardVersionComparator.h" -#import "SUStatusController.h" -#import "SUPlainInstallerInternals.h" -#import "SULog.h" - -#include - -/*! - * If the Installation takes longer than this time the Application Icon is shown in the Dock so that the user has some feedback. - */ -static const NSTimeInterval SUInstallationTimeLimit = 5; - -/*! - * Time this app uses to recheck if the parent has already died. - */ -static const NSTimeInterval SUParentQuitCheckInterval = .25; - -@interface TerminationListener : NSObject - -@property (copy) NSString *hostpath; -@property (copy) NSString *executablepath; -@property (assign) pid_t parentprocessid; -@property (copy) NSString *folderpath; - -@property (copy) NSString *selfPath; -@property (copy) NSString *installationPath; -@property (strong) NSTimer *watchdogTimer; -@property (strong) NSTimer *longInstallationTimer; -@property (strong) SUHost *host; -@property (assign) BOOL shouldRelaunch; -@property (assign) BOOL shouldShowUI; -@property (strong) SUStatusController *statusController; - -- (void)parentHasQuit; - -- (void)relaunch; -- (void)install; - -- (void)showAppIconInDock:(NSTimer *)aTimer; -- (void)watchdog:(NSTimer *)aTimer; - -@end - -@implementation TerminationListener - -@synthesize hostpath; -@synthesize executablepath; -@synthesize parentprocessid; -@synthesize folderpath; - -@synthesize selfPath; -@synthesize installationPath; -@synthesize watchdogTimer; -@synthesize longInstallationTimer; -@synthesize host; -@synthesize shouldRelaunch; -@synthesize shouldShowUI; -@synthesize statusController; - -- (instancetype)initWithHostPath:(NSString *)inhostpath executablePath:(NSString *)execpath parentProcessId:(pid_t)ppid folderPath:(NSString *)infolderpath shouldRelaunch:(BOOL)relaunch shouldShowUI:(BOOL)showUI selfPath:(NSString *)inSelfPath -{ - if (!(self = [super init])) { - return nil; - } - - self.hostpath = inhostpath; - self.executablepath = execpath; - self.parentprocessid = ppid; - self.folderpath = infolderpath; - self.selfPath = inSelfPath; - self.shouldRelaunch = relaunch; - self.shouldShowUI = showUI; - - BOOL alreadyTerminated = (getppid() == 1); // ppid is launchd (1) => parent terminated already - - if (alreadyTerminated) - [self parentHasQuit]; - else - self.watchdogTimer = [NSTimer scheduledTimerWithTimeInterval:SUParentQuitCheckInterval target:self selector:@selector(watchdog:) userInfo:nil repeats:YES]; - - return self; -} - - -- (void)dealloc -{ - [self.longInstallationTimer invalidate]; - [self.statusController close]; -} - - -- (void)parentHasQuit -{ - [self.watchdogTimer invalidate]; - self.longInstallationTimer = [NSTimer scheduledTimerWithTimeInterval:SUInstallationTimeLimit - target: self selector: @selector(showAppIconInDock:) - userInfo:nil repeats:NO]; - - if (self.folderpath) - [self install]; - else - [self relaunch]; -} - -- (void)watchdog:(NSTimer *)__unused aTimer -{ - if (![NSRunningApplication runningApplicationWithProcessIdentifier:self.parentprocessid]) { - [self parentHasQuit]; - } -} - -- (void)showAppIconInDock:(NSTimer *)__unused aTimer -{ - ProcessSerialNumber psn = { 0, kCurrentProcess }; - TransformProcessType(&psn, kProcessTransformToForegroundApplication); -} - - -- (void)relaunch __attribute__((noreturn)) -{ - if (self.shouldRelaunch) - { - NSString *appPath = nil; - if (!self.folderpath || ![self.executablepath isEqualToString:self.hostpath]) - appPath = self.executablepath; - else - appPath = self.installationPath; - [[NSWorkspace sharedWorkspace] openFile:appPath]; - } - - if (self.folderpath) - { - NSError *theError = nil; - if (![SUPlainInstaller _removeFileAtPath:[SUInstaller updateFolder] error:&theError]) - SULog(@"Couldn't remove update folder: %@.", theError); - } - [[NSFileManager defaultManager] removeItemAtPath:self.selfPath error:NULL]; - - exit(EXIT_SUCCESS); -} - - -- (void)install -{ - NSBundle *theBundle = [NSBundle bundleWithPath:self.hostpath]; - self.host = [[SUHost alloc] initWithBundle:theBundle]; - self.installationPath = [[self.host installationPath] copy]; - - if (self.shouldShowUI) { - SUStatusController *statusCtl = [[SUStatusController alloc] initWithHost:self.host]; // We quit anyway after we've installed, so leak this for now. - [statusCtl setButtonTitle:SULocalizedString(@"Cancel Update", @"") target:nil action:Nil isDefault:NO]; - [statusCtl beginActionWithTitle:SULocalizedString(@"Installing update...", @"") - maxProgressValue: 0 statusText: @""]; - [statusCtl showWindow:self]; - - [self.statusController close]; // If there's an existing status controller, close it before we release our strong reference to it. - self.statusController = statusCtl; // Keep a strong reference to the status controller, or else it might get prematurely deallocated. - } - - [SUInstaller installFromUpdateFolder:self.folderpath - overHost:self.host - installationPath:self.installationPath - versionComparator:[SUStandardVersionComparator defaultComparator] - completionHandler:^(NSError *error) { - if (error) { - if (self.shouldShowUI) { - NSRunAlertPanel(@"", @"%@", @"OK", @"", @"", [error localizedDescription]); - } - exit(EXIT_FAILURE); - } else { - [self relaunch]; - } - }]; -} - -@end - -int main(int __unused argc, const char __unused *argv[]) -{ - @autoreleasepool - { - NSArray *args = [[NSProcessInfo processInfo] arguments]; - if (args.count < 5 || args.count > 7) { - return EXIT_FAILURE; - } - - BOOL shouldShowUI = (args.count > 6) ? [args[6] boolValue] : YES; - if (shouldShowUI) { - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; - } - - [NSApplication sharedApplication]; - TerminationListener *termListen = [[TerminationListener alloc] initWithHostPath:args[1] - executablePath:args[2] - parentProcessId:[args[3] intValue] - folderPath:args[4] - shouldRelaunch:(args.count > 5) ? [args[5] boolValue] : YES - shouldShowUI:shouldShowUI - selfPath:[[NSBundle mainBundle] bundlePath]]; - - [[NSApplication sharedApplication] run]; - // Ensure termListen is not deallocated by ARC before caling -[NSApplication run] - [termListen class]; - } - - return EXIT_SUCCESS; -} diff --git a/Frameworks/Sparkle/Sparkle/SUAppcast.h b/Frameworks/Sparkle/Sparkle/SUAppcast.h deleted file mode 100644 index 8f3efc8e8..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAppcast.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// SUAppcast.h -// Sparkle -// -// Created by Andy Matuschak on 3/12/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUAPPCAST_H -#define SUAPPCAST_H - -#import -#import "SUExport.h" - -@class SUAppcastItem; -SU_EXPORT @interface SUAppcast : NSObject - -@property (copy) NSString *userAgentString; -@property (copy) NSDictionary *httpHeaders; - -- (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))err; - -@property (readonly, copy) NSArray *items; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUAppcast.m b/Frameworks/Sparkle/Sparkle/SUAppcast.m deleted file mode 100644 index eda206a97..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAppcast.m +++ /dev/null @@ -1,281 +0,0 @@ -// -// SUAppcast.m -// Sparkle -// -// Created by Andy Matuschak on 3/12/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUAppcast.h" -#import "SUConstants.h" -#import "SULog.h" - -@interface NSXMLElement (SUAppcastExtensions) -@property (readonly, copy) NSDictionary *attributesAsDictionary; -@end - -@implementation NSXMLElement (SUAppcastExtensions) -- (NSDictionary *)attributesAsDictionary -{ - NSEnumerator *attributeEnum = [[self attributes] objectEnumerator]; - NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; - - for (NSXMLNode *attribute in attributeEnum) { - dictionary[[attribute name]] = [attribute stringValue]; - } - return dictionary; -} -@end - -@interface SUAppcast () -@property (strong) void (^completionBlock)(NSError *); -@property (copy) NSString *downloadFilename; -@property (strong) NSURLDownload *download; -@property (copy) NSArray *items; -- (void)reportError:(NSError *)error; -- (NSXMLNode *)bestNodeInNodes:(NSArray *)nodes; -@end - -@implementation SUAppcast - -@synthesize downloadFilename; -@synthesize completionBlock; -@synthesize userAgentString; -@synthesize httpHeaders; -@synthesize download; -@synthesize items; - -- (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))block -{ - self.completionBlock = block; - - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0]; - if (self.userAgentString) { - [request setValue:self.userAgentString forHTTPHeaderField:@"User-Agent"]; - } - - if (self.httpHeaders) { - for (NSString *key in self.httpHeaders) { - id value = [self.httpHeaders objectForKey:key]; - [request setValue:value forHTTPHeaderField:key]; - } - } - - [request setValue:@"application/rss+xml,*/*;q=0.1" forHTTPHeaderField:@"Accept"]; - - self.download = [[NSURLDownload alloc] initWithRequest:request delegate:self]; -} - -- (void)download:(NSURLDownload *)__unused aDownload decideDestinationWithSuggestedFilename:(NSString *)filename -{ - NSString *destinationFilename = NSTemporaryDirectory(); - if (destinationFilename) - { - destinationFilename = [destinationFilename stringByAppendingPathComponent:filename]; - [self.download setDestination:destinationFilename allowOverwrite:NO]; - } -} - -- (void)download:(NSURLDownload *)__unused aDownload didCreateDestination:(NSString *)path -{ - self.downloadFilename = path; -} - -- (void)downloadDidFinish:(NSURLDownload *)__unused aDownload -{ - NSError *error = nil; - - NSXMLDocument *document = nil; - BOOL failed = NO; - NSArray *xmlItems = nil; - NSMutableArray *appcastItems = [NSMutableArray array]; - - if (self.downloadFilename) - { - NSUInteger options = 0; - options = NSXMLNodeLoadExternalEntitiesSameOriginOnly; - document = [[NSXMLDocument alloc] initWithContentsOfURL:[NSURL fileURLWithPath:self.downloadFilename] options:options error:&error]; - - [[NSFileManager defaultManager] removeItemAtPath:self.downloadFilename error:nil]; - self.downloadFilename = nil; - } - else - { - failed = YES; - } - - if (nil == document) - { - failed = YES; - } - else - { - xmlItems = [document nodesForXPath:@"/rss/channel/item" error:&error]; - if (nil == xmlItems) - { - failed = YES; - } - } - - if (failed == NO) - { - - NSEnumerator *nodeEnum = [xmlItems objectEnumerator]; - NSXMLNode *node; - NSMutableDictionary *nodesDict = [NSMutableDictionary dictionary]; - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - - while (failed == NO && (node = [nodeEnum nextObject])) - { - // First, we'll "index" all the first-level children of this appcast item so we can pick them out by language later. - if ([[node children] count]) - { - node = [node childAtIndex:0]; - while (nil != node) - { - NSString *name = [node name]; - if (name) - { - NSMutableArray *nodes = nodesDict[name]; - if (nodes == nil) - { - nodes = [NSMutableArray array]; - nodesDict[name] = nodes; - } - [nodes addObject:node]; - } - node = [node nextSibling]; - } - } - - for (NSString *name in nodesDict) - { - node = [self bestNodeInNodes:nodesDict[name]]; - if ([name isEqualToString:SURSSElementEnclosure]) - { - // enclosure is flattened as a separate dictionary for some reason - NSDictionary *encDict = [(NSXMLElement *)node attributesAsDictionary]; - dict[name] = encDict; - - } - else if ([name isEqualToString:SURSSElementPubDate]) - { - // pubDate is expected to be an NSDate by SUAppcastItem, but the RSS class was returning an NSString - NSDate *date = [NSDate dateWithNaturalLanguageString:[node stringValue]]; - if (date) - dict[name] = date; - } - else if ([name isEqualToString:SUAppcastElementDeltas]) - { - NSMutableArray *deltas = [NSMutableArray array]; - NSEnumerator *childEnum = [[node children] objectEnumerator]; - for (NSXMLNode *child in childEnum) { - if ([[child name] isEqualToString:SURSSElementEnclosure]) - [deltas addObject:[(NSXMLElement *)child attributesAsDictionary]]; - } - dict[name] = deltas; - } - else if ([name isEqualToString:SUAppcastElementTags]) { - NSMutableArray *tags = [NSMutableArray array]; - NSEnumerator *childEnum = [[node children] objectEnumerator]; - for (NSXMLNode *child in childEnum) { - [tags addObject:[child name]]; - } - dict[name] = tags; - } - else if (name != nil) - { - // add all other values as strings - NSString *theValue = [[node stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - if (theValue != nil) { - dict[name] = theValue; - } - } - } - - NSString *errString; - SUAppcastItem *anItem = [[SUAppcastItem alloc] initWithDictionary:dict failureReason:&errString]; - if (anItem) - { - [appcastItems addObject:anItem]; - } - else - { - SULog(@"Sparkle Updater: Failed to parse appcast item: %@.\nAppcast dictionary was: %@", errString, dict); - } - [nodesDict removeAllObjects]; - [dict removeAllObjects]; - } - } - - if ([appcastItems count]) { - NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; - [appcastItems sortUsingDescriptors:@[sort]]; - self.items = appcastItems; - } - - if (failed) { - [self reportError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUAppcastParseError userInfo:@{ NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while parsing the update feed.", nil) }]]; - } else { - self.completionBlock(nil); - self.completionBlock = nil; - } -} - -- (void)download:(NSURLDownload *)__unused aDownload didFailWithError:(NSError *)error -{ - if (self.downloadFilename) { - [[NSFileManager defaultManager] removeItemAtPath:self.downloadFilename error:nil]; - } - self.downloadFilename = nil; - - [self reportError:error]; -} - -- (NSURLRequest *)download:(NSURLDownload *)__unused aDownload willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)__unused redirectResponse -{ - return request; -} - -- (void)reportError:(NSError *)error -{ - NSURL *failingUrl = error.userInfo[NSURLErrorFailingURLErrorKey]; - - self.completionBlock([NSError errorWithDomain:SUSparkleErrorDomain code:SUAppcastError userInfo:@{ - NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred in retrieving update information. Please try again later.", nil), - NSLocalizedFailureReasonErrorKey: [error localizedDescription], - NSUnderlyingErrorKey: error, - NSURLErrorFailingURLErrorKey: failingUrl ? failingUrl : [NSNull null], - }]); - self.completionBlock = nil; -} - -- (NSXMLNode *)bestNodeInNodes:(NSArray *)nodes -{ - // We use this method to pick out the localized version of a node when one's available. - if ([nodes count] == 1) - return nodes[0]; - else if ([nodes count] == 0) - return nil; - - NSMutableArray *languages = [NSMutableArray array]; - NSString *lang; - NSUInteger i; - for (NSXMLElement *node in nodes) { - lang = [[node attributeForName:@"xml:lang"] stringValue]; - [languages addObject:(lang ? lang : @"")]; - } - lang = [NSBundle preferredLocalizationsFromArray:languages][0]; - i = [languages indexOfObject:([languages containsObject:lang] ? lang : @"")]; - if (i == NSNotFound) { - i = 0; - } - return nodes[i]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUAppcastItem.h b/Frameworks/Sparkle/Sparkle/SUAppcastItem.h deleted file mode 100644 index 551d389b1..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAppcastItem.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// SUAppcastItem.h -// Sparkle -// -// Created by Andy Matuschak on 3/12/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUAPPCASTITEM_H -#define SUAPPCASTITEM_H - -#include "SUExport.h" - -SU_EXPORT @interface SUAppcastItem : NSObject -@property (copy, readonly) NSString *title; -@property (copy, readonly) NSDate *date; -@property (copy, readonly) NSString *itemDescription; -@property (strong, readonly) NSURL *releaseNotesURL; -@property (copy, readonly) NSString *DSASignature; -@property (copy, readonly) NSString *minimumSystemVersion; -@property (copy, readonly) NSString *maximumSystemVersion; -@property (strong, readonly) NSURL *fileURL; -@property (copy, readonly) NSString *versionString; -@property (copy, readonly) NSString *displayVersionString; -@property (copy, readonly) NSDictionary *deltaUpdates; -@property (strong, readonly) NSURL *infoURL; - -// Initializes with data from a dictionary provided by the RSS class. -- (instancetype)initWithDictionary:(NSDictionary *)dict; -- (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error; - -@property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate; -@property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate; - -// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. -@property (readonly, copy) NSDictionary *propertiesDictionary; - -- (NSURL *)infoURL; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUAppcastItem.m b/Frameworks/Sparkle/Sparkle/SUAppcastItem.m deleted file mode 100644 index 0f5b79201..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAppcastItem.m +++ /dev/null @@ -1,180 +0,0 @@ -// -// SUAppcastItem.m -// Sparkle -// -// Created by Andy Matuschak on 3/12/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUAppcastItem.h" -#import "SULog.h" - -@interface SUAppcastItem () -@property (copy, readwrite) NSString *title; -@property (copy, readwrite) NSDate *date; -@property (copy, readwrite) NSString *itemDescription; -@property (strong, readwrite) NSURL *releaseNotesURL; -@property (copy, readwrite) NSString *DSASignature; -@property (copy, readwrite) NSString *minimumSystemVersion; -@property (copy, readwrite) NSString *maximumSystemVersion; -@property (strong, readwrite) NSURL *fileURL; -@property (copy, readwrite) NSString *versionString; -@property (copy, readwrite) NSString *displayVersionString; -@property (copy, readwrite) NSDictionary *deltaUpdates; -@property (strong, readwrite) NSURL *infoURL; -@property (readwrite, copy) NSDictionary *propertiesDictionary; -@end - -@implementation SUAppcastItem -@synthesize date; -@synthesize deltaUpdates; -@synthesize displayVersionString; -@synthesize DSASignature; -@synthesize fileURL; -@synthesize infoURL; -@synthesize itemDescription; -@synthesize maximumSystemVersion; -@synthesize minimumSystemVersion; -@synthesize releaseNotesURL; -@synthesize title; -@synthesize versionString; -@synthesize propertiesDictionary; - -- (BOOL)isDeltaUpdate -{ - return self.propertiesDictionary[SURSSElementEnclosure][SUAppcastAttributeDeltaFrom] != nil; -} - -- (BOOL)isCriticalUpdate -{ - return [self.propertiesDictionary[SUAppcastElementTags] containsObject:SUAppcastElementCriticalUpdate]; -} - -- (instancetype)initWithDictionary:(NSDictionary *)dict -{ - return [self initWithDictionary:dict failureReason:nil]; -} - -- (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString *__autoreleasing *)error -{ - self = [super init]; - if (self) { - id enclosure = dict[SURSSElementEnclosure]; - - // Try to find a version string. - // Finding the new version number from the RSS feed is a little bit hacky. There are two ways: - // 1. A "sparkle:version" attribute on the enclosure tag, an extension from the RSS spec. - // 2. If there isn't a version attribute, Sparkle will parse the path in the enclosure, expecting - // that it will look like this: http://something.com/YourApp_0.5.zip. It'll read whatever's between the last - // underscore and the last period as the version number. So name your packages like this: APPNAME_VERSION.extension. - // The big caveat with this is that you can't have underscores in your version strings, as that'll confuse Sparkle. - // Feel free to change the separator string to a hyphen or something more suited to your needs if you like. - NSString *newVersion = enclosure[SUAppcastAttributeVersion]; - if (newVersion == nil) { - newVersion = dict[SUAppcastAttributeVersion]; // Get version from the item, in case it's a download-less item (i.e. paid upgrade). - } - if (newVersion == nil) // no sparkle:version attribute anywhere? - { - SULog(@"warning: <%@> for URL '%@' is missing %@ attribute. Version comparison may be unreliable. Please always specify %@", SURSSElementEnclosure, enclosure[SURSSAttributeURL], SUAppcastAttributeVersion, SUAppcastAttributeVersion); - - // Separate the url by underscores and take the last component, as that'll be closest to the end, - // then we remove the extension. Hopefully, this will be the version. - NSArray *fileComponents = [enclosure[SURSSAttributeURL] componentsSeparatedByString:@"_"]; - if ([fileComponents count] > 1) { - newVersion = [[fileComponents lastObject] stringByDeletingPathExtension]; - } - } - - if (!newVersion) { - if (error) { - *error = [NSString stringWithFormat:@"Feed item lacks %@ attribute, and version couldn't be deduced from file name (would have used last component of a file name like AppName_1.3.4.zip)", SUAppcastAttributeVersion]; - } - return nil; - } - - propertiesDictionary = [[NSMutableDictionary alloc] initWithDictionary:dict]; - self.title = dict[SURSSElementTitle]; - self.date = dict[SURSSElementPubDate]; - self.itemDescription = dict[SURSSElementDescription]; - - NSString *theInfoURL = dict[SURSSElementLink]; - if (theInfoURL) { - if (![theInfoURL isKindOfClass:[NSString class]]) { - SULog(@"%@ -%@ Info URL is not of valid type.", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); - } else { - self.infoURL = [NSURL URLWithString:theInfoURL]; - } - } - - // Need an info URL or an enclosure URL. Former to show "More Info" - // page, latter to download & install: - if (!enclosure && !theInfoURL) { - if (error) { - *error = @"No enclosure in feed item"; - } - return nil; - } - - NSString *enclosureURLString = enclosure[SURSSAttributeURL]; - if (!enclosureURLString && !theInfoURL) { - if (error) { - *error = @"Feed item's enclosure lacks URL"; - } - return nil; - } - - if (enclosureURLString) { - NSString *fileURLString = [[enclosureURLString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - self.fileURL = [NSURL URLWithString:fileURLString]; - } - if (enclosure) { - self.DSASignature = enclosure[SUAppcastAttributeDSASignature]; - } - - self.versionString = newVersion; - self.minimumSystemVersion = dict[SUAppcastElementMinimumSystemVersion]; - self.maximumSystemVersion = dict[SUAppcastElementMaximumSystemVersion]; - - NSString *shortVersionString = enclosure[SUAppcastAttributeShortVersionString]; - if (nil == shortVersionString) { - shortVersionString = dict[SUAppcastAttributeShortVersionString]; // fall back on the - } - - if (shortVersionString) { - self.displayVersionString = shortVersionString; - } else { - self.displayVersionString = self.versionString; - } - - // Find the appropriate release notes URL. - if (dict[SUAppcastElementReleaseNotesLink]) { - self.releaseNotesURL = [NSURL URLWithString:dict[SUAppcastElementReleaseNotesLink]]; - } else if ([self.itemDescription hasPrefix:@"http://"] || [self.itemDescription hasPrefix:@"https://"]) { // if the description starts with http:// or https:// use that. - self.releaseNotesURL = [NSURL URLWithString:self.itemDescription]; - } else { - self.releaseNotesURL = nil; - } - - NSArray *deltaDictionaries = dict[SUAppcastElementDeltas]; - if (deltaDictionaries) { - NSMutableDictionary *deltas = [NSMutableDictionary dictionary]; - for (NSDictionary *deltaDictionary in deltaDictionaries) { - NSMutableDictionary *fakeAppCastDict = [dict mutableCopy]; - [fakeAppCastDict removeObjectForKey:SUAppcastElementDeltas]; - fakeAppCastDict[SURSSElementEnclosure] = deltaDictionary; - SUAppcastItem *deltaItem = [[[self class] alloc] initWithDictionary:fakeAppCastDict]; - - deltas[deltaDictionary[SUAppcastAttributeDeltaFrom]] = deltaItem; - } - self.deltaUpdates = deltas; - } - } - return self; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h deleted file mode 100644 index 1fcfcfb7b..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// SUAutomaticUpdateAlert.h -// Sparkle -// -// Created by Andy Matuschak on 3/18/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUAUTOMATICUPDATEALERT_H -#define SUAUTOMATICUPDATEALERT_H - -#import "SUWindowController.h" - -typedef NS_ENUM(NSInteger, SUAutomaticInstallationChoice) { - SUInstallNowChoice, - SUInstallLaterChoice, - SUDoNotInstallChoice -}; - -@class SUAppcastItem, SUHost; -@interface SUAutomaticUpdateAlert : SUWindowController - -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)hostBundle completionBlock:(void (^)(SUAutomaticInstallationChoice))c; -- (IBAction)installNow:sender; -- (IBAction)installLater:sender; -- (IBAction)doNotInstall:sender; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m deleted file mode 100644 index 4271e6084..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateAlert.m +++ /dev/null @@ -1,89 +0,0 @@ -// -// SUAutomaticUpdateAlert.m -// Sparkle -// -// Created by Andy Matuschak on 3/18/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#import "SUAutomaticUpdateAlert.h" - -#import "SUHost.h" - -@interface SUAutomaticUpdateAlert () -@property (strong) void(^completionBlock)(SUAutomaticInstallationChoice); -@property (strong) SUAppcastItem *updateItem; -@property (strong) SUHost *host; -@end - -@implementation SUAutomaticUpdateAlert -@synthesize host; -@synthesize updateItem; -@synthesize completionBlock; - -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)aHost completionBlock:(void (^)(SUAutomaticInstallationChoice))block -{ - self = [super initWithWindowNibName:@"SUAutomaticUpdateAlert"]; - if (self) { - self.updateItem = item; - self.completionBlock = block; - self.host = aHost; - [self setShouldCascadeWindows:NO]; - [[self window] center]; - } - return self; -} - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@, %@>", [self class], [self.host bundlePath], [self.host installationPath]]; } - -- (IBAction)installNow:(id)__unused sender -{ - [self close]; - self.completionBlock(SUInstallNowChoice); - self.completionBlock = nil; -} - -- (IBAction)installLater:(id)__unused sender -{ - [self close]; - self.completionBlock(SUInstallLaterChoice); - self.completionBlock = nil; -} - -- (IBAction)doNotInstall:(id)__unused sender -{ - [self close]; - self.completionBlock(SUDoNotInstallChoice); - self.completionBlock = nil; -} - -- (NSImage *)applicationIcon -{ - return [self.host icon]; -} - -- (NSString *)titleText -{ - if ([self.updateItem isCriticalUpdate]) - { - return [NSString stringWithFormat:SULocalizedString(@"An important update to %@ is ready to install", nil), [self.host name]]; - } - else - { - return [NSString stringWithFormat:SULocalizedString(@"A new version of %@ is ready to install!", nil), [self.host name]]; - } -} - -- (NSString *)descriptionText -{ - if ([self.updateItem isCriticalUpdate]) - { - return [NSString stringWithFormat:SULocalizedString(@"%1$@ %2$@ has been downloaded and is ready to use! This is an important update; would you like to install it and relaunch %1$@ now?", nil), [self.host name], [self.updateItem displayVersionString]]; - } - else - { - return [NSString stringWithFormat:SULocalizedString(@"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?", nil), [self.host name], [self.updateItem displayVersionString]]; - } -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h deleted file mode 100644 index 4dd90e8f0..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// SUAutomaticUpdateDriver.h -// Sparkle -// -// Created by Andy Matuschak on 5/6/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUAUTOMATICUPDATEDRIVER_H -#define SUAUTOMATICUPDATEDRIVER_H - -#import -#import "SUBasicUpdateDriver.h" -#import "SUAutomaticUpdateAlert.h" - -@interface SUAutomaticUpdateDriver : SUBasicUpdateDriver - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m deleted file mode 100644 index 45b3d5469..000000000 --- a/Frameworks/Sparkle/Sparkle/SUAutomaticUpdateDriver.m +++ /dev/null @@ -1,196 +0,0 @@ -// -// SUAutomaticUpdateDriver.m -// Sparkle -// -// Created by Andy Matuschak on 5/6/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUAutomaticUpdateDriver.h" - -#import "SUAutomaticUpdateAlert.h" -#import "SUHost.h" -#import "SUConstants.h" - -// If the user hasn't quit in a week, ask them if they want to relaunch to get the latest bits. It doesn't matter that this measure of "one day" is imprecise. -static const NSTimeInterval SUAutomaticUpdatePromptImpatienceTimer = 60 * 60 * 24 * 7; - -@interface SUUpdateDriver () - -@property (getter=isInterruptible) BOOL interruptible; - -@end - -@interface SUAutomaticUpdateDriver () - -@property (assign) BOOL postponingInstallation; -@property (assign) BOOL showErrors; -@property (assign) BOOL willUpdateOnTermination; -@property (strong) SUAutomaticUpdateAlert *alert; -@property (strong) NSTimer *showUpdateAlertTimer; - -@end - -@implementation SUAutomaticUpdateDriver - -@synthesize postponingInstallation; -@synthesize showErrors; -@synthesize willUpdateOnTermination; -@synthesize alert; -@synthesize showUpdateAlertTimer; - -- (void)showUpdateAlert -{ - self.interruptible = NO; - self.alert = [[SUAutomaticUpdateAlert alloc] initWithAppcastItem:self.updateItem host:self.host completionBlock:^(SUAutomaticInstallationChoice choice) { - [self automaticUpdateAlertFinishedWithChoice:choice]; - }]; - - // If the app is a menubar app or the like, we need to focus it first and alter the - // update prompt to behave like a normal window. Otherwise if the window were hidden - // there may be no way for the application to be activated to make it visible again. - if ([self.host isBackgroundApplication]) { - [[self.alert window] setHidesOnDeactivate:NO]; - [NSApp activateIgnoringOtherApps:YES]; - } - - if ([NSApp isActive]) - [[self.alert window] makeKeyAndOrderFront:self]; - else - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:NSApplicationDidBecomeActiveNotification object:NSApp]; -} - -- (void)unarchiverDidFinish:(SUUnarchiver *)__unused ua -{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:NSApplicationWillTerminateNotification object:nil]; - - // Sudden termination is available on 10.6+ - NSProcessInfo *processInfo = [NSProcessInfo processInfo]; - [processInfo disableSuddenTermination]; - - self.willUpdateOnTermination = YES; - - id updaterDelegate = [self.updater delegate]; - if ([updaterDelegate respondsToSelector:@selector(updater:willInstallUpdateOnQuit:immediateInstallationInvocation:)]) - { - BOOL relaunch = YES; - BOOL showUI = NO; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(installWithToolAndRelaunch:displayingUserInterface:)]]; - [invocation setSelector:@selector(installWithToolAndRelaunch:displayingUserInterface:)]; - [invocation setArgument:&relaunch atIndex:2]; - [invocation setArgument:&showUI atIndex:3]; - [invocation setTarget:self]; - - [updaterDelegate updater:self.updater willInstallUpdateOnQuit:self.updateItem immediateInstallationInvocation:invocation]; - } - - // If this is marked as a critical update, we'll prompt the user to install it right away. - if ([self.updateItem isCriticalUpdate]) - { - [self showUpdateAlert]; - } - else - { - self.showUpdateAlertTimer = [NSTimer scheduledTimerWithTimeInterval:SUAutomaticUpdatePromptImpatienceTimer target:self selector:@selector(showUpdateAlert) userInfo:nil repeats:NO]; - - // At this point the driver is idle, allow it to be interrupted for user-initiated update checks. - self.interruptible = YES; - } -} - -- (void)stopUpdatingOnTermination -{ - if (self.willUpdateOnTermination) - { - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationWillTerminateNotification object:nil]; - NSProcessInfo *processInfo = [NSProcessInfo processInfo]; - [processInfo enableSuddenTermination]; - - self.willUpdateOnTermination = NO; - - id updaterDelegate = [self.updater delegate]; - if ([updaterDelegate respondsToSelector:@selector(updater:didCancelInstallUpdateOnQuit:)]) - [updaterDelegate updater:self.updater didCancelInstallUpdateOnQuit:self.updateItem]; - } -} - -- (void)invalidateShowUpdateAlertTimer -{ - [self.showUpdateAlertTimer invalidate]; - self.showUpdateAlertTimer = nil; -} - -- (void)dealloc -{ - [self stopUpdatingOnTermination]; - [self invalidateShowUpdateAlertTimer]; -} - -- (void)abortUpdate -{ - [self stopUpdatingOnTermination]; - [self invalidateShowUpdateAlertTimer]; - [super abortUpdate]; -} - -- (void)applicationDidBecomeActive:(NSNotification *)__unused aNotification -{ - [[self.alert window] makeKeyAndOrderFront:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidBecomeActiveNotification object:NSApp]; -} - -- (void)automaticUpdateAlertFinishedWithChoice:(SUAutomaticInstallationChoice)choice -{ - switch (choice) - { - case SUInstallNowChoice: - [self stopUpdatingOnTermination]; - [self installWithToolAndRelaunch:YES]; - break; - - case SUInstallLaterChoice: - self.postponingInstallation = YES; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:NSApplicationWillTerminateNotification object:nil]; - // We're already waiting on quit, just indicate that we're idle. - self.interruptible = YES; - break; - - case SUDoNotInstallChoice: - [self.host setObject:[self.updateItem versionString] forUserDefaultsKey:SUSkippedVersionKey]; - [self abortUpdate]; - break; - } -} - -- (void)installWithToolAndRelaunch:(BOOL)relaunch displayingUserInterface:(BOOL)showUI -{ - if (relaunch) { - [self stopUpdatingOnTermination]; - } - - self.showErrors = YES; - [super installWithToolAndRelaunch:relaunch displayingUserInterface:showUI]; -} - -- (void)applicationWillTerminate:(NSNotification *)__unused note -{ - [self installWithToolAndRelaunch:NO]; -} - -- (void)abortUpdateWithError:(NSError *)error -{ - if (self.showErrors) { - [super abortUpdateWithError:error]; - } else { - // Call delegate separately here because otherwise it won't know we stopped. - // Normally this gets called by the superclass - id updaterDelegate = [self.updater delegate]; - if ([updaterDelegate respondsToSelector:@selector(updater:didAbortWithError:)]) { - [updaterDelegate updater:self.updater didAbortWithError:error]; - } - - [self abortUpdate]; - } -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h deleted file mode 100644 index 8c6960d83..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.h +++ /dev/null @@ -1,56 +0,0 @@ -// -// SUBasicUpdateDriver.h -// Sparkle, -// -// Created by Andy Matuschak on 4/23/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUBASICUPDATEDRIVER_H -#define SUBASICUPDATEDRIVER_H - -#import -#import "SUUpdateDriver.h" -#import "SUUnarchiver.h" -#import "SUAppcast.h" - -@class SUAppcastItem, SUHost; -@interface SUBasicUpdateDriver : SUUpdateDriver - -@property (strong, readonly) SUAppcastItem *updateItem; -@property (strong, readonly) NSURLDownload *download; -@property (copy, readonly) NSString *downloadPath; - -- (void)checkForUpdatesAtURL:(NSURL *)URL host:(SUHost *)host; - -- (BOOL)isItemNewer:(SUAppcastItem *)ui; -- (BOOL)hostSupportsItem:(SUAppcastItem *)ui; -- (BOOL)itemContainsSkippedVersion:(SUAppcastItem *)ui; -- (BOOL)itemContainsValidUpdate:(SUAppcastItem *)ui; -- (void)appcastDidFinishLoading:(SUAppcast *)ac; -- (void)didFindValidUpdate; -- (void)didNotFindUpdate; - -- (void)downloadUpdate; -- (void)download:(NSURLDownload *)d decideDestinationWithSuggestedFilename:(NSString *)name; -- (void)downloadDidFinish:(NSURLDownload *)d; -- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error; - -- (void)extractUpdate; -- (void)unarchiverDidFinish:(SUUnarchiver *)ua; -- (void)unarchiverDidFail:(SUUnarchiver *)ua; -- (void)failedToApplyDeltaUpdate; - -- (void)installWithToolAndRelaunch:(BOOL)relaunch; -- (void)installWithToolAndRelaunch:(BOOL)relaunch displayingUserInterface:(BOOL)showUI; -- (void)installerForHost:(SUHost *)host failedWithError:(NSError *)error; - -- (void)cleanUpDownload; - -- (void)abortUpdate; -- (void)abortUpdateWithError:(NSError *)error; -- (void)terminateApp; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m deleted file mode 100644 index a0536faba..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBasicUpdateDriver.m +++ /dev/null @@ -1,465 +0,0 @@ -// -// SUBasicUpdateDriver.m -// Sparkle -// -// Created by Andy Matuschak on 4/23/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUBasicUpdateDriver.h" - -#import "SUHost.h" -#import "SUDSAVerifier.h" -#import "SUInstaller.h" -#import "SUStandardVersionComparator.h" -#import "SUUnarchiver.h" -#import "SUConstants.h" -#import "SULog.h" -#import "SUPlainInstaller.h" -#import "SUPlainInstallerInternals.h" -#import "SUBinaryDeltaCommon.h" -#import "SUCodeSigningVerifier.h" -#import "SUUpdater_Private.h" - -@interface SUBasicUpdateDriver () - -@property (strong) SUAppcastItem *updateItem; -@property (strong) NSURLDownload *download; -@property (copy) NSString *downloadPath; - -@property (strong) SUAppcastItem *nonDeltaUpdateItem; -@property (copy) NSString *tempDir; -@property (copy) NSString *relaunchPath; - -@end - -@implementation SUBasicUpdateDriver - -@synthesize updateItem; -@synthesize download; -@synthesize downloadPath; - -@synthesize nonDeltaUpdateItem; -@synthesize tempDir; -@synthesize relaunchPath; - -- (void)checkForUpdatesAtURL:(NSURL *)URL host:(SUHost *)aHost -{ - [super checkForUpdatesAtURL:URL host:aHost]; - if ([aHost isRunningOnReadOnlyVolume]) - { - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURunningFromDiskImageError userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithFormat:SULocalizedString(@"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again.", nil), [aHost name]] }]]; - return; - } - - SUAppcast *appcast = [[SUAppcast alloc] init]; - - [appcast setUserAgentString:[self.updater userAgentString]]; - [appcast setHttpHeaders:[self.updater httpHeaders]]; - [appcast fetchAppcastFromURL:URL completionBlock:^(NSError *error) { - if (error) { - [self abortUpdateWithError:error]; - } else { - [self appcastDidFinishLoading:appcast]; - } - }]; -} - -- (id)versionComparator -{ - id comparator = nil; - - // Give the delegate a chance to provide a custom version comparator - if ([[self.updater delegate] respondsToSelector:@selector(versionComparatorForUpdater:)]) { - comparator = [[self.updater delegate] versionComparatorForUpdater:self.updater]; - } - - // If we don't get a comparator from the delegate, use the default comparator - if (!comparator) { - comparator = [SUStandardVersionComparator defaultComparator]; - } - - return comparator; -} - -- (BOOL)isItemNewer:(SUAppcastItem *)ui -{ - return [[self versionComparator] compareVersion:[self.host version] toVersion:[ui versionString]] == NSOrderedAscending; -} - -- (BOOL)hostSupportsItem:(SUAppcastItem *)ui -{ - if (([ui minimumSystemVersion] == nil || [[ui minimumSystemVersion] isEqualToString:@""]) && - ([ui maximumSystemVersion] == nil || [[ui maximumSystemVersion] isEqualToString:@""])) { return YES; } - - BOOL minimumVersionOK = TRUE; - BOOL maximumVersionOK = TRUE; - - // Check minimum and maximum System Version - if ([ui minimumSystemVersion] != nil && ![[ui minimumSystemVersion] isEqualToString:@""]) { - minimumVersionOK = [[SUStandardVersionComparator defaultComparator] compareVersion:[ui minimumSystemVersion] toVersion:[SUHost systemVersionString]] != NSOrderedDescending; - } - if ([ui maximumSystemVersion] != nil && ![[ui maximumSystemVersion] isEqualToString:@""]) { - maximumVersionOK = [[SUStandardVersionComparator defaultComparator] compareVersion:[ui maximumSystemVersion] toVersion:[SUHost systemVersionString]] != NSOrderedAscending; - } - - return minimumVersionOK && maximumVersionOK; -} - -- (BOOL)itemContainsSkippedVersion:(SUAppcastItem *)ui -{ - NSString *skippedVersion = [self.host objectForUserDefaultsKey:SUSkippedVersionKey]; - if (skippedVersion == nil) { return NO; } - return [[self versionComparator] compareVersion:[ui versionString] toVersion:skippedVersion] != NSOrderedDescending; -} - -- (BOOL)itemContainsValidUpdate:(SUAppcastItem *)ui -{ - return ui && [self hostSupportsItem:ui] && [self isItemNewer:ui] && ![self itemContainsSkippedVersion:ui]; -} - -- (void)appcastDidFinishLoading:(SUAppcast *)ac -{ - if ([[self.updater delegate] respondsToSelector:@selector(updater:didFinishLoadingAppcast:)]) { - [[self.updater delegate] updater:self.updater didFinishLoadingAppcast:ac]; - } - - NSDictionary *userInfo = (ac != nil) ? @{ SUUpdaterAppcastNotificationKey: ac } : nil; - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterDidFinishLoadingAppCastNotification object:self.updater userInfo:userInfo]; - - SUAppcastItem *item = nil; - - // Now we have to find the best valid update in the appcast. - if ([[self.updater delegate] respondsToSelector:@selector(bestValidUpdateInAppcast:forUpdater:)]) // Does the delegate want to handle it? - { - item = [[self.updater delegate] bestValidUpdateInAppcast:ac forUpdater:self.updater]; - } - else // If not, we'll take care of it ourselves. - { - // Find the first update we can actually use. - NSEnumerator *updateEnumerator = [[ac items] objectEnumerator]; - do { - item = [updateEnumerator nextObject]; - } while (item && ![self hostSupportsItem:item]); - - SUAppcastItem *deltaUpdateItem = [item deltaUpdates][[self.host version]]; - if (deltaUpdateItem && [self hostSupportsItem:deltaUpdateItem]) { - self.nonDeltaUpdateItem = item; - item = deltaUpdateItem; - } - } - - if ([self itemContainsValidUpdate:item]) { - self.updateItem = item; - [self didFindValidUpdate]; - } else { - self.updateItem = nil; - [self didNotFindUpdate]; - } -} - -- (void)didFindValidUpdate -{ - assert(self.updateItem); - - if ([[self.updater delegate] respondsToSelector:@selector(updater:didFindValidUpdate:)]) { - [[self.updater delegate] updater:self.updater didFindValidUpdate:self.updateItem]; - } - - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterDidFindValidUpdateNotification - object:self.updater - userInfo:@{ SUUpdaterAppcastItemNotificationKey: self.updateItem }]; - [self downloadUpdate]; -} - -- (void)didNotFindUpdate -{ - if ([[self.updater delegate] respondsToSelector:@selector(updaterDidNotFindUpdate:)]) { - [[self.updater delegate] updaterDidNotFindUpdate:self.updater]; - } - - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterDidNotFindUpdateNotification object:self.updater]; - - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain - code:SUNoUpdateError - userInfo:@{ - NSLocalizedDescriptionKey: [NSString stringWithFormat:SULocalizedString(@"You already have the newest version of %@.", "'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI)"), self.host.name] - }]]; -} - -- (void)downloadUpdate -{ - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[self.updateItem fileURL]]; - [request setValue:[self.updater userAgentString] forHTTPHeaderField:@"User-Agent"]; - self.download = [[NSURLDownload alloc] initWithRequest:request delegate:self]; -} - -- (void)download:(NSURLDownload *)__unused d decideDestinationWithSuggestedFilename:(NSString *)name -{ - NSString *downloadFileName = [NSString stringWithFormat:@"%@ %@", [self.host name], [self.updateItem versionString]]; - - - self.tempDir = [self.host.appCachePath stringByAppendingPathComponent:downloadFileName]; - int cnt = 1; - while ([[NSFileManager defaultManager] fileExistsAtPath:self.tempDir] && cnt <= 999) - { - self.tempDir = [self.host.appCachePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@ %d", downloadFileName, cnt++]]; - } - - // Create the temporary directory if necessary. - BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath:self.tempDir withIntermediateDirectories:YES attributes:nil error:NULL]; - if (!success) - { - // Okay, something's really broken with this user's file structure. - [self.download cancel]; - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUTemporaryDirectoryError userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Can't make a temporary directory for the update download at %@.", self.tempDir] }]]; - } - - self.downloadPath = [self.tempDir stringByAppendingPathComponent:name]; - [self.download setDestination:self.downloadPath allowOverwrite:YES]; -} - -- (BOOL)validateUpdateDownloadedToPath:(NSString *)downloadedPath extractedToPath:(NSString *)extractedPath DSASignature:(NSString *)DSASignature publicDSAKey:(NSString *)publicDSAKey -{ - NSString *newBundlePath = [SUInstaller appPathInUpdateFolder:extractedPath forHost:self.host]; - - if (newBundlePath) { - if ([SUCodeSigningVerifier hostApplicationIsCodeSigned]) { - NSError *error = nil; - if ([SUCodeSigningVerifier codeSignatureMatchesHostAndIsValidAtPath:newBundlePath error:&error]) { - return YES; - } else { - SULog(@"Code signature check on update failed: %@. Sparkle will use DSA signature instead.", error); - } - } else { - SULog(@"The host app is not signed using Apple Code Signing, and therefore cannot verify updates this way. Sparkle will use DSA signature instead."); - } - } - - if (DSASignature) { - return [SUDSAVerifier validatePath:downloadedPath withEncodedDSASignature:DSASignature withPublicDSAKey:publicDSAKey]; - } else { - SULog(@"The appcast item for the update has no DSA signature. The update will be rejected, because both DSA and Apple Code Signing verification failed."); - return NO; - } -} - -- (void)downloadDidFinish:(NSURLDownload *)__unused d -{ - assert(self.updateItem); - - [self extractUpdate]; -} - -- (void)download:(NSURLDownload *)__unused download didFailWithError:(NSError *)error -{ - NSURL *failingUrl = error.userInfo[NSURLErrorFailingURLErrorKey]; - if (!failingUrl) { - failingUrl = [self.updateItem fileURL]; - } - - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{ - NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while downloading the update. Please try again later.", nil), - NSUnderlyingErrorKey: error, - NSURLErrorFailingURLErrorKey: failingUrl ? failingUrl : [NSNull null], - }]]; -} - -- (BOOL)download:(NSURLDownload *)__unused download shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType -{ - // We don't want the download system to extract our gzips. - // Note that we use a substring matching here instead of direct comparison because the docs say "application/gzip" but the system *uses* "application/x-gzip". This is a documentation bug. - return ([encodingType rangeOfString:@"gzip"].location == NSNotFound); -} - -- (void)extractUpdate -{ - SUUnarchiver *unarchiver = [SUUnarchiver unarchiverForPath:self.downloadPath updatingHostBundlePath:[[self.host bundle] bundlePath]]; - if (!unarchiver) { - SULog(@"Error: No valid unarchiver for %@!", self.downloadPath); - [self unarchiverDidFail:nil]; - return; - } - unarchiver.delegate = self; - [unarchiver start]; -} - -- (void)failedToApplyDeltaUpdate -{ - // When a delta update fails to apply we fall back on updating via a full install. - self.updateItem = self.nonDeltaUpdateItem; - self.nonDeltaUpdateItem = nil; - - [self downloadUpdate]; -} - -- (void)unarchiverDidFinish:(SUUnarchiver *)__unused ua -{ - assert(self.updateItem); - - [self installWithToolAndRelaunch:YES]; -} - -- (void)unarchiverDidFail:(SUUnarchiver *)__unused ua -{ - if ([self.updateItem isDeltaUpdate]) { - [self failedToApplyDeltaUpdate]; - return; - } - - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUUnarchivingError userInfo:@{ NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while extracting the archive. Please try again later.", nil) }]]; -} - -- (void)installWithToolAndRelaunch:(BOOL)relaunch -{ - // Perhaps a poor assumption but: if we're not relaunching, we assume we shouldn't be showing any UI either. Because non-relaunching installations are kicked off without any user interaction, we shouldn't be interrupting them. - [self installWithToolAndRelaunch:relaunch displayingUserInterface:relaunch]; -} - -- (void)installWithToolAndRelaunch:(BOOL)relaunch displayingUserInterface:(BOOL)showUI -{ - assert(self.updateItem); - - if (![self validateUpdateDownloadedToPath:self.downloadPath extractedToPath:self.tempDir DSASignature:self.updateItem.DSASignature publicDSAKey:self.host.publicDSAKey]) - { - NSDictionary *userInfo = @{ - NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while extracting the archive. Please try again later.", nil), - NSLocalizedFailureReasonErrorKey: SULocalizedString(@"The update is improperly signed.", nil), - }; - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUSignatureError userInfo:userInfo]]; - return; - } - - if (![self.updater mayUpdateAndRestart]) - { - [self abortUpdate]; - return; - } - - // Give the host app an opportunity to postpone the install and relaunch. - static BOOL postponedOnce = NO; - id updaterDelegate = [self.updater delegate]; - if (!postponedOnce && [updaterDelegate respondsToSelector:@selector(updater:shouldPostponeRelaunchForUpdate:untilInvoking:)]) - { - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(installWithToolAndRelaunch:)]]; - [invocation setSelector:@selector(installWithToolAndRelaunch:)]; - [invocation setArgument:&relaunch atIndex:2]; - [invocation setTarget:self]; - postponedOnce = YES; - if ([updaterDelegate updater:self.updater shouldPostponeRelaunchForUpdate:self.updateItem untilInvoking:invocation]) { - return; - } - } - - - if ([updaterDelegate respondsToSelector:@selector(updater:willInstallUpdate:)]) { - [updaterDelegate updater:self.updater willInstallUpdate:self.updateItem]; - } - - NSBundle *sparkleBundle = [NSBundle bundleWithIdentifier:SUBundleIdentifier]; - - // Copy the relauncher into a temporary directory so we can get to it after the new version's installed. - // Only the paranoid survive: if there's already a stray copy of relaunch there, we would have problems. - NSString *const relaunchPathToCopy = [sparkleBundle pathForResource:[[sparkleBundle infoDictionary] objectForKey:SURelaunchToolNameKey] ofType:@"app"]; - if (relaunchPathToCopy != nil) { - NSString *targetPath = [self.host.appCachePath stringByAppendingPathComponent:[relaunchPathToCopy lastPathComponent]]; - // Only the paranoid survive: if there's already a stray copy of relaunch there, we would have problems. - NSError *error = nil; - [[NSFileManager defaultManager] createDirectoryAtPath:[targetPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:@{} error:&error]; - - if ([SUPlainInstaller copyPathWithAuthentication:relaunchPathToCopy overPath:targetPath temporaryName:nil error:&error]) { - self.relaunchPath = targetPath; - } else { - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{ - NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while extracting the archive. Please try again later.", nil), - NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"Couldn't copy relauncher (%@) to temporary path (%@)! %@", relaunchPathToCopy, targetPath, (error ? [error localizedDescription] : @"")] - }]]; - } - } - - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterWillRestartNotification object:self]; - if ([updaterDelegate respondsToSelector:@selector(updaterWillRelaunchApplication:)]) - [updaterDelegate updaterWillRelaunchApplication:self.updater]; - - if (!self.relaunchPath || ![[NSFileManager defaultManager] fileExistsAtPath:self.relaunchPath]) { - // Note that we explicitly use the host app's name here, since updating plugin for Mail relaunches Mail, not just the plugin. - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:@{ - NSLocalizedDescriptionKey: [NSString stringWithFormat:SULocalizedString(@"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@.", nil), [self.host name]], - NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"Couldn't find the relauncher (expected to find it at %@)", self.relaunchPath] - }]]; - // We intentionally don't abandon the update here so that the host won't initiate another. - return; - } - - NSString *pathToRelaunch = [self.host bundlePath]; - if ([updaterDelegate respondsToSelector:@selector(pathToRelaunchForUpdater:)]) { - pathToRelaunch = [updaterDelegate pathToRelaunchForUpdater:self.updater]; - } - NSString *relaunchToolPath = [[NSBundle bundleWithPath:self.relaunchPath] executablePath]; - [NSTask launchedTaskWithLaunchPath:relaunchToolPath arguments:@[[self.host bundlePath], - pathToRelaunch, - [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]], - self.tempDir, - relaunch ? @"1" : @"0", - showUI ? @"1" : @"0"]]; - [self terminateApp]; -} - -- (void)terminateApp -{ - [NSApp terminate:self]; -} - -- (void)cleanUpDownload -{ - if (self.tempDir != nil) // tempDir contains downloadPath, so we implicitly delete both here. - { - BOOL success = NO; - NSError *error = nil; - success = [[NSFileManager defaultManager] removeItemAtPath:self.tempDir error:&error]; // Clean up the copied relauncher - if (!success) - [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:[self.tempDir stringByDeletingLastPathComponent] destination:@"" files:@[[self.tempDir lastPathComponent]] tag:NULL]; - } -} - -- (void)installerForHost:(SUHost *)aHost failedWithError:(NSError *)error -{ - if (aHost != self.host) { - return; - } - NSError *dontThrow = nil; - [[NSFileManager defaultManager] removeItemAtPath:self.relaunchPath error:&dontThrow]; // Clean up the copied relauncher - [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SUInstallationError userInfo:@{ - NSLocalizedDescriptionKey: SULocalizedString(@"An error occurred while installing the update. Please try again later.", nil), - NSLocalizedFailureReasonErrorKey: [error localizedDescription], - NSUnderlyingErrorKey: error, - }]]; -} - -- (void)abortUpdate -{ - [self cleanUpDownload]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - self.updateItem = nil; - [super abortUpdate]; -} - -- (void)abortUpdateWithError:(NSError *)error -{ - if ([error code] != SUNoUpdateError) { // Let's not bother logging this. - SULog(@"Error: %@ %@ (URL %@)", error.localizedDescription, error.localizedFailureReason, error.userInfo[NSURLErrorFailingURLErrorKey]); - } - if (self.download) { - [self.download cancel]; - } - - // Notify host app that update has aborted - id updaterDelegate = [self.updater delegate]; - if ([updaterDelegate respondsToSelector:@selector(updater:didAbortWithError:)]) { - [updaterDelegate updater:self.updater didAbortWithError:error]; - } - - [self abortUpdate]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h deleted file mode 100644 index 293c1e11a..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// SUBinaryDeltaApply.h -// Sparkle -// -// Created by Mark Rowe on 2009-06-01. -// Copyright 2009 Mark Rowe. All rights reserved. -// - -#ifndef SUBINARYDELTAAPPLY_H -#define SUBINARYDELTAAPPLY_H - -@class NSString; -int applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, BOOL verbose); - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m deleted file mode 100644 index 43952df98..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaApply.m +++ /dev/null @@ -1,226 +0,0 @@ -// -// SUBinaryDeltaApply.m -// Sparkle -// -// Created by Mark Rowe on 2009-06-01. -// Copyright 2009 Mark Rowe. All rights reserved. -// - -#import "SUBinaryDeltaApply.h" -#import "SUBinaryDeltaCommon.h" -#include -#import -#include "bspatch.h" -#include -#include -#include - -static BOOL applyBinaryDeltaToFile(xar_t x, xar_file_t file, NSString *sourceFilePath, NSString *destinationFilePath) -{ - NSString *patchFile = temporaryFilename(@"apply-binary-delta"); - xar_extract_tofile(x, file, [patchFile fileSystemRepresentation]); - const char *argv[] = {"/usr/bin/bspatch", [sourceFilePath fileSystemRepresentation], [destinationFilePath fileSystemRepresentation], [patchFile fileSystemRepresentation]}; - BOOL success = (bspatch(4, (char **)argv) == 0); - unlink([patchFile fileSystemRepresentation]); - return success; -} - -int applyBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, BOOL verbose) -{ - xar_t x = xar_open([patchFile fileSystemRepresentation], READ); - if (!x) { - fprintf(stderr, "Unable to open %s. Giving up.\n", [patchFile fileSystemRepresentation]); - return 1; - } - - SUBinaryDeltaMajorVersion majorDiffVersion = FIRST_DELTA_DIFF_MAJOR_VERSION; - SUBinaryDeltaMinorVersion minorDiffVersion = FIRST_DELTA_DIFF_MINOR_VERSION; - - NSString *expectedBeforeHashv1 = nil; - NSString *expectedAfterHashv1 = nil; - - NSString *expectedNewBeforeHash = nil; - NSString *expectedNewAfterHash = nil; - - xar_subdoc_t subdoc; - for (subdoc = xar_subdoc_first(x); subdoc; subdoc = xar_subdoc_next(subdoc)) { - if (!strcmp(xar_subdoc_name(subdoc), BINARY_DELTA_ATTRIBUTES_KEY)) { - const char *value = 0; - - // available in version 2.0 or later - xar_subdoc_prop_get(subdoc, MAJOR_DIFF_VERSION_KEY, &value); - if (value) - majorDiffVersion = (SUBinaryDeltaMajorVersion)[@(value) intValue]; - - // available in version 2.0 or later - xar_subdoc_prop_get(subdoc, MINOR_DIFF_VERSION_KEY, &value); - if (value) - minorDiffVersion = (SUBinaryDeltaMinorVersion)[@(value) intValue]; - - // available in version 2.0 or later - xar_subdoc_prop_get(subdoc, BEFORE_TREE_SHA1_KEY, &value); - if (value) - expectedNewBeforeHash = @(value); - - // available in version 2.0 or later - xar_subdoc_prop_get(subdoc, AFTER_TREE_SHA1_KEY, &value); - if (value) - expectedNewAfterHash = @(value); - - // only available in version 1.0 - xar_subdoc_prop_get(subdoc, BEFORE_TREE_SHA1_OLD_KEY, &value); - if (value) - expectedBeforeHashv1 = @(value); - - // only available in version 1.0 - xar_subdoc_prop_get(subdoc, AFTER_TREE_SHA1_OLD_KEY, &value); - if (value) - expectedAfterHashv1 = @(value); - } - } - - if (majorDiffVersion < FIRST_DELTA_DIFF_MAJOR_VERSION) { - fprintf(stderr, "Unable to identify diff-version %u in delta. Giving up.\n", majorDiffVersion); - return 1; - } - - if (majorDiffVersion > LATEST_DELTA_DIFF_MAJOR_VERSION) { - fprintf(stderr, "A later version is needed to apply this patch (on major version %u, but patch requests version %u).\n", LATEST_DELTA_DIFF_MAJOR_VERSION, majorDiffVersion); - return 1; - } - - BOOL usesNewTreeHash = MAJOR_VERSION_IS_AT_LEAST(majorDiffVersion, SUBeigeMajorVersion); - - NSString *expectedBeforeHash = usesNewTreeHash ? expectedNewBeforeHash : expectedBeforeHashv1; - NSString *expectedAfterHash = usesNewTreeHash ? expectedNewAfterHash : expectedAfterHashv1; - - if (!expectedBeforeHash || !expectedAfterHash) { - fprintf(stderr, "Unable to find before-sha1 or after-sha1 metadata in delta. Giving up.\n"); - return 1; - } - - if (verbose) { - fprintf(stderr, "Applying version %u.%u patch...\n", majorDiffVersion, minorDiffVersion); - fprintf(stderr, "Verifying source..."); - } - - NSString *beforeHash = hashOfTreeWithVersion(source, majorDiffVersion); - if (!beforeHash) { - fprintf(stderr, "\nUnable to calculate hash of tree %s\n", [source fileSystemRepresentation]); - return 1; - } - - if (![beforeHash isEqualToString:expectedBeforeHash]) { - fprintf(stderr, "\nSource doesn't have expected hash (%s != %s). Giving up.\n", [expectedBeforeHash UTF8String], [beforeHash UTF8String]); - return 1; - } - - if (verbose) { - fprintf(stderr, "\nCopying files..."); - } - - if (!removeTree(destination)) { - fprintf(stderr, "\nFailed to remove %s\n", [destination fileSystemRepresentation]); - return 1; - } - if (!copyTree(source, destination)) { - fprintf(stderr, "\nFailed to copy %s to %s\n", [source fileSystemRepresentation], [destination fileSystemRepresentation]); - return 1; - } - - BOOL hasExtractKeyAvailable = MAJOR_VERSION_IS_AT_LEAST(majorDiffVersion, SUBeigeMajorVersion); - - if (verbose) { - fprintf(stderr, "\nPatching..."); - } - NSFileManager *fileManager = [[NSFileManager alloc] init]; - xar_file_t file; - xar_iter_t iter = xar_iter_new(); - for (file = xar_file_first(x, iter); file; file = xar_file_next(iter)) { - NSString *path = @(xar_get_path(file)); - NSString *sourceFilePath = [source stringByAppendingPathComponent:path]; - NSString *destinationFilePath = [destination stringByAppendingPathComponent:path]; - - // Don't use -[NSFileManager fileExistsAtPath:] because it will follow symbolic links - BOOL fileExisted = verbose && [fileManager attributesOfItemAtPath:destinationFilePath error:nil]; - BOOL removedFile = NO; - - const char *value; - if (!xar_prop_get(file, DELETE_KEY, &value) || - (!hasExtractKeyAvailable && !xar_prop_get(file, DELETE_THEN_EXTRACT_OLD_KEY, &value))) { - if (!removeTree(destinationFilePath)) { - fprintf(stderr, "\n%s or %s: failed to remove %s\n", DELETE_KEY, DELETE_THEN_EXTRACT_OLD_KEY, [destination fileSystemRepresentation]); - return 1; - } - if (!hasExtractKeyAvailable && !xar_prop_get(file, DELETE_KEY, &value)) { - if (verbose) { - fprintf(stderr, "\n❌ %s %s", VERBOSE_DELETED, [path fileSystemRepresentation]); - } - continue; - } - - removedFile = YES; - } - - if (!xar_prop_get(file, BINARY_DELTA_KEY, &value)) { - if (!applyBinaryDeltaToFile(x, file, sourceFilePath, destinationFilePath)) { - fprintf(stderr, "\nUnable to patch %s to destination %s\n", [sourceFilePath fileSystemRepresentation], [destinationFilePath fileSystemRepresentation]); - return 1; - } - - if (verbose) { - fprintf(stderr, "\n🔨 %s %s", VERBOSE_PATCHED, [path fileSystemRepresentation]); - } - } else if ((hasExtractKeyAvailable && !xar_prop_get(file, EXTRACT_KEY, &value)) || - (!hasExtractKeyAvailable && xar_prop_get(file, MODIFY_PERMISSIONS_KEY, &value))) { // extract and permission modifications don't coexist - - if (xar_extract_tofile(x, file, [destinationFilePath fileSystemRepresentation]) != 0) { - fprintf(stderr, "\nUnable to extract file to %s\n", [destinationFilePath fileSystemRepresentation]); - return 1; - } - - if (verbose) { - if (fileExisted) { - fprintf(stderr, "\n✏️ %s %s", VERBOSE_UPDATED, [path fileSystemRepresentation]); - } else { - fprintf(stderr, "\n✅ %s %s", VERBOSE_ADDED, [path fileSystemRepresentation]); - } - } - } else if (verbose && removedFile) { - fprintf(stderr, "\n❌ %s %s", VERBOSE_DELETED, [path fileSystemRepresentation]); - } - - if (!xar_prop_get(file, MODIFY_PERMISSIONS_KEY, &value)) { - mode_t mode = (mode_t)[[NSString stringWithUTF8String:value] intValue]; - if (!modifyPermissions(destinationFilePath, mode)) { - fprintf(stderr, "\nUnable to modify permissions (%s) on file %s\n", value, [destinationFilePath fileSystemRepresentation]); - return 1; - } - - if (verbose) { - fprintf(stderr, "\n👮 %s %s (0%o)", VERBOSE_MODIFIED, [path fileSystemRepresentation], mode); - } - } - } - xar_close(x); - - if (verbose) { - fprintf(stderr, "\nVerifying destination..."); - } - NSString *afterHash = hashOfTreeWithVersion(destination, majorDiffVersion); - if (!afterHash) { - fprintf(stderr, "\nUnable to calculate hash of tree %s\n", [destination fileSystemRepresentation]); - return 1; - } - - if (![afterHash isEqualToString:expectedAfterHash]) { - fprintf(stderr, "\nDestination doesn't have expected hash (%s != %s). Giving up.\n", [expectedAfterHash UTF8String], [afterHash UTF8String]); - removeTree(destination); - return 1; - } - - if (verbose) { - fprintf(stderr, "\nDone!\n"); - } - return 0; -} diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h deleted file mode 100644 index 44a5d04e4..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// SUBinaryDeltaCommon.h -// Sparkle -// -// Created by Mark Rowe on 2009-06-01. -// Copyright 2009 Mark Rowe. All rights reserved. -// - -#ifndef SUBINARYDELTACOMMON_H -#define SUBINARYDELTACOMMON_H - -#include - -#define PERMISSION_FLAGS (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX) - -#define IS_VALID_PERMISSIONS(mode) \ - (((mode & PERMISSION_FLAGS) == 0755) || ((mode & PERMISSION_FLAGS) == 0644)) - -#define BINARY_DELTA_ATTRIBUTES_KEY "binary-delta-attributes" -#define MAJOR_DIFF_VERSION_KEY "major-version" -#define MINOR_DIFF_VERSION_KEY "minor-version" -#define BEFORE_TREE_SHA1_KEY "before-tree-sha1" -#define AFTER_TREE_SHA1_KEY "after-tree-sha1" -#define DELETE_KEY "delete" -#define EXTRACT_KEY "extract" -#define BINARY_DELTA_KEY "binary-delta" -#define MODIFY_PERMISSIONS_KEY "mod-permissions" - -// Properties no longer used in new patches -#define DELETE_THEN_EXTRACT_OLD_KEY "delete-then-extract" -#define BEFORE_TREE_SHA1_OLD_KEY "before-sha1" -#define AFTER_TREE_SHA1_OLD_KEY "after-sha1" - -#define VERBOSE_DELETED "Deleted" // file is deleted from the file system when applying a patch -#define VERBOSE_REMOVED "Removed" // file is set to be removed when creating a patch -#define VERBOSE_ADDED "Added" // file is added to the patch or file system -#define VERBOSE_DIFFED "Diffed" // file is diffed when creating a patch -#define VERBOSE_PATCHED "Patched" // file is patched when applying a patch -#define VERBOSE_UPDATED "Updated" // file's contents are updated -#define VERBOSE_MODIFIED "Modified" // file's metadata is modified - -#define MAJOR_VERSION_IS_AT_LEAST(actualMajor, expectedMajor) (actualMajor >= expectedMajor) - -// Each major version will be assigned a name of a color -// Changes that break backwards compatibility will have different major versions -// Changes that affect creating but not applying patches will have different minor versions - -typedef NS_ENUM(uint16_t, SUBinaryDeltaMajorVersion) -{ - SUAzureMajorVersion = 1, - SUBeigeMajorVersion = 2 -}; - -// Only keep track of the latest minor version for each major version -typedef NS_ENUM(uint16_t, SUBinaryDeltaMinorVersion) -{ - SUAzureMinorVersion = 1, - SUBeigeMinorVersion = 0, -}; - -#define FIRST_DELTA_DIFF_MAJOR_VERSION SUAzureMajorVersion -#define FIRST_DELTA_DIFF_MINOR_VERSION 0 - -#define LATEST_DELTA_DIFF_MAJOR_VERSION SUBeigeMajorVersion - -@class NSString; -@class NSData; - -extern int compareFiles(const FTSENT **a, const FTSENT **b); -extern NSData *hashOfFileContents(FTSENT *ent); -extern NSString *hashOfTreeWithVersion(NSString *path, uint16_t majorVersion); -extern NSString *hashOfTree(NSString *path); -extern BOOL removeTree(NSString *path); -extern BOOL copyTree(NSString *source, NSString *dest); -extern BOOL modifyPermissions(NSString *path, mode_t desiredPermissions); -extern NSString *pathRelativeToDirectory(NSString *directory, NSString *path); -NSString *temporaryFilename(NSString *base); -NSString *temporaryDirectory(NSString *base); -NSString *stringWithFileSystemRepresentation(const char*); -SUBinaryDeltaMinorVersion latestMinorVersionForMajorVersion(SUBinaryDeltaMajorVersion majorVersion); -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m deleted file mode 100644 index 9bde20c31..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCommon.m +++ /dev/null @@ -1,238 +0,0 @@ -// -// SUBinaryDeltaCommon.m -// Sparkle -// -// Created by Mark Rowe on 2009-06-01. -// Copyright 2009 Mark Rowe. All rights reserved. -// - -#include "SUBinaryDeltaCommon.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int compareFiles(const FTSENT **a, const FTSENT **b) -{ - return strcoll((*a)->fts_name, (*b)->fts_name); -} - -NSString *pathRelativeToDirectory(NSString *directory, NSString *path) -{ - NSUInteger directoryLength = [directory length]; - if ([path hasPrefix:directory]) - return [path substringFromIndex:directoryLength]; - - return path; -} - -NSString *stringWithFileSystemRepresentation(const char *input) { - return [[NSFileManager defaultManager] stringWithFileSystemRepresentation:input length:strlen(input)]; -} - -SUBinaryDeltaMinorVersion latestMinorVersionForMajorVersion(SUBinaryDeltaMajorVersion majorVersion) -{ - switch (majorVersion) { - case SUAzureMajorVersion: - return SUAzureMinorVersion; - case SUBeigeMajorVersion: - return SUBeigeMinorVersion; - } - return 0; -} - -NSString *temporaryFilename(NSString *base) -{ - NSString *template = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.XXXXXXXXXX", base]]; - NSMutableData *data = [NSMutableData data]; - [data appendBytes:template.fileSystemRepresentation length:strlen(template.fileSystemRepresentation) + 1]; - - char *buffer = data.mutableBytes; - int fd = mkstemp(buffer); - if (fd == -1) { - perror("mkstemp"); - return nil; - } - - if (close(fd) != 0) { - perror("close"); - return nil; - } - - return stringWithFileSystemRepresentation(buffer); -} - -NSString *temporaryDirectory(NSString *base) -{ - NSString *template = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.XXXXXXXXXX", base]]; - NSMutableData *data = [NSMutableData data]; - [data appendBytes:template.fileSystemRepresentation length:strlen(template.fileSystemRepresentation) + 1]; - - char *buffer = data.mutableBytes; - char *templateResult = mkdtemp(buffer); - if (templateResult == NULL) { - perror("mkdtemp"); - return nil; - } - - return stringWithFileSystemRepresentation(templateResult); -} - -static void _hashOfBuffer(unsigned char *hash, const char* buffer, ssize_t bufferLength) -{ - assert(bufferLength >= 0 && bufferLength <= UINT32_MAX); - CC_SHA1_CTX hashContext; - CC_SHA1_Init(&hashContext); - CC_SHA1_Update(&hashContext, buffer, (CC_LONG)bufferLength); - CC_SHA1_Final(hash, &hashContext); -} - -static BOOL _hashOfFileContents(unsigned char* hash, FTSENT *ent) -{ - if (ent->fts_info == FTS_SL) { - char linkDestination[MAXPATHLEN + 1]; - ssize_t linkDestinationLength = readlink(ent->fts_path, linkDestination, MAXPATHLEN); - if (linkDestinationLength < 0) { - perror("readlink"); - return NO; - } - - _hashOfBuffer(hash, linkDestination, linkDestinationLength); - } else if (ent->fts_info == FTS_F) { - int fileDescriptor = open(ent->fts_path, O_RDONLY); - if (fileDescriptor == -1) { - perror("open"); - return NO; - } - - ssize_t fileSize = ent->fts_statp->st_size; - if (fileSize == 0) { - _hashOfBuffer(hash, NULL, 0); - } else { - void *buffer = mmap(0, (size_t)fileSize, PROT_READ, MAP_FILE | MAP_PRIVATE, fileDescriptor, 0); - if (buffer == (void*)-1) { - close(fileDescriptor); - perror("mmap"); - return NO; - } - - _hashOfBuffer(hash, buffer, fileSize); - munmap(buffer, (size_t)fileSize); - } - close(fileDescriptor); - } else if (ent->fts_info == FTS_D) { - memset(hash, 0xdd, CC_SHA1_DIGEST_LENGTH); - } else { - return NO; - } - return YES; -} - -NSData *hashOfFileContents(FTSENT *ent) -{ - unsigned char fileHash[CC_SHA1_DIGEST_LENGTH]; - if (!_hashOfFileContents(fileHash, ent)) { - return nil; - } - return [NSData dataWithBytes:fileHash length:CC_SHA1_DIGEST_LENGTH]; -} - -NSString *hashOfTreeWithVersion(NSString *path, uint16_t majorVersion) -{ - const char *sourcePaths[] = {[path fileSystemRepresentation], 0}; - FTS *fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); - if (!fts) { - perror("fts_open"); - return nil; - } - - CC_SHA1_CTX hashContext; - CC_SHA1_Init(&hashContext); - - FTSENT *ent = 0; - while ((ent = fts_read(fts))) { - if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) - continue; - - if (ent->fts_info == FTS_D && !MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { - continue; - } - - NSString *relativePath = pathRelativeToDirectory(path, stringWithFileSystemRepresentation(ent->fts_path)); - if (relativePath.length == 0) - continue; - - unsigned char fileHash[CC_SHA1_DIGEST_LENGTH]; - if (!_hashOfFileContents(fileHash, ent)) { - return nil; - } - CC_SHA1_Update(&hashContext, fileHash, sizeof(fileHash)); - - const char *relativePathBytes = [relativePath fileSystemRepresentation]; - CC_SHA1_Update(&hashContext, relativePathBytes, (CC_LONG)strlen(relativePathBytes)); - - if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { - uint16_t mode = ent->fts_statp->st_mode; - uint16_t type = ent->fts_info; - uint16_t permissions = mode & PERMISSION_FLAGS; - - CC_SHA1_Update(&hashContext, &type, sizeof(type)); - CC_SHA1_Update(&hashContext, &permissions, sizeof(permissions)); - } - } - fts_close(fts); - - unsigned char hash[CC_SHA1_DIGEST_LENGTH]; - CC_SHA1_Final(hash, &hashContext); - - char hexHash[CC_SHA1_DIGEST_LENGTH * 2 + 1]; - size_t i; - for (i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) - sprintf(hexHash + i * 2, "%02x", hash[i]); - - return @(hexHash); -} - -extern NSString *hashOfTree(NSString *path) -{ - return hashOfTreeWithVersion(path, LATEST_DELTA_DIFF_MAJOR_VERSION); -} - -BOOL removeTree(NSString *path) -{ - NSFileManager *fileManager = [NSFileManager defaultManager]; - // Don't use fileExistsForPath: because it will try to follow symbolic links - if (![fileManager attributesOfItemAtPath:path error:nil]) { - return YES; - } - return [fileManager removeItemAtPath:path error:nil]; -} - -BOOL copyTree(NSString *source, NSString *dest) -{ - return [[NSFileManager defaultManager] copyItemAtPath:source toPath:dest error:nil]; -} - -BOOL modifyPermissions(NSString *path, mode_t desiredPermissions) -{ - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSDictionary *attributes = [fileManager attributesOfItemAtPath:path error:nil]; - if (!attributes) { - return NO; - } - NSNumber *permissions = attributes[NSFilePosixPermissions]; - if (!permissions) { - return NO; - } - mode_t newMode = ([permissions unsignedShortValue] & ~PERMISSION_FLAGS) | desiredPermissions; - int (*changeModeFunc)(const char *, mode_t) = [attributes[NSFileType] isEqualToString:NSFileTypeSymbolicLink] ? lchmod : chmod; - if (changeModeFunc([path fileSystemRepresentation], newMode) != 0) { - return NO; - } - return YES; -} diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h deleted file mode 100644 index 4afc22817..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// SUBinaryDeltaCreate.m -// Sparkle -// -// Created by Mayur Pawashe on 4/9/15. -// Copyright (c) 2015 Sparkle Project. All rights reserved. -// - -#ifndef SUBINARYDELTACREATE_H -#define SUBINARYDELTACREATE_H - -#import "SUBinaryDeltaCommon.h" - -@class NSString; -int createBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, SUBinaryDeltaMajorVersion majorVersion, BOOL verbose); - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m deleted file mode 100644 index a477d6740..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaCreate.m +++ /dev/null @@ -1,462 +0,0 @@ -// -// SUBinaryDeltaCreate.m -// Sparkle -// -// Created by Mayur Pawashe on 4/9/15. -// Copyright (c) 2015 Sparkle Project. All rights reserved. -// - -#import "SUBinaryDeltaCreate.h" -#import -#include "SUBinaryDeltaCommon.h" -#import -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int bsdiff(int argc, const char **argv); - -@interface CreateBinaryDeltaOperation : NSOperation -@property (copy) NSString *relativePath; -@property (strong) NSString *resultPath; -@property (strong) NSNumber *oldPermissions; -@property (strong) NSNumber *permissions; -@property (strong) NSString *_fromPath; -@property (strong) NSString *_toPath; -- (id)initWithRelativePath:(NSString *)relativePath oldTree:(NSString *)oldTree newTree:(NSString *)newTree oldPermissions:(NSNumber *)oldPermissions newPermissions:(NSNumber *)permissions; -@end - -@implementation CreateBinaryDeltaOperation -@synthesize relativePath = _relativePath; -@synthesize resultPath = _resultPath; -@synthesize oldPermissions = _oldPermissions; -@synthesize permissions = _permissions; -@synthesize _fromPath = _fromPath; -@synthesize _toPath = _toPath; - -- (id)initWithRelativePath:(NSString *)relativePath oldTree:(NSString *)oldTree newTree:(NSString *)newTree oldPermissions:(NSNumber *)oldPermissions newPermissions:(NSNumber *)permissions -{ - if ((self = [super init])) { - self.relativePath = relativePath; - self.oldPermissions = oldPermissions; - self.permissions = permissions; - self._fromPath = [oldTree stringByAppendingPathComponent:relativePath]; - self._toPath = [newTree stringByAppendingPathComponent:relativePath]; - } - return self; -} - -- (void)main -{ - NSString *temporaryFile = temporaryFilename(@"BinaryDelta"); - const char *argv[] = {"/usr/bin/bsdiff", [self._fromPath fileSystemRepresentation], [self._toPath fileSystemRepresentation], [temporaryFile fileSystemRepresentation]}; - int result = bsdiff(4, argv); - if (!result) - self.resultPath = temporaryFile; -} - -@end - -#define INFO_HASH_KEY @"hash" -#define INFO_TYPE_KEY @"type" -#define INFO_PERMISSIONS_KEY @"permissions" -#define INFO_SIZE_KEY @"size" - -static NSDictionary *infoForFile(FTSENT *ent) -{ - NSData *hash = hashOfFileContents(ent); - if (!hash) { - return nil; - } - - off_t size = (ent->fts_info != FTS_D) ? ent->fts_statp->st_size : 0; - - assert(ent->fts_statp != NULL); - - mode_t permissions = ent->fts_statp->st_mode & PERMISSION_FLAGS; - - return @{INFO_HASH_KEY: hash, INFO_TYPE_KEY: @(ent->fts_info), INFO_PERMISSIONS_KEY : @(permissions), INFO_SIZE_KEY: @(size)}; -} - -static bool aclExists(const FTSENT *ent) -{ - // OS X does not currently support ACLs for symlinks - if (ent->fts_info == FTS_SL) { - return NO; - } - - acl_t acl = acl_get_link_np(ent->fts_path, ACL_TYPE_EXTENDED); - if (acl != NULL) { - acl_entry_t entry; - int result = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry); - assert(acl_free((void *)acl) == 0); - return (result == 0); - } - return false; -} - -static NSString *absolutePath(NSString *path) -{ - NSURL *url = [[NSURL alloc] initFileURLWithPath:path]; - return [[url absoluteURL] path]; -} - -static NSString *temporaryPatchFile(NSString *patchFile) -{ - NSString *path = absolutePath(patchFile); - NSString *directory = [path stringByDeletingLastPathComponent]; - NSString *file = [path lastPathComponent]; - return [NSString stringWithFormat:@"%@/.%@.tmp", directory, file]; -} - -#define MIN_FILE_SIZE_FOR_CREATING_DELTA 4096 - -static BOOL shouldSkipDeltaCompression(NSDictionary* originalInfo, NSDictionary *newInfo) -{ - unsigned long long fileSize = [newInfo[INFO_SIZE_KEY] unsignedLongLongValue]; - if (fileSize < MIN_FILE_SIZE_FOR_CREATING_DELTA) { - return YES; - } - - if (!originalInfo) { - return YES; - } - - if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { - return YES; - } - - if ([originalInfo[INFO_HASH_KEY] isEqual:newInfo[INFO_HASH_KEY]]) { - // this is possible if just the permissions have changed - return YES; - } - - return NO; -} - -static BOOL shouldDeleteThenExtract(NSDictionary* originalInfo, NSDictionary *newInfo) -{ - if (!originalInfo) { - return NO; - } - - if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { - return YES; - } - - return NO; -} - -static BOOL shouldSkipExtracting(NSDictionary *originalInfo, NSDictionary *newInfo) -{ - if (!originalInfo) { - return NO; - } - - if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { - return NO; - } - - if (![originalInfo[INFO_HASH_KEY] isEqual:newInfo[INFO_HASH_KEY]]) { - return NO; - } - - return YES; -} - -static BOOL shouldChangePermissions(NSDictionary *originalInfo, NSDictionary *newInfo) -{ - if (!originalInfo) { - return NO; - } - - if ([originalInfo[INFO_TYPE_KEY] unsignedShortValue] != [newInfo[INFO_TYPE_KEY] unsignedShortValue]) { - return NO; - } - - if ([originalInfo[INFO_PERMISSIONS_KEY] unsignedShortValue] == [newInfo[INFO_PERMISSIONS_KEY] unsignedShortValue]) { - return NO; - } - - return YES; -} - -int createBinaryDelta(NSString *source, NSString *destination, NSString *patchFile, SUBinaryDeltaMajorVersion majorVersion, BOOL verbose) -{ - if (majorVersion < FIRST_DELTA_DIFF_MAJOR_VERSION) { - fprintf(stderr, "Version provided (%u) is not valid\n", majorVersion); - return 1; - } - - if (majorVersion > LATEST_DELTA_DIFF_MAJOR_VERSION) { - fprintf(stderr, "This program is too old to create a version %u patch, or the version number provided is invalid\n", majorVersion); - return 1; - } - - SUBinaryDeltaMinorVersion minorVersion = latestMinorVersionForMajorVersion(majorVersion); - - NSMutableDictionary *originalTreeState = [NSMutableDictionary dictionary]; - - const char *sourcePaths[] = {[source fileSystemRepresentation], 0}; - FTS *fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); - if (!fts) { - perror("fts_open"); - return 1; - } - - if (verbose) { - fprintf(stderr, "Creating version %u.%u patch...\n", majorVersion, minorVersion); - fprintf(stderr, "Processing %s...", [source fileSystemRepresentation]); - } - - FTSENT *ent = 0; - while ((ent = fts_read(fts))) { - if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) { - continue; - } - - NSString *key = pathRelativeToDirectory(source, stringWithFileSystemRepresentation(ent->fts_path)); - if (![key length]) { - continue; - } - - NSDictionary *info = infoForFile(ent); - if (!info) { - fprintf(stderr, "\nFailed to retrieve info for file %s\n", ent->fts_path); - return 1; - } - originalTreeState[key] = info; - - if (aclExists(ent)) { - fprintf(stderr, "\nDiffing ACLs are not supported. Detected ACL in before-tree on file %s\n", ent->fts_path); - return 1; - } - } - fts_close(fts); - - NSString *beforeHash = hashOfTreeWithVersion(source, majorVersion); - - if (!beforeHash) { - fprintf(stderr, "\nFailed to generate hash for tree %s\n", [source fileSystemRepresentation]); - return 1; - } - - NSMutableDictionary *newTreeState = [NSMutableDictionary dictionary]; - for (NSString *key in originalTreeState) - { - newTreeState[key] = [NSNull null]; - } - - if (verbose) { - fprintf(stderr, "\nProcessing %s...", [destination fileSystemRepresentation]); - } - - sourcePaths[0] = [destination fileSystemRepresentation]; - fts = fts_open((char* const*)sourcePaths, FTS_PHYSICAL | FTS_NOCHDIR, compareFiles); - if (!fts) { - perror("fts_open"); - return 1; - } - - - while ((ent = fts_read(fts))) { - if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL && ent->fts_info != FTS_D) { - continue; - } - - NSString *key = pathRelativeToDirectory(destination, stringWithFileSystemRepresentation(ent->fts_path)); - if (![key length]) { - continue; - } - - NSDictionary *info = infoForFile(ent); - if (!info) { - fprintf(stderr, "\nFailed to retrieve info from file %s\n", ent->fts_path); - return 1; - } - - // We should validate permissions and ACLs even if we don't store the info in the diff in the case of ACLs, - // or in the case of permissions if the patch version is 1 - - mode_t permissions = [info[INFO_PERMISSIONS_KEY] unsignedShortValue]; - if (!IS_VALID_PERMISSIONS(permissions)) { - fprintf(stderr, "\nInvalid file permissions after-tree on file %s\nOnly permissions with modes 0755 and 0644 are supported\n", ent->fts_path); - return 1; - } - - if (aclExists(ent)) { - fprintf(stderr, "\nDiffing ACLs are not supported. Detected ACL in after-tree on file %s\n", ent->fts_path); - return 1; - } - - NSDictionary *oldInfo = originalTreeState[key]; - - if ([info isEqual:oldInfo]) { - [newTreeState removeObjectForKey:key]; - } else { - newTreeState[key] = info; - - if (oldInfo && [oldInfo[INFO_TYPE_KEY] unsignedShortValue] == FTS_D && [info[INFO_TYPE_KEY] unsignedShortValue] != FTS_D) { - NSArray *parentPathComponents = key.pathComponents; - - for (NSString *childPath in originalTreeState) { - NSArray *childPathComponents = childPath.pathComponents; - if (childPathComponents.count > parentPathComponents.count && - [parentPathComponents isEqualToArray:[childPathComponents subarrayWithRange:NSMakeRange(0, parentPathComponents.count)]]) { - [newTreeState removeObjectForKey:childPath]; - } - } - } - } - } - fts_close(fts); - - NSString *afterHash = hashOfTreeWithVersion(destination, majorVersion); - if (!afterHash) { - fprintf(stderr, "\nFailed to generate hash for tree %s\n", [destination fileSystemRepresentation]); - return 1; - } - - if (verbose) { - fprintf(stderr, "\nGenerating delta..."); - } - - NSString *temporaryFile = temporaryPatchFile(patchFile); - xar_t x = xar_open([temporaryFile fileSystemRepresentation], WRITE); - xar_opt_set(x, XAR_OPT_COMPRESSION, "bzip2"); - - xar_subdoc_t attributes = xar_subdoc_new(x, BINARY_DELTA_ATTRIBUTES_KEY); - - xar_subdoc_prop_set(attributes, MAJOR_DIFF_VERSION_KEY, [[NSString stringWithFormat:@"%u", majorVersion] UTF8String]); - xar_subdoc_prop_set(attributes, MINOR_DIFF_VERSION_KEY, [[NSString stringWithFormat:@"%u", minorVersion] UTF8String]); - - // Version 1 patches don't have a major or minor version field, so we need to differentiate between the hash keys - const char *beforeHashKey = - MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) ? BEFORE_TREE_SHA1_KEY : BEFORE_TREE_SHA1_OLD_KEY; - const char *afterHashKey = - MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) ? AFTER_TREE_SHA1_KEY : AFTER_TREE_SHA1_OLD_KEY; - - xar_subdoc_prop_set(attributes, beforeHashKey, [beforeHash UTF8String]); - xar_subdoc_prop_set(attributes, afterHashKey, [afterHash UTF8String]); - - NSOperationQueue *deltaQueue = [[NSOperationQueue alloc] init]; - NSMutableArray *deltaOperations = [NSMutableArray array]; - - // Sort the keys by preferring the ones from the original tree to appear first - // We want to enforce deleting before extracting in the case paths differ only by case - NSArray *keys = [[newTreeState allKeys] sortedArrayUsingComparator:^NSComparisonResult(NSString *key1, NSString *key2) { - NSComparisonResult insensitiveCompareResult = [key1 caseInsensitiveCompare:key2]; - if (insensitiveCompareResult != NSOrderedSame) { - return insensitiveCompareResult; - } - - return originalTreeState[key1] ? NSOrderedAscending : NSOrderedDescending; - }]; - for (NSString* key in keys) { - id value = [newTreeState valueForKey:key]; - - if ([value isEqual:[NSNull null]]) { - xar_file_t newFile = xar_add_frombuffer(x, 0, [key fileSystemRepresentation], (char *)"", 1); - assert(newFile); - xar_prop_set(newFile, DELETE_KEY, "true"); - - if (verbose) { - fprintf(stderr, "\n❌ %s %s", VERBOSE_REMOVED, [key fileSystemRepresentation]); - } - continue; - } - - NSDictionary *originalInfo = originalTreeState[key]; - NSDictionary *newInfo = newTreeState[key]; - if (shouldSkipDeltaCompression(originalInfo, newInfo)) { - if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) && shouldSkipExtracting(originalInfo, newInfo)) { - if (shouldChangePermissions(originalInfo, newInfo)) { - xar_file_t newFile = xar_add_frombuffer(x, 0, [key fileSystemRepresentation], (char *)"", 1); - assert(newFile); - xar_prop_set(newFile, MODIFY_PERMISSIONS_KEY, [[NSString stringWithFormat:@"%u", [newInfo[INFO_PERMISSIONS_KEY] unsignedShortValue]] UTF8String]); - - if (verbose) { - fprintf(stderr, "\n👮 %s %s (0%o -> 0%o)", VERBOSE_MODIFIED, [key fileSystemRepresentation], [originalInfo[INFO_PERMISSIONS_KEY] unsignedShortValue], [newInfo[INFO_PERMISSIONS_KEY] unsignedShortValue]); - } - } - } else { - NSString *path = [destination stringByAppendingPathComponent:key]; - xar_file_t newFile = xar_add_frompath(x, 0, [key fileSystemRepresentation], [path fileSystemRepresentation]); - assert(newFile); - - if (shouldDeleteThenExtract(originalInfo, newInfo)) { - if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { - xar_prop_set(newFile, DELETE_KEY, "true"); - } else { - xar_prop_set(newFile, DELETE_THEN_EXTRACT_OLD_KEY, "true"); - } - } - - if (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion)) { - xar_prop_set(newFile, EXTRACT_KEY, "true"); - } - - if (verbose) { - if (originalInfo) { - fprintf(stderr, "\n✏️ %s %s", VERBOSE_UPDATED, [key fileSystemRepresentation]); - } else { - fprintf(stderr, "\n✅ %s %s", VERBOSE_ADDED, [key fileSystemRepresentation]); - } - } - } - } else { - NSNumber *permissions = - (MAJOR_VERSION_IS_AT_LEAST(majorVersion, SUBeigeMajorVersion) && shouldChangePermissions(originalInfo, newInfo)) ? - newInfo[INFO_PERMISSIONS_KEY] : - nil; - CreateBinaryDeltaOperation *operation = [[CreateBinaryDeltaOperation alloc] initWithRelativePath:key oldTree:source newTree:destination oldPermissions:originalInfo[INFO_PERMISSIONS_KEY] newPermissions:permissions]; - [deltaQueue addOperation:operation]; - [deltaOperations addObject:operation]; - } - } - - [deltaQueue waitUntilAllOperationsAreFinished]; - - for (CreateBinaryDeltaOperation *operation in deltaOperations) { - NSString *resultPath = [operation resultPath]; - if (!resultPath) { - fprintf(stderr, "\nFailed to create patch from source %s and destination %s\n", [[operation relativePath] fileSystemRepresentation], [resultPath fileSystemRepresentation]); - return 1; - } - - if (verbose) { - fprintf(stderr, "\n🔨 %s %s", VERBOSE_DIFFED, [[operation relativePath] fileSystemRepresentation]); - } - - xar_file_t newFile = xar_add_frompath(x, 0, [[operation relativePath] fileSystemRepresentation], [resultPath fileSystemRepresentation]); - assert(newFile); - xar_prop_set(newFile, BINARY_DELTA_KEY, "true"); - unlink([resultPath fileSystemRepresentation]); - - if (operation.permissions) { - xar_prop_set(newFile, MODIFY_PERMISSIONS_KEY, [[NSString stringWithFormat:@"%u", [operation.permissions unsignedShortValue]] UTF8String]); - - if (verbose) { - fprintf(stderr, "\n👮 %s %s (0%o -> 0%o)", VERBOSE_MODIFIED, [[operation relativePath] fileSystemRepresentation], operation.oldPermissions.unsignedShortValue, operation.permissions.unsignedShortValue); - } - } - } - - xar_close(x); - - unlink([patchFile fileSystemRepresentation]); - link([temporaryFile fileSystemRepresentation], [patchFile fileSystemRepresentation]); - unlink([temporaryFile fileSystemRepresentation]); - - if (verbose) { - fprintf(stderr, "\nDone!\n"); - } - - return 0; -} diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m deleted file mode 100644 index 804663dd8..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaTool.m +++ /dev/null @@ -1,218 +0,0 @@ -// -// SUBinaryDeltaTool.m -// Sparkle -// -// Created by Mark Rowe on 2009-06-01. -// Copyright 2009 Mark Rowe. All rights reserved. -// - -#include "SUBinaryDeltaApply.h" -#include "SUBinaryDeltaCreate.h" -#import "SUBinaryDeltaCommon.h" -#include -#include - -#define VERBOSE_FLAG @"--verbose" -#define VERSION_FLAG @"--version" - -#define CREATE_COMMAND @"create" -#define APPLY_COMMAND @"apply" -#define VERSION_COMMAND @"version" -#define VERSION_ALTERNATE_COMMAND @"--version" - -static void printUsage(NSString *programName) -{ - fprintf(stderr, "Usage:\n"); - fprintf(stderr, "%s create [--verbose] [--version=] \n", [programName UTF8String]); - fprintf(stderr, "%s apply [--verbose] \n", [programName UTF8String]); - fprintf(stderr, "%s version []\n", [programName UTF8String]); -} - -static int runCreateCommand(NSString *programName, NSArray *args) -{ - if (args.count < 3 || args.count > 5) { - printUsage(programName); - return 1; - } - - NSUInteger numberOflagsFound = 0; - NSUInteger verboseIndex = [args indexOfObject:VERBOSE_FLAG]; - NSUInteger versionIndex = NSNotFound; - for (NSUInteger argumentIndex = 0; argumentIndex < args.count; ++argumentIndex) { - if ([args[argumentIndex] hasPrefix:VERSION_FLAG]) { - versionIndex = argumentIndex; - break; - } - } - - if (verboseIndex != NSNotFound) { - ++numberOflagsFound; - } - if (versionIndex != NSNotFound) { - ++numberOflagsFound; - } - - if (args.count - numberOflagsFound < 3) { - printUsage(programName); - return 1; - } - - BOOL verbose = (verboseIndex != NSNotFound); - NSString *versionField = (versionIndex != NSNotFound) ? args[versionIndex] : nil; - - NSArray *versionComponents = nil; - if (versionField) { - versionComponents = [versionField componentsSeparatedByString:@"="]; - if (versionComponents.count != 2) { - printUsage(programName); - return 1; - } - } - - SUBinaryDeltaMajorVersion patchVersion = - !versionComponents ? - LATEST_DELTA_DIFF_MAJOR_VERSION : - (SUBinaryDeltaMajorVersion)[[versionComponents[1] componentsSeparatedByString:@"."][0] intValue]; // ignore minor version if provided - - NSMutableArray *fileArgs = [NSMutableArray array]; - for (NSString *argument in args) { - if (![argument hasPrefix:VERSION_FLAG] && ![argument isEqualToString:VERBOSE_FLAG]) { - [fileArgs addObject:argument]; - } - } - - if (fileArgs.count != 3) { - printUsage(programName); - return 1; - } - - BOOL isDirectory; - if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[0] isDirectory:&isDirectory] || !isDirectory) { - printUsage(programName); - fprintf(stderr, "Error: before-tree must be a directory\n"); - return 1; - } - - if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[1] isDirectory:&isDirectory] || !isDirectory) { - printUsage(programName); - fprintf(stderr, "Error: after-tree must be a directory\n"); - return 1; - } - - return createBinaryDelta(fileArgs[0], fileArgs[1], fileArgs[2], patchVersion, verbose); -} - -static int runApplyCommand(NSString *programName, NSArray *args) -{ - if (args.count < 3 || args.count > 4) { - printUsage(programName); - return 1; - } - - BOOL verbose = [args containsObject:VERBOSE_FLAG]; - - if (args.count == 4 && !verbose) { - printUsage(programName); - return 1; - } - - NSMutableArray *fileArgs = [NSMutableArray array]; - for (NSString *argument in args) { - if (![argument isEqualToString:VERBOSE_FLAG]) { - [fileArgs addObject:argument]; - } - } - - if (fileArgs.count != 3) { - printUsage(programName); - return 1; - } - - BOOL isDirectory; - if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[0] isDirectory:&isDirectory] || !isDirectory) { - printUsage(programName); - fprintf(stderr, "Error: before-tree must be a directory\n"); - return 1; - } - - if (![[NSFileManager defaultManager] fileExistsAtPath:fileArgs[2] isDirectory:&isDirectory] || isDirectory) { - printUsage(programName); - fprintf(stderr, "Error: patch-file must be a file %d\n", isDirectory); - return 1; - } - - return applyBinaryDelta(fileArgs[0], fileArgs[1], fileArgs[2], verbose); -} - -static int runVersionCommand(NSString *programName, NSArray *args) -{ - if (args.count > 1) { - printUsage(programName); - return 1; - } - - if (args.count == 0) { - fprintf(stdout, "%u.%u\n", LATEST_DELTA_DIFF_MAJOR_VERSION, latestMinorVersionForMajorVersion(LATEST_DELTA_DIFF_MAJOR_VERSION)); - } else { - NSString *patchFile = args[0]; - xar_t x = xar_open([patchFile fileSystemRepresentation], READ); - if (!x) { - fprintf(stderr, "Unable to open patch %s\n", [patchFile fileSystemRepresentation]); - return 1; - } - - SUBinaryDeltaMajorVersion majorDiffVersion = FIRST_DELTA_DIFF_MAJOR_VERSION; - SUBinaryDeltaMinorVersion minorDiffVersion = FIRST_DELTA_DIFF_MINOR_VERSION; - - xar_subdoc_t subdoc; - for (subdoc = xar_subdoc_first(x); subdoc; subdoc = xar_subdoc_next(subdoc)) { - if (!strcmp(xar_subdoc_name(subdoc), BINARY_DELTA_ATTRIBUTES_KEY)) { - const char *value = 0; - - // available in version 2.0 or later - xar_subdoc_prop_get(subdoc, MAJOR_DIFF_VERSION_KEY, &value); - if (value) - majorDiffVersion = (SUBinaryDeltaMajorVersion)[@(value) intValue]; - - // available in version 2.0 or later - xar_subdoc_prop_get(subdoc, MINOR_DIFF_VERSION_KEY, &value); - if (value) - minorDiffVersion = (SUBinaryDeltaMinorVersion)[@(value) intValue]; - } - } - - fprintf(stdout, "%u.%u\n", majorDiffVersion, minorDiffVersion); - } - - return 0; -} - -int main(int __unused argc, char __unused *argv[]) -{ - @autoreleasepool { - NSArray *args = [[NSProcessInfo processInfo] arguments]; - NSString *programName = [args[0] lastPathComponent]; - - if (args.count < 2) { - printUsage(programName); - return 1; - } - - NSString *command = args[1]; - NSArray *commandArguments = [args subarrayWithRange:NSMakeRange(2, args.count - 2)]; - - int result; - if ([command isEqualToString:CREATE_COMMAND]) { - result = runCreateCommand(programName, commandArguments); - } else if ([command isEqualToString:APPLY_COMMAND]) { - result = runApplyCommand(programName, commandArguments); - } else if ([command isEqualToString:VERSION_COMMAND] || [command isEqualToString:VERSION_ALTERNATE_COMMAND]) { - result = runVersionCommand(programName, commandArguments); - } else { - result = 1; - printUsage(programName); - } - - return result; - } -} diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.h b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.h deleted file mode 100644 index 1e71cbe49..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// SUBinaryDeltaUnarchiver.h -// Sparkle -// -// Created by Mark Rowe on 2009-06-03. -// Copyright 2009 Mark Rowe. All rights reserved. -// - -#ifndef SUBINARYDELTAUNARCHIVER_H -#define SUBINARYDELTAUNARCHIVER_H - -#import -#import "SUUnarchiver.h" - -@interface SUBinaryDeltaUnarchiver : SUUnarchiver - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m b/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m deleted file mode 100644 index 0c238df7f..000000000 --- a/Frameworks/Sparkle/Sparkle/SUBinaryDeltaUnarchiver.m +++ /dev/null @@ -1,55 +0,0 @@ -// -// SUBinaryDeltaUnarchiver.m -// Sparkle -// -// Created by Mark Rowe on 2009-06-03. -// Copyright 2009 Mark Rowe. All rights reserved. -// - -#import "SUBinaryDeltaCommon.h" -#import "SUBinaryDeltaUnarchiver.h" -#import "SUBinaryDeltaApply.h" -#import "SUUnarchiver_Private.h" -#import "SUHost.h" -#import "NTSynchronousTask.h" - -@implementation SUBinaryDeltaUnarchiver - -+ (BOOL)canUnarchivePath:(NSString *)path -{ - return [[path pathExtension] isEqualToString:@"delta"]; -} - -- (void)applyBinaryDelta -{ - @autoreleasepool { - NSString *sourcePath = self.updateHostBundlePath; - NSString *targetPath = [[self.archivePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:[sourcePath lastPathComponent]]; - - int result = applyBinaryDelta(sourcePath, targetPath, self.archivePath, NO); - if (!result) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self notifyDelegateOfSuccess]; - }); - } - else { - dispatch_async(dispatch_get_main_queue(), ^{ - [self notifyDelegateOfFailure]; - }); - } - } -} - -- (void)start -{ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self applyBinaryDelta]; - }); -} - -+ (void)load -{ - [self registerImplementation:self]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h b/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h deleted file mode 100644 index eddd1b261..000000000 --- a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// SUCodeSigningVerifier.h -// Sparkle -// -// Created by Andy Matuschak on 7/5/12. -// -// - -#ifndef SUCODESIGNINGVERIFIER_H -#define SUCODESIGNINGVERIFIER_H - -#import - -@interface SUCodeSigningVerifier : NSObject -+ (BOOL)codeSignatureMatchesHostAndIsValidAtPath:(NSString *)applicationPath error:(NSError **)error; -+ (BOOL)codeSignatureIsValidAtPath:(NSString *)applicationPath error:(NSError **)error; -+ (BOOL)hostApplicationIsCodeSigned; -+ (BOOL)applicationAtPathIsCodeSigned:(NSString *)applicationPath; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m b/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m deleted file mode 100644 index 73efc6c11..000000000 --- a/Frameworks/Sparkle/Sparkle/SUCodeSigningVerifier.m +++ /dev/null @@ -1,198 +0,0 @@ -// -// SUCodeSigningVerifier.m -// Sparkle -// -// Created by Andy Matuschak on 7/5/12. -// -// - -#include -#include -#import "SUCodeSigningVerifier.h" -#import "SULog.h" - -@implementation SUCodeSigningVerifier - -+ (BOOL)codeSignatureMatchesHostAndIsValidAtPath:(NSString *)applicationPath error:(NSError *__autoreleasing *)error -{ - OSStatus result; - SecRequirementRef requirement = NULL; - SecStaticCodeRef staticCode = NULL; - SecCodeRef hostCode = NULL; - NSBundle *newBundle; - CFErrorRef cfError = NULL; - if (error) { - *error = nil; - } - - result = SecCodeCopySelf(kSecCSDefaultFlags, &hostCode); - if (result != noErr) { - SULog(@"Failed to copy host code %d", result); - goto finally; - } - - result = SecCodeCopyDesignatedRequirement(hostCode, kSecCSDefaultFlags, &requirement); - if (result != noErr) { - SULog(@"Failed to copy designated requirement. Code Signing OSStatus code: %d", result); - goto finally; - } - - newBundle = [NSBundle bundleWithPath:applicationPath]; - if (!newBundle) { - SULog(@"Failed to load NSBundle for update"); - result = -1; - goto finally; - } - - result = SecStaticCodeCreateWithPath((__bridge CFURLRef)[newBundle bundleURL], kSecCSDefaultFlags, &staticCode); - if (result != noErr) { - SULog(@"Failed to get static code %d", result); - goto finally; - } - - // Note that kSecCSCheckNestedCode may not work with pre-Mavericks code signing. - // See https://github.com/sparkle-project/Sparkle/issues/376#issuecomment-48824267 and https://developer.apple.com/library/mac/technotes/tn2206 - SecCSFlags flags = kSecCSDefaultFlags | kSecCSCheckAllArchitectures; - result = SecStaticCodeCheckValidityWithErrors(staticCode, flags, requirement, &cfError); - - if (cfError) { - NSError *tmpError = CFBridgingRelease(cfError); - if (error) *error = tmpError; - } - - if (result != noErr) { - if (result == errSecCSUnsigned) { - SULog(@"The host app is signed, but the new version of the app is not signed using Apple Code Signing. Please ensure that the new app is signed and that archiving did not corrupt the signature."); - } - if (result == errSecCSReqFailed) { - CFStringRef requirementString = nil; - if (SecRequirementCopyString(requirement, kSecCSDefaultFlags, &requirementString) == noErr) { - SULog(@"Code signature of the new version doesn't match the old version: %@. Please ensure that old and new app is signed using exactly the same certificate.", requirementString); - CFRelease(requirementString); - } - - [self logSigningInfoForCode:hostCode label:@"host info"]; - [self logSigningInfoForCode:staticCode label:@"new info"]; - } - } - -finally: - if (hostCode) CFRelease(hostCode); - if (staticCode) CFRelease(staticCode); - if (requirement) CFRelease(requirement); - return (result == noErr); -} - -+ (BOOL)codeSignatureIsValidAtPath:(NSString *)applicationPath error:(NSError *__autoreleasing *)error -{ - OSStatus result; - SecStaticCodeRef staticCode = NULL; - NSBundle *newBundle; - CFErrorRef cfError = NULL; - if (error) { - *error = nil; - } - - newBundle = [NSBundle bundleWithPath:applicationPath]; - if (!newBundle) { - SULog(@"Failed to load NSBundle"); - result = -1; - goto finally; - } - - result = SecStaticCodeCreateWithPath((__bridge CFURLRef)[newBundle bundleURL], kSecCSDefaultFlags, &staticCode); - if (result != noErr) { - SULog(@"Failed to get static code %d", result); - goto finally; - } - - // Note that kSecCSCheckNestedCode may not work with pre-Mavericks code signing. - // See https://github.com/sparkle-project/Sparkle/issues/376#issuecomment-48824267 and https://developer.apple.com/library/mac/technotes/tn2206 - SecCSFlags flags = kSecCSDefaultFlags | kSecCSCheckAllArchitectures; - result = SecStaticCodeCheckValidityWithErrors(staticCode, flags, NULL, &cfError); - - if (cfError) { - NSError *tmpError = CFBridgingRelease(cfError); - if (error) *error = tmpError; - } - - if (result != noErr) { - if (result == errSecCSUnsigned) { - SULog(@"Error: The app is not signed using Apple Code Signing. %@", applicationPath); - } - if (result == errSecCSReqFailed) { - [self logSigningInfoForCode:staticCode label:@"new info"]; - } - } - -finally: - if (staticCode) CFRelease(staticCode); - return (result == noErr); -} - -static id valueOrNSNull(id value) { - return value ? value : [NSNull null]; -} - -+ (void)logSigningInfoForCode:(SecStaticCodeRef)code label:(NSString*)label { - CFDictionaryRef signingInfo = nil; - const SecCSFlags flags = kSecCSSigningInformation | kSecCSRequirementInformation | kSecCSDynamicInformation | kSecCSContentInformation; - if (SecCodeCopySigningInformation(code, flags, &signingInfo) == noErr) { - NSDictionary *signingDict = CFBridgingRelease(signingInfo); - NSMutableDictionary *relevantInfo = [NSMutableDictionary dictionary]; - for (NSString *key in @[@"format", @"identifier", @"requirements", @"teamid", @"signing-time"]) { - relevantInfo[key] = valueOrNSNull(signingDict[key]); - } - NSDictionary *infoPlist = signingDict[@"info-plist"]; - relevantInfo[@"version"] = valueOrNSNull(infoPlist[@"CFBundleShortVersionString"]); - relevantInfo[@"build"] = valueOrNSNull(infoPlist[(__bridge NSString *)kCFBundleVersionKey]); - SULog(@"%@: %@", label, relevantInfo); - } -} - -+ (BOOL)hostApplicationIsCodeSigned -{ - OSStatus result; - SecCodeRef hostCode = NULL; - result = SecCodeCopySelf(kSecCSDefaultFlags, &hostCode); - if (result != 0) return NO; - - SecRequirementRef requirement = NULL; - result = SecCodeCopyDesignatedRequirement(hostCode, kSecCSDefaultFlags, &requirement); - if (hostCode) CFRelease(hostCode); - if (requirement) CFRelease(requirement); - return (result == 0); -} - -+ (BOOL)applicationAtPathIsCodeSigned:(NSString *)applicationPath -{ - OSStatus result; - SecStaticCodeRef staticCode = NULL; - NSBundle *newBundle; - - newBundle = [NSBundle bundleWithPath:applicationPath]; - if (!newBundle) { - SULog(@"Failed to load NSBundle"); - return NO; - } - - result = SecStaticCodeCreateWithPath((__bridge CFURLRef)[newBundle bundleURL], kSecCSDefaultFlags, &staticCode); - if (result == errSecCSUnsigned) { - return NO; - } - - SecRequirementRef requirement = NULL; - result = SecCodeCopyDesignatedRequirement(staticCode, kSecCSDefaultFlags, &requirement); - if (staticCode) { - CFRelease(staticCode); - } - if (requirement) { - CFRelease(requirement); - } - if (result == errSecCSUnsigned) { - return NO; - } - return (result == 0); -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUConstants.h b/Frameworks/Sparkle/Sparkle/SUConstants.h deleted file mode 100644 index e6bfcb31c..000000000 --- a/Frameworks/Sparkle/Sparkle/SUConstants.h +++ /dev/null @@ -1,82 +0,0 @@ -// -// SUConstants.h -// Sparkle -// -// Created by Andy Matuschak on 3/16/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - - -#ifndef SUCONSTANTS_H -#define SUCONSTANTS_H - -// ----------------------------------------------------------------------------- -// Misc: -// ----------------------------------------------------------------------------- - -extern const NSTimeInterval SUMinimumUpdateCheckInterval; -extern const NSTimeInterval SUDefaultUpdateCheckInterval; - -extern NSString *const SUBundleIdentifier; - -// ----------------------------------------------------------------------------- -// Notifications: -// ----------------------------------------------------------------------------- - -extern NSString *const SUTechnicalErrorInformationKey; - -// ----------------------------------------------------------------------------- -// PList keys:: -// ----------------------------------------------------------------------------- - -extern NSString *const SUFeedURLKey; -extern NSString *const SUHasLaunchedBeforeKey; -extern NSString *const SUShowReleaseNotesKey; -extern NSString *const SUSkippedVersionKey; -extern NSString *const SUScheduledCheckIntervalKey; -extern NSString *const SULastCheckTimeKey; -extern NSString *const SUExpectsDSASignatureKey; -extern NSString *const SUPublicDSAKeyKey; -extern NSString *const SUPublicDSAKeyFileKey; -extern NSString *const SUAutomaticallyUpdateKey; -extern NSString *const SUAllowsAutomaticUpdatesKey; -extern NSString *const SUEnableAutomaticChecksKey; -extern NSString *const SUEnableAutomaticChecksKeyOld; -extern NSString *const SUEnableSystemProfilingKey; -extern NSString *const SUSendProfileInfoKey; -extern NSString *const SULastProfileSubmitDateKey; -extern NSString *const SUPromptUserOnFirstLaunchKey; -extern NSString *const SUKeepDownloadOnFailedInstallKey; -extern NSString *const SUDefaultsDomainKey; -extern NSString *const SUFixedHTMLDisplaySizeKey __attribute__((deprecated("This key is obsolete and has no effect."))); - -extern NSString *const SUAppendVersionNumberKey; -extern NSString *const SUEnableAutomatedDowngradesKey; -extern NSString *const SUNormalizeInstalledApplicationNameKey; -extern NSString *const SURelaunchToolNameKey; - -// ----------------------------------------------------------------------------- -// Appcast keys:: -// ----------------------------------------------------------------------------- - -extern NSString *const SUAppcastAttributeDeltaFrom; -extern NSString *const SUAppcastAttributeDSASignature; -extern NSString *const SUAppcastAttributeShortVersionString; -extern NSString *const SUAppcastAttributeVersion; - -extern NSString *const SUAppcastElementCriticalUpdate; -extern NSString *const SUAppcastElementDeltas; -extern NSString *const SUAppcastElementMinimumSystemVersion; -extern NSString *const SUAppcastElementMaximumSystemVersion; -extern NSString *const SUAppcastElementReleaseNotesLink; -extern NSString *const SUAppcastElementTags; - -extern NSString *const SURSSAttributeURL; - -extern NSString *const SURSSElementDescription; -extern NSString *const SURSSElementEnclosure; -extern NSString *const SURSSElementLink; -extern NSString *const SURSSElementPubDate; -extern NSString *const SURSSElementTitle; - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUConstants.m b/Frameworks/Sparkle/Sparkle/SUConstants.m deleted file mode 100644 index 31c80ca3d..000000000 --- a/Frameworks/Sparkle/Sparkle/SUConstants.m +++ /dev/null @@ -1,73 +0,0 @@ -// -// SUConstants.m -// Sparkle -// -// Created by Andy Matuschak on 3/16/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUConstants.h" - -#ifndef DEBUG -#define DEBUG 0 -#endif - -// Define some minimum intervals to avoid DoS-like checking attacks -const NSTimeInterval SUMinimumUpdateCheckInterval = DEBUG ? 60 : (60 * 60); -const NSTimeInterval SUDefaultUpdateCheckInterval = DEBUG ? 60 : (60 * 60 * 24); - -NSString *const SUBundleIdentifier = @SPARKLE_BUNDLE_IDENTIFIER; - -NSString *const SUTechnicalErrorInformationKey = @"SUTechnicalErrorInformation"; - -NSString *const SUHasLaunchedBeforeKey = @"SUHasLaunchedBefore"; -NSString *const SUFeedURLKey = @"SUFeedURL"; -NSString *const SUShowReleaseNotesKey = @"SUShowReleaseNotes"; -NSString *const SUSkippedVersionKey = @"SUSkippedVersion"; -NSString *const SUScheduledCheckIntervalKey = @"SUScheduledCheckInterval"; -NSString *const SULastCheckTimeKey = @"SULastCheckTime"; -NSString *const SUExpectsDSASignatureKey = @"SUExpectsDSASignature"; -NSString *const SUPublicDSAKeyKey = @"SUPublicDSAKey"; -NSString *const SUPublicDSAKeyFileKey = @"SUPublicDSAKeyFile"; -NSString *const SUAutomaticallyUpdateKey = @"SUAutomaticallyUpdate"; -NSString *const SUAllowsAutomaticUpdatesKey = @"SUAllowsAutomaticUpdates"; -NSString *const SUEnableSystemProfilingKey = @"SUEnableSystemProfiling"; -NSString *const SUEnableAutomaticChecksKey = @"SUEnableAutomaticChecks"; -NSString *const SUEnableAutomaticChecksKeyOld = @"SUCheckAtStartup"; -NSString *const SUSendProfileInfoKey = @"SUSendProfileInfo"; -NSString *const SULastProfileSubmitDateKey = @"SULastProfileSubmissionDate"; -NSString *const SUPromptUserOnFirstLaunchKey = @"SUPromptUserOnFirstLaunch"; -NSString *const SUFixedHTMLDisplaySizeKey = @"SUFixedHTMLDisplaySize"; -NSString *const SUKeepDownloadOnFailedInstallKey = @"SUKeepDownloadOnFailedInstall"; -NSString *const SUDefaultsDomainKey = @"SUDefaultsDomain"; -NSString *const SUSparkleErrorDomain = @"SUSparkleErrorDomain"; - -NSString *const SUAppendVersionNumberKey = @"SUAppendVersionNumber"; -NSString *const SUEnableAutomatedDowngradesKey = @"SUEnableAutomatedDowngrades"; -NSString *const SUNormalizeInstalledApplicationNameKey = @"SUNormalizeInstalledApplicationName"; -NSString *const SURelaunchToolNameKey = @"SURelaunchToolName"; - -NSString *const SUAppcastAttributeDeltaFrom = @"sparkle:deltaFrom"; -NSString *const SUAppcastAttributeDSASignature = @"sparkle:dsaSignature"; -NSString *const SUAppcastAttributeShortVersionString = @"sparkle:shortVersionString"; -NSString *const SUAppcastAttributeVersion = @"sparkle:version"; - -NSString *const SUAppcastElementCriticalUpdate = @"sparkle:criticalUpdate"; -NSString *const SUAppcastElementDeltas = @"sparkle:deltas"; -NSString *const SUAppcastElementMinimumSystemVersion = @"sparkle:minimumSystemVersion"; -NSString *const SUAppcastElementMaximumSystemVersion = @"sparkle:maximumSystemVersion"; -NSString *const SUAppcastElementReleaseNotesLink = @"sparkle:releaseNotesLink"; -NSString *const SUAppcastElementTags = @"sparkle:tags"; - -NSString *const SURSSAttributeURL = @"url"; - -NSString *const SURSSElementDescription = @"description"; -NSString *const SURSSElementEnclosure = @"enclosure"; -NSString *const SURSSElementLink = @"link"; -NSString *const SURSSElementPubDate = @"pubDate"; -NSString *const SURSSElementTitle = @"title"; diff --git a/Frameworks/Sparkle/Sparkle/SUDSAVerifier.h b/Frameworks/Sparkle/Sparkle/SUDSAVerifier.h deleted file mode 100644 index 3e876e19c..000000000 --- a/Frameworks/Sparkle/Sparkle/SUDSAVerifier.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// SUDSAVerifier.h -// Sparkle -// -// Created by Andy Matuschak on 3/16/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// -// Includes code by Zach Waldowski on 10/18/13. -// Copyright 2014 Big Nerd Ranch. Licensed under MIT. -// -// Includes code from Plop by Mark Hamlin. -// Copyright 2011 Mark Hamlin. Licensed under BSD. -// - -#ifndef SUDSAVERIFIER_H -#define SUDSAVERIFIER_H - -@interface SUDSAVerifier : NSObject - -+ (BOOL)validatePath:(NSString *)path withEncodedDSASignature:(NSString *)encodedSignature withPublicDSAKey:(NSString *)pkeyString; - -- (instancetype)initWithPublicKeyData:(NSData *)data; - -- (BOOL)verifyFileAtPath:(NSString *)path signature:(NSData *)signature; -- (BOOL)verifyStream:(NSInputStream *)stream signature:(NSData *)signature; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUDSAVerifier.m b/Frameworks/Sparkle/Sparkle/SUDSAVerifier.m deleted file mode 100644 index 4789327e0..000000000 --- a/Frameworks/Sparkle/Sparkle/SUDSAVerifier.m +++ /dev/null @@ -1,159 +0,0 @@ -// -// SUDSAVerifier.m -// Sparkle -// -// Created by Andy Matuschak on 3/16/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// -// Includes code by Zach Waldowski on 10/18/13. -// Copyright 2014 Big Nerd Ranch. Licensed under MIT. -// -// Includes code from Plop by Mark Hamlin. -// Copyright 2011 Mark Hamlin. Licensed under BSD. -// - -#import "SUDSAVerifier.h" -#import "SULog.h" -#include - -@implementation SUDSAVerifier { - SecKeyRef _secKey; -} - -+ (BOOL)validatePath:(NSString *)path withEncodedDSASignature:(NSString *)encodedSignature withPublicDSAKey:(NSString *)pkeyString -{ - if (!encodedSignature) { - SULog(@"There is no DSA signature to check"); - return NO; - } - - if (!path) { - return NO; - } - - SUDSAVerifier *verifier = [[self alloc] initWithPublicKeyData:[pkeyString dataUsingEncoding:NSUTF8StringEncoding]]; - - if (!verifier) { - return NO; - } - - NSString *strippedSignature = [encodedSignature stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; - NSData *signature = [[NSData alloc] initWithBase64Encoding:strippedSignature]; - return [verifier verifyFileAtPath:path signature:signature]; -} - -- (instancetype)initWithPublicKeyData:(NSData *)data -{ - self = [super init]; - - if (!self || !data.length) { - SULog(@"Could not read public DSA key"); - return nil; - } - - SecExternalFormat format = kSecFormatOpenSSL; - SecExternalItemType itemType = kSecItemTypePublicKey; - CFArrayRef items = NULL; - - OSStatus status = SecItemImport((__bridge CFDataRef)data, NULL, &format, &itemType, 0, NULL, NULL, &items); - if (status != errSecSuccess || !items) { - if (items) { - CFRelease(items); - } - SULog(@"Public DSA key could not be imported: %d", status); - return nil; - } - - if (format == kSecFormatOpenSSL && itemType == kSecItemTypePublicKey && CFArrayGetCount(items) == 1) { - _secKey = (SecKeyRef)CFRetain(CFArrayGetValueAtIndex(items, 0)); - } - - CFRelease(items); - - return self; -} - -- (void)dealloc -{ - if (_secKey) { - CFRelease(_secKey); - } -} - -- (BOOL)verifyFileAtPath:(NSString *)path signature:(NSData *)signature -{ - if (!path.length) { - return NO; - } - NSInputStream *dataInputStream = [NSInputStream inputStreamWithFileAtPath:path]; - return [self verifyStream:dataInputStream signature:signature]; -} - -- (BOOL)verifyStream:(NSInputStream *)stream signature:(NSData *)signature -{ - if (!stream || !signature) { - return NO; - } - - __block SecGroupTransformRef group = SecTransformCreateGroupTransform(); - __block SecTransformRef dataReadTransform = NULL; - __block SecTransformRef dataDigestTransform = NULL; - __block SecTransformRef dataVerifyTransform = NULL; - __block CFErrorRef error = NULL; - - BOOL (^cleanup)(void) = ^{ - if (group) CFRelease(group); - if (dataReadTransform) CFRelease(dataReadTransform); - if (dataDigestTransform) CFRelease(dataDigestTransform); - if (dataVerifyTransform) CFRelease(dataVerifyTransform); - if (error) CFRelease(error); - return NO; - }; - - dataReadTransform = SecTransformCreateReadTransformWithReadStream((__bridge CFReadStreamRef)stream); - if (!dataReadTransform) { - SULog(@"File containing update archive could not be read (failed to create SecTransform for input stream)"); - return cleanup(); - } - - dataDigestTransform = SecDigestTransformCreate(kSecDigestSHA1, CC_SHA1_DIGEST_LENGTH, NULL); - if (!dataDigestTransform) { - return cleanup(); - } - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdirect-ivar-access" - dataVerifyTransform = SecVerifyTransformCreate(_secKey, (__bridge CFDataRef)signature, &error); -#pragma clang diagnostic pop - if (!dataVerifyTransform || error) { - SULog(@"Could not understand format of the signature: %@; Signature data: %@", error, signature); - return cleanup(); - } - - SecTransformConnectTransforms(dataReadTransform, kSecTransformOutputAttributeName, dataDigestTransform, kSecTransformInputAttributeName, group, &error); - if (error) { - SULog(@"%@", error); - return cleanup(); - } - - SecTransformConnectTransforms(dataDigestTransform, kSecTransformOutputAttributeName, dataVerifyTransform, kSecTransformInputAttributeName, group, &error); - if (error) { - SULog(@"%@", error); - return cleanup(); - } - - NSNumber *result = CFBridgingRelease(SecTransformExecute(group, &error)); - if (error) { - SULog(@"DSA signature verification failed: %@", error); - return cleanup(); - } - - if (!result.boolValue) { - SULog(@"DSA signature does not match. Data of the update file being checked is different than data that has been signed, or the public key and the private key are not from the same set."); - } - - cleanup(); - return result.boolValue; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.h b/Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.h deleted file mode 100644 index 7a8e9167a..000000000 --- a/Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// SUDiskImageUnarchiver.h -// Sparkle -// -// Created by Andy Matuschak on 6/16/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUDISKIMAGEUNARCHIVER_H -#define SUDISKIMAGEUNARCHIVER_H - -#import -#import "SUUnarchiver.h" - -@interface SUDiskImageUnarchiver : SUUnarchiver - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.m b/Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.m deleted file mode 100644 index f5d39fd98..000000000 --- a/Frameworks/Sparkle/Sparkle/SUDiskImageUnarchiver.m +++ /dev/null @@ -1,168 +0,0 @@ -// -// SUDiskImageUnarchiver.m -// Sparkle -// -// Created by Andy Matuschak on 6/16/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUDiskImageUnarchiver.h" -#import "SUUnarchiver_Private.h" -#import "NTSynchronousTask.h" -#import "SULog.h" -#include - -@implementation SUDiskImageUnarchiver - -+ (BOOL)canUnarchivePath:(NSString *)path -{ - return [[path pathExtension] isEqualToString:@"dmg"]; -} - -// Called on a non-main thread. -- (void)extractDMG -{ - @autoreleasepool { - [self extractDMGWithPassword:nil]; - } -} - -// Called on a non-main thread. -- (void)extractDMGWithPassword:(NSString *)__unused password -{ - @autoreleasepool { - BOOL mountedSuccessfully = NO; - - SULog(@"Extracting %@ as a DMG", self.archivePath); - - // get a unique mount point path - NSString *mountPoint = nil; - FSRef tmpRef; - NSFileManager *manager; - NSError *error; - NSArray *contents; - // We have to declare these before a goto to prevent an error under ARC. - // No, we cannot have them in the dispatch_async calls, as the goto "jump enters - // lifetime of block which strongly captures a variable" - dispatch_block_t delegateFailure = ^{ - [self notifyDelegateOfFailure]; - }; - dispatch_block_t delegateSuccess = ^{ - [self notifyDelegateOfSuccess]; - }; - do - { - // Using NSUUID would make creating UUIDs be done in Cocoa, - // and thus managed under ARC. Sadly, the class is in 10.8 and later. - CFUUIDRef uuid = CFUUIDCreate(NULL); - if (uuid) - { - NSString *uuidString = CFBridgingRelease(CFUUIDCreateString(NULL, uuid)); - if (uuidString) - { - mountPoint = [@"/Volumes" stringByAppendingPathComponent:uuidString]; - } - CFRelease(uuid); - } - } - while (noErr == FSPathMakeRefWithOptions((UInt8 *)[mountPoint fileSystemRepresentation], kFSPathMakeRefDoNotFollowLeafSymlink, &tmpRef, NULL)); - - NSData *promptData = nil; - promptData = [NSData dataWithBytes:"yes\n" length:4]; - - NSArray *arguments = @[@"attach", self.archivePath, @"-mountpoint", mountPoint, /*@"-noverify",*/ @"-nobrowse", @"-noautoopen"]; - - NSData *output = nil; - NSInteger taskResult = -1; - @try - { - NTSynchronousTask *task = [[NTSynchronousTask alloc] init]; - - [task run:@"/usr/bin/hdiutil" directory:@"/" withArgs:arguments input:promptData]; - - taskResult = [task result]; - output = [[task output] copy]; - } - @catch (NSException *) - { - goto reportError; - } - - if (taskResult != 0) - { - NSString *resultStr = output ? [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding] : nil; - SULog(@"hdiutil failed with code: %ld data: <<%@>>", (long)taskResult, resultStr); - goto reportError; - } - mountedSuccessfully = YES; - - // Now that we've mounted it, we need to copy out its contents. - manager = [[NSFileManager alloc] init]; - contents = [manager contentsOfDirectoryAtPath:mountPoint error:&error]; - if (error) - { - SULog(@"Couldn't enumerate contents of archive mounted at %@: %@", mountPoint, error); - goto reportError; - } - - for (NSString *item in contents) - { - NSString *fromPath = [mountPoint stringByAppendingPathComponent:item]; - NSString *toPath = [[self.archivePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:item]; - - // We skip any files in the DMG which are not readable. - if (![manager isReadableFileAtPath:fromPath]) { - continue; - } - - SULog(@"copyItemAtPath:%@ toPath:%@", fromPath, toPath); - - if (![manager copyItemAtPath:fromPath toPath:toPath error:&error]) - { - SULog(@"Couldn't copy item: %@ : %@", error, error.userInfo ? error.userInfo : @""); - goto reportError; - } - } - - dispatch_async(dispatch_get_main_queue(), delegateSuccess); - goto finally; - - reportError: - dispatch_async(dispatch_get_main_queue(), delegateFailure); - - finally: - if (mountedSuccessfully) - [NSTask launchedTaskWithLaunchPath:@"/usr/bin/hdiutil" arguments:@[@"detach", mountPoint, @"-force"]]; - else - SULog(@"Can't mount DMG %@", self.archivePath); - } -} - -- (void)start -{ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self extractDMG]; - }); -} - -+ (void)load -{ - [self registerImplementation:self]; -} - -- (BOOL)isEncrypted:(NSData *)resultData -{ - BOOL result = NO; - if(resultData) - { - NSString *data = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; - - if ((data != nil) && !NSEqualRanges([data rangeOfString:@"passphrase-count"], NSMakeRange(NSNotFound, 0))) - { - result = YES; - } - } - return result; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUErrors.h b/Frameworks/Sparkle/Sparkle/SUErrors.h deleted file mode 100644 index e624bb056..000000000 --- a/Frameworks/Sparkle/Sparkle/SUErrors.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// SUErrors.h -// Sparkle -// -// Created by C.W. Betts on 10/13/14. -// Copyright (c) 2014 Sparkle Project. All rights reserved. -// - -#ifndef SUERRORS_H -#define SUERRORS_H - -#import -#import "SUExport.h" - -/** - * Error domain used by Sparkle - */ -SU_EXPORT extern NSString *const SUSparkleErrorDomain; - -typedef NS_ENUM(OSStatus, SUError) { - // Appcast phase errors. - SUAppcastParseError = 1000, - SUNoUpdateError = 1001, - SUAppcastError = 1002, - SURunningFromDiskImageError = 1003, - - // Downlaod phase errors. - SUTemporaryDirectoryError = 2000, - - // Extraction phase errors. - SUUnarchivingError = 3000, - SUSignatureError = 3001, - - // Installation phase errors. - SUFileCopyFailure = 4000, - SUAuthenticationFailure = 4001, - SUMissingUpdateError = 4002, - SUMissingInstallerToolError = 4003, - SURelaunchError = 4004, - SUInstallationError = 4005, - SUDowngradeError = 4006 -}; - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUExport.h b/Frameworks/Sparkle/Sparkle/SUExport.h deleted file mode 100644 index 3e3f8a164..000000000 --- a/Frameworks/Sparkle/Sparkle/SUExport.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// SUExport.h -// Sparkle -// -// Created by Jake Petroules on 2014-08-23. -// Copyright (c) 2014 Sparkle Project. All rights reserved. -// - -#ifndef SUEXPORT_H -#define SUEXPORT_H - -#ifdef BUILDING_SPARKLE -#define SU_EXPORT __attribute__((visibility("default"))) -#else -#define SU_EXPORT -#endif - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h b/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h deleted file mode 100644 index 92082a340..000000000 --- a/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// SUGuidedPackageInstaller.h -// Sparkle -// -// Created by Graham Miln on 14/05/2010. -// Copyright 2010 Dragon Systems Software Limited. All rights reserved. -// - -/*! -# Sparkle Guided Installations - -A guided installation allows Sparkle to download and install a package (pkg) or multi-package (mpkg) without user interaction. - -The installer package is installed using Mac OS X's built-in command line installer, `/usr/sbin/installer`. No installation interface is shown to the user. - -A guided installation can be started by applications other than the application being replaced. This is particularly useful where helper applications or agents are used. - -## To Do -- Replace the use of `AuthorizationExecuteWithPrivilegesAndWait`. This method remains because it is well supported and tested. Ideally a helper tool or XPC would be used. -*/ - -#ifndef SUGUIDEDPACKAGEINSTALLER_H -#define SUGUIDEDPACKAGEINSTALLER_H - -#import "Sparkle.h" -#import "SUInstaller.h" - -@interface SUGuidedPackageInstaller : SUInstaller { -} - -/*! Perform the guided installation */ -+ (void)performInstallationToPath:(NSString *)path fromPath:(NSString *)installerGuide host:(SUHost *)host versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m b/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m deleted file mode 100644 index bc83d42be..000000000 --- a/Frameworks/Sparkle/Sparkle/SUGuidedPackageInstaller.m +++ /dev/null @@ -1,139 +0,0 @@ -// -// SUGuidedPackageInstaller.m -// Sparkle -// -// Created by Graham Miln on 14/05/2010. -// Copyright 2010 Dragon Systems Software Limited. All rights reserved. -// - -#import -#import - -#import "SUGuidedPackageInstaller.h" - -static BOOL AuthorizationExecuteWithPrivilegesAndWait(AuthorizationRef authorization, const char* executablePath, AuthorizationFlags options, const char* const* arguments) -{ - sig_t oldSigChildHandler = signal(SIGCHLD, SIG_DFL); - BOOL returnValue = YES; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - /* AuthorizationExecuteWithPrivileges used to support 10.4+; should be replaced with XPC or external process */ - if (AuthorizationExecuteWithPrivileges(authorization, executablePath, options, (char* const*)arguments, NULL) == errAuthorizationSuccess) -#pragma clang diagnostic pop - { - int status = 0; - pid_t pid = wait(&status); - if (pid == -1 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) - returnValue = NO; - } - else - returnValue = NO; - - signal(SIGCHLD, oldSigChildHandler); - return returnValue; -} - -@implementation SUGuidedPackageInstaller (SUGuidedPackageInstallerAuthentication) - -+ (AuthorizationRef)authorizationForExecutable:(NSString*)executablePath -{ - NSParameterAssert(executablePath); - - // Get authorization using advice in Apple's Technical Q&A1172 - - // ...create authorization without specific rights - AuthorizationRef auth = NULL; - OSStatus validAuth = AuthorizationCreate(NULL, - kAuthorizationEmptyEnvironment, - kAuthorizationFlagDefaults, - &auth); - // ...then extend authorization with desired rights - if ((validAuth == errAuthorizationSuccess) && - (auth != NULL)) - { - const char* executableFileSystemRepresentation = [executablePath fileSystemRepresentation]; - - // Prepare a right allowing script to execute with privileges - AuthorizationItem right; - memset(&right,0,sizeof(right)); - right.name = kAuthorizationRightExecute; - right.value = (void*) executableFileSystemRepresentation; - right.valueLength = strlen(executableFileSystemRepresentation); - - // Package up the single right - AuthorizationRights rights; - memset(&rights,0,sizeof(rights)); - rights.count = 1; - rights.items = &right; - - // Extend rights to run script - validAuth = AuthorizationCopyRights(auth, - &rights, - kAuthorizationEmptyEnvironment, - kAuthorizationFlagPreAuthorize | - kAuthorizationFlagExtendRights | - kAuthorizationFlagInteractionAllowed, - NULL); - if (validAuth != errAuthorizationSuccess) - { - // Error, clean up authorization - (void) AuthorizationFree(auth,kAuthorizationFlagDefaults); - auth = NULL; - } - } - - return auth; -} - -@end - -@implementation SUGuidedPackageInstaller - -+ (void)performInstallationToPath:(NSString *)destinationPath fromPath:(NSString *)packagePath host:(SUHost *)__unused host versionComparator:(id)__unused comparator completionHandler:(void (^)(NSError *))completionHandler -{ - NSParameterAssert(packagePath); - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - - // Preflight - NSString* installerPath = @"/usr/sbin/installer"; // Mac OS X 10.2+ command line installer tool - NSError* error = nil; - - // Create authorization for installer executable - BOOL validInstallation = NO; - AuthorizationRef auth = [self authorizationForExecutable:installerPath]; - if (auth != NULL) - { - // Permission was granted to execute the installer with privileges - const char* const arguments[] = { - "-pkg", - [packagePath fileSystemRepresentation], - "-target", - "/", - NULL - }; - validInstallation = AuthorizationExecuteWithPrivilegesAndWait(auth, - [installerPath fileSystemRepresentation], - kAuthorizationFlagDefaults, - arguments); - // TODO: wait for communications pipe to close via fileno & CFSocketCreateWithNative - AuthorizationFree(auth,kAuthorizationFlagDefaults); - } - else - { - NSString* errorMessage = [NSString stringWithFormat:@"Sparkle Updater: Script authorization denied."]; - error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUInstallationError userInfo:[NSDictionary dictionaryWithObject:errorMessage forKey:NSLocalizedDescriptionKey]]; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [self finishInstallationToPath:destinationPath - withResult:validInstallation - error:error - completionHandler:completionHandler]; - - }); - }); -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUHost.h b/Frameworks/Sparkle/Sparkle/SUHost.h deleted file mode 100644 index 4ec132867..000000000 --- a/Frameworks/Sparkle/Sparkle/SUHost.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// SUHost.h -// Sparkle -// -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" - -@interface SUHost : NSObject - -@property (strong, readonly) NSBundle *bundle; - -+ (NSString *)systemVersionString; - -- (instancetype)initWithBundle:(NSBundle *)aBundle; -@property (readonly, copy) NSString *bundlePath; -@property (readonly, copy) NSString *appCachePath; -@property (readonly, copy) NSString *installationPath; -@property (readonly, copy) NSString *name; -@property (readonly, copy) NSString *version; -@property (readonly, copy) NSString *displayVersion; -@property (readonly, copy) NSImage *icon; -@property (getter=isRunningOnReadOnlyVolume, readonly) BOOL runningOnReadOnlyVolume; -@property (getter=isBackgroundApplication, readonly) BOOL backgroundApplication; -@property (readonly, copy) NSString *publicDSAKey; -@property (readonly, copy) NSArray *systemProfile; - -- (id)objectForInfoDictionaryKey:(NSString *)key; -- (BOOL)boolForInfoDictionaryKey:(NSString *)key; -- (id)objectForUserDefaultsKey:(NSString *)defaultName; -- (void)setObject:(id)value forUserDefaultsKey:(NSString *)defaultName; -- (BOOL)boolForUserDefaultsKey:(NSString *)defaultName; -- (void)setBool:(BOOL)value forUserDefaultsKey:(NSString *)defaultName; -- (id)objectForKey:(NSString *)key; -- (BOOL)boolForKey:(NSString *)key; -@end diff --git a/Frameworks/Sparkle/Sparkle/SUHost.m b/Frameworks/Sparkle/Sparkle/SUHost.m deleted file mode 100644 index 8f559a87e..000000000 --- a/Frameworks/Sparkle/Sparkle/SUHost.m +++ /dev/null @@ -1,287 +0,0 @@ -// -// SUHost.m -// Sparkle -// -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUHost.h" - -#import "SUConstants.h" -#import "SUSystemProfiler.h" -#include // For statfs for isRunningOnReadOnlyVolume -#import "SULog.h" - -#if __MAC_OS_X_VERSION_MAX_ALLOWED < 101000 -typedef struct { - NSInteger majorVersion; - NSInteger minorVersion; - NSInteger patchVersion; -} NSOperatingSystemVersion; -@interface NSProcessInfo () -- (NSOperatingSystemVersion)operatingSystemVersion; -@end -#endif - -@interface SUHost () - -@property (strong, readwrite) NSBundle *bundle; -@property (copy) NSString *defaultsDomain; -@property (assign) BOOL usesStandardUserDefaults; - -@end - -@implementation SUHost - -@synthesize bundle; -@synthesize defaultsDomain; -@synthesize usesStandardUserDefaults; - -- (instancetype)initWithBundle:(NSBundle *)aBundle -{ - if ((self = [super init])) - { - if (aBundle == nil) aBundle = [NSBundle mainBundle]; - self.bundle = aBundle; - if (![self.bundle bundleIdentifier]) { - SULog(@"Error: the bundle being updated at %@ has no %@! This will cause preference read/write to not work properly.", self.bundle, kCFBundleIdentifierKey); - } - - self.defaultsDomain = [self.bundle objectForInfoDictionaryKey:SUDefaultsDomainKey]; - if (!self.defaultsDomain) { - self.defaultsDomain = [self.bundle bundleIdentifier]; - } - - // If we're using the main bundle's defaults we'll use the standard user defaults mechanism, otherwise we have to get CF-y. - usesStandardUserDefaults = !self.defaultsDomain || [self.defaultsDomain isEqualToString:[[NSBundle mainBundle] bundleIdentifier]]; - } - return self; -} - - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@, %@>", [self class], [self bundlePath], [self installationPath]]; } - -- (NSString *)bundlePath -{ - return [self.bundle bundlePath]; -} - -- (NSString *)appCachePath -{ - NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - NSString *cachePath = nil; - if ([cachePaths count]) { - cachePath = cachePaths[0]; - } - if (!cachePath) { - SULog(@"Failed to find user's cache directory! Using system default"); - cachePath = NSTemporaryDirectory(); - } - - NSString *name = [self.bundle bundleIdentifier]; - if (!name) { - name = [self name]; - } - - cachePath = [cachePath stringByAppendingPathComponent:name]; - cachePath = [cachePath stringByAppendingPathComponent:@"Sparkle"]; - return cachePath; -} - -- (NSString *)installationPath -{ - if ([[[NSBundle bundleWithIdentifier:SUBundleIdentifier] infoDictionary][SUNormalizeInstalledApplicationNameKey] boolValue]) { - // We'll install to "#{CFBundleName}.app", but only if that path doesn't already exist. If we're "Foo 4.2.app," and there's a "Foo.app" in this directory, we don't want to overwrite it! But if there's no "Foo.app," we'll take that name. - NSString *normalizedAppPath = [[[self.bundle bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", [self.bundle objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleNameKey], [[self.bundle bundlePath] pathExtension]]]; - if (![[NSFileManager defaultManager] fileExistsAtPath:[[[self.bundle bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", [self.bundle objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleNameKey], [[self.bundle bundlePath] pathExtension]]]]) { - return normalizedAppPath; - } - } - return [self.bundle bundlePath]; -} - -- (NSString *)name -{ - NSString *name; - - // Allow host bundle to provide a custom name - name = [self objectForInfoDictionaryKey:@"SUBundleName"]; - if (name) return name; - - name = [self.bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; - if (name) return name; - - name = [self objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleNameKey]; - if (name) return name; - - return [[[NSFileManager defaultManager] displayNameAtPath:[self.bundle bundlePath]] stringByDeletingPathExtension]; -} - -- (NSString *)version -{ - NSString *version = [self.bundle objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]; - if (!version || [version isEqualToString:@""]) - [NSException raise:@"SUNoVersionException" format:@"This host (%@) has no %@! This attribute is required.", [self bundlePath], (__bridge NSString *)kCFBundleVersionKey]; - return version; -} - -- (NSString *)displayVersion -{ - NSString *shortVersionString = [self.bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - if (shortVersionString) - return shortVersionString; - else - return [self version]; // Fall back on the normal version string. -} - -- (NSImage *)icon -{ - // Cache the application icon. - NSString *iconPath = [self.bundle pathForResource:[self.bundle objectForInfoDictionaryKey:@"CFBundleIconFile"] ofType:@"icns"]; - // According to the OS X docs, "CFBundleIconFile - This key identifies the file containing - // the icon for the bundle. The filename you specify does not need to include the .icns - // extension, although it may." - // - // However, if it *does* include the '.icns' the above method fails (tested on OS X 10.3.9) so we'll also try: - if (!iconPath) { - iconPath = [self.bundle pathForResource:[self.bundle objectForInfoDictionaryKey:@"CFBundleIconFile"] ofType:nil]; - } - NSImage *icon = [[NSImage alloc] initWithContentsOfFile:iconPath]; - // Use a default icon if none is defined. - if (!icon) { - BOOL isMainBundle = (self.bundle == [NSBundle mainBundle]); - - NSString *fileType = isMainBundle ? (NSString *)kUTTypeApplication : (NSString *)kUTTypeBundle; - icon = [[NSWorkspace sharedWorkspace] iconForFileType:fileType]; - } - return icon; -} - -- (BOOL)isRunningOnReadOnlyVolume -{ - struct statfs statfs_info; - statfs([[self.bundle bundlePath] fileSystemRepresentation], &statfs_info); - return (statfs_info.f_flags & MNT_RDONLY); -} - -- (BOOL)isBackgroundApplication -{ - return ([[NSApplication sharedApplication] activationPolicy] == NSApplicationActivationPolicyAccessory); -} - -- (NSString *)publicDSAKey -{ - // Maybe the key is just a string in the Info.plist. - NSString *key = [self.bundle objectForInfoDictionaryKey:SUPublicDSAKeyKey]; - if (key) { return key; } - - // More likely, we've got a reference to a Resources file by filename: - NSString *keyFilename = [self objectForInfoDictionaryKey:SUPublicDSAKeyFileKey]; - if (!keyFilename) { return nil; } - NSError *ignoreErr = nil; - return [NSString stringWithContentsOfFile:[self.bundle pathForResource:keyFilename ofType:nil] encoding:NSASCIIStringEncoding error:&ignoreErr]; -} - -- (NSArray *)systemProfile -{ - return [[SUSystemProfiler sharedSystemProfiler] systemProfileArrayForHost:self]; -} - -- (id)objectForInfoDictionaryKey:(NSString *)key -{ - return [self.bundle objectForInfoDictionaryKey:key]; -} - -- (BOOL)boolForInfoDictionaryKey:(NSString *)key -{ - return [[self objectForInfoDictionaryKey:key] boolValue]; -} - -- (id)objectForUserDefaultsKey:(NSString *)defaultName -{ - if (!defaultName || !self.defaultsDomain) { - return nil; - } - - // Under Tiger, CFPreferencesCopyAppValue doesn't get values from NSRegistrationDomain, so anything - // passed into -[NSUserDefaults registerDefaults:] is ignored. The following line falls - // back to using NSUserDefaults, but only if the host bundle is the main bundle. - if (self.usesStandardUserDefaults) { - return [[NSUserDefaults standardUserDefaults] objectForKey:defaultName]; - } - - CFPropertyListRef obj = CFPreferencesCopyAppValue((__bridge CFStringRef)defaultName, (__bridge CFStringRef)self.defaultsDomain); - return CFBridgingRelease(obj); -} - -- (void)setObject:(id)value forUserDefaultsKey:(NSString *)defaultName -{ - if (self.usesStandardUserDefaults) - { - [[NSUserDefaults standardUserDefaults] setObject:value forKey:defaultName]; - } - else - { - CFPreferencesSetValue((__bridge CFStringRef)defaultName, (__bridge CFPropertyListRef)(value), (__bridge CFStringRef)self.defaultsDomain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - CFPreferencesSynchronize((__bridge CFStringRef)self.defaultsDomain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - } -} - -- (BOOL)boolForUserDefaultsKey:(NSString *)defaultName -{ - if (self.usesStandardUserDefaults) { - return [[NSUserDefaults standardUserDefaults] boolForKey:defaultName]; - } - - BOOL value; - CFPropertyListRef plr = CFPreferencesCopyAppValue((__bridge CFStringRef)defaultName, (__bridge CFStringRef)self.defaultsDomain); - if (plr == NULL) { - value = NO; - } - else - { - value = (BOOL)CFBooleanGetValue((CFBooleanRef)plr); - CFRelease(plr); - } - return value; -} - -- (void)setBool:(BOOL)value forUserDefaultsKey:(NSString *)defaultName -{ - if (self.usesStandardUserDefaults) - { - [[NSUserDefaults standardUserDefaults] setBool:value forKey:defaultName]; - } - else - { - CFPreferencesSetValue((__bridge CFStringRef)defaultName, (__bridge CFBooleanRef) @(value), (__bridge CFStringRef)self.defaultsDomain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - CFPreferencesSynchronize((__bridge CFStringRef)self.defaultsDomain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - } -} - -- (id)objectForKey:(NSString *)key { - return [self objectForUserDefaultsKey:key] ? [self objectForUserDefaultsKey:key] : [self objectForInfoDictionaryKey:key]; -} - -- (BOOL)boolForKey:(NSString *)key { - return [self objectForUserDefaultsKey:key] ? [self boolForUserDefaultsKey:key] : [self boolForInfoDictionaryKey:key]; -} - -+ (NSString *)systemVersionString -{ -#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1090 // Present in 10.9 despite NS_AVAILABLE's claims -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wselector" - // Xcode 5.1.1: operatingSystemVersion is clearly declared, must warn due to a compiler bug? - if (![NSProcessInfo instancesRespondToSelector:@selector(operatingSystemVersion)]) -#pragma clang diagnostic pop - { - NSURL *coreServices = [[NSFileManager defaultManager] URLForDirectory:NSCoreServiceDirectory inDomain:NSSystemDomainMask appropriateForURL:nil create:NO error:nil]; - return [NSDictionary dictionaryWithContentsOfURL:[coreServices URLByAppendingPathComponent:@"SystemVersion.plist"]][@"ProductVersion"]; - } -#endif - NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; - return [NSString stringWithFormat:@"%ld.%ld.%ld", (long)version.majorVersion, (long)version.minorVersion, (long)version.patchVersion]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUInstaller.h b/Frameworks/Sparkle/Sparkle/SUInstaller.h deleted file mode 100644 index fe82f885f..000000000 --- a/Frameworks/Sparkle/Sparkle/SUInstaller.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// SUInstaller.h -// Sparkle -// -// Created by Andy Matuschak on 4/10/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUINSTALLER_H -#define SUINSTALLER_H - -#import -#import "SUVersionComparisonProtocol.h" - -@class SUHost; -@interface SUInstaller : NSObject - -+ (NSString *)appPathInUpdateFolder:(NSString *)updateFolder forHost:(SUHost *)host; -+ (void)installFromUpdateFolder:(NSString *)updateFolder overHost:(SUHost *)host installationPath:(NSString *)installationPath versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler; -+ (void)finishInstallationToPath:(NSString *)installationPath withResult:(BOOL)result error:(NSError *)error completionHandler:(void (^)(NSError *))completionHandler; -+ (NSString *)updateFolder; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUInstaller.m b/Frameworks/Sparkle/Sparkle/SUInstaller.m deleted file mode 100644 index 2513973a9..000000000 --- a/Frameworks/Sparkle/Sparkle/SUInstaller.m +++ /dev/null @@ -1,187 +0,0 @@ -// -// SUInstaller.m -// Sparkle -// -// Created by Andy Matuschak on 4/10/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUInstaller.h" -#import "SUPlainInstaller.h" -#import "SUPackageInstaller.h" -#import "SUGuidedPackageInstaller.h" -#import "SUHost.h" -#import "SUConstants.h" -#import "SULog.h" - -@implementation SUInstaller - -static NSString *sUpdateFolder = nil; - -+ (NSString *)updateFolder -{ - return sUpdateFolder; -} - -+ (BOOL)isAliasFolderAtPath:(NSString *)path -{ - FSRef fileRef; - OSStatus err = noErr; - Boolean aliasFileFlag = false, folderFlag = false; - NSURL *fileURL = [NSURL fileURLWithPath:path]; - - if (FALSE == CFURLGetFSRef((CFURLRef)fileURL, &fileRef)) - err = coreFoundationUnknownErr; - - if (noErr == err) - err = FSIsAliasFile(&fileRef, &aliasFileFlag, &folderFlag); - - if (noErr == err) - return !!(aliasFileFlag && folderFlag); - else - return NO; -} - -+ (NSString *)installSourcePathInUpdateFolder:(NSString *)inUpdateFolder forHost:(SUHost *)host isPackage:(BOOL *)isPackagePtr isGuided:(BOOL *)isGuidedPtr -{ - NSParameterAssert(inUpdateFolder); - NSParameterAssert(host); - - // Search subdirectories for the application - NSString *currentFile, - *newAppDownloadPath = nil, - *bundleFileName = [[host bundlePath] lastPathComponent], - *alternateBundleFileName = [[host name] stringByAppendingPathExtension:[[host bundlePath] pathExtension]]; - BOOL isPackage = NO; - BOOL isGuided = NO; - NSString *fallbackPackagePath = nil; - NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:inUpdateFolder]; - NSString *bundleFileNameNoExtension = [bundleFileName stringByDeletingPathExtension]; - - sUpdateFolder = inUpdateFolder; - - while ((currentFile = [dirEnum nextObject])) { - NSString *currentPath = [inUpdateFolder stringByAppendingPathComponent:currentFile]; - NSString *currentFilename = [currentFile lastPathComponent]; - NSString *currentExtension = [currentFile pathExtension]; - NSString *currentFilenameNoExtension = [currentFilename stringByDeletingPathExtension]; - if ([currentFilename isEqualToString:bundleFileName] || - [currentFilename isEqualToString:alternateBundleFileName]) // We found one! - { - isPackage = NO; - newAppDownloadPath = currentPath; - break; - } else if ([currentExtension isEqualToString:@"pkg"] || - [currentExtension isEqualToString:@"mpkg"]) { - if ([currentFilenameNoExtension isEqualToString:bundleFileNameNoExtension]) { - isPackage = YES; - newAppDownloadPath = currentPath; - break; - } else { - // Remember any other non-matching packages we have seen should we need to use one of them as a fallback. - fallbackPackagePath = currentPath; - } - } else { - // Try matching on bundle identifiers in case the user has changed the name of the host app - NSBundle *incomingBundle = [NSBundle bundleWithPath:currentPath]; - if (incomingBundle && [[incomingBundle bundleIdentifier] isEqualToString:[[host bundle] bundleIdentifier]]) { - isPackage = NO; - newAppDownloadPath = currentPath; - break; - } - } - - // Some DMGs have symlinks into /Applications! That's no good! - if ([self isAliasFolderAtPath:currentPath]) - [dirEnum skipDescendents]; - } - - // We don't have a valid path. Try to use the fallback package. - - if (newAppDownloadPath == nil && fallbackPackagePath != nil) { - isPackage = YES; - newAppDownloadPath = fallbackPackagePath; - } - - if (isPackage) { - // foo.app -> foo.sparkle_guided.pkg or foo.sparkle_guided.mpkg - if ([[[newAppDownloadPath stringByDeletingPathExtension] pathExtension] isEqualToString:@"sparkle_guided"]) { - isGuided = YES; - } - } - - if (isPackagePtr) - *isPackagePtr = isPackage; - if (isGuidedPtr) - *isGuidedPtr = isGuided; - - if (!newAppDownloadPath) { - SULog(@"Searched %@ for %@.(app|pkg)", inUpdateFolder, bundleFileNameNoExtension); - } - return newAppDownloadPath; -} - -+ (NSString *)appPathInUpdateFolder:(NSString *)updateFolder forHost:(SUHost *)host -{ - BOOL isPackage = NO; - NSString *path = [self installSourcePathInUpdateFolder:updateFolder forHost:host isPackage:&isPackage isGuided:nil]; - return isPackage ? nil : path; -} - -+ (void)installFromUpdateFolder:(NSString *)inUpdateFolder overHost:(SUHost *)host installationPath:(NSString *)installationPath versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler -{ - BOOL isPackage = NO; - BOOL isGuided = NO; - NSString *newAppDownloadPath = [self installSourcePathInUpdateFolder:inUpdateFolder forHost:host isPackage:&isPackage isGuided:&isGuided]; - - if (newAppDownloadPath == nil) { - [self finishInstallationToPath:installationPath withResult:NO error:[NSError errorWithDomain:SUSparkleErrorDomain code:SUMissingUpdateError userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't find an appropriate update in the downloaded package." }] completionHandler:completionHandler]; - } else { - if (isPackage && isGuided) { - [SUGuidedPackageInstaller performInstallationToPath:installationPath fromPath:newAppDownloadPath host:host versionComparator:comparator completionHandler:completionHandler]; - } else if (isPackage) { - [SUPackageInstaller performInstallationToPath:installationPath fromPath:newAppDownloadPath host:host versionComparator:comparator completionHandler:completionHandler]; - } else { - [SUPlainInstaller performInstallationToPath:installationPath fromPath:newAppDownloadPath host:host versionComparator:comparator completionHandler:completionHandler]; - } - } -} - -+ (void)mdimportInstallationPath:(NSString *)installationPath -{ - // *** GETS CALLED ON NON-MAIN THREAD! - - SULog(@"mdimporting"); - - NSTask *mdimport = [[NSTask alloc] init]; - [mdimport setLaunchPath:@"/usr/bin/mdimport"]; - [mdimport setArguments:@[installationPath]]; - @try { - [mdimport launch]; - [mdimport waitUntilExit]; - } - @catch (NSException *launchException) - { - // No big deal. - SULog(@"Error: %@", [launchException description]); - } -} - -+ (void)finishInstallationToPath:(NSString *)installationPath withResult:(BOOL)result error:(NSError *)error completionHandler:(void (^)(NSError *))completionHandler -{ - if (result) { - [self mdimportInstallationPath:installationPath]; - dispatch_async(dispatch_get_main_queue(), ^{ - completionHandler(nil); - }); - } else { - if (!error) { - error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUInstallationError userInfo:nil]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - completionHandler(error); - }); - } -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SULog.h b/Frameworks/Sparkle/Sparkle/SULog.h deleted file mode 100644 index 1693f5355..000000000 --- a/Frameworks/Sparkle/Sparkle/SULog.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SULog.h - * EyeTV - * - * Created by Uli Kusterer on 12/03/2009. - * Copyright 2008 Elgato Systems GmbH. All rights reserved. - * - */ - -/* - Log output for troubleshooting Sparkle failures on end-user machines. - Your tech support will hug you if you tell them about this. -*/ - -#ifndef SULOG_H -#define SULOG_H - -// ----------------------------------------------------------------------------- -// Headers: -// ----------------------------------------------------------------------------- - -#include - - -// ----------------------------------------------------------------------------- -// Prototypes: -// ----------------------------------------------------------------------------- - -void SUClearLog(void); -void SULog(NSString *format, ...) NS_FORMAT_FUNCTION(1, 2); - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SULog.m b/Frameworks/Sparkle/Sparkle/SULog.m deleted file mode 100644 index 5941aac7e..000000000 --- a/Frameworks/Sparkle/Sparkle/SULog.m +++ /dev/null @@ -1,78 +0,0 @@ -/* - * SULog.m - * EyeTV - * - * Created by Uli Kusterer on 12/03/2009. - * Copyright 2009 Elgato Systems GmbH. All rights reserved. - * - */ - -// ----------------------------------------------------------------------------- -// Headers: -// ----------------------------------------------------------------------------- - -#include "SULog.h" - - -// ----------------------------------------------------------------------------- -// Constants: -// ----------------------------------------------------------------------------- - -static NSString *const SULogFilePath = @"~/Library/Logs/SparkleUpdateLog.log"; - - -// ----------------------------------------------------------------------------- -// SUClearLog: -// Erase the log at the start of an update. We don't want to litter the -// user's hard disk with logging data that's mostly unused, so each app -// should clear the log before it starts updating, so only the most recent -// update is kept around. -// -// TAKES: -// sender - Object that sent this message, typically of type X. -// ----------------------------------------------------------------------------- - -void SUClearLog(void) -{ - FILE *logfile = fopen([[SULogFilePath stringByExpandingTildeInPath] fileSystemRepresentation], "w"); - if (logfile) { - fclose(logfile); - SULog(@"===== %@ =====", [[NSFileManager defaultManager] displayNameAtPath:[[NSBundle mainBundle] bundlePath]]); - } -} - - -// ----------------------------------------------------------------------------- -// SULog: -// Like NSLog, but logs to one specific log file. Each line is prefixed -// with the current date and time, to help in regressing issues. -// -// TAKES: -// format - NSLog/printf-style format string. -// ... - More parameters depending on format string's contents. -// ----------------------------------------------------------------------------- - -void SULog(NSString *format, ...) -{ - static BOOL loggedYet = NO; - if (!loggedYet) { - loggedYet = YES; - SUClearLog(); - } - - va_list ap; - va_start(ap, format); - NSString *theStr = [[NSString alloc] initWithFormat:format arguments:ap]; - NSLog(@"Sparkle: %@", theStr); - - FILE *logfile = fopen([[SULogFilePath stringByExpandingTildeInPath] fileSystemRepresentation], "a"); - if (logfile) { - theStr = [NSString stringWithFormat:@"%@: %@\n", [NSDate date], theStr]; - NSData *theData = [theStr dataUsingEncoding:NSUTF8StringEncoding]; - fwrite([theData bytes], 1, [theData length], logfile); - fclose(logfile); - } - va_end(ap); -} - - diff --git a/Frameworks/Sparkle/Sparkle/SUPackageInstaller.h b/Frameworks/Sparkle/Sparkle/SUPackageInstaller.h deleted file mode 100644 index 04b500eea..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPackageInstaller.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// SUPackageInstaller.h -// Sparkle -// -// Created by Andy Matuschak on 4/10/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUPACKAGEINSTALLER_H -#define SUPACKAGEINSTALLER_H - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUPlainInstaller.h" - -@interface SUPackageInstaller : SUPlainInstaller -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUPackageInstaller.m b/Frameworks/Sparkle/Sparkle/SUPackageInstaller.m deleted file mode 100644 index 64637433c..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPackageInstaller.m +++ /dev/null @@ -1,41 +0,0 @@ -// -// SUPackageInstaller.m -// Sparkle -// -// Created by Andy Matuschak on 4/10/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUPackageInstaller.h" -#import -#import "SUConstants.h" - -@implementation SUPackageInstaller - -+ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)__unused host versionComparator:(id)__unused comparator completionHandler:(void (^)(NSError *))completionHandler -{ - // Run installer using the "open" command to ensure it is launched in front of current application. - // -W = wait until the app has quit. - // -n = Open another instance if already open. - // -b = app bundle identifier - NSString *command = @"/usr/bin/open"; - NSArray *args = @[@"-W", @"-n", @"-b", @"com.apple.installer", path]; - - if (![[NSFileManager defaultManager] fileExistsAtPath:command]) { - NSError *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUMissingInstallerToolError userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't find Apple's installer tool!" }]; - [self finishInstallationToPath:installationPath withResult:NO error:error completionHandler:completionHandler]; - return; - } - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSTask *installer = [NSTask launchedTaskWithLaunchPath:command arguments:args]; - [installer waitUntilExit]; - - // Known bug: if the installation fails or is canceled, Sparkle goes ahead and restarts, thinking everything is fine. - dispatch_async(dispatch_get_main_queue(), ^{ - [self finishInstallationToPath:installationPath withResult:YES error:nil completionHandler:completionHandler]; - }); - }); -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.h b/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.h deleted file mode 100644 index 7304ba0ab..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// SUPipedUnarchiver.h -// Sparkle -// -// Created by Andy Matuschak on 6/16/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUPIPEDUNARCHIVER_H -#define SUPIPEDUNARCHIVER_H - -#import -#import "SUUnarchiver.h" - -@interface SUPipedUnarchiver : SUUnarchiver - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m b/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m deleted file mode 100644 index 7a65054c1..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPipedUnarchiver.m +++ /dev/null @@ -1,157 +0,0 @@ -// -// SUPipedUnarchiver.m -// Sparkle -// -// Created by Andy Matuschak on 6/16/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUPipedUnarchiver.h" -#import "SUUnarchiver_Private.h" -#import "SULog.h" - - -@implementation SUPipedUnarchiver - -+ (SEL)selectorConformingToTypeOfPath:(NSString *)path -{ - static NSDictionary *typeSelectorDictionary; - if (!typeSelectorDictionary) - typeSelectorDictionary = @{ @".zip": @"extractZIP", - @".tar": @"extractTAR", - @".tar.gz": @"extractTGZ", - @".tgz": @"extractTGZ", - @".tar.bz2": @"extractTBZ", - @".tbz": @"extractTBZ", - @".tar.xz": @"extractTXZ", - @".txz": @"extractTXZ", - @".tar.lzma": @"extractTXZ"}; - - NSString *lastPathComponent = [path lastPathComponent]; - for (NSString *currentType in typeSelectorDictionary) - { - if ([currentType length] > [lastPathComponent length]) continue; - if ([[lastPathComponent substringFromIndex:[lastPathComponent length] - [currentType length]] isEqualToString:currentType]) - return NSSelectorFromString(typeSelectorDictionary[currentType]); - } - return NULL; -} - -- (void)start -{ - [NSThread detachNewThreadSelector:[[self class] selectorConformingToTypeOfPath:self.archivePath] toTarget:self withObject:nil]; -} - -+ (BOOL)canUnarchivePath:(NSString *)path -{ - return ([self selectorConformingToTypeOfPath:path] != nil); -} - -// This method abstracts the types that use a command line tool piping data from stdin. -- (void)extractArchivePipingDataToCommand:(NSString *)command args:(NSArray*)args -{ - // *** GETS CALLED ON NON-MAIN THREAD!!! - @autoreleasepool { - - NSString *destination = [self.archivePath stringByDeletingLastPathComponent]; - - SULog(@"Extracting using '%@' '%@' < '%@' '%@'", command, [args componentsJoinedByString:@"' '"], self.archivePath, destination); - - // Get the file size. - NSUInteger expectedLength = [[[NSFileManager defaultManager] attributesOfItemAtPath:self.archivePath error:nil][NSFileSize] unsignedIntegerValue]; - if (expectedLength > 0) { - NSFileHandle *archiveInput = [NSFileHandle fileHandleForReadingAtPath:self.archivePath]; - - NSPipe *pipe = [NSPipe pipe]; - NSFileHandle *archiveOutput = [pipe fileHandleForWriting]; - - NSTask *task = [[NSTask alloc] init]; - [task setStandardInput:[pipe fileHandleForReading]]; - [task setStandardError:[NSFileHandle fileHandleWithStandardError]]; - [task setStandardOutput:[NSFileHandle fileHandleWithStandardOutput]]; - [task setLaunchPath:command]; - [task setArguments:[args arrayByAddingObject:destination]]; - [task launch]; - - NSUInteger bytesRead = 0; - do { - NSData *data = [archiveInput readDataOfLength:256*1024]; - NSUInteger len = [data length]; - if (!len) { - break; - } - bytesRead += len; - [archiveOutput writeData:data]; - dispatch_async(dispatch_get_main_queue(), ^{ - [self notifyDelegateOfProgress:(double)bytesRead / (double)expectedLength]; - }); - } - while(bytesRead < expectedLength); - - [archiveOutput closeFile]; - - [task waitUntilExit]; - - if ([task terminationStatus] == 0) { - if (bytesRead == expectedLength) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self notifyDelegateOfSuccess]; - }); - return; - } else { - SULog(@"Extraction failed, command '%@' got only %ld of %ld bytes", command, (long)bytesRead, (long)expectedLength); - } - } else { - SULog(@"Extraction failed, command '%@' returned %d", command, [task terminationStatus]); - } - } else { - SULog(@"Extraction failed, archive '%@' is empty", self.archivePath); - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [self notifyDelegateOfFailure]; - }); - } -} - -- (void)extractTAR -{ - // *** GETS CALLED ON NON-MAIN THREAD!!! - - [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-xC"]]; -} - -- (void)extractTGZ -{ - // *** GETS CALLED ON NON-MAIN THREAD!!! - - [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-zxC"]]; -} - -- (void)extractTBZ -{ - // *** GETS CALLED ON NON-MAIN THREAD!!! - - [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-jxC"]]; -} - -- (void)extractZIP -{ - // *** GETS CALLED ON NON-MAIN THREAD!!! - - [self extractArchivePipingDataToCommand:@"/usr/bin/ditto" args:@[@"-x",@"-k",@"-"]]; -} - -- (void)extractTXZ -{ - // *** GETS CALLED ON NON-MAIN THREAD!!! - - [self extractArchivePipingDataToCommand:@"/usr/bin/tar" args:@[@"-zxC"]]; -} - -+ (void)load -{ - [self registerImplementation:self]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.h b/Frameworks/Sparkle/Sparkle/SUPlainInstaller.h deleted file mode 100644 index 9fd78f6ff..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// SUPlainInstaller.h -// Sparkle -// -// Created by Andy Matuschak on 4/10/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUPLAININSTALLER_H -#define SUPLAININSTALLER_H - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUInstaller.h" -#import "SUVersionComparisonProtocol.h" - -@class SUHost; - -@interface SUPlainInstaller : SUInstaller - -+ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)host versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.m b/Frameworks/Sparkle/Sparkle/SUPlainInstaller.m deleted file mode 100644 index 1aeb63171..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPlainInstaller.m +++ /dev/null @@ -1,61 +0,0 @@ -// -// SUPlainInstaller.m -// Sparkle -// -// Created by Andy Matuschak on 4/10/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUPlainInstaller.h" -#import "SUPlainInstallerInternals.h" -#import "SUCodeSigningVerifier.h" -#import "SUConstants.h" -#import "SUHost.h" - -@implementation SUPlainInstaller - -+ (void)performInstallationToPath:(NSString *)installationPath fromPath:(NSString *)path host:(SUHost *)host versionComparator:(id)comparator completionHandler:(void (^)(NSError *))completionHandler -{ - NSParameterAssert(host); - - // Prevent malicious downgrades - if (![[[NSBundle bundleWithIdentifier:SUBundleIdentifier] infoDictionary][SUEnableAutomatedDowngradesKey] boolValue]) { - if ([comparator compareVersion:[host version] toVersion:[[NSBundle bundleWithPath:path] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]] == NSOrderedDescending) { - NSString *errorMessage = [NSString stringWithFormat:@"Sparkle Updater: Possible attack in progress! Attempting to \"upgrade\" from %@ to %@. Aborting update.", [host version], [[NSBundle bundleWithPath:path] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]]; - NSError *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUDowngradeError userInfo:@{ NSLocalizedDescriptionKey: errorMessage }]; - [self finishInstallationToPath:installationPath withResult:NO error:error completionHandler:completionHandler]; - return; - } - } - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSError *error = nil; - NSString *oldPath = [host bundlePath]; - NSString *tempName = [self temporaryNameForPath:[host installationPath]]; - BOOL hostIsCodeSigned = [SUCodeSigningVerifier applicationAtPathIsCodeSigned:oldPath]; - - BOOL result = [self copyPathWithAuthentication:path overPath:installationPath temporaryName:tempName error:&error]; - - if (result) { - // If the host is code signed, then the replacement should be be too (and the signature should be valid). - BOOL needToCheckCodeSignature = (hostIsCodeSigned || [SUCodeSigningVerifier applicationAtPathIsCodeSigned:installationPath]); - if (needToCheckCodeSignature) { - result = [SUCodeSigningVerifier codeSignatureIsValidAtPath:installationPath error:&error]; - } - } - - if (result) { - BOOL haveOld = [[NSFileManager defaultManager] fileExistsAtPath:oldPath]; - BOOL differentFromNew = ![oldPath isEqualToString:installationPath]; - if (haveOld && differentFromNew) { - [self _movePathToTrash:oldPath]; // On success, trash old copy if there's still one due to renaming. - } - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [self finishInstallationToPath:installationPath withResult:result error:error completionHandler:completionHandler]; - }); - }); -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.h b/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.h deleted file mode 100644 index 1bb645d40..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// SUPlainInstallerInternals.m -// Sparkle -// -// Created by Andy Matuschak on 3/9/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUPLAININSTALLERINTERNALS_H -#define SUPLAININSTALLERINTERNALS_H - -#import "SUPlainInstaller.h" - -@interface SUPlainInstaller (Internals) -+ (NSString *)temporaryNameForPath:(NSString *)path; -+ (BOOL)copyPathWithAuthentication:(NSString *)src overPath:(NSString *)dst temporaryName:(NSString *)tmp error:(NSError **)error; -+ (void)_movePathToTrash:(NSString *)path; -+ (BOOL)_removeFileAtPath:(NSString *)path error:(NSError **)error; -+ (BOOL)_removeFileAtPathWithForcedAuthentication:(NSString *)src error:(NSError **)error; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m b/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m deleted file mode 100644 index 41b297e8b..000000000 --- a/Frameworks/Sparkle/Sparkle/SUPlainInstallerInternals.m +++ /dev/null @@ -1,628 +0,0 @@ -// -// SUPlainInstallerInternals.m -// Sparkle -// -// Created by Andy Matuschak on 3/9/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUPlainInstallerInternals.h" -#import "SUConstants.h" -#import "SULog.h" - -#include -#include -#include -#include -#include -#include -#include - -#if __MAC_OS_X_VERSION_MAX_ALLOWED < 101000 -extern NSString *const NSURLQuarantinePropertiesKey WEAK_IMPORT_ATTRIBUTE; -#endif - -static inline void PerformOnMainThreadSync(dispatch_block_t theBlock) -{ - if ([NSThread isMainThread]) { - theBlock(); - } else { - dispatch_sync(dispatch_get_main_queue(), theBlock); - } -} - -@interface SUPlainInstaller (MMExtendedAttributes) -// Removes the directory tree rooted at |root| from the file quarantine. -// The quarantine was introduced on OS X 10.5 and is described at: -// -// http://developer.apple.com/releasenotes/Carbon/RN-LaunchServices/index.html -//#apple_ref/doc/uid/TP40001369-DontLinkElementID_2 -// -// If |root| is not a directory, then it alone is removed from the quarantine. -// Symbolic links, including |root| if it is a symbolic link, will not be -// traversed. -// -// Ordinarily, the quarantine is managed by calling LSSetItemAttribute -// to set the kLSItemQuarantineProperties attribute to a dictionary specifying -// the quarantine properties to be applied. However, it does not appear to be -// possible to remove an item from the quarantine directly through any public -// Launch Services calls. Instead, this method takes advantage of the fact -// that the quarantine is implemented in part by setting an extended attribute, -// "com.apple.quarantine", on affected files. Removing this attribute is -// sufficient to remove files from the quarantine. -+ (void)releaseFromQuarantine:(NSString *)root; -@end - -// Authorization code based on generous contribution from Allan Odgaard. Thanks, Allan! -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" // this is terrible; will fix later probably -static BOOL AuthorizationExecuteWithPrivilegesAndWait(AuthorizationRef authorization, const char *executablePath, AuthorizationFlags options, const char *const *arguments) -{ - // *** MUST BE SAFE TO CALL ON NON-MAIN THREAD! - - sig_t oldSigChildHandler = signal(SIGCHLD, SIG_DFL); - BOOL returnValue = YES; - - if (AuthorizationExecuteWithPrivileges(authorization, executablePath, options, (char* const*)arguments, NULL) == errAuthorizationSuccess) - { - int status; - pid_t pid = wait(&status); - if (pid == -1 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) - returnValue = NO; - } - else - returnValue = NO; - - signal(SIGCHLD, oldSigChildHandler); - return returnValue; -} -#pragma clang diagnostic pop - -@implementation SUPlainInstaller (Internals) - -+ (NSString *)temporaryNameForPath:(NSString *)path -{ - // Let's try to read the version number so the filename will be more meaningful. - NSString *postFix; - NSString *version; - if ((version = [[NSBundle bundleWithPath:path] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]) && ![version isEqualToString:@""]) - { - NSMutableCharacterSet *validCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; - [validCharacters formUnionWithCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@".-()"]]; - postFix = [version stringByTrimmingCharactersInSet:[validCharacters invertedSet]]; - } - else - postFix = @"old"; - NSString *prefix = [[path stringByDeletingPathExtension] stringByAppendingFormat:@" (%@)", postFix]; - NSString *tempDir = [prefix stringByAppendingPathExtension:[path pathExtension]]; - // Now let's make sure we get a unique path. - unsigned int cnt = 2; - while ([[NSFileManager defaultManager] fileExistsAtPath:tempDir] && cnt <= 999) - tempDir = [NSString stringWithFormat:@"%@ %u.%@", prefix, cnt++, [path pathExtension]]; - return [tempDir lastPathComponent]; -} - -+ (NSString *)_temporaryCopyNameForPath:(NSString *)path didFindTrash:(BOOL *)outDidFindTrash -{ - // *** MUST BE SAFE TO CALL ON NON-MAIN THREAD! - NSString *tempDir = nil; - - UInt8 trashPath[MAXPATHLEN + 1] = { 0 }; - FSRef trashRef, pathRef; - FSVolumeRefNum vSrcRefNum = kFSInvalidVolumeRefNum; - FSCatalogInfo catInfo; - memset(&catInfo, 0, sizeof(catInfo)); - OSStatus err = FSPathMakeRef((UInt8 *)[path fileSystemRepresentation], &pathRef, NULL); - if( err == noErr ) - { - err = FSGetCatalogInfo(&pathRef, kFSCatInfoVolume, &catInfo, NULL, NULL, NULL); - vSrcRefNum = catInfo.volume; - } - if (err == noErr) - err = FSFindFolder(vSrcRefNum, kTrashFolderType, kCreateFolder, &trashRef); - if (err == noErr) - err = FSGetCatalogInfo(&trashRef, kFSCatInfoVolume, &catInfo, NULL, NULL, NULL); - if (err == noErr && vSrcRefNum != catInfo.volume) - err = nsvErr; // Couldn't find a trash folder on same volume as given path. Docs say this may happen in the future. - if (err == noErr) - err = FSRefMakePath(&trashRef, trashPath, MAXPATHLEN); - if (err == noErr) - tempDir = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:(char *)trashPath length:strlen((char *)trashPath)]; - if (outDidFindTrash) - *outDidFindTrash = (tempDir != nil); - if (!tempDir) - tempDir = [path stringByDeletingLastPathComponent]; - - // Let's try to read the version number so the filename will be more meaningful - NSString *prefix; - if ([[[NSBundle bundleWithIdentifier:SUBundleIdentifier] infoDictionary][SUAppendVersionNumberKey] boolValue]) { - NSString *postFix = nil; - NSString *version = nil; - if ((version = [[NSBundle bundleWithPath: path] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]) && ![version isEqualToString:@""]) - { - NSMutableCharacterSet *validCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; - [validCharacters formUnionWithCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@".-()"]]; - postFix = [version stringByTrimmingCharactersInSet:[validCharacters invertedSet]]; - } - else { - postFix = @"old"; - } - prefix = [NSString stringWithFormat:@"%@ (%@)", [[path lastPathComponent] stringByDeletingPathExtension], postFix]; - } else { - prefix = [[path lastPathComponent] stringByDeletingPathExtension]; - } - NSString *tempName = [prefix stringByAppendingPathExtension:[path pathExtension]]; - tempDir = [tempDir stringByAppendingPathComponent:tempName]; - - // Now let's make sure we get a unique path. - int cnt = 2; - while ([[NSFileManager defaultManager] fileExistsAtPath:tempDir] && cnt <= 9999) { - tempDir = [[tempDir stringByDeletingLastPathComponent] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@ %d.%@", prefix, cnt++, [path pathExtension]]]; - } - - return tempDir; -} - -+ (BOOL)_copyPathWithForcedAuthentication:(NSString *)src toPath:(NSString *)dst temporaryPath:(NSString *)tmp error:(NSError *__autoreleasing *)error -{ - // *** MUST BE SAFE TO CALL ON NON-MAIN THREAD! - - const char *srcPath = [src fileSystemRepresentation]; - const char *tmpPath = [tmp fileSystemRepresentation]; - const char *dstPath = [dst fileSystemRepresentation]; - - struct stat dstSB; - if (stat(dstPath, &dstSB) != 0) // Doesn't exist yet, try containing folder. - { - const char *dstDirPath = [[dst stringByDeletingLastPathComponent] fileSystemRepresentation]; - if( stat(dstDirPath, &dstSB) != 0 ) - { - NSString *errorMessage = [NSString stringWithFormat:@"Stat on %@ during authenticated file copy failed.", dst]; - if (error != NULL) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUFileCopyFailure userInfo:@{ NSLocalizedDescriptionKey: errorMessage }]; - return NO; - } - } - - AuthorizationRef auth = NULL; - OSStatus authStat = errAuthorizationDenied; - while (authStat == errAuthorizationDenied) { - authStat = AuthorizationCreate(NULL, - kAuthorizationEmptyEnvironment, - kAuthorizationFlagDefaults, - &auth); - } - - BOOL res = NO; - if (authStat == errAuthorizationSuccess) { - res = YES; - - char uidgid[42]; - snprintf(uidgid, sizeof(uidgid), "%u:%u", - dstSB.st_uid, dstSB.st_gid); - - // If the currently-running application is trusted, the new - // version should be trusted as well. Remove it from the - // quarantine to avoid a delay at launch, and to avoid - // presenting the user with a confusing trust dialog. - // - // This needs to be done after the application is moved to its - // new home with "mv" in case it's moved across filesystems: if - // that happens, "mv" actually performs a copy and may result - // in the application being quarantined. It also needs to be - // done before "chown" changes ownership, because the ownership - // change will almost certainly make it impossible to change - // attributes to release the files from the quarantine. - if (res) - { - SULog(@"releaseFromQuarantine"); - PerformOnMainThreadSync(^{ - [self releaseFromQuarantine:src]; - }); - } - - if (res) // Set permissions while it's still in source, so we have it with working and correct perms when it arrives at destination. - { - const char *coParams[] = { "-R", uidgid, srcPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/usr/sbin/chown", kAuthorizationFlagDefaults, coParams); - if (!res) - SULog(@"chown -R %s %s failed.", uidgid, srcPath); - } - - BOOL haveDst = [[NSFileManager defaultManager] fileExistsAtPath:dst]; - if (res && haveDst) // If there's something at our tmp path (previous failed update or whatever) delete that first. - { - const char *rmParams[] = { "-rf", tmpPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/bin/rm", kAuthorizationFlagDefaults, rmParams); - if (!res) - SULog(@"rm failed"); - } - - if (res && haveDst) // Move old exe to tmp path. - { - const char *mvParams[] = { "-f", dstPath, tmpPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/bin/mv", kAuthorizationFlagDefaults, mvParams); - if (!res) - SULog(@"mv 1 failed"); - } - - if (res) // Move new exe to old exe's path. - { - const char *mvParams2[] = { "-f", srcPath, dstPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/bin/mv", kAuthorizationFlagDefaults, mvParams2); - if (!res) - SULog(@"mv 2 failed"); - } - - // if( res && haveDst /*&& !foundTrash*/ ) // If we managed to put the old exe in the trash, leave it there for the user to delete or recover. - // { // ... Otherwise we better delete it, wouldn't want dozens of old versions lying around next to the new one. - // const char* rmParams2[] = { "-rf", tmpPath, NULL }; - // res = AuthorizationExecuteWithPrivilegesAndWait( auth, "/bin/rm", kAuthorizationFlagDefaults, rmParams2 ); - // } - - AuthorizationFree(auth, 0); - - // If the currently-running application is trusted, the new - // version should be trusted as well. Remove it from the - // quarantine to avoid a delay at launch, and to avoid - // presenting the user with a confusing trust dialog. - // - // This needs to be done after the application is moved to its - // new home with "mv" in case it's moved across filesystems: if - // that happens, "mv" actually performs a copy and may result - // in the application being quarantined. - if (res) - { - SULog(@"releaseFromQuarantine after installing"); - PerformOnMainThreadSync(^{ - [self releaseFromQuarantine:dst]; - }); - } - - if (!res) - { - // Something went wrong somewhere along the way, but we're not sure exactly where. - NSString *errorMessage = [NSString stringWithFormat:@"Authenticated file copy from %@ to %@ failed.", src, dst]; - if (error != nil) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUAuthenticationFailure userInfo:@{ NSLocalizedDescriptionKey: errorMessage }]; - } - } - else - { - if (error != nil) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUAuthenticationFailure userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't get permission to authenticate." }]; - } - return res; -} - -+ (BOOL)_movePathWithForcedAuthentication:(NSString *)src toPath:(NSString *)dst error:(NSError *__autoreleasing *)error -{ - // *** MUST BE SAFE TO CALL ON NON-MAIN THREAD! - - const char *srcPath = [src fileSystemRepresentation]; - const char *dstPath = [dst fileSystemRepresentation]; - const char *dstContainerPath = [[dst stringByDeletingLastPathComponent] fileSystemRepresentation]; - - struct stat dstSB; - stat(dstContainerPath, &dstSB); - - AuthorizationRef auth = NULL; - OSStatus authStat = errAuthorizationDenied; - while( authStat == errAuthorizationDenied ) - { - authStat = AuthorizationCreate(NULL, - kAuthorizationEmptyEnvironment, - kAuthorizationFlagDefaults, - &auth); - } - - BOOL res = NO; - if (authStat == errAuthorizationSuccess) - { - res = YES; - - char uidgid[42]; - snprintf(uidgid, sizeof(uidgid), "%d:%d", - dstSB.st_uid, dstSB.st_gid); - - if (res) // Set permissions while it's still in source, so we have it with working and correct perms when it arrives at destination. - { - const char *coParams[] = { "-R", uidgid, srcPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/usr/sbin/chown", kAuthorizationFlagDefaults, coParams); - if (!res) - SULog(@"Can't set permissions"); - } - - BOOL haveDst = [[NSFileManager defaultManager] fileExistsAtPath:dst]; - if (res && haveDst) // If there's something at our tmp path (previous failed update or whatever) delete that first. - { - const char *rmParams[] = { "-rf", dstPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/bin/rm", kAuthorizationFlagDefaults, rmParams); - if (!res) - SULog(@"Can't remove destination file"); - } - - if (res) // Move!. - { - const char *mvParams[] = { "-f", srcPath, dstPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/bin/mv", kAuthorizationFlagDefaults, mvParams); - if (!res) - SULog(@"Can't move source file"); - } - - AuthorizationFree(auth, 0); - - if (!res) - { - // Something went wrong somewhere along the way, but we're not sure exactly where. - NSString *errorMessage = [NSString stringWithFormat:@"Authenticated file move from %@ to %@ failed.", src, dst]; - if (error != NULL) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUAuthenticationFailure userInfo:@{ NSLocalizedDescriptionKey: errorMessage }]; - } - } - else - { - if (error != NULL) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUAuthenticationFailure userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't get permission to authenticate." }]; - } - return res; -} - - -+ (BOOL)_removeFileAtPathWithForcedAuthentication:(NSString *)src error:(NSError *__autoreleasing *)error -{ - // *** MUST BE SAFE TO CALL ON NON-MAIN THREAD! - - const char *srcPath = [src fileSystemRepresentation]; - - AuthorizationRef auth = NULL; - OSStatus authStat = errAuthorizationDenied; - while( authStat == errAuthorizationDenied ) - { - authStat = AuthorizationCreate(NULL, - kAuthorizationEmptyEnvironment, - kAuthorizationFlagDefaults, - &auth); - } - - BOOL res = NO; - if (authStat == errAuthorizationSuccess) - { - res = YES; - - if (res) // If there's something at our tmp path (previous failed update or whatever) delete that first. - { - const char *rmParams[] = { "-rf", srcPath, NULL }; - res = AuthorizationExecuteWithPrivilegesAndWait(auth, "/bin/rm", kAuthorizationFlagDefaults, rmParams); - if (!res) - SULog(@"Can't remove destination file"); - } - - AuthorizationFree(auth, 0); - - if (!res) - { - // Something went wrong somewhere along the way, but we're not sure exactly where. - NSString *errorMessage = [NSString stringWithFormat:@"Authenticated file remove from %@ failed.", src]; - if (error != NULL) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUAuthenticationFailure userInfo:@{ NSLocalizedDescriptionKey: errorMessage }]; - } - } - else - { - if (error != NULL) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUAuthenticationFailure userInfo:@{ NSLocalizedDescriptionKey: @"Couldn't get permission to authenticate." }]; - } - return res; -} - -+ (BOOL)_removeFileAtPath:(NSString *)path error:(NSError *__autoreleasing *)error -{ - BOOL success = YES; - if( ![[NSFileManager defaultManager] removeItemAtPath: path error: NULL] ) - { - success = [self _removeFileAtPathWithForcedAuthentication:path error:error]; - } - - return success; -} - -+ (void)_movePathToTrash:(NSString *)path -{ - //SULog(@"Moving %@ to the trash.", path); - NSInteger tag = 0; - if (![[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:[path stringByDeletingLastPathComponent] destination:@"" files:@[[path lastPathComponent]] tag:&tag]) - { - BOOL didFindTrash = NO; - NSString *trashPath = [self _temporaryCopyNameForPath:path didFindTrash:&didFindTrash]; - if( didFindTrash ) - { - NSError *err = nil; - if (![self _movePathWithForcedAuthentication:path toPath:trashPath error:&err]) { - SULog(@"Error: couldn't move %@ to the trash (%@). %@", path, trashPath, err); - } - } - else { - SULog(@"Error: couldn't move %@ to the trash. This is often a sign of a permissions error.", path); - } - } -} - -+ (BOOL)copyPathWithAuthentication:(NSString *)src overPath:(NSString *)dst temporaryName:(NSString *)__unused tmp error:(NSError *__autoreleasing *)error -{ - FSRef srcRef, dstRef, dstDirRef, tmpDirRef; - OSStatus err; - BOOL hadFileAtDest = NO, didFindTrash = NO; - NSString *tmpPath = [self _temporaryCopyNameForPath:dst didFindTrash:&didFindTrash]; - - // Make FSRef for destination: - err = FSPathMakeRefWithOptions((UInt8 *)[dst fileSystemRepresentation], kFSPathMakeRefDoNotFollowLeafSymlink, &dstRef, NULL); - hadFileAtDest = (err == noErr); // There is a file at the destination, move it aside. If we normalized the name, we might not get here, so don't error. - if( hadFileAtDest ) - { - if (0 != access([dst fileSystemRepresentation], W_OK) || 0 != access([[dst stringByDeletingLastPathComponent] fileSystemRepresentation], W_OK)) - { - return [self _copyPathWithForcedAuthentication:src toPath:dst temporaryPath:tmpPath error:error]; - } - } - else - { - if (0 != access([[dst stringByDeletingLastPathComponent] fileSystemRepresentation], W_OK) - || 0 != access([[[dst stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] fileSystemRepresentation], W_OK)) - { - return [self _copyPathWithForcedAuthentication:src toPath:dst temporaryPath:tmpPath error:error]; - } - } - - if( hadFileAtDest ) - { - err = FSPathMakeRef((UInt8 *)[[tmpPath stringByDeletingLastPathComponent] fileSystemRepresentation], &tmpDirRef, NULL); - if (err != noErr) - FSPathMakeRef((UInt8 *)[[dst stringByDeletingLastPathComponent] fileSystemRepresentation], &tmpDirRef, NULL); - } - - err = FSPathMakeRef((UInt8 *)[[dst stringByDeletingLastPathComponent] fileSystemRepresentation], &dstDirRef, NULL); - - if (err == noErr && hadFileAtDest) - { - NSFileManager *manager = [[NSFileManager alloc] init]; - BOOL success = [manager moveItemAtPath:dst toPath:tmpPath error:error]; - if (!success && hadFileAtDest) - { - if (error != NULL) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUFileCopyFailure userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Couldn't move %@ to %@.", dst, tmpPath] }]; - return NO; - } - } - - err = FSPathMakeRef((UInt8 *)[src fileSystemRepresentation], &srcRef, NULL); - if (err == noErr) - { - NSFileManager *manager = [[NSFileManager alloc] init]; - BOOL success = [manager copyItemAtPath:src toPath:dst error:error]; - if (!success) - { - // We better move the old version back to its old location - if (hadFileAtDest) { - success = [manager moveItemAtPath:tmpPath toPath:dst error:error]; - } - if (!success && error != NULL) - *error = [NSError errorWithDomain:SUSparkleErrorDomain code:SUFileCopyFailure userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Couldn't move %@ to %@.", dst, tmpPath] }]; - return NO; - - } - } - - // If the currently-running application is trusted, the new - // version should be trusted as well. Remove it from the - // quarantine to avoid a delay at launch, and to avoid - // presenting the user with a confusing trust dialog. - // - // This needs to be done after the application is moved to its - // new home in case it's moved across filesystems: if that - // happens, the move is actually a copy, and it may result - // in the application being quarantined. - PerformOnMainThreadSync(^{ - [self releaseFromQuarantine:dst]; - }); - - return YES; -} - -@end - -#include -#include -#include - -@implementation SUPlainInstaller (MMExtendedAttributes) - -+ (int)removeXAttr:(NSString *)name - fromFile:(NSString *)file - options:(int)options -{ - // *** MUST BE SAFE TO CALL ON NON-MAIN THREAD! - - const char *path = NULL; - const char *attr = [name cStringUsingEncoding:NSASCIIStringEncoding]; - @try { - path = [file fileSystemRepresentation]; - } - @catch (id) { - // -[NSString fileSystemRepresentation] throws an exception if it's - // unable to convert the string to something suitable. Map that to - // EDOM, "argument out of domain", which sort of conveys that there - // was a conversion failure. - errno = EDOM; - return -1; - } - - return removexattr(path, attr, options); -} - -+ (void)releaseFromQuarantine:(NSString *)root -{ - // *** MUST BE SAFE TO CALL ON NON-MAIN THREAD! - - NSFileManager *manager = [NSFileManager defaultManager]; -#if __MAC_OS_X_VERSION_MIN_REQUIRED < 101000 - if (!&NSURLQuarantinePropertiesKey) { - NSString *const quarantineAttribute = (NSString*)kLSItemQuarantineProperties; - const int removeXAttrOptions = XATTR_NOFOLLOW; - - [self removeXAttr:quarantineAttribute - fromFile:root - options:removeXAttrOptions]; - - // Only recurse if it's actually a directory. Don't recurse into a - // root-level symbolic link. - NSDictionary *rootAttributes = [manager attributesOfItemAtPath:root error:nil]; - NSString *rootType = rootAttributes[NSFileType]; - - if (rootType == NSFileTypeDirectory) { - // The NSDirectoryEnumerator will avoid recursing into any contained - // symbolic links, so no further type checks are needed. - NSDirectoryEnumerator *directoryEnumerator = [manager enumeratorAtPath:root]; - NSString *file = nil; - while ((file = [directoryEnumerator nextObject])) { - [self removeXAttr:quarantineAttribute - fromFile:[root stringByAppendingPathComponent:file] - options:removeXAttrOptions]; - } - } - return; - } -#endif - NSURL *rootURL = [NSURL fileURLWithPath:root]; - id rootResourceValue = nil; - [rootURL getResourceValue:&rootResourceValue forKey:NSURLQuarantinePropertiesKey error:NULL]; - if (rootResourceValue) { - [rootURL setResourceValue:[NSNull null] forKey:NSURLQuarantinePropertiesKey error:NULL]; - } - - // Only recurse if it's actually a directory. Don't recurse into a - // root-level symbolic link. - NSDictionary *rootAttributes = [manager attributesOfItemAtPath:root error:nil]; - NSString *rootType = rootAttributes[NSFileType]; - - if (rootType == NSFileTypeDirectory) { - // The NSDirectoryEnumerator will avoid recursing into any contained - // symbolic links, so no further type checks are needed. - NSDirectoryEnumerator *directoryEnumerator = [manager enumeratorAtURL:rootURL includingPropertiesForKeys:nil options:(NSDirectoryEnumerationOptions)0 errorHandler:nil]; - - for (NSURL *file in directoryEnumerator) { - id fileResourceValue = nil; - [file getResourceValue:&fileResourceValue forKey:NSURLQuarantinePropertiesKey error:NULL]; - if (fileResourceValue) { - [file setResourceValue:[NSNull null] forKey:NSURLQuarantinePropertiesKey error:NULL]; - } - } - } -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.h deleted file mode 100644 index bf897c8c4..000000000 --- a/Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// SUProbingUpdateDriver.h -// Sparkle -// -// Created by Andy Matuschak on 5/7/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUPROBINGUPDATEDRIVER_H -#define SUPROBINGUPDATEDRIVER_H - -#import -#import "SUBasicUpdateDriver.h" - -// This replaces the old SUStatusChecker. -@interface SUProbingUpdateDriver : SUBasicUpdateDriver -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.m deleted file mode 100644 index 1fde6c6d9..000000000 --- a/Frameworks/Sparkle/Sparkle/SUProbingUpdateDriver.m +++ /dev/null @@ -1,39 +0,0 @@ -// -// SUProbingUpdateDriver.m -// Sparkle -// -// Created by Andy Matuschak on 5/7/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUProbingUpdateDriver.h" -#import "SUUpdater.h" - -@implementation SUProbingUpdateDriver - -// Stop as soon as we have an answer! Since the superclass implementations are not called, we are responsible for notifying the delegate. - -- (void)didFindValidUpdate -{ - id updaterDelegate = [self.updater delegate]; - - if ([updaterDelegate respondsToSelector:@selector(updater:didFindValidUpdate:)]) - [updaterDelegate updater:self.updater didFindValidUpdate:self.updateItem]; - NSDictionary *userInfo = (self.updateItem != nil) ? @{ SUUpdaterAppcastItemNotificationKey: self.updateItem } : nil; - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterDidFindValidUpdateNotification object:self.updater userInfo:userInfo]; - [self abortUpdate]; -} - -- (void)didNotFindUpdate -{ - id updaterDelegate = [self.updater delegate]; - - if ([updaterDelegate respondsToSelector:@selector(updaterDidNotFindUpdate:)]) { - [updaterDelegate updaterDidNotFindUpdate:self.updater]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterDidNotFindUpdateNotification object:self.updater]; - - [self abortUpdate]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.h deleted file mode 100644 index dfdde51f6..000000000 --- a/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// SUScheduledUpdateDriver.h -// Sparkle -// -// Created by Andy Matuschak on 5/6/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUSCHEDULEDUPDATEDRIVER_H -#define SUSCHEDULEDUPDATEDRIVER_H - -#import -#import "SUUIBasedUpdateDriver.h" - -@interface SUScheduledUpdateDriver : SUUIBasedUpdateDriver - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m deleted file mode 100644 index 9d6bf141b..000000000 --- a/Frameworks/Sparkle/Sparkle/SUScheduledUpdateDriver.m +++ /dev/null @@ -1,60 +0,0 @@ -// -// SUScheduledUpdateDriver.m -// Sparkle -// -// Created by Andy Matuschak on 5/6/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUScheduledUpdateDriver.h" -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" - -@interface SUScheduledUpdateDriver () - -@property (assign) BOOL showErrors; - -@end - -@implementation SUScheduledUpdateDriver - -@synthesize showErrors; - -- (void)didFindValidUpdate -{ - self.showErrors = YES; // We only start showing errors after we present the UI for the first time. - [super didFindValidUpdate]; -} - -- (void)didNotFindUpdate -{ - id updaterDelegate = [self.updater delegate]; - - if ([updaterDelegate respondsToSelector:@selector(updaterDidNotFindUpdate:)]) { - [updaterDelegate updaterDidNotFindUpdate:self.updater]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterDidNotFindUpdateNotification object:self.updater]; - - [self abortUpdate]; // Don't tell the user that no update was found; this was a scheduled update. -} - -- (void)abortUpdateWithError:(NSError *)error -{ - if (self.showErrors) { - [super abortUpdateWithError:error]; - } else { - // Call delegate separately here because otherwise it won't know we stopped. - // Normally this gets called by the superclass - id updaterDelegate = [self.updater delegate]; - if ([updaterDelegate respondsToSelector:@selector(updater:didAbortWithError:)]) { - [updaterDelegate updater:self.updater didAbortWithError:error]; - } - - [self abortUpdate]; - } -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.h b/Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.h deleted file mode 100644 index 73ac968b3..000000000 --- a/Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// SUStandardVersionComparator.h -// Sparkle -// -// Created by Andy Matuschak on 12/21/07. -// Copyright 2007 Andy Matuschak. All rights reserved. -// - -#ifndef SUSTANDARDVERSIONCOMPARATOR_H -#define SUSTANDARDVERSIONCOMPARATOR_H - -#import "SUExport.h" -#import "SUVersionComparisonProtocol.h" - -/*! - Sparkle's default version comparator. - - This comparator is adapted from MacPAD, by Kevin Ballard. - It's "dumb" in that it does essentially string comparison, - in components split by character type. -*/ -SU_EXPORT @interface SUStandardVersionComparator : NSObject - -/*! - Returns a singleton instance of the comparator. -*/ -+ (SUStandardVersionComparator *)defaultComparator; - -/*! - Compares version strings through textual analysis. - - See the implementation for more details. -*/ -- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.m b/Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.m deleted file mode 100644 index b7c876a50..000000000 --- a/Frameworks/Sparkle/Sparkle/SUStandardVersionComparator.m +++ /dev/null @@ -1,170 +0,0 @@ -// -// SUStandardVersionComparator.m -// Sparkle -// -// Created by Andy Matuschak on 12/21/07. -// Copyright 2007 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUStandardVersionComparator.h" - -@implementation SUStandardVersionComparator - -+ (SUStandardVersionComparator *)defaultComparator -{ - static SUStandardVersionComparator *defaultComparator = nil; - if (defaultComparator == nil) { - defaultComparator = [[SUStandardVersionComparator alloc] init]; - } - return defaultComparator; -} - -typedef NS_ENUM(NSInteger, SUCharacterType) { - kNumberType, - kStringType, - kSeparatorType, -}; - -- (SUCharacterType)typeOfCharacter:(NSString *)character -{ - if ([character isEqualToString:@"."]) { - return kSeparatorType; - } else if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[character characterAtIndex:0]]) { - return kNumberType; - } else if ([[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember:[character characterAtIndex:0]]) { - return kSeparatorType; - } else if ([[NSCharacterSet punctuationCharacterSet] characterIsMember:[character characterAtIndex:0]]) { - return kSeparatorType; - } else { - return kStringType; - } -} - -- (NSArray *)splitVersionString:(NSString *)version -{ - NSString *character; - NSMutableString *s; - NSUInteger i, n; - SUCharacterType oldType, newType; - NSMutableArray *parts = [NSMutableArray array]; - if ([version length] == 0) { - // Nothing to do here - return parts; - } - s = [[version substringToIndex:1] mutableCopy]; - oldType = [self typeOfCharacter:s]; - n = [version length] - 1; - for (i = 1; i <= n; ++i) { - character = [version substringWithRange:NSMakeRange(i, 1)]; - newType = [self typeOfCharacter:character]; - if (oldType != newType || oldType == kSeparatorType) { - // We've reached a new segment - NSString *aPart = [[NSString alloc] initWithString:s]; - [parts addObject:aPart]; - [s setString:character]; - } else { - // Add character to string and continue - [s appendString:character]; - } - oldType = newType; - } - - // Add the last part onto the array - [parts addObject:[NSString stringWithString:s]]; - return parts; -} - -- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB -{ - NSArray *partsA = [self splitVersionString:versionA]; - NSArray *partsB = [self splitVersionString:versionB]; - - NSString *partA, *partB; - NSUInteger i, n; - long long valueA, valueB; - SUCharacterType typeA, typeB; - - n = MIN([partsA count], [partsB count]); - for (i = 0; i < n; ++i) { - partA = partsA[i]; - partB = partsB[i]; - - typeA = [self typeOfCharacter:partA]; - typeB = [self typeOfCharacter:partB]; - - // Compare types - if (typeA == typeB) { - // Same type; we can compare - if (typeA == kNumberType) { - valueA = [partA longLongValue]; - valueB = [partB longLongValue]; - if (valueA > valueB) { - return NSOrderedDescending; - } else if (valueA < valueB) { - return NSOrderedAscending; - } - } else if (typeA == kStringType) { - NSComparisonResult result = [partA compare:partB]; - if (result != NSOrderedSame) { - return result; - } - } - } else { - // Not the same type? Now we have to do some validity checking - if (typeA != kStringType && typeB == kStringType) { - // typeA wins - return NSOrderedDescending; - } else if (typeA == kStringType && typeB != kStringType) { - // typeB wins - return NSOrderedAscending; - } else { - // One is a number and the other is a period. The period is invalid - if (typeA == kNumberType) { - return NSOrderedDescending; - } else { - return NSOrderedAscending; - } - } - } - } - // The versions are equal up to the point where they both still have parts - // Lets check to see if one is larger than the other - if ([partsA count] != [partsB count]) { - // Yep. Lets get the next part of the larger - // n holds the index of the part we want. - NSString *missingPart; - SUCharacterType missingType; - NSComparisonResult shorterResult, largerResult; - - if ([partsA count] > [partsB count]) { - missingPart = partsA[n]; - shorterResult = NSOrderedAscending; - largerResult = NSOrderedDescending; - } else { - missingPart = partsB[n]; - shorterResult = NSOrderedDescending; - largerResult = NSOrderedAscending; - } - - missingType = [self typeOfCharacter:missingPart]; - // Check the type - if (missingType == kStringType) { - // It's a string. Shorter version wins - return shorterResult; - } else { - // It's a number/period. Larger version wins - return largerResult; - } - } - - // The 2 strings are identical - return NSOrderedSame; -} - - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUStatus.xib b/Frameworks/Sparkle/Sparkle/SUStatus.xib deleted file mode 100644 index fca3d15d3..000000000 --- a/Frameworks/Sparkle/Sparkle/SUStatus.xib +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSIsNil - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/SUStatusController.h b/Frameworks/Sparkle/Sparkle/SUStatusController.h deleted file mode 100644 index 8a2792589..000000000 --- a/Frameworks/Sparkle/Sparkle/SUStatusController.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// SUStatusController.h -// Sparkle -// -// Created by Andy Matuschak on 3/14/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUSTATUSCONTROLLER_H -#define SUSTATUSCONTROLLER_H - -#import "SUWindowController.h" - -@class SUHost; -@interface SUStatusController : SUWindowController -@property (weak) IBOutlet NSButton *actionButton; -@property (weak) IBOutlet NSProgressIndicator *progressBar; - -@property (copy) NSString *statusText; -@property double progressValue; -@property (nonatomic) double maxProgressValue; -@property (getter=isButtonEnabled) BOOL buttonEnabled; - -- (instancetype)initWithHost:(SUHost *)host; - -// Pass 0 for the max progress value to get an indeterminate progress bar. -// Pass nil for the status text to not show it. -- (void)beginActionWithTitle:(NSString *)title maxProgressValue:(double)maxProgressValue statusText:(NSString *)statusText; - -// If isDefault is YES, the button's key equivalent will be \r. -- (void)setButtonTitle:(NSString *)buttonTitle target:(id)target action:(SEL)action isDefault:(BOOL)isDefault; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUStatusController.m b/Frameworks/Sparkle/Sparkle/SUStatusController.m deleted file mode 100644 index c7def5d5d..000000000 --- a/Frameworks/Sparkle/Sparkle/SUStatusController.m +++ /dev/null @@ -1,120 +0,0 @@ -// -// SUStatusController.m -// Sparkle -// -// Created by Andy Matuschak on 3/14/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUStatusController.h" -#import "SUHost.h" - -@interface SUStatusController () -@property (copy) NSString *title, *buttonTitle; -@property (strong) SUHost *host; -@end - -@implementation SUStatusController -@synthesize progressValue; -@synthesize maxProgressValue; -@synthesize statusText; -@synthesize title; -@synthesize buttonTitle; -@synthesize host; -@synthesize actionButton; -@synthesize progressBar; - -- (instancetype)initWithHost:(SUHost *)aHost -{ - self = [super initWithWindowNibName:@"SUStatus"]; - if (self) - { - self.host = aHost; - [self setShouldCascadeWindows:NO]; - } - return self; -} - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@, %@>", [self class], [self.host bundlePath], [self.host installationPath]]; } - -- (void)awakeFromNib -{ - if ([self.host isBackgroundApplication]) { - [[self window] setLevel:NSFloatingWindowLevel]; - } - - [[self window] center]; - [[self window] setFrameAutosaveName:@"SUStatusFrame"]; - [self.progressBar setUsesThreadedAnimation:YES]; -} - -- (NSString *)windowTitle -{ - return [NSString stringWithFormat:SULocalizedString(@"Updating %@", nil), [self.host name]]; -} - -- (NSImage *)applicationIcon -{ - return [self.host icon]; -} - -- (void)beginActionWithTitle:(NSString *)aTitle maxProgressValue:(double)aMaxProgressValue statusText:(NSString *)aStatusText -{ - self.title = aTitle; - - self.maxProgressValue = aMaxProgressValue; - self.statusText = aStatusText; -} - -- (void)setButtonTitle:(NSString *)aButtonTitle target:(id)target action:(SEL)action isDefault:(BOOL)isDefault -{ - self.buttonTitle = aButtonTitle; - - [self window]; - [self.actionButton sizeToFit]; - // Except we're going to add 15 px for padding. - [self.actionButton setFrameSize:NSMakeSize([self.actionButton frame].size.width + 15, [self.actionButton frame].size.height)]; - // Now we have to move it over so that it's always 15px from the side of the window. - [self.actionButton setFrameOrigin:NSMakePoint([[self window] frame].size.width - 15 - [self.actionButton frame].size.width, [self.actionButton frame].origin.y)]; - // Redisplay superview to clean up artifacts - [[self.actionButton superview] display]; - - [self.actionButton setTarget:target]; - [self.actionButton setAction:action]; - [self.actionButton setKeyEquivalent:isDefault ? @"\r" : @""]; - - // 06/05/2008 Alex: Avoid a crash when cancelling during the extraction - [self setButtonEnabled:(target != nil)]; -} - -- (BOOL)progressBarShouldAnimate -{ - return YES; -} - -- (void)setButtonEnabled:(BOOL)enabled -{ - [self.actionButton setEnabled:enabled]; -} - -- (BOOL)isButtonEnabled -{ - return [self.actionButton isEnabled]; -} - -- (void)setMaxProgressValue:(double)value -{ - if (value < 0.0) value = 0.0; - maxProgressValue = value; - [self setProgressValue:0.0]; - [self.progressBar setIndeterminate:(value == 0.0)]; - [self.progressBar startAnimation:self]; - [self.progressBar setUsesThreadedAnimation:YES]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUSystemProfiler.h b/Frameworks/Sparkle/Sparkle/SUSystemProfiler.h deleted file mode 100644 index 124f66916..000000000 --- a/Frameworks/Sparkle/Sparkle/SUSystemProfiler.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// SUSystemProfiler.h -// Sparkle -// -// Created by Andy Matuschak on 12/22/07. -// Copyright 2007 Andy Matuschak. All rights reserved. -// - -#ifndef SUSYSTEMPROFILER_H -#define SUSYSTEMPROFILER_H - -#import - -@class SUHost; -@interface SUSystemProfiler : NSObject -+ (SUSystemProfiler *)sharedSystemProfiler; -- (NSMutableArray *)systemProfileArrayForHost:(SUHost *)host; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUSystemProfiler.m b/Frameworks/Sparkle/Sparkle/SUSystemProfiler.m deleted file mode 100644 index 9176606e9..000000000 --- a/Frameworks/Sparkle/Sparkle/SUSystemProfiler.m +++ /dev/null @@ -1,169 +0,0 @@ -// -// SUSystemProfiler.m -// Sparkle -// -// Created by Andy Matuschak on 12/22/07. -// Copyright 2007 Andy Matuschak. All rights reserved. -// Adapted from Sparkle+, by Tom Harrington. -// - -#import "SUSystemProfiler.h" - -#import "SUHost.h" -#include - -static NSString *const SUSystemProfilerApplicationNameKey = @"appName"; -static NSString *const SUSystemProfilerApplicationVersionKey = @"appVersion"; -static NSString *const SUSystemProfilerCPU64bitKey = @"cpu64bit"; -static NSString *const SUSystemProfilerCPUCountKey = @"ncpu"; -static NSString *const SUSystemProfilerCPUFrequencyKey = @"cpuFreqMHz"; -static NSString *const SUSystemProfilerCPUTypeKey = @"cputype"; -static NSString *const SUSystemProfilerCPUSubtypeKey = @"cpusubtype"; -static NSString *const SUSystemProfilerHardwareModelKey = @"model"; -static NSString *const SUSystemProfilerMemoryKey = @"ramMB"; -static NSString *const SUSystemProfilerOperatingSystemVersionKey = @"osVersion"; -static NSString *const SUSystemProfilerPreferredLanguageKey = @"lang"; - -@implementation SUSystemProfiler -+ (SUSystemProfiler *)sharedSystemProfiler -{ - static SUSystemProfiler *sharedSystemProfiler = nil; - if (!sharedSystemProfiler) { - sharedSystemProfiler = [[self alloc] init]; - } - return sharedSystemProfiler; -} - -- (NSDictionary *)modelTranslationTable -{ - NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"SUModelTranslation" ofType:@"plist"]; - return [[NSDictionary alloc] initWithContentsOfFile:path]; -} - -- (NSMutableArray *)systemProfileArrayForHost:(SUHost *)host -{ - NSDictionary *modelTranslation = [self modelTranslationTable]; - - // Gather profile information and append it to the URL. - NSMutableArray *profileArray = [NSMutableArray array]; - NSArray *profileDictKeys = @[@"key", @"displayKey", @"value", @"displayValue"]; - int error = 0; - int value = 0; - size_t length = sizeof(value); - - // OS version - NSString *currentSystemVersion = [SUHost systemVersionString]; - if (currentSystemVersion != nil) { - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerOperatingSystemVersionKey, @"OS Version", currentSystemVersion, currentSystemVersion] forKeys:profileDictKeys]]; - } - - // CPU type (decoder info for values found here is in mach/machine.h) - error = sysctlbyname("hw.cputype", &value, &length, NULL, 0); - int cpuType = -1; - if (error == 0) { - cpuType = value; - NSString *visibleCPUType; - switch (value) { - case CPU_TYPE_ARM: visibleCPUType = @"ARM"; break; - case CPU_TYPE_X86: visibleCPUType = @"Intel"; break; - case CPU_TYPE_POWERPC: visibleCPUType = @"PowerPC"; break; - default: visibleCPUType = @"Unknown"; break; - } - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerCPUTypeKey, @"CPU Type", @(value), visibleCPUType] forKeys:profileDictKeys]]; - } - error = sysctlbyname("hw.cpu64bit_capable", &value, &length, NULL, 0); - if (error != 0) { - error = sysctlbyname("hw.optional.x86_64", &value, &length, NULL, 0); //x86 specific - } - if (error != 0) { - error = sysctlbyname("hw.optional.64bitops", &value, &length, NULL, 0); //PPC specific - } - - BOOL is64bit = NO; - - if (error == 0) { - is64bit = value == 1; - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerCPU64bitKey, @"CPU is 64-Bit?", @(is64bit), is64bit ? @"Yes" : @"No"] forKeys:profileDictKeys]]; - } - error = sysctlbyname("hw.cpusubtype", &value, &length, NULL, 0); - if (error == 0) { - NSString *visibleCPUSubType; - if (cpuType == 7) { - // Intel - // TODO: other Intel processors, like Core i7, i5, i3, Xeon? - visibleCPUSubType = is64bit ? @"Intel Core 2" : @"Intel Core"; // If anyone knows how to tell a Core Duo from a Core Solo, please email tph@atomicbird.com - } else if (cpuType == 18) { - // PowerPC - switch (value) { - case 9: visibleCPUSubType=@"G3"; break; - case 10: case 11: visibleCPUSubType=@"G4"; break; - case 100: visibleCPUSubType=@"G5"; break; - default: visibleCPUSubType=@"Other"; break; - } - } else { - visibleCPUSubType = @"Other"; - } - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerCPUSubtypeKey, @"CPU Subtype", @(value), visibleCPUSubType] forKeys:profileDictKeys]]; - } - error = sysctlbyname("hw.model", NULL, &length, NULL, 0); - if (error == 0) { - char *cpuModel = (char *)malloc(sizeof(char) * length); - if (cpuModel != NULL) { - error = sysctlbyname("hw.model", cpuModel, &length, NULL, 0); - if (error == 0) { - NSString *rawModelName = @(cpuModel); - NSString *visibleModelName = modelTranslation[rawModelName]; - if (visibleModelName == nil) { - visibleModelName = rawModelName; - } - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerHardwareModelKey, @"Mac Model", rawModelName, visibleModelName] forKeys:profileDictKeys]]; - } - free(cpuModel); - } - } - - // Number of CPUs - error = sysctlbyname("hw.ncpu", &value, &length, NULL, 0); - if (error == 0) { - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerCPUCountKey, @"Number of CPUs", @(value), @(value)] forKeys:profileDictKeys]]; - } - - // User preferred language - NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; - NSArray *languages = [defs objectForKey:@"AppleLanguages"]; - if ([languages count] > 0) { - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerPreferredLanguageKey, @"Preferred Language", languages[0], languages[0]] forKeys:profileDictKeys]]; - } - - // Application sending the request - NSString *appName = [host name]; - if (appName) { - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerApplicationNameKey, @"Application Name", appName, appName] forKeys:profileDictKeys]]; - } - NSString *appVersion = [host version]; - if (appVersion) { - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerApplicationVersionKey, @"Application Version", appVersion, appVersion] forKeys:profileDictKeys]]; - } - - // Number of displays? - - // CPU speed - unsigned long hz; - size_t hz_size = sizeof(unsigned long); - if (sysctlbyname("hw.cpufrequency", &hz, &hz_size, NULL, 0) == 0) { - unsigned long mhz = hz / 1000000; - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerCPUFrequencyKey, @"CPU Speed (MHz)", @(mhz), @(mhz / 1000.)] forKeys:profileDictKeys]]; - } - - // amount of RAM - unsigned long bytes; - size_t bytes_size = sizeof(unsigned long); - if (sysctlbyname("hw.memsize", &bytes, &bytes_size, NULL, 0) == 0) { - double megabytes = bytes / (1024. * 1024.); - [profileArray addObject:[NSDictionary dictionaryWithObjects:@[SUSystemProfilerMemoryKey, @"Memory (MB)", @(megabytes), @(megabytes)] forKeys:profileDictKeys]]; - } - - return profileArray; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h deleted file mode 100644 index 65f374433..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// SUUIBasedUpdateDriver.h -// Sparkle -// -// Created by Andy Matuschak on 5/5/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUUIBASEDUPDATEDRIVER_H -#define SUUIBASEDUPDATEDRIVER_H - -#import -#import "SUBasicUpdateDriver.h" -#import "SUUpdateAlert.h" - -@class SUStatusController; - -@interface SUUIBasedUpdateDriver : SUBasicUpdateDriver - -- (void)showModalAlert:(NSAlert *)alert; -- (IBAction)cancelDownload:(id)sender; -- (void)installAndRestart:(id)sender; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m deleted file mode 100644 index 7875dadd9..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUIBasedUpdateDriver.m +++ /dev/null @@ -1,236 +0,0 @@ -// -// SUUIBasedUpdateDriver.m -// Sparkle -// -// Created by Andy Matuschak on 5/5/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUUIBasedUpdateDriver.h" - -#import "SUUpdateAlert.h" -#import "SUUpdater_Private.h" -#import "SUHost.h" -#import "SUStatusController.h" -#import "SUConstants.h" - -@interface SUUIBasedUpdateDriver () - -@property (strong) SUStatusController *statusController; -@property (strong) SUUpdateAlert *updateAlert; - -@end - -@implementation SUUIBasedUpdateDriver - -@synthesize statusController; -@synthesize updateAlert; - -- (void)didFindValidUpdate -{ - self.updateAlert = [[SUUpdateAlert alloc] initWithAppcastItem:self.updateItem host:self.host completionBlock:^(SUUpdateAlertChoice choice) { - [self updateAlertFinishedWithChoice:choice]; - }]; - - id versDisp = nil; - if ([[self.updater delegate] respondsToSelector:@selector(versionDisplayerForUpdater:)]) { - versDisp = [[self.updater delegate] versionDisplayerForUpdater:self.updater]; - } - [self.updateAlert setVersionDisplayer:versDisp]; - - if ([[self.updater delegate] respondsToSelector:@selector(updater:didFindValidUpdate:)]) { - [[self.updater delegate] updater:self.updater didFindValidUpdate:self.updateItem]; - } - - // If the app is a menubar app or the like, we need to focus it first and alter the - // update prompt to behave like a normal window. Otherwise if the window were hidden - // there may be no way for the application to be activated to make it visible again. - if ([self.host isBackgroundApplication]) { - [[self.updateAlert window] setHidesOnDeactivate:NO]; - [NSApp activateIgnoringOtherApps:YES]; - } - - // Only show the update alert if the app is active; otherwise, we'll wait until it is. - if ([NSApp isActive]) - [[self.updateAlert window] makeKeyAndOrderFront:self]; - else - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:NSApplicationDidBecomeActiveNotification object:NSApp]; -} - -- (void)didNotFindUpdate -{ - if ([[self.updater delegate] respondsToSelector:@selector(updaterDidNotFindUpdate:)]) - [[self.updater delegate] updaterDidNotFindUpdate:self.updater]; - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdaterDidNotFindUpdateNotification object:self.updater]; - - NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"You're up-to-date!", "Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates.") - defaultButton:SULocalizedString(@"OK", nil) - alternateButton:nil - otherButton:nil - informativeTextWithFormat:SULocalizedString(@"%@ %@ is currently the newest version available.", nil), [self.host name], [self.host displayVersion]]; - [self showModalAlert:alert]; - [self abortUpdate]; -} - -- (void)applicationDidBecomeActive:(NSNotification *)__unused aNotification -{ - [[self.updateAlert window] makeKeyAndOrderFront:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidBecomeActiveNotification object:NSApp]; -} - -- (void)updateAlertFinishedWithChoice:(SUUpdateAlertChoice)choice -{ - self.updateAlert = nil; - [self.host setObject:nil forUserDefaultsKey:SUSkippedVersionKey]; - switch (choice) { - case SUInstallUpdateChoice: - self.statusController = [[SUStatusController alloc] initWithHost:self.host]; - [self.statusController beginActionWithTitle:SULocalizedString(@"Downloading update...", @"Take care not to overflow the status window.") maxProgressValue:0.0 statusText:nil]; - [self.statusController setButtonTitle:SULocalizedString(@"Cancel", nil) target:self action:@selector(cancelDownload:) isDefault:NO]; - [self.statusController showWindow:self]; - [self downloadUpdate]; - break; - - case SUOpenInfoURLChoice: - [[NSWorkspace sharedWorkspace] openURL:[self.updateItem infoURL]]; - [self abortUpdate]; - break; - - case SUSkipThisVersionChoice: - [self.host setObject:[self.updateItem versionString] forUserDefaultsKey:SUSkippedVersionKey]; - [self abortUpdate]; - break; - - case SURemindMeLaterChoice: - [self abortUpdate]; - break; - } -} - -- (void)download:(NSURLDownload *)__unused download didReceiveResponse:(NSURLResponse *)response -{ - [self.statusController setMaxProgressValue:[response expectedContentLength]]; -} - -- (NSString *)humanReadableSizeFromDouble:(double)value -{ - if (value < 1000) { - return [NSString stringWithFormat:@"%.0lf %@", value, SULocalizedString(@"B", @"the unit for bytes")]; - } - - if (value < 1000 * 1000) { - return [NSString stringWithFormat:@"%.0lf %@", value / 1000.0, SULocalizedString(@"KB", @"the unit for kilobytes")]; - } - - if (value < 1000 * 1000 * 1000) { - return [NSString stringWithFormat:@"%.1lf %@", value / 1000.0 / 1000.0, SULocalizedString(@"MB", @"the unit for megabytes")]; - } - - return [NSString stringWithFormat:@"%.2lf %@", value / 1000.0 / 1000.0 / 1000.0, SULocalizedString(@"GB", @"the unit for gigabytes")]; -} - -- (void)download:(NSURLDownload *)__unused download didReceiveDataOfLength:(NSUInteger)length -{ - [self.statusController setProgressValue:[self.statusController progressValue] + (double)length]; - if ([self.statusController maxProgressValue] > 0.0) - [self.statusController setStatusText:[NSString stringWithFormat:SULocalizedString(@"%@ of %@", nil), [self humanReadableSizeFromDouble:[self.statusController progressValue]], [self humanReadableSizeFromDouble:[self.statusController maxProgressValue]]]]; - else - [self.statusController setStatusText:[NSString stringWithFormat:SULocalizedString(@"%@ downloaded", nil), [self humanReadableSizeFromDouble:[self.statusController progressValue]]]]; -} - -- (IBAction)cancelDownload:(id)__unused sender -{ - if (self.download) - [self.download cancel]; - [self abortUpdate]; -} - -- (void)extractUpdate -{ - // Now we have to extract the downloaded archive. - [self.statusController beginActionWithTitle:SULocalizedString(@"Extracting update...", @"Take care not to overflow the status window.") maxProgressValue:0.0 statusText:nil]; - [self.statusController setButtonEnabled:NO]; - [super extractUpdate]; -} - -- (void)unarchiver:(SUUnarchiver *)__unused ua extractedProgress:(double)progress -{ - // We do this here instead of in extractUpdate so that we only have a determinate progress bar for archives with progress. - if ([self.statusController maxProgressValue] == 0.0) { - [self.statusController setMaxProgressValue:1]; - } - [self.statusController setProgressValue:progress]; -} - -- (void)unarchiverDidFinish:(SUUnarchiver *)__unused ua -{ - [self.statusController beginActionWithTitle:SULocalizedString(@"Ready to Install", nil) maxProgressValue:1.0 statusText:nil]; - [self.statusController setProgressValue:1.0]; // Fill the bar. - [self.statusController setButtonEnabled:YES]; - [self.statusController setButtonTitle:SULocalizedString(@"Install and Relaunch", nil) target:self action:@selector(installAndRestart:) isDefault:YES]; - [[self.statusController window] makeKeyAndOrderFront:self]; - [NSApp requestUserAttention:NSInformationalRequest]; -} - -- (void)installAndRestart:(id)__unused sender -{ - [self installWithToolAndRelaunch:YES]; -} - -- (void)installWithToolAndRelaunch:(BOOL)relaunch -{ - [self.statusController beginActionWithTitle:SULocalizedString(@"Installing update...", @"Take care not to overflow the status window.") maxProgressValue:0.0 statusText:nil]; - [self.statusController setButtonEnabled:NO]; - [super installWithToolAndRelaunch:relaunch]; -} - -- (void)terminateApp -{ - // if a user chooses to NOT relaunch the app (as is the case with WebKit - // when it asks you if you are sure you want to close the app with multiple - // tabs open), the status window still stays on the screen and obscures - // other windows; with this fix, it doesn't - - if (self.statusController) { - [self.statusController close]; - self.statusController = nil; - } - - [super terminateApp]; -} - -- (void)abortUpdateWithError:(NSError *)error -{ - NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"Update Error!", nil) defaultButton:SULocalizedString(@"Cancel Update", nil) alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@", [error localizedDescription]]; - [self showModalAlert:alert]; - [super abortUpdateWithError:error]; -} - -- (void)abortUpdate -{ - if (self.statusController) - { - [self.statusController close]; - self.statusController = nil; - } - [super abortUpdate]; -} - -- (void)showModalAlert:(NSAlert *)alert -{ - if ([[self.updater delegate] respondsToSelector:@selector(updaterWillShowModalAlert:)]) { - [[self.updater delegate] updaterWillShowModalAlert:self.updater]; - } - - // When showing a modal alert we need to ensure that background applications - // are focused to inform the user since there is no dock icon to notify them. - if ([self.host isBackgroundApplication]) { [NSApp activateIgnoringOtherApps:YES]; } - - [alert setIcon:[self.host icon]]; - [alert runModal]; - - if ([[self.updater delegate] respondsToSelector:@selector(updaterDidShowModalAlert:)]) - [[self.updater delegate] updaterDidShowModalAlert:self.updater]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUnarchiver.h b/Frameworks/Sparkle/Sparkle/SUUnarchiver.h deleted file mode 100644 index 9b7d07807..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUnarchiver.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// SUUnarchiver.h -// Sparkle -// -// Created by Andy Matuschak on 3/16/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUUNARCHIVER_H -#define SUUNARCHIVER_H - -@class SUHost; -@protocol SUUnarchiverDelegate; - -@interface SUUnarchiver : NSObject - -@property (copy, readonly) NSString *archivePath; -@property (copy, readonly) NSString *updateHostBundlePath; -@property (weak) id delegate; - -+ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHostBundlePath:(NSString *)host; - -- (void)start; -@end - -@protocol SUUnarchiverDelegate -- (void)unarchiverDidFinish:(SUUnarchiver *)unarchiver; -- (void)unarchiverDidFail:(SUUnarchiver *)unarchiver; -@optional -- (void)unarchiver:(SUUnarchiver *)unarchiver extractedProgress:(double)progress; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUnarchiver.m b/Frameworks/Sparkle/Sparkle/SUUnarchiver.m deleted file mode 100644 index fefa840bf..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUnarchiver.m +++ /dev/null @@ -1,93 +0,0 @@ -// -// SUUnarchiver.m -// Sparkle -// -// Created by Andy Matuschak on 3/16/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - - -#import "SUUpdater.h" - -#import "SUAppcast.h" -#import "SUAppcastItem.h" -#import "SUVersionComparisonProtocol.h" -#import "SUUnarchiver.h" -#import "SUUnarchiver_Private.h" - -@implementation SUUnarchiver - -@synthesize archivePath; -@synthesize updateHostBundlePath; -@synthesize delegate; - -+ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHostBundlePath:(NSString *)hostPath -{ - for (id current in [self unarchiverImplementations]) - { - if ([current canUnarchivePath:path]) { - return [[current alloc] initWithPath:path hostBundlePath:hostPath]; - } - } - return nil; -} - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@>", [self class], self.archivePath]; } - -- (void)start -{ - // No-op -} - -- (instancetype)initWithPath:(NSString *)path hostBundlePath:(NSString *)hostPath -{ - if ((self = [super init])) - { - archivePath = [path copy]; - updateHostBundlePath = hostPath; - } - return self; -} - -+ (BOOL)canUnarchivePath:(NSString *)__unused path -{ - return NO; -} - -- (void)notifyDelegateOfProgress:(double)progress -{ - if ([self.delegate respondsToSelector:@selector(unarchiver:extractedProgress:)]) { - [self.delegate unarchiver:self extractedProgress:progress]; - } -} - -- (void)notifyDelegateOfSuccess -{ - if ([self.delegate respondsToSelector:@selector(unarchiverDidFinish:)]) { - [self.delegate unarchiverDidFinish:self]; - } -} - -- (void)notifyDelegateOfFailure -{ - if ([self.delegate respondsToSelector:@selector(unarchiverDidFail:)]) { - [self.delegate unarchiverDidFail:self]; - } -} - -static NSMutableArray *gUnarchiverImplementations; - -+ (void)registerImplementation:(Class)implementation -{ - if (!gUnarchiverImplementations) { - gUnarchiverImplementations = [[NSMutableArray alloc] init]; - } - [gUnarchiverImplementations addObject:implementation]; -} - -+ (NSArray *)unarchiverImplementations -{ - return [NSArray arrayWithArray:gUnarchiverImplementations]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h b/Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h deleted file mode 100644 index c29d68cff..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUnarchiver_Private.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// SUUnarchiver_Private.h -// Sparkle -// -// Created by Andy Matuschak on 6/17/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUUNARCHIVER_PRIVATE_H -#define SUUNARCHIVER_PRIVATE_H - -#import -#import "SUUnarchiver.h" - -@interface SUUnarchiver (Private) -+ (void)registerImplementation:(Class)implementation; -+ (NSArray *)unarchiverImplementations; -+ (BOOL)canUnarchivePath:(NSString *)path; -- (instancetype)initWithPath:(NSString *)archive hostBundlePath:(NSString *)host; - -- (void)notifyDelegateOfProgress:(double)progress; -- (void)notifyDelegateOfSuccess; -- (void)notifyDelegateOfFailure; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.h b/Frameworks/Sparkle/Sparkle/SUUpdateAlert.h deleted file mode 100644 index 2db57bf49..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// SUUpdateAlert.h -// Sparkle -// -// Created by Andy Matuschak on 3/12/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUUPDATEALERT_H -#define SUUPDATEALERT_H - -#import "SUWindowController.h" -#import "SUVersionDisplayProtocol.h" - -@protocol SUUpdateAlertDelegate; - -typedef NS_ENUM(NSInteger, SUUpdateAlertChoice) { - SUInstallUpdateChoice, - SURemindMeLaterChoice, - SUSkipThisVersionChoice, - SUOpenInfoURLChoice -}; - -@class WebView, SUAppcastItem, SUHost; -@interface SUUpdateAlert : SUWindowController - -@property (weak) id versionDisplayer; - -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)host completionBlock:(void(^)(SUUpdateAlertChoice))c; - -- (IBAction)installUpdate:sender; -- (IBAction)skipThisVersion:sender; -- (IBAction)remindMeLater:sender; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.m b/Frameworks/Sparkle/Sparkle/SUUpdateAlert.m deleted file mode 100644 index 0b3610381..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdateAlert.m +++ /dev/null @@ -1,281 +0,0 @@ -// -// SUUpdateAlert.m -// Sparkle -// -// Created by Andy Matuschak on 3/12/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -// ----------------------------------------------------------------------------- -// Headers: -// ----------------------------------------------------------------------------- - -#import "SUUpdateAlert.h" - -#import "SUHost.h" -#import - -#import "SUConstants.h" - -@interface SUUpdateAlert () - -@property (strong) SUAppcastItem *updateItem; -@property (strong) SUHost *host; -@property (strong) void(^completionBlock)(SUUpdateAlertChoice); - -@property (strong) NSProgressIndicator *releaseNotesSpinner; -@property (assign) BOOL webViewFinishedLoading; - -@property (weak) IBOutlet WebView *releaseNotesView; -@property (weak) IBOutlet NSView *releaseNotesContainerView; -@property (weak) IBOutlet NSTextField *descriptionField; -@property (weak) IBOutlet NSButton *installButton; -@property (weak) IBOutlet NSButton *skipButton; -@property (weak) IBOutlet NSButton *laterButton; - -@end - -@implementation SUUpdateAlert - -@synthesize completionBlock; -@synthesize versionDisplayer; - -@synthesize updateItem; -@synthesize host; - -@synthesize releaseNotesSpinner; -@synthesize webViewFinishedLoading; - -@synthesize releaseNotesView; -@synthesize releaseNotesContainerView; -@synthesize descriptionField; -@synthesize installButton; -@synthesize skipButton; -@synthesize laterButton; - -- (instancetype)initWithAppcastItem:(SUAppcastItem *)item host:(SUHost *)aHost completionBlock:(void (^)(SUUpdateAlertChoice))block -{ - self = [super initWithWindowNibName:@"SUUpdateAlert"]; - if (self) - { - self.completionBlock = block; - host = aHost; - updateItem = item; - [self setShouldCascadeWindows:NO]; - - // Alex: This dummy line makes sure that the binary is linked against WebKit. - // The SUUpdateAlert.xib file contains a WebView and if we don't link against WebKit, - // we will get a runtime crash when decoding the NIB. It is better to get a link error. - [WebView MIMETypesShownAsHTML]; - } - return self; -} - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@>", [self class], [self.host bundlePath]]; } - - -- (void)endWithSelection:(SUUpdateAlertChoice)choice -{ - [self.releaseNotesView stopLoading:self]; - [self.releaseNotesView setFrameLoadDelegate:nil]; - [self.releaseNotesView setPolicyDelegate:nil]; - [self.releaseNotesView removeFromSuperview]; // Otherwise it gets sent Esc presses (why?!) and gets very confused. - [self close]; - self.completionBlock(choice); - self.completionBlock = nil; -} - -- (IBAction)installUpdate:(id)__unused sender -{ - [self endWithSelection:SUInstallUpdateChoice]; -} - -- (IBAction)openInfoURL:(id)__unused sender -{ - [self endWithSelection:SUOpenInfoURLChoice]; -} - -- (IBAction)skipThisVersion:(id)__unused sender -{ - [self endWithSelection:SUSkipThisVersionChoice]; -} - -- (IBAction)remindMeLater:(id)__unused sender -{ - [self endWithSelection:SURemindMeLaterChoice]; -} - -- (void)displayReleaseNotes -{ - // Set the default font - [self.releaseNotesView setPreferencesIdentifier:SUBundleIdentifier]; - WebPreferences *prefs = [self.releaseNotesView preferences]; - NSString *familyName = [[NSFont systemFontOfSize:8] familyName]; - if ([familyName hasPrefix:@"."]) { // 10.9 returns ".Lucida Grande UI", which isn't a valid name for the WebView - familyName = @"Lucida Grande"; - } - [prefs setStandardFontFamily:familyName]; - [prefs setDefaultFontSize:(int)[NSFont systemFontSizeForControlSize:NSSmallControlSize]]; - [prefs setPlugInsEnabled:NO]; - [self.releaseNotesView setFrameLoadDelegate:self]; - [self.releaseNotesView setPolicyDelegate:self]; - - // Stick a nice big spinner in the middle of the web view until the page is loaded. - NSRect frame = [[self.releaseNotesView superview] frame]; - self.releaseNotesSpinner = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(NSMidX(frame) - 16, NSMidY(frame) - 16, 32, 32)]; - [self.releaseNotesSpinner setStyle:NSProgressIndicatorSpinningStyle]; - [self.releaseNotesSpinner startAnimation:self]; - self.webViewFinishedLoading = NO; - [[self.releaseNotesView superview] addSubview:self.releaseNotesSpinner]; - - // If there's a release notes URL, load it; otherwise, just stick the contents of the description into the web view. - if ([self.updateItem releaseNotesURL]) - { - if ([[self.updateItem releaseNotesURL] isFileURL]) - { - [[self.releaseNotesView mainFrame] loadHTMLString:@"Release notes with file:// URLs are not supported for security reasons—Javascript would be able to read files on your file system." baseURL:nil]; - } - else - { - [[self.releaseNotesView mainFrame] loadRequest:[NSURLRequest requestWithURL:[self.updateItem releaseNotesURL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]]; - } - } - else - { - [[self.releaseNotesView mainFrame] loadHTMLString:[self.updateItem itemDescription] baseURL:nil]; - } -} - -- (BOOL)showsReleaseNotes -{ - NSNumber *shouldShowReleaseNotes = [self.host objectForInfoDictionaryKey:SUShowReleaseNotesKey]; - if (shouldShowReleaseNotes == nil) - { - // Don't show release notes if RSS item contains no description and no release notes URL: - return (([self.updateItem itemDescription] != nil - && [[[self.updateItem itemDescription] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] > 0) - || [self.updateItem releaseNotesURL] != nil); - } - else - return [shouldShowReleaseNotes boolValue]; -} - -- (BOOL)allowsAutomaticUpdates -{ - BOOL allowAutoUpdates = YES; // Defaults to YES. - if ([self.host objectForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey]) - allowAutoUpdates = [self.host boolForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey]; - - return allowAutoUpdates; -} - -- (void)awakeFromNib -{ - BOOL showReleaseNotes = [self showsReleaseNotes]; - - [self.window setFrameAutosaveName: showReleaseNotes ? @"SUUpdateAlert" : @"SUUpdateAlertSmall" ]; - - if ([self.host isBackgroundApplication]) { - [self.window setLevel:NSFloatingWindowLevel]; // This means the window will float over all other apps, if our app is switched out ?! - } - - if ([self.updateItem fileURL] == nil) { - [self.installButton setTitle:SULocalizedString(@"Learn More...", @"Alternate title for 'Install Update' button when there's no download in RSS feed.")]; - [self.installButton setAction:@selector(openInfoURL:)]; - } - - if (showReleaseNotes) { - [self displayReleaseNotes]; - } else { - [self.releaseNotesContainerView removeFromSuperview]; - } - - [self.window.contentView setNeedsLayout:YES]; // Prod autolayout to place everything - - [self.window center]; -} - -- (BOOL)windowShouldClose:(NSNotification *) __unused note -{ - [self endWithSelection:SURemindMeLaterChoice]; - return YES; -} - -- (NSImage *)applicationIcon -{ - return [self.host icon]; -} - -- (NSString *)titleText -{ - return [NSString stringWithFormat:SULocalizedString(@"A new version of %@ is available!", nil), [self.host name]]; -} - -- (NSString *)descriptionText -{ - NSString *updateItemVersion = [self.updateItem displayVersionString]; - NSString *hostVersion = [self.host displayVersion]; - // Display more info if the version strings are the same; useful for betas. - if (!self.versionDisplayer && [updateItemVersion isEqualToString:hostVersion] ) - { - updateItemVersion = [updateItemVersion stringByAppendingFormat:@" (%@)", [self.updateItem versionString]]; - hostVersion = [hostVersion stringByAppendingFormat:@" (%@)", [self.host version]]; - } - else { - [self.versionDisplayer formatVersion:&updateItemVersion andVersion:&hostVersion]; - } - return [NSString stringWithFormat:SULocalizedString(@"%@ %@ is now available--you have %@. Would you like to download it now?", nil), [self.host name], updateItemVersion, hostVersion]; -} - -- (void)webView:(WebView *)sender didFinishLoadForFrame:frame -{ - if ([frame parentFrame] == nil) { - self.webViewFinishedLoading = YES; - [self.releaseNotesSpinner setHidden:YES]; - [sender display]; // necessary to prevent weird scroll bar artifacting - } -} - -- (void)webView:(WebView *)__unused sender decidePolicyForNavigationAction:(NSDictionary *)__unused actionInformation request:(NSURLRequest *)request frame:(WebFrame *)__unused frame decisionListener:(id)listener -{ - if (self.webViewFinishedLoading) { - [[NSWorkspace sharedWorkspace] openURL:[request URL]]; - - [listener ignore]; - } - else { - [listener use]; - } -} - -// Clean up the contextual menu. -- (NSArray *)webView:(WebView *)__unused sender contextMenuItemsForElement:(NSDictionary *)__unused element defaultMenuItems:(NSArray *)defaultMenuItems -{ - NSMutableArray *webViewMenuItems = [defaultMenuItems mutableCopy]; - - if (webViewMenuItems) - { - for (NSMenuItem *menuItem in defaultMenuItems) - { - NSInteger tag = [menuItem tag]; - - switch (tag) - { - case WebMenuItemTagOpenLinkInNewWindow: - case WebMenuItemTagDownloadLinkToDisk: - case WebMenuItemTagOpenImageInNewWindow: - case WebMenuItemTagDownloadImageToDisk: - case WebMenuItemTagOpenFrameInNewWindow: - case WebMenuItemTagGoBack: - case WebMenuItemTagGoForward: - case WebMenuItemTagStop: - case WebMenuItemTagReload: - [webViewMenuItems removeObjectIdenticalTo:menuItem]; - } - } - } - - return webViewMenuItems; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUUpdateDriver.h deleted file mode 100644 index 5575994db..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdateDriver.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// SUUpdateDriver.h -// Sparkle -// -// Created by Andy Matuschak on 5/7/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUUPDATEDRIVER_H -#define SUUPDATEDRIVER_H - -#import - -extern NSString *const SUUpdateDriverFinishedNotification; - -@class SUHost, SUUpdater; -@interface SUUpdateDriver : NSObject - -@property (readonly, weak) SUUpdater *updater; -@property (strong) SUHost *host; - -- (instancetype)initWithUpdater:(SUUpdater *)updater; -- (void)checkForUpdatesAtURL:(NSURL *)URL host:(SUHost *)host; -- (void)abortUpdate; -@property (getter=isInterruptible, readonly) BOOL interruptible; -@property (readonly) BOOL finished; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUUpdateDriver.m deleted file mode 100644 index cee31648e..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdateDriver.m +++ /dev/null @@ -1,52 +0,0 @@ -// -// SUUpdateDriver.m -// Sparkle -// -// Created by Andy Matuschak on 5/7/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUUpdateDriver.h" -#import "SUHost.h" - -NSString *const SUUpdateDriverFinishedNotification = @"SUUpdateDriverFinished"; - -@interface SUUpdateDriver () - -@property (weak) SUUpdater *updater; -@property (copy) NSURL *appcastURL; -@property (getter=isInterruptible) BOOL interruptible; - -@end - -@implementation SUUpdateDriver - -@synthesize updater; -@synthesize host; -@synthesize interruptible; -@synthesize finished; -@synthesize appcastURL; - -- (instancetype)initWithUpdater:(SUUpdater *)anUpdater -{ - if ((self = [super init])) { - self.updater = anUpdater; - } - return self; -} - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@, %@>", [self class], [self.host bundlePath], [self.host installationPath]]; } - -- (void)checkForUpdatesAtURL:(NSURL *)URL host:(SUHost *)h -{ - self.appcastURL = URL; - self.host = h; -} - -- (void)abortUpdate -{ - [self setValue:@YES forKey:@"finished"]; - [[NSNotificationCenter defaultCenter] postNotificationName:SUUpdateDriverFinishedNotification object:self]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.h b/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.h deleted file mode 100644 index 2320df885..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// SUUpdatePermissionPrompt.h -// Sparkle -// -// Created by Andy Matuschak on 1/24/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUUPDATEPERMISSIONPROMPT_H -#define SUUPDATEPERMISSIONPROMPT_H - -#import "SUWindowController.h" - -typedef NS_ENUM(NSInteger, SUPermissionPromptResult) { - SUAutomaticallyCheck, - SUDoNotAutomaticallyCheck -}; - -@protocol SUUpdatePermissionPromptDelegate; - -@class SUHost; -@interface SUUpdatePermissionPrompt : SUWindowController - -+ (void)promptWithHost:(SUHost *)aHost systemProfile:(NSArray *)profile delegate:(id)d; -- (IBAction)toggleMoreInfo:(id)sender; -- (IBAction)finishPrompt:(id)sender; -@end - -@protocol SUUpdatePermissionPromptDelegate -- (void)updatePermissionPromptFinishedWithResult:(SUPermissionPromptResult)result; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m b/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m deleted file mode 100644 index 6aef7bd2d..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdatePermissionPrompt.m +++ /dev/null @@ -1,157 +0,0 @@ -// -// SUUpdatePermissionPrompt.m -// Sparkle -// -// Created by Andy Matuschak on 1/24/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUUpdatePermissionPrompt.h" - -#import "SUHost.h" -#import "SUConstants.h" - -@interface SUUpdatePermissionPrompt () - -@property (assign) BOOL isShowingMoreInfo; -@property (assign) BOOL shouldSendProfile; - -@property (strong) SUHost *host; -@property (strong) NSArray *systemProfileInformationArray; -@property (weak) id delegate; -@property (weak) IBOutlet NSTextField *descriptionTextField; -@property (weak) IBOutlet NSView *moreInfoView; -@property (weak) IBOutlet NSButton *moreInfoButton; -@property (weak) IBOutlet NSTableView *profileTableView; - -@end - -@implementation SUUpdatePermissionPrompt - -@synthesize isShowingMoreInfo = _isShowingMoreInfo; -@synthesize shouldSendProfile = _shouldSendProfile; -@synthesize host; -@synthesize systemProfileInformationArray; -@synthesize delegate; -@synthesize descriptionTextField; -@synthesize moreInfoView; -@synthesize moreInfoButton; -@synthesize profileTableView; - -- (BOOL)shouldAskAboutProfile -{ - return [[self.host objectForInfoDictionaryKey:SUEnableSystemProfilingKey] boolValue]; -} - -- (instancetype)initWithHost:(SUHost *)aHost systemProfile:(NSArray *)profile delegate:(id)d -{ - self = [super initWithWindowNibName:@"SUUpdatePermissionPrompt"]; - if (self) - { - host = aHost; - delegate = d; - self.isShowingMoreInfo = NO; - self.shouldSendProfile = [self shouldAskAboutProfile]; - systemProfileInformationArray = profile; - [self setShouldCascadeWindows:NO]; - } - return self; -} - -+ (void)promptWithHost:(SUHost *)aHost systemProfile:(NSArray *)profile delegate:(id)d -{ - // If this is a background application we need to focus it in order to bring the prompt - // to the user's attention. Otherwise the prompt would be hidden behind other applications and - // the user would not know why the application was paused. - if ([aHost isBackgroundApplication]) { [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; } - - if( ![NSApp modalWindow]) // do not prompt if there is is another modal window on screen - { - SUUpdatePermissionPrompt *prompt = [[[self class] alloc] initWithHost:aHost systemProfile:profile delegate:d]; - [NSApp runModalForWindow:[prompt window]]; - } -} - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@>", [self class], [self.host bundlePath]]; } - -- (void)awakeFromNib -{ - if (![self shouldAskAboutProfile]) - { - NSRect frame = [[self window] frame]; - frame.size.height -= [self.moreInfoButton frame].size.height; - [[self window] setFrame:frame display:YES]; - } else { - // Set the table view's delegate so we can disable row selection. - [self.profileTableView setDelegate:(id)self]; - } -} - -- (BOOL)tableView:(NSTableView *) __unused tableView shouldSelectRow:(NSInteger) __unused row { return NO; } - - -- (NSImage *)icon -{ - return [self.host icon]; -} - -- (NSString *)promptDescription -{ - return [NSString stringWithFormat:SULocalizedString(@"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu.", nil), [self.host name]]; -} - -- (IBAction)toggleMoreInfo:(id)__unused sender -{ - self.isShowingMoreInfo = !self.isShowingMoreInfo; - - NSView *contentView = [[self window] contentView]; - NSRect contentViewFrame = [contentView frame]; - NSRect windowFrame = [[self window] frame]; - - NSRect profileMoreInfoViewFrame = [self.moreInfoView frame]; - NSRect profileMoreInfoButtonFrame = [self.moreInfoButton frame]; - NSRect descriptionFrame = [self.descriptionTextField frame]; - - if (self.isShowingMoreInfo) - { - // Add the subview - contentViewFrame.size.height += profileMoreInfoViewFrame.size.height; - profileMoreInfoViewFrame.origin.y = profileMoreInfoButtonFrame.origin.y - profileMoreInfoViewFrame.size.height; - profileMoreInfoViewFrame.origin.x = descriptionFrame.origin.x; - profileMoreInfoViewFrame.size.width = descriptionFrame.size.width; - - windowFrame.size.height += profileMoreInfoViewFrame.size.height; - windowFrame.origin.y -= profileMoreInfoViewFrame.size.height; - - [self.moreInfoView setFrame:profileMoreInfoViewFrame]; - [self.moreInfoView setHidden:YES]; - [contentView addSubview:self.moreInfoView - positioned:NSWindowBelow - relativeTo:self.moreInfoButton]; - } else { - // Remove the subview - [self.moreInfoView setHidden:NO]; - [self.moreInfoView removeFromSuperview]; - contentViewFrame.size.height -= profileMoreInfoViewFrame.size.height; - - windowFrame.size.height -= profileMoreInfoViewFrame.size.height; - windowFrame.origin.y += profileMoreInfoViewFrame.size.height; - } - [[self window] setFrame:windowFrame display:YES animate:YES]; - [contentView setFrame:contentViewFrame]; - [contentView setNeedsDisplay:YES]; - [self.moreInfoView setHidden:!self.isShowingMoreInfo]; -} - -- (IBAction)finishPrompt:(id)sender -{ - if (![self.delegate respondsToSelector:@selector(updatePermissionPromptFinishedWithResult:)]) { - [NSException raise:@"SUInvalidDelegate" format:@"SUUpdatePermissionPrompt's delegate (%@) doesn't respond to updatePermissionPromptFinishedWithResult:!", self.delegate]; - } - [self.host setBool:self.shouldSendProfile forUserDefaultsKey:SUSendProfileInfoKey]; - [self.delegate updatePermissionPromptFinishedWithResult:([sender tag] == 1 ? SUAutomaticallyCheck : SUDoNotAutomaticallyCheck)]; - [[self window] close]; - [NSApp stopModal]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUpdater.h b/Frameworks/Sparkle/Sparkle/SUUpdater.h deleted file mode 100644 index 90d606fa4..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdater.h +++ /dev/null @@ -1,327 +0,0 @@ -// -// SUUpdater.h -// Sparkle -// -// Created by Andy Matuschak on 1/4/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SUUPDATER_H -#define SUUPDATER_H - -#import "SUExport.h" -#import "SUVersionComparisonProtocol.h" -#import "SUVersionDisplayProtocol.h" - -@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast; - -@protocol SUUpdaterDelegate; - -/*! - The main API in Sparkle for controlling the update mechanism. - - This class is used to configure the update paramters as well as manually - and automatically schedule and control checks for updates. - */ -SU_EXPORT @interface SUUpdater : NSObject - -@property (unsafe_unretained) IBOutlet id delegate; - -+ (SUUpdater *)sharedUpdater; -+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle; -- (instancetype)initForBundle:(NSBundle *)bundle; - -@property (readonly, strong) NSBundle *hostBundle; - -@property BOOL automaticallyChecksForUpdates; - -@property NSTimeInterval updateCheckInterval; - -/*! - * The URL of the appcast used to download update information. - * - * This property must be called on the main thread. - */ -@property (copy) NSURL *feedURL; - -@property (nonatomic, copy) NSString *userAgentString; - -@property (copy) NSDictionary *httpHeaders; - -@property BOOL sendsSystemProfile; - -@property BOOL automaticallyDownloadsUpdates; - -/*! - Explicitly checks for updates and displays a progress dialog while doing so. - - This method is meant for a main menu item. - Connect any menu item to this action in Interface Builder, - and Sparkle will check for updates and report back its findings verbosely - when it is invoked. - */ -- (IBAction)checkForUpdates:(id)sender; - -/*! - Checks for updates, but does not display any UI unless an update is found. - - This is meant for programmatically initating a check for updates. That is, - it will display no UI unless it actually finds an update, in which case it - proceeds as usual. - - If the fully automated updating is turned on, however, this will invoke that - behavior, and if an update is found, it will be downloaded and prepped for - installation. - */ -- (void)checkForUpdatesInBackground; - -/*! - Returns the date of last update check. - - \returns \c nil if no check has been performed. - */ -@property (readonly, copy) NSDate *lastUpdateCheckDate; - -/*! - Begins a "probing" check for updates which will not actually offer to - update to that version. - - However, the delegate methods - SUUpdaterDelegate::updater:didFindValidUpdate: and - SUUpdaterDelegate::updaterDidNotFindUpdate: will be called, - so you can use that information in your UI. - */ -- (void)checkForUpdateInformation; - -/*! - Appropriately schedules or cancels the update checking timer according to - the preferences for time interval and automatic checks. - - This call does not change the date of the next check, - but only the internal NSTimer. - */ -- (void)resetUpdateCycle; - -@property (readonly) BOOL updateInProgress; - -@end - -// ----------------------------------------------------------------------------- -// SUUpdater Notifications for events that might be interesting to more than just the delegate -// The updater will be the notification object -// ----------------------------------------------------------------------------- -SU_EXPORT extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification; -SU_EXPORT extern NSString *const SUUpdaterDidFindValidUpdateNotification; -SU_EXPORT extern NSString *const SUUpdaterDidNotFindUpdateNotification; -SU_EXPORT extern NSString *const SUUpdaterWillRestartNotification; -#define SUUpdaterWillRelaunchApplicationNotification SUUpdaterWillRestartNotification; -#define SUUpdaterWillInstallUpdateNotification SUUpdaterWillRestartNotification; - -// Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification userInfo -SU_EXPORT extern NSString *const SUUpdaterAppcastItemNotificationKey; -// Key for the SUAppcast object in the SUUpdaterDidFinishLoadingAppCastNotification userInfo -SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey; - -// ----------------------------------------------------------------------------- -// SUUpdater Delegate: -// ----------------------------------------------------------------------------- - -/*! - Provides methods to control the behavior of an SUUpdater object. - */ -@protocol SUUpdaterDelegate -@optional - -/*! - Returns whether to allow Sparkle to pop up. - - For example, this may be used to prevent Sparkle from interrupting a setup assistant. - - \param updater The SUUpdater instance. - */ -- (BOOL)updaterMayCheckForUpdates:(SUUpdater *)updater; - -/*! - Returns additional parameters to append to the appcast URL's query string. - - This is potentially based on whether or not Sparkle will also be sending along the system profile. - - \param updater The SUUpdater instance. - \param sendingProfile Whether the system profile will also be sent. - - \return An array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user. - */ -- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile; - -/*! - Returns a custom appcast URL. - - Override this to dynamically specify the entire URL. - - \param updater The SUUpdater instance. - */ -- (NSString *)feedURLStringForUpdater:(SUUpdater *)updater; - -/*! - Returns whether Sparkle should prompt the user about automatic update checks. - - Use this to override the default behavior. - - \param updater The SUUpdater instance. - */ -- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)updater; - -/*! - Called after Sparkle has downloaded the appcast from the remote server. - - Implement this if you want to do some special handling with the appcast once it finishes loading. - - \param updater The SUUpdater instance. - \param appcast The appcast that was downloaded from the remote server. - */ -- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; - -/*! - Returns the item in the appcast corresponding to the update that should be installed. - - If you're using special logic or extensions in your appcast, - implement this to use your own logic for finding a valid update, if any, - in the given appcast. - - \param appcast The appcast that was downloaded from the remote server. - \param updater The SUUpdater instance. - */ -- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)updater; - -/*! - Called when a valid update is found by the update driver. - - \param updater The SUUpdater instance. - \param item The appcast item corresponding to the update that is proposed to be installed. - */ -- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)item; - -/*! - Called when a valid update is not found. - - \param updater The SUUpdater instance. - */ -- (void)updaterDidNotFindUpdate:(SUUpdater *)updater; - -/*! - Called immediately before installing the specified update. - - \param updater The SUUpdater instance. - \param item The appcast item corresponding to the update that is proposed to be installed. - */ -- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)item; - -/*! - Returns whether the relaunch should be delayed in order to perform other tasks. - - This is not called if the user didn't relaunch on the previous update, - in that case it will immediately restart. - - \param updater The SUUpdater instance. - \param item The appcast item corresponding to the update that is proposed to be installed. - \param invocation The invocation that must be completed before continuing with the relaunch. - - \return \c YES to delay the relaunch until \p invocation is invoked. - */ -- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)item untilInvoking:(NSInvocation *)invocation; - -/*! - Returns whether the application should be relaunched at all. - - Some apps \b cannot be relaunched under certain circumstances. - This method can be used to explicitly prevent a relaunch. - - \param updater The SUUpdater instance. - */ -- (BOOL)updaterShouldRelaunchApplication:(SUUpdater *)updater; - -/*! - Called immediately before relaunching. - - \param updater The SUUpdater instance. - */ -- (void)updaterWillRelaunchApplication:(SUUpdater *)updater; - -/*! - Returns an object that compares version numbers to determine their arithmetic relation to each other. - - This method allows you to provide a custom version comparator. - If you don't implement this method or return \c nil, - the standard version comparator will be used. - - \sa SUStandardVersionComparator - - \param updater The SUUpdater instance. - */ -- (id)versionComparatorForUpdater:(SUUpdater *)updater; - -/*! - Returns an object that formats version numbers for display to the user. - - If you don't implement this method or return \c nil, - the standard version formatter will be used. - - \sa SUUpdateAlert - - \param updater The SUUpdater instance. - */ -- (id)versionDisplayerForUpdater:(SUUpdater *)updater; - -/*! - Returns the path which is used to relaunch the client after the update is installed. - - The default is the path of the host bundle. - - \param updater The SUUpdater instance. - */ -- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater; - -/*! - Called before an updater shows a modal alert window, - to give the host the opportunity to hide attached windows that may get in the way. - - \param updater The SUUpdater instance. - */ -- (void)updaterWillShowModalAlert:(SUUpdater *)updater; - -/*! - Called after an updater shows a modal alert window, - to give the host the opportunity to hide attached windows that may get in the way. - - \param updater The SUUpdater instance. - */ -- (void)updaterDidShowModalAlert:(SUUpdater *)updater; - -/*! - Called when an update is scheduled to be silently installed on quit. - - \param updater The SUUpdater instance. - \param item The appcast item corresponding to the update that is proposed to be installed. - \param invocation Can be used to trigger an immediate silent install and relaunch. - */ -- (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationInvocation:(NSInvocation *)invocation; - -/*! - Calls after an update that was scheduled to be silently installed on quit has been canceled. - - \param updater The SUUpdater instance. - \param item The appcast item corresponding to the update that was proposed to be installed. - */ -- (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item; - -/*! - Called after an update is aborted due to an error. - - \param updater The SUUpdater instance. - \param error The error that caused the abort - */ -- (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error; - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUpdater.m b/Frameworks/Sparkle/Sparkle/SUUpdater.m deleted file mode 100644 index ee26656ce..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdater.m +++ /dev/null @@ -1,563 +0,0 @@ -// -// SUUpdater.m -// Sparkle -// -// Created by Andy Matuschak on 1/4/06. -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -#import "SUHost.h" -#import "SUUpdatePermissionPrompt.h" - -#import "SUAutomaticUpdateDriver.h" -#import "SUProbingUpdateDriver.h" -#import "SUUserInitiatedUpdateDriver.h" -#import "SUScheduledUpdateDriver.h" -#import "SUConstants.h" -#import "SULog.h" -#import "SUCodeSigningVerifier.h" -#include - -NSString *const SUUpdaterDidFinishLoadingAppCastNotification = @"SUUpdaterDidFinishLoadingAppCastNotification"; -NSString *const SUUpdaterDidFindValidUpdateNotification = @"SUUpdaterDidFindValidUpdateNotification"; -NSString *const SUUpdaterDidNotFindUpdateNotification = @"SUUpdaterDidNotFindUpdateNotification"; -NSString *const SUUpdaterWillRestartNotification = @"SUUpdaterWillRestartNotificationName"; -NSString *const SUUpdaterAppcastItemNotificationKey = @"SUUpdaterAppcastItemNotificationKey"; -NSString *const SUUpdaterAppcastNotificationKey = @"SUUpdaterAppCastNotificationKey"; - -@interface SUUpdater () -@property (strong) NSTimer *checkTimer; -- (instancetype)initForBundle:(NSBundle *)bundle; -- (void)startUpdateCycle; -- (void)checkForUpdatesWithDriver:(SUUpdateDriver *)updateDriver; -- (void)scheduleNextUpdateCheck; -- (void)registerAsObserver; -- (void)unregisterAsObserver; -- (void)updateDriverDidFinish:(NSNotification *)note; -@property (readonly, copy) NSURL *parameterizedFeedURL; - -- (void)notifyWillShowModalAlert; -- (void)notifyDidShowModalAlert; - -@property (strong) SUUpdateDriver *driver; -@property (strong) SUHost *host; - -@end - -@implementation SUUpdater - -@synthesize delegate; -@synthesize checkTimer; -@synthesize userAgentString = customUserAgentString; -@synthesize httpHeaders; -@synthesize driver; -@synthesize host; - -static NSMutableDictionary *sharedUpdaters = nil; -static NSString *const SUUpdaterDefaultsObservationContext = @"SUUpdaterDefaultsObservationContext"; - -+ (SUUpdater *)sharedUpdater -{ - return [self updaterForBundle:[NSBundle mainBundle]]; -} - -// SUUpdater has a singleton for each bundle. We use the fact that NSBundle instances are also singletons, so we can use them as keys. If you don't trust that you can also use the identifier as key -+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle -{ - if (bundle == nil) bundle = [NSBundle mainBundle]; - id updater = sharedUpdaters[[NSValue valueWithNonretainedObject:bundle]]; - if (updater == nil) { - updater = [[[self class] alloc] initForBundle:bundle]; - } - return updater; -} - -// This is the designated initializer for SUUpdater, important for subclasses -- (instancetype)initForBundle:(NSBundle *)bundle -{ - self = [super init]; - if (bundle == nil) bundle = [NSBundle mainBundle]; - - // Register as observer straight away to avoid exceptions on -dealloc when -unregisterAsObserver is called: - if (self) { - [self registerAsObserver]; - } - - id updater = sharedUpdaters[[NSValue valueWithNonretainedObject:bundle]]; - if (updater) - { - self = updater; - } - else if (self) - { - if (sharedUpdaters == nil) { - sharedUpdaters = [[NSMutableDictionary alloc] init]; - } - sharedUpdaters[[NSValue valueWithNonretainedObject:bundle]] = self; - host = [[SUHost alloc] initWithBundle:bundle]; - - // Saving-the-developer-from-a-stupid-mistake-check: - BOOL hasPublicDSAKey = [host publicDSAKey] != nil; - BOOL isMainBundle = [bundle isEqualTo:[NSBundle mainBundle]]; - BOOL hostIsCodeSigned = [SUCodeSigningVerifier hostApplicationIsCodeSigned]; - if (!isMainBundle && !hasPublicDSAKey) { - [self notifyWillShowModalAlert]; - NSRunAlertPanel(@"Insecure update error!", @"For security reasons, you need to sign your updates with a DSA key. See Sparkle's documentation for more information.", @"OK", nil, nil); - [self notifyDidShowModalAlert]; - } else if (isMainBundle && !(hasPublicDSAKey || hostIsCodeSigned)) { - [self notifyWillShowModalAlert]; - NSRunAlertPanel(@"Insecure update error!", @"For security reasons, you need to code sign your application or sign your updates with a DSA key. See Sparkle's documentation for more information.", @"OK", nil, nil); - [self notifyDidShowModalAlert]; - } - - // This runs the permission prompt if needed, but never before the app has finished launching because the runloop won't run before that - [self performSelector:@selector(startUpdateCycle) withObject:nil afterDelay:0]; - } - return self; -} - - -// This will be used when the updater is instantiated in a nib such as MainMenu -- (instancetype)init -{ - return [self initForBundle:[NSBundle mainBundle]]; -} - -- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@, %@>", [self class], [self.host bundlePath], [self.host installationPath]]; } - - -- (void)notifyWillShowModalAlert -{ - if ([self.delegate respondsToSelector:@selector(updaterWillShowModalAlert:)]) - [self.delegate updaterWillShowModalAlert:self]; -} - - -- (void)notifyDidShowModalAlert -{ - if ([self.delegate respondsToSelector:@selector(updaterDidShowModalAlert:)]) - [self.delegate updaterDidShowModalAlert:self]; -} - - -- (void)startUpdateCycle -{ - BOOL shouldPrompt = NO; - BOOL hasLaunchedBefore = [self.host boolForUserDefaultsKey:SUHasLaunchedBeforeKey]; - - // If the user has been asked about automatic checks, don't bother prompting - if ([self.host objectForUserDefaultsKey:SUEnableAutomaticChecksKey]) { - shouldPrompt = NO; - } - // Does the delegate want to take care of the logic for when we should ask permission to update? - else if ([self.delegate respondsToSelector:@selector(updaterShouldPromptForPermissionToCheckForUpdates:)]) { - shouldPrompt = [self.delegate updaterShouldPromptForPermissionToCheckForUpdates:self]; - } - // Has he been asked already? And don't ask if the host has a default value set in its Info.plist. - else if ([self.host objectForKey:SUEnableAutomaticChecksKey] == nil) { - // Now, we don't want to ask the user for permission to do a weird thing on the first launch. - // We wait until the second launch, unless explicitly overridden via SUPromptUserOnFirstLaunchKey. - shouldPrompt = [self.host objectForKey:SUPromptUserOnFirstLaunchKey] || hasLaunchedBefore; - } - - if (!hasLaunchedBefore) { - [self.host setBool:YES forUserDefaultsKey:SUHasLaunchedBeforeKey]; - } - - if (shouldPrompt) { - NSArray *profileInfo = [self.host systemProfile]; - // Always say we're sending the system profile here so that the delegate displays the parameters it would send. - if ([self.delegate respondsToSelector:@selector(feedParametersForUpdater:sendingSystemProfile:)]) { - profileInfo = [profileInfo arrayByAddingObjectsFromArray:[self.delegate feedParametersForUpdater:self sendingSystemProfile:YES]]; - } - [SUUpdatePermissionPrompt promptWithHost:self.host systemProfile:profileInfo delegate:self]; - // We start the update checks and register as observer for changes after the prompt finishes - } else { - // We check if the user's said they want updates, or they haven't said anything, and the default is set to checking. - [self scheduleNextUpdateCheck]; - } -} - -- (void)updatePermissionPromptFinishedWithResult:(SUPermissionPromptResult)result -{ - [self setAutomaticallyChecksForUpdates:(result == SUAutomaticallyCheck)]; - // Schedule checks, but make sure we ignore the delayed call from KVO - [self resetUpdateCycle]; -} - -- (void)updateDriverDidFinish:(NSNotification *)note -{ - if ([note object] == self.driver && [self.driver finished]) - { - self.driver = nil; - [self scheduleNextUpdateCheck]; - } -} - -- (NSDate *)lastUpdateCheckDate -{ - return [self.host objectForUserDefaultsKey:SULastCheckTimeKey]; -} - -- (void)scheduleNextUpdateCheck -{ - if (self.checkTimer) - { - [self.checkTimer invalidate]; - self.checkTimer = nil; // Timer is non-repeating, may have invalidated itself, so we had to retain it. - } - if (![self automaticallyChecksForUpdates]) return; - - // How long has it been since last we checked for an update? - NSDate *lastCheckDate = [self lastUpdateCheckDate]; - if (!lastCheckDate) { lastCheckDate = [NSDate distantPast]; } - NSTimeInterval intervalSinceCheck = [[NSDate date] timeIntervalSinceDate:lastCheckDate]; - - // Now we want to figure out how long until we check again. - NSTimeInterval delayUntilCheck, updateCheckInterval = [self updateCheckInterval]; - if (updateCheckInterval < SUMinimumUpdateCheckInterval) - updateCheckInterval = SUMinimumUpdateCheckInterval; - if (intervalSinceCheck < updateCheckInterval) - delayUntilCheck = (updateCheckInterval - intervalSinceCheck); // It hasn't been long enough. - else - delayUntilCheck = 0; // We're overdue! Run one now. - self.checkTimer = [NSTimer scheduledTimerWithTimeInterval:delayUntilCheck target:self selector:@selector(checkForUpdatesInBackground) userInfo:nil repeats:NO]; // Timer is non-repeating, may have invalidated itself, so we had to retain it. -} - - -- (void)putFeedURLIntoDictionary:(NSMutableDictionary *)theDict // You release this. -{ - theDict[@"feedURL"] = [self feedURL]; -} - -- (void)checkForUpdatesInBgReachabilityCheckWithDriver:(SUUpdateDriver *)inDriver /* RUNS ON ITS OWN THREAD */ -{ - @try { - // This method *must* be called on its own thread. SCNetworkReachabilityCheckByName - // can block, and it can be waiting a long time on slow networks, and we - // wouldn't want to beachball the main thread for a background operation. - // We could use asynchronous reachability callbacks, but those aren't - // reliable enough and can 'get lost' sometimes, which we don't want. - - @autoreleasepool { - SCNetworkConnectionFlags flags = 0; - BOOL isNetworkReachable = YES; - - // Don't perform automatic checks on unconnected laptops or dial-up connections that aren't online: - NSMutableDictionary *theDict = [NSMutableDictionary dictionary]; - dispatch_sync(dispatch_get_main_queue(), ^{ - [self putFeedURLIntoDictionary:theDict]; // Get feed URL on main thread, it's not safe to call elsewhere. - }); - - const char *hostname = [[(NSURL *)theDict[@"feedURL"] host] cStringUsingEncoding:NSUTF8StringEncoding]; - SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, hostname); - Boolean reachabilityResult = NO; - // If the feed's using a file:// URL, we won't be able to use reachability. - if (reachability != NULL) { - SCNetworkReachabilityGetFlags(reachability, &flags); - CFRelease(reachability); - } - - if( reachabilityResult ) - { - BOOL reachable = (flags & kSCNetworkFlagsReachable) == kSCNetworkFlagsReachable; - BOOL automatic = (flags & kSCNetworkFlagsConnectionAutomatic) == kSCNetworkFlagsConnectionAutomatic; - BOOL local = (flags & kSCNetworkFlagsIsLocalAddress) == kSCNetworkFlagsIsLocalAddress; - - if (!(reachable || automatic || local)) - isNetworkReachable = NO; - } - - // If the network's not reachable, we pass a nil driver into checkForUpdatesWithDriver, which will then reschedule the next update so we try again later. - dispatch_async(dispatch_get_main_queue(), ^{ - [self checkForUpdatesWithDriver: isNetworkReachable ? inDriver : nil]; - }); - - } - } @catch (NSException *localException) { - SULog(@"UNCAUGHT EXCEPTION IN UPDATE CHECK TIMER: %@", [localException reason]); - // Don't propagate the exception beyond here. In Carbon apps that would trash the stack. - } -} - - -- (void)checkForUpdatesInBackground -{ - // Background update checks should only happen if we have a network connection. - // Wouldn't want to annoy users on dial-up by establishing a connection every - // hour or so: - SUUpdateDriver *theUpdateDriver = [[([self automaticallyDownloadsUpdates] ? [SUAutomaticUpdateDriver class] : [SUScheduledUpdateDriver class])alloc] initWithUpdater:self]; - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self checkForUpdatesInBgReachabilityCheckWithDriver:theUpdateDriver]; - }); -} - - -- (BOOL)mayUpdateAndRestart -{ - return (!self.delegate || ![self.delegate respondsToSelector:@selector(updaterShouldRelaunchApplication:)] || [self.delegate updaterShouldRelaunchApplication:self]); -} - -- (IBAction)checkForUpdates:(id)__unused sender -{ - if (self.driver && [self.driver isInterruptible]) { - [self.driver abortUpdate]; - } - - [self checkForUpdatesWithDriver:[[SUUserInitiatedUpdateDriver alloc] initWithUpdater:self]]; -} - -- (void)checkForUpdateInformation -{ - [self checkForUpdatesWithDriver:[[SUProbingUpdateDriver alloc] initWithUpdater:self]]; -} - -- (void)checkForUpdatesWithDriver:(SUUpdateDriver *)d -{ - if ([self updateInProgress]) { return; } - if (self.checkTimer) { [self.checkTimer invalidate]; self.checkTimer = nil; } // Timer is non-repeating, may have invalidated itself, so we had to retain it. - - [self willChangeValueForKey:@"lastUpdateCheckDate"]; - [self.host setObject:[NSDate date] forUserDefaultsKey:SULastCheckTimeKey]; - [self didChangeValueForKey:@"lastUpdateCheckDate"]; - - if( [self.delegate respondsToSelector: @selector(updaterMayCheckForUpdates:)] && ![self.delegate updaterMayCheckForUpdates: self] ) - { - [self scheduleNextUpdateCheck]; - return; - } - - self.driver = d; - - // If we're not given a driver at all, just schedule the next update check and bail. - if (!self.driver) - { - [self scheduleNextUpdateCheck]; - return; - } - - NSURL *theFeedURL = [self parameterizedFeedURL]; - if (theFeedURL) // Use a NIL URL to cancel quietly. - [self.driver checkForUpdatesAtURL:theFeedURL host:self.host]; - else - [self.driver abortUpdate]; -} - -- (void)registerAsObserver -{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateDriverDidFinish:) name:SUUpdateDriverFinishedNotification object:nil]; - [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:[@"values." stringByAppendingString:SUScheduledCheckIntervalKey] options:(NSKeyValueObservingOptions)0 context:(__bridge void *)(SUUpdaterDefaultsObservationContext)]; - [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:[@"values." stringByAppendingString:SUEnableAutomaticChecksKey] options:(NSKeyValueObservingOptions)0 context:(__bridge void *)(SUUpdaterDefaultsObservationContext)]; -} - -- (void)unregisterAsObserver -{ - @try - { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:[@"values." stringByAppendingString:SUScheduledCheckIntervalKey]]; - [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:[@"values." stringByAppendingString:SUEnableAutomaticChecksKey]]; - } - @catch (NSException *) - { - SULog(@"Error: [SUUpdater unregisterAsObserver] called, but the updater wasn't registered as an observer."); - } -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - if (context == (__bridge void *)(SUUpdaterDefaultsObservationContext)) - { - // Allow a small delay, because perhaps the user or developer wants to change both preferences. This allows the developer to interpret a zero check interval as a sign to disable automatic checking. - // Or we may get this from the developer and from our own KVO observation, this will effectively coalesce them. - [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(resetUpdateCycle) object:nil]; - [self performSelector:@selector(resetUpdateCycle) withObject:nil afterDelay:1]; - } - else - { - [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; - } -} - -- (void)resetUpdateCycle -{ - [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(resetUpdateCycle) object:nil]; - [self scheduleNextUpdateCheck]; -} - -- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyCheckForUpdates -{ - [self.host setBool:automaticallyCheckForUpdates forUserDefaultsKey:SUEnableAutomaticChecksKey]; - // Hack to support backwards compatibility with older Sparkle versions, which supported - // disabling updates by setting the check interval to 0. - if (automaticallyCheckForUpdates && (NSInteger)[self updateCheckInterval] == 0) { - [self setUpdateCheckInterval:SUDefaultUpdateCheckInterval]; - } - [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(resetUpdateCycle) object:nil]; - // Provide a small delay in case multiple preferences are being updated simultaneously. - [self performSelector:@selector(resetUpdateCycle) withObject:nil afterDelay:1]; -} - -- (BOOL)automaticallyChecksForUpdates -{ - // Don't automatically update when the check interval is 0, to be compatible with 1.1 settings. - if ((NSInteger)[self updateCheckInterval] == 0) { - return NO; - } - return [self.host boolForKey:SUEnableAutomaticChecksKey]; -} - -- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyUpdates -{ - [self.host setBool:automaticallyUpdates forUserDefaultsKey:SUAutomaticallyUpdateKey]; -} - -- (BOOL)automaticallyDownloadsUpdates -{ - // If the SUAllowsAutomaticUpdatesKey exists and is set to NO, return NO. - if ([self.host objectForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey] && [self.host boolForInfoDictionaryKey:SUAllowsAutomaticUpdatesKey] == NO) { - return NO; - } - - // Otherwise, automatically downloading updates is allowed. Does the user want it? - return [self.host boolForUserDefaultsKey:SUAutomaticallyUpdateKey]; -} - -- (void)setFeedURL:(NSURL *)feedURL -{ - if (![NSThread isMainThread]) - [NSException raise:@"SUThreadException" format:@"This method must be called on the main thread"]; - - [self.host setObject:[feedURL absoluteString] forUserDefaultsKey:SUFeedURLKey]; -} - -- (NSURL *)feedURL -{ - if (![NSThread isMainThread]) - [NSException raise:@"SUThreadException" format:@"This method must be called on the main thread"]; - - // A value in the user defaults overrides one in the Info.plist (so preferences panels can be created wherein users choose between beta / release feeds). - NSString *appcastString = [self.host objectForKey:SUFeedURLKey]; - if ([self.delegate respondsToSelector:@selector(feedURLStringForUpdater:)]) - appcastString = [self.delegate feedURLStringForUpdater:self]; - if (!appcastString) // Can't find an appcast string! - [NSException raise:@"SUNoFeedURL" format:@"You must specify the URL of the appcast as the %@ key in either the Info.plist or the user defaults!", SUFeedURLKey]; - NSCharacterSet *quoteSet = [NSCharacterSet characterSetWithCharactersInString:@"\"\'"]; // Some feed publishers add quotes; strip 'em. - NSString *castUrlStr = [appcastString stringByTrimmingCharactersInSet:quoteSet]; - if (!castUrlStr || [castUrlStr length] == 0) - return nil; - else - return [NSURL URLWithString:castUrlStr]; -} - -- (NSString *)userAgentString -{ - if (customUserAgentString) { - return customUserAgentString; - } - - NSString *version = [[NSBundle bundleWithIdentifier:SUBundleIdentifier] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey]; - NSString *userAgent = [NSString stringWithFormat:@"%@/%@ Sparkle/%@", [self.host name], [self.host displayVersion], version ? version : @"?"]; - NSData *cleanedAgent = [userAgent dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; - return [[NSString alloc] initWithData:cleanedAgent encoding:NSASCIIStringEncoding]; -} - -- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile -{ - [self.host setBool:sendsSystemProfile forUserDefaultsKey:SUSendProfileInfoKey]; -} - -- (BOOL)sendsSystemProfile -{ - return [self.host boolForKey:SUSendProfileInfoKey]; -} - -- (NSURL *)parameterizedFeedURL -{ - NSURL *baseFeedURL = [self feedURL]; - - // Determine all the parameters we're attaching to the base feed URL. - BOOL sendingSystemProfile = [self sendsSystemProfile]; - - // Let's only send the system profiling information once per week at most, so we normalize daily-checkers vs. biweekly-checkers and the such. - NSDate *lastSubmitDate = [self.host objectForUserDefaultsKey:SULastProfileSubmitDateKey]; - if (!lastSubmitDate) { - lastSubmitDate = [NSDate distantPast]; - } - const NSTimeInterval oneWeek = 60 * 60 * 24 * 7; - sendingSystemProfile &= (-[lastSubmitDate timeIntervalSinceNow] >= oneWeek); - - NSArray *parameters = @[]; - if ([self.delegate respondsToSelector:@selector(feedParametersForUpdater:sendingSystemProfile:)]) { - parameters = [parameters arrayByAddingObjectsFromArray:[self.delegate feedParametersForUpdater:self sendingSystemProfile:sendingSystemProfile]]; - } - if (sendingSystemProfile) - { - parameters = [parameters arrayByAddingObjectsFromArray:[self.host systemProfile]]; - [self.host setObject:[NSDate date] forUserDefaultsKey:SULastProfileSubmitDateKey]; - } - if ([parameters count] == 0) { return baseFeedURL; } - - // Build up the parameterized URL. - NSMutableArray *parameterStrings = [NSMutableArray array]; - for (NSDictionary *currentProfileInfo in parameters) { - [parameterStrings addObject:[NSString stringWithFormat:@"%@=%@", [[currentProfileInfo[@"key"] description] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [[currentProfileInfo[@"value"] description] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; - } - - NSString *separatorCharacter = @"?"; - if ([baseFeedURL query]) { - separatorCharacter = @"&"; // In case the URL is already http://foo.org/baz.xml?bat=4 - } - NSString *appcastStringWithProfile = [NSString stringWithFormat:@"%@%@%@", [baseFeedURL absoluteString], separatorCharacter, [parameterStrings componentsJoinedByString:@"&"]]; - - // Clean it up so it's a valid URL - return [NSURL URLWithString:appcastStringWithProfile]; -} - -- (void)setUpdateCheckInterval:(NSTimeInterval)updateCheckInterval -{ - [self.host setObject:@(updateCheckInterval) forUserDefaultsKey:SUScheduledCheckIntervalKey]; - if ((NSInteger)updateCheckInterval == 0) { // For compatibility with 1.1's settings. - [self setAutomaticallyChecksForUpdates:NO]; - } - [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(resetUpdateCycle) object:nil]; - - // Provide a small delay in case multiple preferences are being updated simultaneously. - [self performSelector:@selector(resetUpdateCycle) withObject:nil afterDelay:1]; -} - -- (NSTimeInterval)updateCheckInterval -{ - // Find the stored check interval. User defaults override Info.plist. - NSNumber *intervalValue = [self.host objectForKey:SUScheduledCheckIntervalKey]; - if (intervalValue) - return [intervalValue doubleValue]; - else - return SUDefaultUpdateCheckInterval; -} - -- (void)dealloc -{ - [self unregisterAsObserver]; - if (checkTimer) { [checkTimer invalidate]; } // Timer is non-repeating, may have invalidated itself, so we had to retain it. -} - -- (BOOL)validateMenuItem:(NSMenuItem *)item -{ - if ([item action] == @selector(checkForUpdates:)) { - return ![self updateInProgress]; - } - return YES; -} - -- (BOOL)updateInProgress -{ - return self.driver && ([self.driver finished] == NO); -} - -- (NSBundle *)hostBundle { return [self.host bundle]; } - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUpdater_Private.h b/Frameworks/Sparkle/Sparkle/SUUpdater_Private.h deleted file mode 100644 index 400915495..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUpdater_Private.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// SUUpdater_Private.h -// Sparkle -// -// Created by Andy Matuschak on 5/9/11. -// Copyright 2011 Andy Matuschak. All rights reserved. -// - -#import "SUUpdater.h" - -@interface SUUpdater (Private) - -@property (readonly) BOOL mayUpdateAndRestart; - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.h b/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.h deleted file mode 100644 index 079d2fea7..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// SUUserInitiatedUpdateDriver.h -// Sparkle -// -// Created by Andy Matuschak on 5/30/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUUSERINITIATEDUPDATEDRIVER_H -#define SUUSERINITIATEDUPDATEDRIVER_H - -#import -#import "SUUIBasedUpdateDriver.h" - -@interface SUUserInitiatedUpdateDriver : SUUIBasedUpdateDriver - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m b/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m deleted file mode 100644 index d1e0c9a65..000000000 --- a/Frameworks/Sparkle/Sparkle/SUUserInitiatedUpdateDriver.m +++ /dev/null @@ -1,87 +0,0 @@ -// -// SUUserInitiatedUpdateDriver.m -// Sparkle -// -// Created by Andy Matuschak on 5/30/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUUserInitiatedUpdateDriver.h" - -#import "SUStatusController.h" -#import "SUHost.h" - -@interface SUUserInitiatedUpdateDriver () - -@property (strong) SUStatusController *checkingController; -@property (assign, getter=isCanceled) BOOL canceled; - -@end - -@implementation SUUserInitiatedUpdateDriver - -@synthesize checkingController; -@synthesize canceled; - -- (void)closeCheckingWindow -{ - if (self.checkingController) - { - [[self.checkingController window] close]; - self.checkingController = nil; - } -} - -- (void)cancelCheckForUpdates:(id)__unused sender -{ - [self closeCheckingWindow]; - self.canceled = YES; -} - -- (void)checkForUpdatesAtURL:(NSURL *)URL host:(SUHost *)aHost -{ - self.checkingController = [[SUStatusController alloc] initWithHost:aHost]; - [[self.checkingController window] center]; // Force the checking controller to load its window. - [self.checkingController beginActionWithTitle:SULocalizedString(@"Checking for updates...", nil) maxProgressValue:0.0 statusText:nil]; - [self.checkingController setButtonTitle:SULocalizedString(@"Cancel", nil) target:self action:@selector(cancelCheckForUpdates:) isDefault:NO]; - [self.checkingController showWindow:self]; - [super checkForUpdatesAtURL:URL host:aHost]; - - // For background applications, obtain focus. - // Useful if the update check is requested from another app like System Preferences. - if ([aHost isBackgroundApplication]) - { - [NSApp activateIgnoringOtherApps:YES]; - } -} - -- (void)appcastDidFinishLoading:(SUAppcast *)ac -{ - if (self.isCanceled) - { - [self abortUpdate]; - return; - } - [self closeCheckingWindow]; - [super appcastDidFinishLoading:ac]; -} - -- (void)abortUpdateWithError:(NSError *)error -{ - [self closeCheckingWindow]; - [super abortUpdateWithError:error]; -} - -- (void)abortUpdate -{ - [self closeCheckingWindow]; - [super abortUpdate]; -} - -- (BOOL)itemContainsValidUpdate:(SUAppcastItem *)ui -{ - // We don't check to see if this update's been skipped, because the user explicitly *asked* if he had the latest version. - return [self hostSupportsItem:ui] && [self isItemNewer:ui]; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUVersionComparisonProtocol.h b/Frameworks/Sparkle/Sparkle/SUVersionComparisonProtocol.h deleted file mode 100644 index 10c426694..000000000 --- a/Frameworks/Sparkle/Sparkle/SUVersionComparisonProtocol.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// SUVersionComparisonProtocol.h -// Sparkle -// -// Created by Andy Matuschak on 12/21/07. -// Copyright 2007 Andy Matuschak. All rights reserved. -// - -#ifndef SUVERSIONCOMPARISONPROTOCOL_H -#define SUVERSIONCOMPARISONPROTOCOL_H - -#import -#import "SUExport.h" - -/*! - Provides version comparison facilities for Sparkle. -*/ -@protocol SUVersionComparison - -/*! - An abstract method to compare two version strings. - - Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, - and NSOrderedSame if they are equivalent. -*/ -- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD! - -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUVersionDisplayProtocol.h b/Frameworks/Sparkle/Sparkle/SUVersionDisplayProtocol.h deleted file mode 100644 index 97fae4c90..000000000 --- a/Frameworks/Sparkle/Sparkle/SUVersionDisplayProtocol.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// SUVersionDisplayProtocol.h -// EyeTV -// -// Created by Uli Kusterer on 08.12.09. -// Copyright 2009 Elgato Systems GmbH. All rights reserved. -// - -#import -#import "SUExport.h" - -/*! - Applies special display formatting to version numbers. -*/ -@protocol SUVersionDisplay - -/*! - Formats two version strings. - - Both versions are provided so that important distinguishing information - can be displayed while also leaving out unnecessary/confusing parts. -*/ -- (void)formatVersion:(NSString **)inOutVersionA andVersion:(NSString **)inOutVersionB; - -@end diff --git a/Frameworks/Sparkle/Sparkle/SUWindowController.h b/Frameworks/Sparkle/Sparkle/SUWindowController.h deleted file mode 100644 index f6af6fae3..000000000 --- a/Frameworks/Sparkle/Sparkle/SUWindowController.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// SUWindowController.h -// Sparkle -// -// Created by Andy Matuschak on 2/13/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifndef SUWINDOWCONTROLLER_H -#define SUWINDOWCONTROLLER_H - -#import - -@class SUHost; -@interface SUWindowController : NSWindowController -// We use this instead of plain old NSWindowController initWithWindowNibName so that we'll be able to find the right path when running in a bundle loaded from another app. -- (instancetype)initWithWindowNibName:(NSString *)nibName; -@end - -#endif diff --git a/Frameworks/Sparkle/Sparkle/SUWindowController.m b/Frameworks/Sparkle/Sparkle/SUWindowController.m deleted file mode 100644 index 553231130..000000000 --- a/Frameworks/Sparkle/Sparkle/SUWindowController.m +++ /dev/null @@ -1,20 +0,0 @@ -// -// SUWindowController.m -// Sparkle -// -// Created by Andy Matuschak on 2/13/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#import "SUWindowController.h" -#import "SUHost.h" - -@implementation SUWindowController - -- (instancetype)initWithWindowNibName:(NSString *)nibName -{ - self = [super initWithWindowNibName:nibName owner:self]; - return self; -} - -@end diff --git a/Frameworks/Sparkle/Sparkle/Sparkle-Info.plist b/Frameworks/Sparkle/Sparkle/Sparkle-Info.plist deleted file mode 100644 index 3d5c7f184..000000000 --- a/Frameworks/Sparkle/Sparkle/Sparkle-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - ${SPARKLE_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - ${CURRENT_PROJECT_VERSION} - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - SUAppendVersionNumber - ${SPARKLE_APPEND_VERSION_NUMBER} - SUEnableAutomatedDowngrades - ${SPARKLE_AUTOMATED_DOWNGRADES} - SUNormalizeInstalledApplicationName - ${SPARKLE_NORMALIZE_INSTALLED_APPLICATION_NAME} - SURelaunchToolName - ${SPARKLE_RELAUNCH_TOOL_NAME} - - diff --git a/Frameworks/Sparkle/Sparkle/Sparkle.h b/Frameworks/Sparkle/Sparkle/Sparkle.h deleted file mode 100644 index fe97bae17..000000000 --- a/Frameworks/Sparkle/Sparkle/Sparkle.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// Sparkle.h -// Sparkle -// -// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) -// Copyright 2006 Andy Matuschak. All rights reserved. -// - -#ifndef SPARKLE_H -#define SPARKLE_H - -// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless -// there are name-space collisions) so we can list all of them to start with: - -#import -#import -#import -#import -#import -#import -#import - -#endif diff --git a/Frameworks/Sparkle/Sparkle/Sparkle.pch b/Frameworks/Sparkle/Sparkle/Sparkle.pch deleted file mode 100644 index ccd8c7591..000000000 --- a/Frameworks/Sparkle/Sparkle/Sparkle.pch +++ /dev/null @@ -1,17 +0,0 @@ -// -// Sparkle.pch -// Sparkle -// -// Created by Andy Matuschak on 7/23/08. -// Copyright 2008 Andy Matuschak. All rights reserved. -// - -#ifdef __OBJC__ - -#import -#import "SUConstants.h" -#import "SUErrors.h" - -#define SULocalizedString(key, comment) NSLocalizedStringFromTableInBundle(key, @"Sparkle", [NSBundle bundleWithIdentifier:SUBundleIdentifier] ? [NSBundle bundleWithIdentifier:SUBundleIdentifier] : [NSBundle mainBundle], comment) - -#endif diff --git a/Frameworks/Sparkle/Sparkle/ar.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ar.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100755 index ffd6fc0ab..000000000 --- a/Frameworks/Sparkle/Sparkle/ar.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdateAlert.xib deleted file mode 100644 index 71173bce5..000000000 --- a/Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100755 index d3e44c866..000000000 --- a/Frameworks/Sparkle/Sparkle/ar.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. - -This is the information that would be sent: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ar.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/ar.lproj/Sparkle.strings deleted file mode 100644 index ce77b6525..000000000 --- a/Frameworks/Sparkle/Sparkle/ar.lproj/Sparkle.strings +++ /dev/null @@ -1,79 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "تم تنزيل %1$@ %2$@ وهو جاهز للاستخدام، هل ترغب بتثبيت التحديث وإعادة تشغيل %1$@ الآن؟"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "لا يمكن تحديث %1$@ إذا شُغّل من وحدة تخزين للقراءة فقط كصورة قرص أو قارئ الأقراص الضوئية. انقل %1$@ إلى مجلد التطبيقات وأعد تشغيله من هناك ثم حاول مجددًا."; - -"%@ %@ is currently the newest version available." = "الإصدار %2$@ هو أحدث إصدار متوفر حاليًا لتطبيق %1$@"; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "لديك الإصدار %3$@ من تطبيق %1$@، هل ترغب بتزيل الإصدار %2$@ الآن"; - -"%@ downloaded" = "تم تنزيل %@"; - -"%@ of %@" = "%1$@ من %2$@"; - -"A new version of %@ is available!" = "يتوفر إصدار جديد من تطبيق %@"; - -"A new version of %@ is ready to install!" = "الإصدار الجديد من تطبيق %@ جاهز للتثبيت"; - -"An error occurred in retrieving update information. Please try again later." = "حال خطأ دون الحصول على معلومات حول التحديث، الرجاء المحاولة لاحقًا."; - -"An error occurred while downloading the update. Please try again later." = "حدث خطأ أثناء تنزيل التحديث، الرجاء المحاولة لاحقًا."; - -"An error occurred while extracting the archive. Please try again later." = "حدث خطأ أثناء استخراج الأرشيف، الرجاء المحاولة لاحقًا."; - -"An error occurred while installing the update. Please try again later." = "حدث خطأ أثناء تثبيت التحديث، الرجاء المحاولة لاحقًا."; - -"An error occurred while parsing the update feed." = "حدث خطأ أثناء تحليل المعلومات المزوّدَة حول التحديث."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "حدث خطأ أثناء إعادة تشغيل %1$@، إلا أن الإصدار الجديد سيكون متوفرًا في المرة القادمة التي تشغل فيها %1$@"; - -/* the unit for bytes */ -"B" = "بايت"; - -"Cancel" = "إلغاء"; - -"Cancel Update" = "إلغاء التحديث"; - -"Checking for updates..." = "يجري التحقق من وجود تحديثات..."; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "يجري تنزيل التحديث..."; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "يجري استخراج التحديث..."; - -/* the unit for gigabytes */ -"GB" = "غيغا بايت"; - -"Install and Relaunch" = "تثبيت وإعادة تشغيل التطبيق"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "يجري تثبيت التحديث..."; - -/* the unit for kilobytes */ -"KB" = "كيلو بايت"; - -/* the unit for megabytes */ -"MB" = "ميغا بايت"; - -/* OK button. */ -"OK" = "موافق"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "جاهز للتثبيت"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "هل ترغب في أن يتحقق %1$@ من وجود تحديثات تلقائيًا؟ يمكنك التحقق من وجود تحديثات يدويًا في أي وقت من قائمة %1$@."; - -"Update Error!" = "حدث خطأ أثناء التحديث"; - -"Updating %@" = "تحديث %@"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." ="لديك أحدث إصدار من تطبيق %@"; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "لديك أحدث إصدار"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ -"Learn More..." = "مزيد من التفاصيل..."; diff --git a/Frameworks/Sparkle/Sparkle/ca.lproj/SUAutomaticUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/ca.lproj/SUAutomaticUpdateAlert.strings deleted file mode 100644 index 8d3ab4eef..000000000 --- a/Frameworks/Sparkle/Sparkle/ca.lproj/SUAutomaticUpdateAlert.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* NSWindow () : (oid:5) */ -"" = ""; - -/* NSButton (Automatically download and install updates in the future) : (oid:17) */ -"Automatically download and install updates in the future" = "Baixa i instal·la les actualitzacions automàticament en el futur"; - -/* NSButton (Relaunch Later) : (oid:16) */ -"Relaunch Later" = "Reinicia el programa més tard"; - -/* NSButton (Relaunch Now) : (oid:15) */ -"Relaunch Now" = "Reinicia el programa ara"; - diff --git a/Frameworks/Sparkle/Sparkle/ca.lproj/SUUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/ca.lproj/SUUpdateAlert.strings deleted file mode 100644 index d02d071e2..000000000 --- a/Frameworks/Sparkle/Sparkle/ca.lproj/SUUpdateAlert.strings +++ /dev/null @@ -1,18 +0,0 @@ -/* NSButton (Automatically download and install updates in the future) : (oid:92) */ -"Automatically download and install updates in the future" = "Descarrega i instal·la les actualitzacions automàticament en el futur"; - -/* NSButton (Install Update) : (oid:76) */ -"Install Update" = "Instal·la l'actualització"; - -/* NSTextField (Release Notes:) : (oid:17) */ -"Release Notes:" = "Notes d'aquesta versió:"; - -/* NSButton (Remind Me Later) : (oid:22) */ -"Remind Me Later" = "Recorda-m'ho més tard"; - -/* NSButton (Skip This Version) : (oid:23) */ -"Skip This Version" = "Omet aquesta versió"; - -/* NSWindow (Software Update) : (oid:5) */ -"Software Update" = "Actualització del programari"; - diff --git a/Frameworks/Sparkle/Sparkle/ca.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/ca.lproj/Sparkle.strings deleted file mode 100644 index d0ab278c4..000000000 --- a/Frameworks/Sparkle/Sparkle/ca.lproj/Sparkle.strings +++ /dev/null @@ -1,54 +0,0 @@ -"%@ of %@" = "%1$@ de %2$@"; - -"%1$@ can't be updated when it's running from a disk image. Move %1$@ to your Applications folder, relaunch it, and try again." = "%1$@ no es pot actualitzar quan funciona des d'un disc d'imatge. Moveu %1$@ al vostre directori Aplicacions, reinicieu-lo, i torneu a provar-ho."; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%@ %@ ha estat instal·lat i estarà llest per a ser utilitzat la propera vegada que s'iniciï %@! Voleu reiniciar ara?"; - -"%@ %@ is currently the newest version available." = "%@ %@ és la versió disponible més actual."; - -"%@ %@ is now available (you have %@). Would you like to download it now?" = "%@ %@ està disponible (ara teniu %@). Voleu actualitzar?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "%@ no té permís per escriure al directori d'aplicacions! Esteu executant el programa des d'un disc d'imatge? Si no és així, demaneu ajuda al vostre administrador."; - -"A new version of %@ has been installed!" = "S'ha instal·lat una nova versió de %@!"; - -"A new version of %@ is available!" = "Hi ha una nova versió de %@ disponible!"; - -"An error occurred during installation. Please try again later." = "Hi ha hagut un error durant la instal·lació. Torneu-ho a provar més tard."; - -"An error occurred in retrieving update information. Please try again later." = "Hi ha hagut un error obtenint la informació d'actualització. Torneu a provar-ho més tard."; - -"An error occurred while extracting the archive. Please try again later." = "Hi ha hagut un error al extreure l'arxiu? Torneu a provar-ho més tard."; - -"An error occurred while trying to download the file. Please try again later." = "Hi ha hagut un error al intentar descarregar el fitxer. Torneu a provar-ho més tard."; - -"An update is already in progress!" = "Ja hi ha una actualització en progrés!"; - -"Cancel" = "Cancel·la"; - -"Check for updates on startup?" = "Comprovar si hi ha actualitzacions a l'inici?"; - -"Downloading update..." = "Descarregant l'actualització…"; - -"Extracting update..." = "Extraient l'actualització…"; - -"Install and Relaunch" = "Instal·la i reinicia"; - -"Installing update..." = "Instal·lant l'actualització…"; - -"No" = "No"; - -"OK" = "D'acord"; - -"Ready to Install" = "A punt per instal·lar"; - -"Update Error!" = "Error d'actualització!"; - -"Updating %@" = "Actualitzant %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the %@ menu." = "Voleu que %@ comprovi si hi ha noves actualitzacions al iniciar? Si no, podeu inciar la comprovació manualment des del menú @."; - -"Yes" = "Sí"; - -"You're up to date!" = "Ja esteu al dia!"; - diff --git a/Frameworks/Sparkle/Sparkle/cs.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/cs.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index f383c339a..000000000 --- a/Frameworks/Sparkle/Sparkle/cs.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdateAlert.xib deleted file mode 100644 index e1ed9f804..000000000 --- a/Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 382869990..000000000 --- a/Frameworks/Sparkle/Sparkle/cs.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Informace z anonymního systémového profilu pomáhají vývojářům lépe plánovat budoucí vývoj aplikace -Obraťte se na nás v případě, že budete mít k němu nějaký dotaz. - -Tyto informace by měli být odeslány: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/cs.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/cs.lproj/Sparkle.strings deleted file mode 100644 index 843f0b2f5..000000000 --- a/Frameworks/Sparkle/Sparkle/cs.lproj/Sparkle.strings +++ /dev/null @@ -1,71 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ byl instalován a je připraven k použití po příštím spuštění. Přejete si aplikaci %1$@ nyní nainstalovat a znovu spustit?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "Aplikace %1$@ nemůže být aktualizována, protože je spuštěna z nezapisovatelného média. Může to být CD/DVD-ROM, obraz disku nebo jen nemáte právo zápisu na disk. Přesuňte aplikaci %1$@ do vaší složky Aplikace, spusťte ji z tohoto umístěni znovu."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ je nejnovější dostupná verze"; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "Je k dispozici %1$@ %2$@ - máte %3$@. Přejete si nyní zkopírovat aktualizaci?"; - -"%@ downloaded" = "zkopírováno %@"; - -"%@ of %@" = "%1$@ z %2$@"; - -"A new version of %@ is available!" = "Je dostupná nová verze aplikace %@!"; - -"A new version of %@ is ready to install!" = "Nová verze %@ je připravena k instalaci!"; - -"An error occurred in retrieving update information. Please try again later." = "Při získávání údajů o aktualizaci se vyskytla chyba. Zkuste to prosím později."; - -"An error occurred while downloading the update. Please try again later." = "Při kopírování souboru se vyskytla chyba. Zkuste to prosím později."; - -"An error occurred while extracting the archive. Please try again later." = "Při rozbalování archivu se vyskytla chyba. Zkuste to prosím později."; - -"An error occurred while installing the update. Please try again later." = "Při instalování aktualizace se vyskytla chyba. Zkuste to prosím později."; - -"An error occurred while parsing the update feed." = "Při zpracovávání údajů o aktualizaci se vyskytla chyba. Zkuste to prosím později."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Vyskytla se chyba při novém spouštění aplikace %1$@, ale nová verze bude dostupná při dalším spuštění %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Zrušit"; - -"Cancel Update" = "Zrušit aktualizaci"; - -"Checking for updates..." = "Ověřuje se dostupnost aktualizací…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Kopíruje se aktualizace…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Rozbaluje se aktualizace…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Instalovat a znovu spustit"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Instaluje se aktualizace…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "Budiž"; - -"Ready to Install" = "Připraveno k instalaci"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Přejete si, aby aplikace %1$@ automaticky ověřovala dostupnost aktualizací? Tuto volbu můžete kdykoliv změnit v nabídce %1$@."; - -"Update Error!" = "Chyba při aktualizaci!"; - -"Updating %@" = "Aktualizuje se %@"; - -"You already have the newest version of %@." = "Máte nainstalovanou nejnovější verzi aplikace @."; - -"You're up to date!" = "Vaše verze je aktuální!"; - diff --git a/Frameworks/Sparkle/Sparkle/cy.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/cy.lproj/Sparkle.strings deleted file mode 100644 index a9b47b259..000000000 --- a/Frameworks/Sparkle/Sparkle/cy.lproj/Sparkle.strings +++ /dev/null @@ -1,52 +0,0 @@ -"%@ of %@" = "%1$@ of %2$@"; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%1$@ %2$@ has been installed and will be ready to use next time %3$@ starts! Would you like to relaunch now?"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ is currently the newest version available."; - -"%@ %@ is now available (you have %@). Would you like to download it now?" = "%1$@ %2$@ is now available (you have %3$@). Would you like to download it now?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help."; - -"A new version of %@ has been installed!" = "A new version of %@ has been installed!"; - -"A new version of %@ is available!" = "A new version of %@ is available!"; - -"An error occurred during installation. Please try again later." = "An error occurred during installation. Please try again later."; - -"An error occurred in retrieving update information. Please try again later." = "An error occurred in retrieving update information. Please try again later."; - -"An error occurred while extracting the archive. Please try again later." = "An error occurred while extracting the archive. Please try again later."; - -"An error occurred while trying to download the file. Please try again later." = "An error occurred while trying to download the file. Please try again later."; - -"An update is already in progress!" = "An update is already in progress!"; - -"Cancel" = "Cancel"; - -"Check for updates on startup?" = "Check for updates on startup?"; - -"Downloading update..." = "Downloading update…"; - -"Extracting update..." = "Extracting update…"; - -"Install and Relaunch" = "Install and Relaunch"; - -"Installing update..." = "Installing update…"; - -"No" = "No"; - -"OK" = "OK"; - -"Ready to Install" = "Ready to Install"; - -"Update Error!" = "Update Error!"; - -"Updating %@" = "Updating %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu." = "Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu."; - -"Yes" = "Yes"; - -"You're up to date!" = "You're up to date!"; - diff --git a/Frameworks/Sparkle/Sparkle/da.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/da.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100755 index e306261ae..000000000 --- a/Frameworks/Sparkle/Sparkle/da.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/da.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/da.lproj/SUUpdateAlert.xib deleted file mode 100644 index 78ab21b51..000000000 --- a/Frameworks/Sparkle/Sparkle/da.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/da.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/da.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100755 index 1be6db569..000000000 --- a/Frameworks/Sparkle/Sparkle/da.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. - -This is the information that would be sent: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/da.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/da.lproj/Sparkle.strings deleted file mode 100644 index f098528d1..000000000 --- a/Frameworks/Sparkle/Sparkle/da.lproj/Sparkle.strings +++ /dev/null @@ -1,80 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ er hentet og klar til brug! Vil du installere og genstarte %1$@ nu?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kan ikke opdateres når det køres fra en kun læsbar enhed. Flyt %1$@ til mappen Programmer, genstart derfra og prøv igen."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ er den aktuelle version."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ er tilgængelig! Du har %3$@. Skal den hentes nu?"; - -"%@ downloaded" = "%@ hentet"; - -"%@ of %@" = "%1$@ af %2$@"; - -"A new version of %@ is available!" = "En ny version af %@ er tilgængelig!"; - -"A new version of %@ is ready to install!" = "En ny version af %@ er klar til installering!"; - -"An error occurred in retrieving update information. Please try again later." = "Kunne ikke modtage informationer om opdateringer. Kontroller at du har forbindelse til internettet eller prøv igen senere."; - -"An error occurred while downloading the update. Please try again later." = "Opdateringen kunne ikke hentes. Prøv igen senere."; - -"An error occurred while extracting the archive. Please try again later." = "Arkivet kunne ikke udpakkes. Prøv igen senere."; - -"An error occurred while installing the update. Please try again later." = "Opdateringen kunne ikke installeres. Prøv igen senere."; - -"An error occurred while parsing the update feed." = "An error occurred while parsing the update feed."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "%1$@ kunne ikke genstartes. Den nye version vil være tilgængelig, næste gang %1$@ startes."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Annuller"; - -"Cancel Update" = "Annuller opdatering"; - -"Checking for updates..." = "Søger efter opdateringer…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Henter opdatering…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Udpakker arkiver…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Installer og genstart"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Installerer opdatering…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -/* OK button. */ -"OK" = "OK"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "Klar til installering"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Skal %1$@ søge efter opdateringer automatisk? Du kan altid søge efter opdateringer manuelt fra programmets menu."; - -"Update Error!" = "Der opstod en fejl!"; - -"Updating %@" = "Opdaterer %@"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." = "Du har den seneste version af %@."; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "Der er ingen opdateringer"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ -"Learn More..." = "Læs mere…"; - diff --git a/Frameworks/Sparkle/Sparkle/de.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/de.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 0bc4fc975..000000000 --- a/Frameworks/Sparkle/Sparkle/de.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/de.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/de.lproj/SUUpdateAlert.xib deleted file mode 100644 index 0b661de8b..000000000 --- a/Frameworks/Sparkle/Sparkle/de.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/de.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/de.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 5c108c355..000000000 --- a/Frameworks/Sparkle/Sparkle/de.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Das anonymisierte Systemprofil unterstützt uns bei der zukünftigen Entwicklung. Bitte kontaktieren Sie uns, wenn Sie Fragen hierzu haben. - -Diese Informationen würden an uns gesendet: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/de.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/de.lproj/Sparkle.strings deleted file mode 100644 index 056741904..000000000 --- a/Frameworks/Sparkle/Sparkle/de.lproj/Sparkle.strings +++ /dev/null @@ -1,75 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ wurde heruntergeladen und steht zur Verwendung bereit! Möchten Sie %1$@ jetzt durch die neue Version ersetzen und neu starten?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kann nicht aktualisiert werden, wenn es von einem Volumen ohne Schreibzugriff (z.B. Disk Image oder CD/DVD) gestartet wurde. Kopieren Sie %1$@ in den Programme Ordner, aktualisieren Sie es von dort."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ ist zur Zeit die neueste verfügbare Version."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ ist verfügbar (Sie verwenden Version %3$@). Möchten Sie die neue Version jetzt herunterladen?"; - -"%@ downloaded" = "%@ heruntergeladen"; - -"%@ of %@" = "%1$@ von %2$@"; - -"A new version of %@ is available!" = "Eine neue Version von %@ ist verfügbar!"; - -"A new version of %@ is ready to install!" = "Eine neue Version von %@ ist zur Installation bereit!"; - -"An error occurred in retrieving update information. Please try again later." = "Bei der Aktualisierung trat ein Fehler auf. Bitte versuchen Sie es später erneut."; - -"An error occurred while downloading the update. Please try again later." = "Beim Herunterladen ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."; - -"An error occurred while extracting the archive. Please try again later." = "Beim Entpacken der Daten ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."; - -"An error occurred while installing the update. Please try again later." = "Bei der Installation der Aktualisierung ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."; - -"An error occurred while parsing the update feed." = "Beim Lesen der Aktualisierungsinformationen ist ein Fehler aufgetreten."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Beim erneuten Starten von %1$@ ist ein Fehler aufgetreten. Die neue Version von %1$@ steht beim nächsten Programmstart zur Verfügung."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Abbrechen"; - -"Cancel Update" = "Aktualisierung abbrechen"; - -"Checking for updates..." = "Suche nach Aktualisierungen…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Aktualisierung wird heruntergeladen…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Aktualisierung entpacken…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Installieren und erneut starten"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Aktualisierung installieren…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Bereit zum Installieren"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Soll %1$@ automatisch nach Aktualisierungen suchen? Sie können im %1$@-Menü auch manuell nach Aktualisierungen suchen."; - -"Update Error!" = "Fehler beim Aktualisieren!"; - -"Updating %@" = "Aktualisierung von %@"; - -"You already have the newest version of %@." = "Sie haben bereits die neueste Version von %@."; - -"You're up-to-date!" = "Sie sind auf dem neuesten Stand!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "Mehr über…"; diff --git a/Frameworks/Sparkle/Sparkle/el.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/el.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 634566a28..000000000 --- a/Frameworks/Sparkle/Sparkle/el.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/el.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/el.lproj/SUUpdateAlert.xib deleted file mode 100644 index 83fe668cc..000000000 --- a/Frameworks/Sparkle/Sparkle/el.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/el.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/el.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 832b7112d..000000000 --- a/Frameworks/Sparkle/Sparkle/el.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Το ανώνυμο προφίλ συστήματος χρησιμοποιείται για να μας βοηθήσει σε μελλοντική ανάπτυξη του προγράμματος. Παρακαλώ επικοινωνήστε μαζί μας άν έχετε ερωτήσεις. - -Αυτές είναι οι πληροφορίες που θα σταλούν: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/el.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/el.lproj/Sparkle.strings deleted file mode 100644 index dca6fa5c9..000000000 --- a/Frameworks/Sparkle/Sparkle/el.lproj/Sparkle.strings +++ /dev/null @@ -1,71 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "Το %1$@ %2$@ έχει ληφθεί και είναι έτοιμο προς χρήση! Θα θέλατε να το εγκαταστήσετε και να επανεκκινήσετε το %1$@ τώρα;"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "Το %1$@ δεν μπορεί να ενημερωθεί όσο τρέχει από έναν δίσκο ανάγνωσης-μόνο ή έναν οπτικό δίσκο. Μεταφέρετε το %1$@ στον φάκελο εφαρμογών σας, επανεκκινήστε το από εκεί, και ξαναδοκιμάστε."; - -"%@ %@ is currently the newest version available." = "Το %1$@ %2$@ είναι η τελευταία διαθέσιμη έκδοση."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "Το %1$@ %2$@ είναι πλέον διαθέσιμο--έχετε το %3$@. Θέλετε να το κατεβάσετε τώρα;"; - -"%@ downloaded" = "%@ λήφθησαν"; - -"%@ of %@" = "%1$@ από %2$@"; - -"A new version of %@ is available!" = "Μία νέα έκδοση του %@ είναι διαθέσιμη!"; - -"A new version of %@ is ready to install!" = "Μία νέα έκδοση του %@ είναι έτοιμη για εγκατάσταση!"; - -"An error occurred in retrieving update information. Please try again later." = "Υπήρξε ένα σφάλμα κατά την ανάκτηση των πληροφοριών ενημέρωσης. Παρακαλώ δοκιμάστε αργότερα."; - -"An error occurred while downloading the update. Please try again later." = "Υπήρξε ένα σφάλμα κατά την λήψη της ενημέρωσης. Παρακαλώ δοκιμάστε αργότερα."; - -"An error occurred while extracting the archive. Please try again later." = "Υπήρξε ένα σφάλμα κατά την εξαγωγή του αρχείου. Παρακαλώ δοκιμάστε αργότερα."; - -"An error occurred while installing the update. Please try again later." = "Υπήρξε ένα σφάλμα κατά την εγκατάσταση της ενημέρωσης. Παρακαλώ δοκιμάστε αργότερα."; - -"An error occurred while parsing the update feed." = "Υπήρξε ένα σφάλμα κατά την ανάλυση του feed ενημερώσεων."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Υπήρξε ένα σφάλμα κατά την επανεκκίνηση του %1$@, αλλά η νέα έκδοση θα είναι διαθέσιμη την επόμενη φορά που θα τρέξετε το %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Ακύρωση"; - -"Cancel Update" = "Ακύρωση Ενημέρωσης"; - -"Checking for updates..." = "Έλεγχος για ενημερώσεις..."; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Λήψη ενημέρωσης..."; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Εξαγωγή ενημέρωσης..."; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Εγκατάσταση και Επανεκκίνηση"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Εγκατάσταση ενημέρωσης..."; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Έτοιμο προς Εγκατάσταση"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Θέλετε το %1$@ να ελέγχει αυτόματα για ενημερώσεις; Μπορείτε πάντα να ελέγχετε για ενημερώσεις χειροκίνητα από το μενού %1$@."; - -"Update Error!" = "Σφάλμα Ενημέρωσης!"; - -"Updating %@" = "Ενημέρωση %@"; - -"You already have the newest version of %@." = "Έχετε ήδη την τελευταία έκδοση του %@."; - -"You're up-to-date!" = "Είστε ενημερωμένοι!"; - diff --git a/Frameworks/Sparkle/Sparkle/en.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/en.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index c707f6c3b..000000000 --- a/Frameworks/Sparkle/Sparkle/en.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdateAlert.xib deleted file mode 100644 index c1178be9d..000000000 --- a/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index c110598fb..000000000 --- a/Frameworks/Sparkle/Sparkle/en.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. - -This is the information that would be sent: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/en.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/en.lproj/Sparkle.strings deleted file mode 100644 index 50c54b029..000000000 --- a/Frameworks/Sparkle/Sparkle/en.lproj/Sparkle.strings +++ /dev/null @@ -1,85 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! This is an important update; would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ has been downloaded and is ready to use! This is an important update; would you like to install it and relaunch %1$@ now?"; - -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ can’t be updated when it’s running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ is currently the newest version available."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ is now available—you have %3$@. Would you like to download it now?"; - -"%@ downloaded" = "%@ downloaded"; - -"%@ of %@" = "%1$@ of %2$@"; - -"A new version of %@ is available!" = "A new version of %@ is available!"; - -"A new version of %@ is ready to install!" = "A new version of %@ is ready to install!"; - -"An error occurred in retrieving update information. Please try again later." = "An error occurred in retrieving update information. Please try again later."; - -"An error occurred while downloading the update. Please try again later." = "An error occurred while downloading the update. Please try again later."; - -"An error occurred while extracting the archive. Please try again later." = "An error occurred while extracting the archive. Please try again later."; - -"An error occurred while installing the update. Please try again later." = "An error occurred while installing the update. Please try again later."; - -"An error occurred while parsing the update feed." = "An error occurred while parsing the update feed."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@."; - -"An important update to %@ is ready to install" = "An important update to %@ is ready to install"; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Cancel"; - -"Cancel Update" = "Cancel Update"; - -"Checking for updates..." = "Checking for updates…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Downloading update…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Extracting update…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Install and Relaunch"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Installing update…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ -"Learn More..." = "Learn More…"; - -/* the unit for megabytes */ -"MB" = "MB"; - -/* OK button. */ -"OK" = "OK"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "Ready to Install"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu."; - -"The update is improperly signed." = "The update is improperly signed."; - -"Update Error!" = "Update Error!"; - -"Updating %@" = "Updating %@"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." = "You already have the newest version of %@."; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "You’re up-to-date!"; diff --git a/Frameworks/Sparkle/Sparkle/es.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/es.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 98a58ab89..000000000 --- a/Frameworks/Sparkle/Sparkle/es.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/es.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/es.lproj/SUUpdateAlert.xib deleted file mode 100644 index 551ac126f..000000000 --- a/Frameworks/Sparkle/Sparkle/es.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/es.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/es.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 9c0f5ae87..000000000 --- a/Frameworks/Sparkle/Sparkle/es.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - La información de perfil de sistema anónimo se usa para ayudarnos a planear el trabajo de desarrollo futuro. Por favor, póngase en cantacto con nosotros si tiene preguntas sobre esto. - -Esta es la información que se nos enviaría: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/es.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/es.lproj/Sparkle.strings deleted file mode 100644 index 12eb5b46a..000000000 --- a/Frameworks/Sparkle/Sparkle/es.lproj/Sparkle.strings +++ /dev/null @@ -1,75 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ se han descargado y están listos para utilizar. ¿Le gustaría instalar e iniciar %1$@ ahora?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ no se puede actualizar cuando se ejecuta desde un volumen de sólo lectura como imagen de disco o medio óptico. Mueva %1$@ a su carpeta de Aplicaciones y trate de iniciarlo desde allí."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ es la última versión disponible."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ está disponible (usted tiene la %3$@). ¿Desea descargarla ahora?"; - -"%@ downloaded" = "%@ descargado"; - -"%@ of %@" = "%1$@ de %2$@"; - -"A new version of %@ is available!" = "¡Hay una nueva versión de %@ !"; - -"A new version of %@ is ready to install!" = "¡Una versión nueva de %@ está lista para instalar!"; - -"An error occurred in retrieving update information. Please try again later." = "Ocurrió un error al recopilar información sobre la actualización. Por favor, inténtelo de nuevo más tarde."; - -"An error occurred while downloading the update. Please try again later." = "Ocurrió un error mientras se descargaba la actualización. Por favor intente de nuevo más tarde."; - -"An error occurred while extracting the archive. Please try again later." = "Ocurrió un error al extraer el archivo. Por favor, inténtelo de nuevo más tarde."; - -"An error occurred while installing the update. Please try again later." = "Ocurrió un error mientras se instalaba la actualización. Por favor intente de nuevo más tarde."; - -"An error occurred while parsing the update feed." = "Ocurrió un error mientras se analizaba la entrada de la actualización."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Ocurrió un error mientras se re-iniciaba %1$@, pero la nueva versión estará disponible la próxima vez que ejecute %1$@."; - -/* the unit for bytes */ -"B" = "O"; - -"Cancel" = "Cancelar"; - -"Cancel Update" = "Cancelar actualización"; - -"Checking for updates..." = "Buscando actualizaciones …"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Descargando actualización…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Extrayendo actualización…"; - -/* the unit for gigabytes */ -"GB" = "GO"; - -"Install and Relaunch" = "Instalar y volver a arrancar"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Instalando actualización…"; - -/* the unit for kilobytes */ -"KB" = "KO"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Preparado para instalar"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "¿Debería automáticamente %1$@ buscar las actualizaciones? Puede hacerlo también manualmente desde el menú %1$@."; - -"Update Error!" = "¡Error de actualización!"; - -"Updating %@" = "Actualizando %@"; - -"You already have the newest version of %@." = "Ya tiene la versión más reciente de %@."; - -"You're up-to-date!" = "Ya tiene la versión más reciente"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "Más información…"; diff --git a/Frameworks/Sparkle/Sparkle/fi.lproj/SUAutomaticUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/fi.lproj/SUAutomaticUpdateAlert.strings deleted file mode 100644 index 76e07e10c..000000000 --- a/Frameworks/Sparkle/Sparkle/fi.lproj/SUAutomaticUpdateAlert.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* NSWindow () : (oid:5) */ -"" = ""; - -/* NSButton (Automatically download and install updates in the future) : (oid:17) */ -"Automatically download and install updates in the future" = "Hae ja asenna päivitykset jatkossa automaattisesti"; - -/* NSButton (Relaunch Later) : (oid:16) */ -"Relaunch Later" = "Käynnistä uudelleen myöhemmin"; - -/* NSButton (Relaunch Now) : (oid:15) */ -"Relaunch Now" = "Käynnistä uudelleen nyt"; - diff --git a/Frameworks/Sparkle/Sparkle/fi.lproj/SUUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/fi.lproj/SUUpdateAlert.strings deleted file mode 100644 index 471de4aaf..000000000 --- a/Frameworks/Sparkle/Sparkle/fi.lproj/SUUpdateAlert.strings +++ /dev/null @@ -1,18 +0,0 @@ -/* NSButton (Automatically download and install updates in the future) : (oid:92) */ -"Automatically download and install updates in the future" = "Hae ja asenna päivitykset jatkossa automaattisesti"; - -/* NSButton (Install Update) : (oid:76) */ -"Install Update" = "Asenna päivitys"; - -/* NSTextField (Release Notes:) : (oid:17) */ -"Release Notes:" = "Tietoa päivityksestä:"; - -/* NSButton (Remind Me Later) : (oid:22) */ -"Remind Me Later" = "Muistuta myöhemmin"; - -/* NSButton (Skip This Version) : (oid:23) */ -"Skip This Version" = "Ohita tämä versio"; - -/* NSWindow (Software Update) : (oid:5) */ -"Software Update" = "Ohjelmiston pävitys"; - diff --git a/Frameworks/Sparkle/Sparkle/fi.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/fi.lproj/Sparkle.strings deleted file mode 100644 index f57a8b5ad..000000000 --- a/Frameworks/Sparkle/Sparkle/fi.lproj/Sparkle.strings +++ /dev/null @@ -1,52 +0,0 @@ -"%@ of %@" = "%1$@ / %2$@"; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%1$@ %2$@ on asennettu ja on valmiina käyttöön seuraavan kerran kun %3$@ käynnistetään! Haluatko käynnistää ohjelman uudelleen?"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ on uusin saatavilla oleva versio."; - -"%@ %@ is now available (you have %@). Would you like to download it now?" = "%1$@ %2$@ on nyt saatavilla (sinulla on %3$@). Haluatko ladata sen nyt?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "Käyttäjällä %@ ei ole oikeuksia ohjelman kansioon! Ajatko ohjelmaa levytiedostosta? Jos et, kysy apua järjestelmän ylläpitäjältä."; - -"A new version of %@ has been installed!" = "Uusi versio ohjelmasta %@ on asennettu!"; - -"A new version of %@ is available!" = "Uusi versio ohjelmasta %@ on saatavilla!"; - -"An error occurred during installation. Please try again later." = "Asennuksen yhteydessä tapahtui virhe. Yritä myöhemmin uudelleen."; - -"An error occurred in retrieving update information. Please try again later." = "Päivitystietojen haussa tapahtui virhe. Yritä myöhemmin uudelleen."; - -"An error occurred while extracting the archive. Please try again later." = "Pakkauksen purkamisen yhteydessä tapahtui virhe. Yritä myöhemmin uudelleen."; - -"An error occurred while trying to download the file. Please try again later." = "Tiedoston haussa tapahtui virhe. Yritä myöhemmin uudelleen."; - -"An update is already in progress!" = "Päivitys on jo menossa!"; - -"Cancel" = "Kumoa"; - -"Check for updates on startup?" = "Tarkista päivityksiä käynnistyksen yhteydessä?"; - -"Downloading update..." = "Haen päivitystä…"; - -"Extracting update..." = "Puran päivitystä…"; - -"Install and Relaunch" = "Asenna ja käynnistä ohjelma uudelleen"; - -"Installing update..." = "Asennan päivityksen…"; - -"No" = "Ei"; - -"OK" = "OK"; - -"Ready to Install" = "Valmiina asentamaan"; - -"Update Error!" = "Virhe päivityksessä!"; - -"Updating %@" = "Päivitän %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu." = "Haluatko tarkistaa päivitykset ohjelmaan %@ käynnistyksen yhteydessä? Jos et, voit käynnnistää tarkistuksen käsin ohjelmavalikosta."; - -"Yes" = "Kyllä"; - -"You're up to date!" = "Sinulla on viimeisin versio!"; - diff --git a/Frameworks/Sparkle/Sparkle/fr.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/fr.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index eb32a008f..000000000 --- a/Frameworks/Sparkle/Sparkle/fr.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdateAlert.xib deleted file mode 100644 index 60a7add4d..000000000 --- a/Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 347ec9a85..000000000 --- a/Frameworks/Sparkle/Sparkle/fr.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Les informations anonymes de profil système nous aident à planifier les futurs développements. Contactez-nous pour toute question à ce sujet. - -Ci-dessous figurent les informations qui seront transmises : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/fr.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/fr.lproj/Sparkle.strings deleted file mode 100644 index 7ab704c3a..000000000 --- a/Frameworks/Sparkle/Sparkle/fr.lproj/Sparkle.strings +++ /dev/null @@ -1,77 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ a été téléchargé. Voulez-vous l’installer et relancer %1$@ maintenant ?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ ne peut pas être mis à jour quand il fonctionne à partir d’un volume en lecture seule, comme une image disque ou un lecteur optique. Déplacez %1$@ dans votre dossier Applications, relancez-le à partir de là et réessayez."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ est la version la plus récente disponible."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ est disponible ; vous utilisez la version %3$@. Voulez-vous le télécharger maintenant ?"; - -"%@ downloaded" = "%@ téléchargé"; - -"%@ of %@" = "%1$@ sur %2$@"; - -"A new version of %@ is available!" = "Une nouvelle version de %@ est disponible !"; - -"A new version of %@ is ready to install!" = "Une nouvelle version de %@ est prête à être installée !"; - -"An error occurred in retrieving update information. Please try again later." = "Une erreur est survenue en récupérant les informations de mise à jour. Veuillez réessayer plus tard."; - -"An error occurred while downloading the update. Please try again later." = "Une erreur est survenue pendant le téléchargement de la mise à jour. Veuillez réessayer plus tard."; - -"An error occurred while extracting the archive. Please try again later." = "Une erreur est survenue pendant l’extraction des données de l’archive. Veuillez réessayer plus tard."; - -"An error occurred while installing the update. Please try again later." = "Une erreur est survenue pendant l’installation de la mise à jour. Veuillez réessayer plus tard."; - -"An error occurred while parsing the update feed." = "Une erreur est survenue pendant l’analyse de la mise à jour."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Une erreur est survenue en relançant %1$@, mais la nouvelle version sera disponible à la prochaine ouverture de %1$@."; - -/* the unit for bytes */ -"B" = "octets"; - -"Cancel" = "Annuler"; - -"Cancel Update" = "Annuler la mise à jour"; - -"Checking for updates..." = "Recherche de mises à jour…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Téléchargement de la mise à jour…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Extraction de la mise à jour…"; - -/* the unit for gigabytes */ -"GB" = "Go"; - -"Install and Relaunch" = "Installer et relancer"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Installation de la mise à jour…"; - -/* the unit for kilobytes */ -"KB" = "ko"; - -/* the unit for megabytes */ -"MB" = "Mo"; - -"OK" = "OK"; - -"Ready to Install" = "Prêt pour l’installation"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "%1$@ doit-il rechercher automatiquement les mises à jour ? La mise à jour est toujours possible manuellement depuis le menu %1$@."; - -"Update Error!" = "Erreur pendant la mise à jour !"; - -"Updating %@" = "Mise à jour de %@"; - -"You already have the newest version of %@." = "Vous possédez déjà la version la plus récente de %@."; - -"You're up-to-date!" = "Votre logiciel est à jour !"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "En savoir plus…"; - -"The update is improperly signed." = "La signature numérique de la mise à jour est incorrecte"; diff --git a/Frameworks/Sparkle/Sparkle/he.lproj/SUAutomaticUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/he.lproj/SUAutomaticUpdateAlert.strings deleted file mode 100644 index 5b3391b21..000000000 --- a/Frameworks/Sparkle/Sparkle/he.lproj/SUAutomaticUpdateAlert.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* NSWindow () : (oid:5) */ -"" = ""; - -/* NSButton (Automatically download and install updates in the future) : (oid:17) */ -"Automatically download and install updates in the future" = "הורד והתקן עדכונים אוטומטית גם בעתיד"; - -/* NSButton (Relaunch Later) : (oid:16) */ -"Relaunch Later" = "אתחל מאוחר יותר"; - -/* NSButton (Relaunch Now) : (oid:15) */ -"Relaunch Now" = "אתחל עכשיו"; - diff --git a/Frameworks/Sparkle/Sparkle/he.lproj/SUUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/he.lproj/SUUpdateAlert.strings deleted file mode 100644 index f6debba97..000000000 --- a/Frameworks/Sparkle/Sparkle/he.lproj/SUUpdateAlert.strings +++ /dev/null @@ -1,18 +0,0 @@ -/* NSButton (Automatically download and install updates in the future) : (oid:92) */ -"Automatically download and install updates in the future" = "הורד והתקן עדכונים אוטומטית גם בעתיד"; - -/* NSButton (Install Update) : (oid:76) */ -"Install Update" = "התקן עדכון"; - -/* NSTextField (Release Notes:) : (oid:17) */ -"Release Notes:" = "פרטי גרסה:"; - -/* NSButton (Remind Me Later) : (oid:22) */ -"Remind Me Later" = "הזכר לי מאוחר יותר"; - -/* NSButton (Skip This Version) : (oid:23) */ -"Skip This Version" = "דלג על גרסה זו"; - -/* NSWindow (Software Update) : (oid:5) */ -"Software Update" = "עדכון תכנה"; - diff --git a/Frameworks/Sparkle/Sparkle/he.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/he.lproj/Sparkle.strings deleted file mode 100644 index 0d2aa275a..000000000 --- a/Frameworks/Sparkle/Sparkle/he.lproj/Sparkle.strings +++ /dev/null @@ -1,52 +0,0 @@ -"%@ of %@" = "%1$@ of %2$@"; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%1$@ %2$@ הותקנה ותהיה מוכנה לפעולה בפעם הבאה שתריץ את %3$@ ! ברצונך לאתחל?"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ היא הגרסה האחונה הזמינה."; - -"%@ %@ is now available (you have %@). Would you like to download it now?" = "%1$@ %2$@ זמין כעת (לך יש %3$@). ברצונך להוריד כעת?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "ל %@ אין הרשאה לכתוב לתקיית התוכניות! האם אתה פועל מ- disc image? אם לא, בקש עזרה ממנהל הרשת."; - -"A new version of %@ has been installed!" = "גרסה חדשה של %@ הותקנה!"; - -"A new version of %@ is available!" = "גרסה חדשה של %@ זמינה!"; - -"An error occurred during installation. Please try again later." = "שגיאה בהתקנה. אנא נסה שנית במועד מרוחר יותר."; - -"An error occurred in retrieving update information. Please try again later." = "שגיאה בקבלת מידע על עדכונים. אנא נסה שנית במועד מרוחר יותר."; - -"An error occurred while extracting the archive. Please try again later." = "שגיאה בפתיחת הקובת המקווץ. אנא נסה שנית במועד מרוחר יותר."; - -"An error occurred while trying to download the file. Please try again later." = "שגיאה בהורדת הקובץ. אנא נסה שנית במועד מאוחר יותר."; - -"An update is already in progress!" = "עדכון כבר מתבצע"; - -"Cancel" = "ביטול"; - -"Check for updates on startup?" = "לבדוק עדכונים באתחול?"; - -"Downloading update..." = "מוריד עדכון…"; - -"Extracting update..." = "פותח עדכון…"; - -"Install and Relaunch" = "התקן ואתחל"; - -"Installing update..." = "מתקין עידכון…"; - -"No" = "לא"; - -"OK" = "אישור"; - -"Ready to Install" = "מוכן להתקנה!"; - -"Update Error!" = "שגיאה בעדכון!"; - -"Updating %@" = "מעדכן %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu." = "האם ברצונך ש%@ יבדוק עדכונים באתחול? אם לא, תוכל לבדוק ידנית מתפריט התכנה."; - -"Yes" = "כן"; - -"You're up to date!" = "התכנה עדכנית!"; - diff --git a/Frameworks/Sparkle/Sparkle/hu.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/hu.lproj/Sparkle.strings deleted file mode 100644 index a9b47b259..000000000 --- a/Frameworks/Sparkle/Sparkle/hu.lproj/Sparkle.strings +++ /dev/null @@ -1,52 +0,0 @@ -"%@ of %@" = "%1$@ of %2$@"; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%1$@ %2$@ has been installed and will be ready to use next time %3$@ starts! Would you like to relaunch now?"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ is currently the newest version available."; - -"%@ %@ is now available (you have %@). Would you like to download it now?" = "%1$@ %2$@ is now available (you have %3$@). Would you like to download it now?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help."; - -"A new version of %@ has been installed!" = "A new version of %@ has been installed!"; - -"A new version of %@ is available!" = "A new version of %@ is available!"; - -"An error occurred during installation. Please try again later." = "An error occurred during installation. Please try again later."; - -"An error occurred in retrieving update information. Please try again later." = "An error occurred in retrieving update information. Please try again later."; - -"An error occurred while extracting the archive. Please try again later." = "An error occurred while extracting the archive. Please try again later."; - -"An error occurred while trying to download the file. Please try again later." = "An error occurred while trying to download the file. Please try again later."; - -"An update is already in progress!" = "An update is already in progress!"; - -"Cancel" = "Cancel"; - -"Check for updates on startup?" = "Check for updates on startup?"; - -"Downloading update..." = "Downloading update…"; - -"Extracting update..." = "Extracting update…"; - -"Install and Relaunch" = "Install and Relaunch"; - -"Installing update..." = "Installing update…"; - -"No" = "No"; - -"OK" = "OK"; - -"Ready to Install" = "Ready to Install"; - -"Update Error!" = "Update Error!"; - -"Updating %@" = "Updating %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu." = "Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu."; - -"Yes" = "Yes"; - -"You're up to date!" = "You're up to date!"; - diff --git a/Frameworks/Sparkle/Sparkle/id.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/id.lproj/Sparkle.strings deleted file mode 100644 index a9b47b259..000000000 --- a/Frameworks/Sparkle/Sparkle/id.lproj/Sparkle.strings +++ /dev/null @@ -1,52 +0,0 @@ -"%@ of %@" = "%1$@ of %2$@"; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%1$@ %2$@ has been installed and will be ready to use next time %3$@ starts! Would you like to relaunch now?"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ is currently the newest version available."; - -"%@ %@ is now available (you have %@). Would you like to download it now?" = "%1$@ %2$@ is now available (you have %3$@). Would you like to download it now?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help."; - -"A new version of %@ has been installed!" = "A new version of %@ has been installed!"; - -"A new version of %@ is available!" = "A new version of %@ is available!"; - -"An error occurred during installation. Please try again later." = "An error occurred during installation. Please try again later."; - -"An error occurred in retrieving update information. Please try again later." = "An error occurred in retrieving update information. Please try again later."; - -"An error occurred while extracting the archive. Please try again later." = "An error occurred while extracting the archive. Please try again later."; - -"An error occurred while trying to download the file. Please try again later." = "An error occurred while trying to download the file. Please try again later."; - -"An update is already in progress!" = "An update is already in progress!"; - -"Cancel" = "Cancel"; - -"Check for updates on startup?" = "Check for updates on startup?"; - -"Downloading update..." = "Downloading update…"; - -"Extracting update..." = "Extracting update…"; - -"Install and Relaunch" = "Install and Relaunch"; - -"Installing update..." = "Installing update…"; - -"No" = "No"; - -"OK" = "OK"; - -"Ready to Install" = "Ready to Install"; - -"Update Error!" = "Update Error!"; - -"Updating %@" = "Updating %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu." = "Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu."; - -"Yes" = "Yes"; - -"You're up to date!" = "You're up to date!"; - diff --git a/Frameworks/Sparkle/Sparkle/is.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/is.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 1e8542ec9..000000000 --- a/Frameworks/Sparkle/Sparkle/is.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/is.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/is.lproj/SUUpdateAlert.xib deleted file mode 100644 index 6dba3438f..000000000 --- a/Frameworks/Sparkle/Sparkle/is.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/is.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/is.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index af4e9524e..000000000 --- a/Frameworks/Sparkle/Sparkle/is.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Upplýsingar úr nafnlausum kerfisskýrslum eru notaðar til að hjálpa okkur við framtíðarþróun hugbúnaðarins. Ekki hika við að hafa samband ef spurningar vakna um þetta. - -Þetta eru upplýsingarnar sem yrðu sendar: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/is.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/is.lproj/Sparkle.strings deleted file mode 100644 index da6f2c63a..000000000 --- a/Frameworks/Sparkle/Sparkle/is.lproj/Sparkle.strings +++ /dev/null @@ -1,52 +0,0 @@ -"%@ of %@" = "%@ af %@"; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%@ %@ hefur verið sett inn og verður tiltækt við næstu ræsingu %@. Viltu endurræsa núna?"; - -"%@ %@ is currently the newest version available." = "%@ %@ er nýjasta útgáfan sem er fáanleg þessa stundina."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "Útgafa %2$@ af %1$@ er nú fáanlegt en þú ert með %3$@. Viltu sækja hana núna?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "%@ hefur ekki heimild til að skrifa í möppu forritsins! Ertu að keyra forritið af diskmynd? Ef ekki skaltu ráðfæra þig við kerfisstjórann."; - -"A new version of %@ has been installed!" = "Ný útgáfa af %@ hefur verið sett inn!"; - -"A new version of %@ is available!" = "Ný útgáfa af %@ er fáanleg!"; - -"An error occurred during installation. Please try again later." = "Villa kom upp við innsetningu. Vinsamlegast reynið síðar."; - -"An error occurred in retrieving update information. Please try again later." = "Villa kom upp við að sækja uppfærsluupplýsingar. Vinsamlegast reynið síðar."; - -"An error occurred while extracting the archive. Please try again later." = "Villa kom upp við afþjöppun skráarsafns. Vinsamlegast reynið síðar."; - -"An error occurred while trying to download the file. Please try again later." = "Villa kom upp þegar reynt var að sækja skrána. Vinsamlegast reynið síðar"; - -"An update is already in progress!" = "Uppfærsla er þegar í gangi!"; - -"Cancel" = "Hætta við"; - -"Check for updates on startup?" = "Athuga með uppfærslur í ræsingu?"; - -"Downloading update..." = "Sækja nýja útgáfu…"; - -"Extracting update..." = "Afþjappa uppfærslu…"; - -"Install and Relaunch" = "Setja upp og ræsa aftur"; - -"Installing update..." = "Set inn uppfærslu…"; - -"Ready to Install" = "Innsetning reiðubúin"; - -"No" = "Nei"; - -"OK" = "Í lagi"; - -"Update Error!" = "Villa við uppfærslu!"; - -"Updating %@" = "Uppfæri %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the %@ menu." = "Viltu að forritið %@ athugi með uppfærslur þegar það er ræst? Ef ekki getur þú athugað handvirkt af %@-valblaðinu."; - -"Yes" = "Já"; - -"You're up to date!" = "Það er allt uppfært hjá þér!"; - diff --git a/Frameworks/Sparkle/Sparkle/it.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/it.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 30f0c8660..000000000 --- a/Frameworks/Sparkle/Sparkle/it.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/it.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/it.lproj/SUUpdateAlert.xib deleted file mode 100644 index 79b06d5bc..000000000 --- a/Frameworks/Sparkle/Sparkle/it.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/it.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/it.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 582aa13c7..000000000 --- a/Frameworks/Sparkle/Sparkle/it.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Le informazioni del profilo di sistema anomino sono utilizzate per aiutarci in futuri lavori di sviluppo. Contattaci se hai dei quesiti sull’argomento. - -Queste sono le informazioni che verrebbero inviate: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/it.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/it.lproj/Sparkle.strings deleted file mode 100644 index 096e6caab..000000000 --- a/Frameworks/Sparkle/Sparkle/it.lproj/Sparkle.strings +++ /dev/null @@ -1,75 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ è stato scaricato ed è pronto per essere utilizzato! Desideri installare e riavviare %1$@ ora?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "Impossibile aggiornare %1$@ quando viene eseguito da un volume di sola lettura come un’immagine disco o un’unità ottica. Spostare %1$@ nella Cartella Applicazioni, riavviarlo e riprovare."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ è la versione più recente attualmente disponibile."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ è disponbile; disponi della versione %3$@. Desideri eseguire l’aggiornamento ora?"; - -"%@ downloaded" = "%@ scaricato"; - -"%@ of %@" = "%1$@ di %2$@"; - -"A new version of %@ is available!" = "E’ disponibile una nuova versione di %@!"; - -"A new version of %@ is ready to install!" = "Una nuova versione di %@ è pronta per essere installata!"; - -"An error occurred in retrieving update information. Please try again later." = "Si è verificato un errore durante il recupero delle informazioni sull’aggiornamento. Riprova in seguito."; - -"An error occurred while downloading the update. Please try again later." = "Si è verificato un errore durante lo scaricamento dell’aggiornamento. Riprova in seguito."; - -"An error occurred while extracting the archive. Please try again later." = "Si è verificato un errore durante l’estrazione dell’archivio. Riprova in seguito."; - -"An error occurred while installing the update. Please try again later." = "Si è verificato un errore durante l’installazione dell’aggiornamento. Riprova in seguito."; - -"An error occurred while parsing the update feed." = "Si è verificato un errore durante la lettura del feed di aggiornamento."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Si è verificato un errore al riavvio di %1$@. La nuova versione sarà comunque disponibile alla prossima esecuzione di %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Annulla"; - -"Cancel Update" = "Annulla Aggiornamento"; - -"Checking for updates..." = "Controllo aggiornamenti in corso…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Scaricamento dell’aggiornamento…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Estrazione dell’aggiornamento…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Installa e Riavvia"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Installazione aggiornamento in corso…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Pronto per l’installazione"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Desideri che %1$@ verifichi gli aggiornamenti automaticamente? Puoi effettuare la verifica manualmente dal menu di %1$@."; - -"Update Error!" = "Errore di Aggiornamento!"; - -"Updating %@" = "Aggiornamento di %@"; - -"You already have the newest version of %@." = "Disponi della versione più recente di %@."; - -"You're up-to-date!" = "La tua applicazione è aggiornata!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "Ulteriori informazioni…"; diff --git a/Frameworks/Sparkle/Sparkle/ja.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ja.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index b9afe24a4..000000000 --- a/Frameworks/Sparkle/Sparkle/ja.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdateAlert.xib deleted file mode 100644 index 675fd050b..000000000 --- a/Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 0648c96b9..000000000 --- a/Frameworks/Sparkle/Sparkle/ja.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - 匿名のシステムプロファイル情報は、今後我が社の企画開発を計画する上で参考にさせていただきます。この件に関してご質問があれば、ご連絡下さい。 - -以下の情報を送信してください: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ja.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/ja.lproj/Sparkle.strings deleted file mode 100644 index dfe98beed..000000000 --- a/Frameworks/Sparkle/Sparkle/ja.lproj/Sparkle.strings +++ /dev/null @@ -1,85 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! This is an important update; would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ がダウンロードされました! これは重要なアップデートです。今すぐ %1$@ をインストールして再起動しますか?"; - -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ がダウンロードされました! 今すぐ %1$@ をインストールして再起動しますか?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ は、ディスクイメージや光学式ドライブなどの読み出し専用ボリュームから起動している場合アップデートできません。%1$@ をアプリケーションフォルダに移動し、そこから再起動したあとやり直してください。"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ は現在入手できる最新バージョンです。"; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ が入手できます(使用中のバージョンは %3$@ です)。今すぐダウンロードしますか?"; - -"%@ downloaded" = "%@ ダウンロード済み"; - -"%@ of %@" = "%1$@ / %2$@"; - -"A new version of %@ is available!" = "新しいバージョンの %@ が入手できます!"; - -"A new version of %@ is ready to install!" = "新しいバージョンの %@ が今すぐインストールできます!"; - -"An error occurred in retrieving update information. Please try again later." = "アップデート情報の取得中にエラーが発生しました。あとでやり直してください。"; - -"An error occurred while downloading the update. Please try again later." = "アップデートをダウンロード中にエラーが発生しました。あとでやり直してください。"; - -"An error occurred while extracting the archive. Please try again later." = "アーカイブの展開中にエラーが発生しました。あとでやり直してください。"; - -"An error occurred while installing the update. Please try again later." = "アップデートをインストール中にエラーが発生しました。あとでやり直してください。"; - -"An error occurred while parsing the update feed." = "アップデートフィードを解析中にエラーが発生しました。"; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "%1$@ を再起動中にエラーが発生しましたが、次回 %1$@ の実行時に新しいバージョンが利用できます。"; - -"An important update to %@ is ready to install" = "%@ の重要なアップデートがインストールできます。"; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "キャンセル"; - -"Cancel Update" = "アップデートを中止"; - -"Checking for updates..." = "アップデートを確認しています…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "アップデートをダウンロードしています…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "アップデートを展開しています…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "インストールして再起動"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "アップデートをインストールしています…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ -"Learn More..." = "詳しい情報…"; - -/* the unit for megabytes */ -"MB" = "MB"; - -/* OK button. */ -"OK" = "OK"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "インストールできます"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = " %1$@ のアップデートを自動で確認しますか? アップデートは %1$@ メニューから手動でいつでも確認することができます。"; - -"The update is improperly signed." = "このアップデートは無効な署名が含まれています。"; - -"Update Error!" = "アップデートエラー!"; - -"Updating %@" = "%@ をアップデート中"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." = "すでに最新バージョンの %@ を使用しています。"; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "最新版を使用しています!"; diff --git a/Frameworks/Sparkle/Sparkle/ko.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ko.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 8797c38ab..000000000 --- a/Frameworks/Sparkle/Sparkle/ko.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdateAlert.xib deleted file mode 100644 index 4cddbc2a9..000000000 --- a/Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 9c8d5110f..000000000 --- a/Frameworks/Sparkle/Sparkle/ko.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - 익명으로 보내지는 시스템 정보로 차후 프로그램 개발에 도움이 될 수 있습니다. 질문이 있으시면 연락 주십시오. - -아래 정보가 전송될 것입니다. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ko.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/ko.lproj/Sparkle.strings deleted file mode 100644 index 50a939979..000000000 --- a/Frameworks/Sparkle/Sparkle/ko.lproj/Sparkle.strings +++ /dev/null @@ -1,71 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@이(가) 다운로드 되었습니다. 프로그램을 업데이트하고 재실행 하시겠습니까?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@이(가) 디스크 이미지나 CD 드라이브 같은 읽기 전용 볼륨에서 실행되고 있으므로 업데이트 할 수 없습니다. %1$@을(를) 응용프로그램 폴더로 이동하여 다시 실행해 주십시오."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@이(가) 현재 최신 버전입니다."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@이(가) 업데이트 되었습니다. (현재 버전 : %3$@) 다운로드 하시겠습니까?"; - -"%@ downloaded" = "%@ 다운로드 완료"; - -"%@ of %@" = "%1$@ / %2$@"; - -"A new version of %@ is available!" = "%@ 새 버전이 있습니다."; - -"A new version of %@ is ready to install!" = "%@ 새 버전을 설치할 준비가 되었습니다."; - -"An error occurred in retrieving update information. Please try again later." = "업데이트 정보를 수집하는 중 오류가 발생하였습니다. 나중에 다시 시도해 주십시오."; - -"An error occurred while downloading the update. Please try again later." = "업데이트를 다운로드 하는 중 오류가 발생하였습니다. 나중에 다시 시도해 주십시오."; - -"An error occurred while extracting the archive. Please try again later." = "압축 파일을 푸는 중 오류가 발생하였습니다. 나중에 다시 시도해 주십시오."; - -"An error occurred while installing the update. Please try again later." = "업데이트를 설치하는 중 오류가 발생하였습니다. 나중에 다시 시도해 주십시오."; - -"An error occurred while parsing the update feed." = "업데이트 피드를 분석하는 중 오류가 발생하였습니다."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "%1$@을(를) 재실행하는 중 오류가 발생하였습니다. 업데이트는 완료되었으므로 다음 실행시에는 새 버전으로 실행됩니다."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "취소"; - -"Cancel Update" = "업데이트 취소"; - -"Checking for updates..." = "업데이트 확인 중…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "다운로드 중…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "압축 푸는 중…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "설치 & 재실행"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "설치 중…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "확인"; - -"Ready to Install" = "설치 준비 완료"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "%1$@ 업데이트 확인을 자동으로 할까요? %1$@ 메뉴에서 수동 설정을 할 수 있습니다."; - -"Update Error!" = "업데이트 오류!"; - -"Updating %@" = "%@ 업데이트 중"; - -"You already have the newest version of %@." = "이미 %@ 최신 버전입니다."; - -"You're up to date!" = "최신 버전입니다."; - diff --git a/Frameworks/Sparkle/Sparkle/nb.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/nb.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index aa23477ef..000000000 --- a/Frameworks/Sparkle/Sparkle/nb.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdateAlert.xib deleted file mode 100644 index 46dc0feb6..000000000 --- a/Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 54c7c1ac8..000000000 --- a/Frameworks/Sparkle/Sparkle/nb.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Den anonyme systemprofilen hjelper oss med å planlegge fremtidig utviklingsarbeid. Ta gjerne kontakt med oss hvis du har spørsmål om dette.
 -Følgende innhold vil bli sendt: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/nb.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/nb.lproj/Sparkle.strings deleted file mode 100644 index db8a6c36b..000000000 --- a/Frameworks/Sparkle/Sparkle/nb.lproj/Sparkle.strings +++ /dev/null @@ -1,84 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! This is an important update; would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ er lastet ned og er klar til bruk! Dette er en viktig oppdatering; ønsker du å installere og restarte %1$@ nå?"; - -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ er lastet ned og er klar til bruk! Ønsker du å installere og restarte %1$@ nå?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kan ikke oppdateres fra en 'bare lesbar' enhet som f.eks. en cd. Flytt %1$@ til Programmer-katalogen, start på ny og prøv igjen."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ er nyeste versjon."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ er nå tilgjengelig—du har %3$@. Ønsker du å laste ned og installere nå?"; - -"%@ downloaded" = "%@ lastet ned"; - -"%@ of %@" = "%1$@ av %2$@"; - -"A new version of %@ is available!" = "En ny versjon av %@ er tilgjengelig!"; - -"A new version of %@ is ready to install!" = "En ny versjon av %@ er klar for installering!"; - -"An error occurred in retrieving update information. Please try again later." = "En feil oppstod ved henting av oppdateringsinformasjon. Vennligst prøv igjen senere."; - -"An error occurred while downloading the update. Please try again later." = "En feil oppstod under nedlasting av oppdateringen. Vennligst prøv igjen senere."; - -"An error occurred while extracting the archive. Please try again later." = "En feil oppstod under utpakking av oppdateringen. Vennligst prøv igjen senere."; - -"An error occurred while installing the update. Please try again later." = "En feil oppstod under installering av opddateringen. Vennligst prøv igjen senere."; - -"An error occurred while parsing the update feed." = "En feil oppstod under lesing av oppdateringsstrømmen."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "En feil oppstod under omstart av %1$@, men den nyeste versjonen vil være tilgjengelig neste gang du starter %1$@."; - -"An important update to %@ is ready to install" = "En viktig oppdatering for %@ er klar til å installeres"; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Avbryt"; - -"Cancel Update" = "Avbryt oppdateringen"; - -"Checking for updates..." = "Søker etter oppdateringer…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Laster ned oppdateringen…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Pakker ut oppdateringen…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Installer og start på ny"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Installerer oppdateringen…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -/* OK button. */ -"OK" = "OK"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "Klar til å installere"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Skal %1$@ søke automatisk etter oppdateringer? Du kan når som helst søke manuelt fra %1$@-menyen."; - -"Update Error!" = "Feil ved oppdateringen!"; - -"Updating %@" = "Oppdaterer %@"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." = "Du har allerede nyeste versjon av %@."; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "Ingen nye oppdateringer"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ -"Learn More..." = "Mer info…"; - diff --git a/Frameworks/Sparkle/Sparkle/nl.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/nl.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index cc4b4589b..000000000 --- a/Frameworks/Sparkle/Sparkle/nl.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdateAlert.xib deleted file mode 100644 index b730298f3..000000000 --- a/Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index a8585c6a8..000000000 --- a/Frameworks/Sparkle/Sparkle/nl.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Aan de hand van anonieme informatie over het systeemprofiel kunnen wij toekomstige ontwikkelingswerkzaamheden beter plannen. Neem contact met ons op als u hierover vragen hebt. - -Dit is de informatie die wordt verzonden: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/nl.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/nl.lproj/Sparkle.strings deleted file mode 100644 index ffa3f0b8c..000000000 --- a/Frameworks/Sparkle/Sparkle/nl.lproj/Sparkle.strings +++ /dev/null @@ -1,80 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ is gedownload en is klaar voor gebruik! Wilt u %1$@ nu installeren en herstarten?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kan niet worden geupdate als het van een alleen-lezen volume, zoals een schijfkopie of CD, geopend is. Verplaats %1$@ naar de Map ’Programma’s’, herstart van daar, en probeer opnieuw."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ is momenteel de recentste versie."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ is nu beschikbaar—u heeft %3$@. Wilt u het nu downloaden?"; - -"%@ downloaded" = "%@ gedownload"; - -"%@ of %@" = "%1$@ van %2$@"; - -"A new version of %@ is available!" = "Een nieuwe versie van %@ is beschikbaar!"; - -"A new version of %@ is ready to install!" = "Een nieuwe versie van %@ is klaar om te installeren!"; - -"An error occurred in retrieving update information. Please try again later." = "Bij het ophalen van update-informatie deed zich een fout voor. Probeer alstublieft later opnieuw."; - -"An error occurred while downloading the update. Please try again later." = "Bij het downloaden deed zich een fout voor. Probeer alstublieft later opnieuw."; - -"An error occurred while extracting the archive. Please try again later." = "Bij het uitpakken van het archief deed zich een fout voor. Probeer alstublieft later opnieuw."; - -"An error occurred while installing the update. Please try again later." = "Bij het installeren van de update deed zich een fout voor. Probeer alstublieft later opnieuw."; - -"An error occurred while parsing the update feed." = "Bij het afhandelen van de update feed deed zich een fout voor."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Bij het herstarten van %1$@ deed zich een fout voor. Maar de nieuwe versie is beschikbaar de volgende keer u %1$@ opstart."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Annuleren"; - -"Cancel Update" = "Updaten annuleren"; - -"Checking for updates..." = "Controleren op updates …"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Downloaden update …"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Bezig met uitpakken van de update …"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Installeer en herstart"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Update installeren …"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -/* OK button. */ -"OK" = "OK"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "Klaar om te installeren"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Zou %1$@ automatisch op updates moeten controleren? U kunt altijd nog handmatig controleren op updates via het %1$@ menu."; - -"Update Error!" = "Update-fout!"; - -"Updating %@" = "%@ updaten"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." = "U heeft al de nieuwste versie van %@."; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "U heeft de nieuwste versie!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "Meer informatie …"; diff --git a/Frameworks/Sparkle/Sparkle/no.lproj/SUAutomaticUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/no.lproj/SUAutomaticUpdateAlert.strings deleted file mode 100644 index 56e7c6619..000000000 --- a/Frameworks/Sparkle/Sparkle/no.lproj/SUAutomaticUpdateAlert.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* NSWindow () : (oid:5) */ -"" = ""; - -/* NSButton (Automatically download and install updates in the future) : (oid:17) */ -"Automatically download and install updates in the future" = "Last ned og installer oppdateringer automatisk i fremtiden"; - -/* NSButton (Relaunch Later) : (oid:16) */ -"Relaunch Later" = "Omstart senere"; - -/* NSButton (Relaunch Now) : (oid:15) */ -"Relaunch Now" = "Omstart nå"; - diff --git a/Frameworks/Sparkle/Sparkle/no.lproj/SUUpdateAlert.strings b/Frameworks/Sparkle/Sparkle/no.lproj/SUUpdateAlert.strings deleted file mode 100644 index 0b412a5c7..000000000 --- a/Frameworks/Sparkle/Sparkle/no.lproj/SUUpdateAlert.strings +++ /dev/null @@ -1,18 +0,0 @@ -/* NSButton (Automatically download and install updates in the future) : (oid:92) */ -"Automatically download and install updates in the future" = "Automatisk nedlastning og installering i fremtiden"; - -/* NSButton (Install Update) : (oid:76) */ -"Install Update" = "Installer oppdatering"; - -/* NSTextField (Release Notes:) : (oid:17) */ -"Release Notes:" = "Vedrørende utgivelsen:"; - -/* NSButton (Remind Me Later) : (oid:22) */ -"Remind Me Later" = "Påminn meg senere"; - -/* NSButton (Skip This Version) : (oid:23) */ -"Skip This Version" = "Hopp over denne versjonen"; - -/* NSWindow (Software Update) : (oid:5) */ -"Software Update" = "Programvareoppdatering"; - diff --git a/Frameworks/Sparkle/Sparkle/no.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/no.lproj/Sparkle.strings deleted file mode 100644 index 866607cb1..000000000 --- a/Frameworks/Sparkle/Sparkle/no.lproj/Sparkle.strings +++ /dev/null @@ -1,52 +0,0 @@ -"%@ of %@" = "%1$@ of %2$@"; - -"%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%1$@ %2$@ har blitt installert og er klar til bruk neste gang %3$@ starter opp! Vil du starte på nytt nå?"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ er den nyeste tilgjengelige versjonen."; - -"%@ %@ is now available (you have %@). Would you like to download it now?" = "%1$@ %2$@ er nå tilgjengelig (du har %3$@). Ønsker du å laste den ned nå?"; - -"%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "%@ har ikke tilgangsrettigheter til å skrive til programmets filbane! Starter du fra en diskfil? Hvis ikke, spør din systemadministrator om hjelp."; - -"A new version of %@ has been installed!" = "En ny versjon av %@ har blitt installert!"; - -"A new version of %@ is available!" = "En ny versjon av %@ er tilgjengelig!"; - -"An error occurred during installation. Please try again later." = "Det skjedde en feil under installasjonen. Vennligst prøv igjen senere."; - -"An error occurred in retrieving update information. Please try again later." = "Det skjedde en feil ved henting av oppdateringsinformasjon. Vennligst prøv igjen senere."; - -"An error occurred while extracting the archive. Please try again later." = "Det skjedde en feil ved utpakking av filarkivet. Vennligst prøv igjen senere."; - -"An error occurred while trying to download the file. Please try again later." = "Det skjedde en feil under forsøket på å laste ned filen. Vennligst prøv igjen senere."; - -"An update is already in progress!" = "Oppdateringen er allerede igang!"; - -"Cancel" = "Avbryt"; - -"Check for updates on startup?" = "Vil du se etter oppdateringer ved oppstart?"; - -"Downloading update..." = "Laster ned oppdatering..."; - -"Extracting update..." = "Pakker ut oppdatering..."; - -"Install and Relaunch" = "Installer og start på nytt"; - -"Installing update..." = "Installerer oppdatering..."; - -"No" = "Nei"; - -"OK" = "OK"; - -"Ready to Install" = "Klar til å installere"; - -"Update Error!" = "Oppdateringsfeil!"; - -"Updating %@" = "Oppdaterer %@"; - -"Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the application menu." = "Ønsker du at %@ skal se etter oppdateringer under oppstart? Hvis ikke kan du sette igang sjekkingen manuelt ifra programmenyen."; - -"Yes" = "Ja"; - -"You're up to date!" = "Du er oppdatert!"; - diff --git a/Frameworks/Sparkle/Sparkle/pl.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/pl.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index aa9cdc29b..000000000 --- a/Frameworks/Sparkle/Sparkle/pl.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdateAlert.xib deleted file mode 100644 index 5836777de..000000000 --- a/Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 667e888cf..000000000 --- a/Frameworks/Sparkle/Sparkle/pl.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. - -This is the information that would be sent: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pl.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/pl.lproj/Sparkle.strings deleted file mode 100644 index e8bc35c2c..000000000 --- a/Frameworks/Sparkle/Sparkle/pl.lproj/Sparkle.strings +++ /dev/null @@ -1,73 +0,0 @@ -/* "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?"; */ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ został pobrany i jest gotowy do użycia! Czy chciałbyś teraz zainstalować i ponownie uruchomić %1$@?"; - -/* "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again."; */ -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ nie może zostać zaktualizowany gdy jest uruchomiony z woluminu tylko do odczytu w stylu obraz dysku lub napęd optyczny. Przenieś %1$@ do teczki Programy, uruchom z nowej lokalizacji i spróbuj ponownie."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ jest najbardziej aktualną dostępną wersją."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ jest już dostępny (aktualnie posiadasz %3$@). Chciałbyś go teraz pobrać?"; - -"%@ downloaded" = "Pobrano %@"; - -"%@ of %@" = "%1$@ z %2$@"; - -"A new version of %@ is available!" = "Dostępna jest nowa wersja %@!"; - -"A new version of %@ is ready to install!" = "Nowa wersja %@ gotowa do zainstalowania!"; - -"An error occurred in retrieving update information. Please try again later." = "Błąd podczas pobierania informacji o uaktualnieniach. Spróbuj ponownie później."; - -"An error occurred while downloading the update. Please try again later." = "Błąd podczas pobierania uaktualnienia. Spróbuj ponownie później."; - -"An error occurred while extracting the archive. Please try again later." = "Błąd podczas rozpakowywania archiwum. Spróbuj ponownie później"; - -"An error occurred while installing the update. Please try again later." = "Błąd podczas instalowania uaktualnienia. Spróbuj ponownie później"; - -"An error occurred while parsing the update feed." = "Błąd podczas analizowania danych o uaktualnieniu."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Błąd podczas ponownego uruchomienia %1$@, ale nowa wersja będzie dostępna przy ponownym ręcznym uruchomieniu %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Anuluj"; - -"Cancel Update" = "Anuluj uaktualnianie"; - -"Checking for updates..." = "Sprawdzam uaktualnienia…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Pobieram uaktualnienia…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Rozpakowuję uaktualnienia…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Zainstaluj i uruchom ponownie"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Instalowanie uaktualnienia…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Gotowy do instalacji"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Czy %1$@ powinien automatycznie sprawdzać uaktualnienia? Zawsze możesz to samemu sprawdzić z menu %1$@."; - -"Update Error!" = "Błąd uaktualniania!"; - -"Updating %@" = "Uaktualniam %@"; - -"You already have the newest version of %@." = "Posiadasz najnowszą wersję %@."; - -"You're up to date!" = "Jesteś na bieżąco!"; - diff --git a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100755 index b4f1bad6a..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdateAlert.xib deleted file mode 100644 index 4831e60c7..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 4fd82b205..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - As informações anônimas do sistema são usadas para nos ajudar a planejar o desenvolvimento futuro do aplicativo. Contate-nos caso tenha dúvidas sobre este procedimento. - -As seguintes informações seriam enviadas: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/pt_BR.lproj/Sparkle.strings deleted file mode 100755 index 3b7893e85..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_BR.lproj/Sparkle.strings +++ /dev/null @@ -1,71 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ foi transferido e está pronto para uso! Deseja instalar e reiniciar o %1$@ agora?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ não pode ser atualizado enquanto for executado a partir de um volume somente de leitura, como uma imagem de disco ou CD/DVD. Mova o %1$@ para a pasta Aplicativos, reinicie-o e tente novamente."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ é a versão mais recente disponível."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ está disponível – sua versão é %3$@. Deseja transferi-lo agora?"; - -"%@ downloaded" = "%@ transferidos"; - -"%@ of %@" = "%1$@ de %2$@"; - -"A new version of %@ is available!" = "Uma nova versão do %@ está disponível!"; - -"A new version of %@ is ready to install!" = "Uma nova versão do %@ está pronta para ser instalada!"; - -"An error occurred in retrieving update information. Please try again later." = "Ocorreu um erro ao obter informações da atualização. Tente novamente mais tarde."; - -"An error occurred while downloading the update. Please try again later." = "Ocorreu um erro ao transferir a atualização. Tente novamente mais tarde."; - -"An error occurred while extracting the archive. Please try again later." = "Ocorreu um erro ao extrair o arquivo. Tente novamente mais tarde."; - -"An error occurred while installing the update. Please try again later." = "Ocorreu um erro ao instalar a atualização. Tente novamente mais tarde."; - -"An error occurred while parsing the update feed." = "Ocorreu um erro ao analisar o feed de atualização."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Ocorreu um erro ao reiniciar o %1$@. A nova versão estará disponível da próxima vez que você abrir o %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Cancelar"; - -"Cancel Update" = "Cancelar Atualização"; - -"Checking for updates..." = "Buscando atualizações…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Transferindo atualização…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Extraindo atualização…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Instalar e Reiniciar"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Instalando atualização…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Pronto para Instalar"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Deseja que o %1$@ busque atualizações automaticamente? Você pode buscar atualizações manualmente, através do menu %1$@."; - -"Update Error!" = "Erro de Atualização!"; - -"Updating %@" = "Atualizando %@"; - -"You already have the newest version of %@." = "Você já possui a versão mais recente do %@."; - -"You're up to date!" = "Você está atualizado!"; - diff --git a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 3aa21b7d7..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdateAlert.xib deleted file mode 100644 index 865cdbf17..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 258fed2f6..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - A informação anónima do perfil de sistema é usada para no futuro nos ajudar a planear o trabalho de desenvolvimento. Por favor contacte-nos se tiver alguma questão acerca deste assunto. - -Esta é a informação que seria enviada: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/pt_PT.lproj/Sparkle.strings deleted file mode 100644 index 725628cd7..000000000 --- a/Frameworks/Sparkle/Sparkle/pt_PT.lproj/Sparkle.strings +++ /dev/null @@ -1,71 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "O %1$@ %2$@ foi transferido e está pronto a instalar! Gostaria de o fazer agora e reiniciar o %1$@ posteriormente?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "O %1$@ não pode ser actualizado quando estiver a ser executado a partir de um volume apenas de leitura como uma imagem de disco ou disco óptico. Mova o %1$@ para a sua pasta Aplicações, reinicie-o aí e tente novamente."; - -"%@ %@ is currently the newest version available." = "O %1$@ %2$@ é neste momento a versão mais recente disponível."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "O %1$@ %2$@ está agora disponível e tem a versão %3$@. Gostaria de o transferir agora?"; - -"%@ downloaded" = "%@ transferido"; - -"%@ of %@" = "%1$@ de %2$@"; - -"A new version of %@ is available!" = "Uma nova versão do %@ está dísponível!"; - -"A new version of %@ is ready to install!" = "Uma nova versão do %@ está pronta a instalar!"; - -"An error occurred in retrieving update information. Please try again later." = "Ocorreu um erro ao recolher informação sobre as actualizações disponíveis. Por favor tente novamente mais tarde."; - -"An error occurred while downloading the update. Please try again later." = "Ocorreu um erro ao transferir a actualização. Por favor novamente tente mais tarde."; - -"An error occurred while extracting the archive. Please try again later." = "Ocorreu um erro ao extrair o arquivo. Por favor novamente tente mais tarde."; - -"An error occurred while installing the update. Please try again later." = "Ocorreu um erro ao instalar a actualização. Por favor novamente tente mais tarde."; - -"An error occurred while parsing the update feed." = "Ocorrer um erro ao processar o feed de actualização."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Ocorreu um erro ao reiniciar o %1$@, mas a nova versão estará disponível na próxima vez que iniciar o %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Cancelar"; - -"Cancel Update" = "Cancelar actualização"; - -"Checking for updates..." = "A procurar actualizações…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "A transferir actualização…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "A extrair actualização…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Instalar e reiniciar"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "A instalar actualização…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Pronto para instalar"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Deverá o %1$@ procurar por actualizações automaticamente? Pode sempre procurar actualizações manualmente a partir do menu do %1$@."; - -"Update Error!" = "Erro na actualização!"; - -"Updating %@" = "A actualizar o %@"; - -"You already have the newest version of %@." = "Já tem a versão mais recente do %@."; - -"You're up-to-date!" = "Está actualizado!"; - diff --git a/Frameworks/Sparkle/Sparkle/ro.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ro.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 82772f848..000000000 --- a/Frameworks/Sparkle/Sparkle/ro.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdateAlert.xib deleted file mode 100644 index 3f652c77a..000000000 --- a/Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 21712d375..000000000 --- a/Frameworks/Sparkle/Sparkle/ro.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. - -This is the information that would be sent: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ro.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/ro.lproj/Sparkle.strings deleted file mode 100644 index 648000f7f..000000000 --- a/Frameworks/Sparkle/Sparkle/ro.lproj/Sparkle.strings +++ /dev/null @@ -1,85 +0,0 @@ - - -"%1$@ %2$@ has been downloaded and is ready to use! This is an important update; would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ a fost descărcată și este gata de utilizare! Aceasta este o actualizare importantă; dorești să o instalezi și să relansați %1$@ acum?"; - -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ a fost descărcată și este gata de utilizare! Dorești să o instalezi și să relansați %1$@ acum?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ nu poate fi actualizată atunci când a fost pornită de pe un volum read-only ca o imagine disc sau o unitate optică. Mută %1$@ în directorul Aplicații, repornește-o de acolo și încearcă din nou."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ este cea ultima versiune disponibilă."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ este disponibilă—tu ai %3$@. Dorești să o descărcarci acum?"; - -"%@ downloaded" = "%@ descărcat"; - -"%@ of %@" = "%1$@ din %2$@"; - -"A new version of %@ is available!" = "O nouă versiune pentru %@ este disponibilă!"; - -"A new version of %@ is ready to install!" = "O nouă versiune pentru %@ este gata de instalare!"; - -"An error occurred in retrieving update information. Please try again later." = "A apărut o eroare în timpul preluari informaţiilor pentru actualizare. Te rog încercă din nou mai târziu."; - -"An error occurred while downloading the update. Please try again later." = "A apărut o eroare în timp ce se descărca actualizărea. Te rog încercă din nou mai târziu."; - -"An error occurred while extracting the archive. Please try again later." = "A apărut o eroare în timpul dezarhivării. Te rog încercă din nou mai târziu."; - -"An error occurred while installing the update. Please try again later." = "A apărut o eroare în timpul instalări actualizări. Te rog încercă din nou mai târziu."; - -"An error occurred while parsing the update feed." = "A apărut o eroare în timpul citiri feed-ului de actualizare."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "A apărut o eroare în timpul relansării aplicației %1$@, dar noua versiune va fii disponibilă data viitoare când vei reporni %1$@."; - -"An important update to %@ is ready to install" = "O actualizare importantă pentru %@ este gata pentru a fi instalată"; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Anulează"; - -"Cancel Update" = "Anulează actualizarea"; - -"Checking for updates..." = "Verifică de actualizări…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Descarcă actualizarea…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Dezarhivează actualizarea…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Instalează și Redeschide"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Instalează actualizarea…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -/* OK button. */ -"OK" = "OK"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "Pregatit pentru a instala"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "%1$@ ar trebui ca să caute în mod automat pentru actualizări? Puteți verifica mereu pentru actualizări din meniul %1$@."; - -"Update Error!" = "Eroare Actualizare!"; - -"Updating %@" = "Actualizează %@"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." = "Ai cea mai nouă versiune de %@."; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "Ai ultima versiune!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ -"Learn More..." = "Află mai multe…"; diff --git a/Frameworks/Sparkle/Sparkle/ru.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ru.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 250e33441..000000000 --- a/Frameworks/Sparkle/Sparkle/ru.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdateAlert.xib deleted file mode 100644 index 6f36ee828..000000000 --- a/Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 5217d7b8e..000000000 --- a/Frameworks/Sparkle/Sparkle/ru.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Использование анонимного профиля системы помогает нам в планировании будущей работы по разработке. Если у вас есть какие-либо вопросы по этой теме, обращайтесь к нам. - -Это информация, предназначенная для отправления: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/ru.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/ru.lproj/Sparkle.strings deleted file mode 100644 index 80ba0f6c9..000000000 --- a/Frameworks/Sparkle/Sparkle/ru.lproj/Sparkle.strings +++ /dev/null @@ -1,75 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ загружен и готов к использованию! Хотите установить и перезапустить %1$@?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "Во время работы %1$@ с тома, предназначенного только для чтения, как например, образа диска или накопителя на оптических дисках, его невозможно обновить. Переместите %1$@ в Папку приложений, перезапустите его оттуда и повторите попытку."; - -"%@ %@ is currently the newest version available." = "В настоящий момент %1$@ %2$@ является новейшей версией."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ теперь доступен – вы имеете %3$@. Хотите загрузить его сейчас?"; - -"%@ downloaded" = "%@ загружено"; - -"%@ of %@" = "%1$@ из %2$@"; - -"A new version of %@ is available!" = "Имеется новая версия %@!"; - -"A new version of %@ is ready to install!" = "Новая версия %@ готова к установке!"; - -"An error occurred in retrieving update information. Please try again later." = "Произошла ошибка при извлечении информации обновления. Повторите попытку позже."; - -"An error occurred while downloading the update. Please try again later." = "Произошла ошибка при загрузке обновления. Повторите попытку позже."; - -"An error occurred while extracting the archive. Please try again later." = "Произошла ошибка при извлечении архива. Повторите попытку позже."; - -"An error occurred while installing the update. Please try again later." = "Произошла ошибка при установке обновления. Повторите попытку позже."; - -"An error occurred while parsing the update feed." = "Ошибка произошла при извлечении канала обновления."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Произошла ошибка при перезапуске %1$@, но при последующем запуске %1$@ будет доступна новая версия."; - -/* the unit for bytes */ -"B" = "Б"; - -"Cancel" = "Отменить"; - -"Cancel Update" = "Отменить обновление"; - -"Checking for updates..." = "Проверяю наличие обновлений…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Загружаю обновление…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Извлекаю обновление…"; - -/* the unit for gigabytes */ -"GB" = "ГБ"; - -"Install and Relaunch" = "Установить и перезапустить"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Устанавливаю обновление…"; - -/* the unit for kilobytes */ -"KB" = "КБ"; - -/* the unit for megabytes */ -"MB" = "МБ"; - -"OK" = "OK"; - -"Ready to Install" = "Готов к установке"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Должен ли %1$@ выполнять автоматическую проверку обновлений? Вы всегда можете выполнять проверку обновлений вручную в меню %1$@."; - -"Update Error!" = "Ошибка при обновлении!"; - -"Updating %@" = "Обновляю %@"; - -"You already have the newest version of %@." = "Вы уже имеете самую новую версию %@."; - -"You're up-to-date!" = "У вас все обновлено!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "Узнать больше…"; diff --git a/Frameworks/Sparkle/Sparkle/sk.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/sk.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index c999eaab4..000000000 --- a/Frameworks/Sparkle/Sparkle/sk.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdateAlert.xib deleted file mode 100644 index c047f054b..000000000 --- a/Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 3f95cb61c..000000000 --- a/Frameworks/Sparkle/Sparkle/sk.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonymný profil systému nám umožní zlepšiť plánovanie budúceho vývoja aplikácie. Ak máte ohľadom tohto akékoľvek otázky, neváhajte a kontaktujte nás. - -Odosielané budú nasledujúce informácie: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sk.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/sk.lproj/Sparkle.strings deleted file mode 100644 index 4efb5311e..000000000 --- a/Frameworks/Sparkle/Sparkle/sk.lproj/Sparkle.strings +++ /dev/null @@ -1,71 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "Aplikácia %1$@ %2$@ bola prevzatá a je pripravená na použitie! Chcete teraz nainštalovať a následne znovu spustiť %1$@?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "Aplikáciu %1$@ nemožno aktualizovať, ak je spustená zo zväzku s právami len na čítanie (napríklad z obrazu disku alebo optického disku). Presuňte aplikáciu %1$@ do priečinka Applications, spustite ju odtiaľ a potom znova skúste aktualizáciu."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@\nje najnovšia dostupná verzia."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "Je dostupná aplikácia %1$@ %2$@ — máte %3$@. Chcete ju prevziať teraz?"; - -"%@ downloaded" = "%@ prevzaté"; - -"%@ of %@" = "%1$@ z %2$@"; - -"A new version of %@ is available!" = "Je dostupná nová verzia aplikácie %@!"; - -"A new version of %@ is ready to install!" = "Nová verzia aplikácie %@ je pripravená na inštaláciu!"; - -"An error occurred in retrieving update information. Please try again later." = "Pri získavaní informácie o aktualizácii sa vyskytla chyba. Skúste neskôr."; - -"An error occurred while downloading the update. Please try again later." = "Pri preberaní aktualizácie sa vyskytla chyba. Skúste neskôr."; - -"An error occurred while extracting the archive. Please try again later." = "Pri rozbaľovaní archívu sa vyskytla chyba. Skúste neskôr."; - -"An error occurred while installing the update. Please try again later." = "Pri inštalácii aktualizácie sa vyskytla chyba. Skúste neskôr."; - -"An error occurred while parsing the update feed." = "Pri analyzovaní aktualizácie sa vyskytla chyba."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Pri spustení %1$@ sa vyskytla chyba, avšak nová verzia bude dostupná pri opätovnom štarte %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Zrušiť"; - -"Cancel Update" = "Zrušiť aktualizáciu"; - -"Checking for updates..." = "Kontrolujú sa aktualizácie…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Preberá sa aktualizácia…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Rozbaľuje sa aktualizácia…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Inštalovať a znovu spustiť"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Inštaluje sa aktualizácia…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Pripravené na inštaláciu"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Môže %1$@ automaticky kontrolovať aktualizácie? Kedykoľvek ich môžete z ponuky %1$@ skontrolovať aj manuálne."; - -"Update Error!" = "Chyba aktualizácie!"; - -"Updating %@" = "Aktualizuje sa %@"; - -"You already have the newest version of %@." = "Máte aktuálnu verziu aplikácie %@."; - -"You're up to date!" = "Máte aktuálnu verziu!"; -"You're up-to-date!" = "Máte aktuálnu verziu!"; diff --git a/Frameworks/Sparkle/Sparkle/sl.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/sl.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 605ee9aea..000000000 --- a/Frameworks/Sparkle/Sparkle/sl.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdateAlert.xib deleted file mode 100644 index 0021bda78..000000000 --- a/Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 4694fee95..000000000 --- a/Frameworks/Sparkle/Sparkle/sl.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonimni profil sistema se uporablja za načrtovanje nadaljnega razvoja programa. V primeru vprašanj nas lahko kontaktirate. - -Pošljejo se sledeče informacije: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sl.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/sl.lproj/Sparkle.strings deleted file mode 100644 index 13d790b01..000000000 --- a/Frameworks/Sparkle/Sparkle/sl.lproj/Sparkle.strings +++ /dev/null @@ -1,70 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ je bil uspešno prenešen s spleta in je pripravljen na namestitev. Ga želite namestiti in ponovno zagnati takoj?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "Programa %1$@ ni mogoče posodobiti, ker ga poganjate iz lokacije, kamor pisanje ni dovoljeno (pogosto je to slika diska dmg ali optična enota). Poskusite %1$@ premakniti v direktorij z aplikacijami (Applications), ga ponovno zagnati in šele nato posodobiti."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ je najnovejša verzija programa."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "Na voljo je %1$@ %2$@ — vi imate %3$@. Ga želite prenesti s spleta sedaj?"; - -"%@ downloaded" = "prenešenih je %@"; - -"%@ of %@" = "%1$@ od %2$@"; - -"A new version of %@ is available!" = "Na voljo je nova verzija programa %@."; - -"A new version of %@ is ready to install!" = "Najnovejša verzija programa %@ je že nameščena."; - -"An error occurred in retrieving update information. Please try again later." = "Med iskanjem posodobitev je prišlo do napake. Prosimo poskusite ponovno čez nekaj časa."; - -"An error occurred while downloading the update. Please try again later." = "Med prenašanje posodobitve s spleta je prišlo do napake. Prosimo poskusite ponovno čez nekaj časa."; - -"An error occurred while extracting the archive. Please try again later." = "Med odpiranjem arhiva je prišlo do napake. Prosimo poskusite ponovno čez nekaj časa."; - -"An error occurred while installing the update. Please try again later." = "Med nameščanjem posodobitve je prišlo do napake. Prosimo poskusite ponovno čez nekaj časa."; - -"An error occurred while parsing the update feed." = "Napaka pri interpretaciji RSS vira s posodobitvami."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Med ponovnim zagonom programa %1$@ je sicer prišlo do napake, vendar bo nova verzija na voljo, ko boste naslednjič pognali program."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Prekliči"; - -"Cancel Update" = "Prekliči posodabljanje"; - -"Checking for updates..." = "Iskanje posodobitev …"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Prenašanje posodobitve …"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Razpakiranje posodobitve …"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Namesti in ponovno zaženi"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Nameščanje posodobitve …"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "V redu"; - -"Ready to Install" = "Pripravljen na namestitev"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Naj %1$@ samodejno preverja, če so na voljo posodobitve? To lahko kadarkoli preverite tudi sami iz menija za %1$@."; - -"Update Error!" = "Napaka pri posodabljanju"; - -"Updating %@" = "Posodabljam %@"; - -"You already have the newest version of %@." = "Najnovejša verzija programa %@ je že nameščena."; - -"You're up-to-date!" = "Uporabljate zadnjo verzijo."; diff --git a/Frameworks/Sparkle/Sparkle/sv.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/sv.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 4d4027241..000000000 --- a/Frameworks/Sparkle/Sparkle/sv.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdateAlert.xib deleted file mode 100644 index 5e55383e7..000000000 --- a/Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 5f058e216..000000000 --- a/Frameworks/Sparkle/Sparkle/sv.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Leta efter uppdateringar automatiskt? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Anonym systemprofilinformation används för att hjälpa oss att planera framtida utvecklingsarbete. Vänligen kontakta oss ifall du har några frågot om detta. - -Detta är informationen som skulle sändas: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/sv.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/sv.lproj/Sparkle.strings deleted file mode 100644 index ab47f40a6..000000000 --- a/Frameworks/Sparkle/Sparkle/sv.lproj/Sparkle.strings +++ /dev/null @@ -1,75 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ har hämtats och är klar att använda! Vill du installera det och starta om %1$@ nu?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kan inte uppdateras när det körs från en skrivskyddad volym som en skivavbild eller en optisk enhet. Flytta %1$@ till mappen Program, starta om det därifrån, och försök igen."; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ är för närvarande den senaste tillgängliga versionen."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ finns nu tillgänglig—du har %3$@. Vill hämta uppdateringen nu?"; - -"%@ downloaded" = "%@ hämtat"; - -"%@ of %@" = "%1$@ av %2$@"; - -"A new version of %@ is available!" = "En ny version av %@ finns tillgänglig!"; - -"A new version of %@ is ready to install!" = "En ny version av %@ är redo att installeras!"; - -"An error occurred in retrieving update information. Please try again later." = "Ett fel uppstod vid hämtning av information om uppdateringar. Försök igen senare."; - -"An error occurred while downloading the update. Please try again later." = "Ett fel uppstod vid hämtning av uppdateringen. Försök igen senare."; - -"An error occurred while extracting the archive. Please try again later." = "Ett fel uppstod vid extrahering av arkivet. Försök igen senare."; - -"An error occurred while installing the update. Please try again later." = "Ett fel uppstod vid installationen av uppdateringen. Försök igen senare."; - -"An error occurred while parsing the update feed." = "Ett fel uppstod vid tolkning av uppdateringslänken."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Ett fel uppstod när %1$@ skulle startas om, men den nya versionen kommer att finnas tillgänglig nästa gång du kör %1$@."; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "Avbryt"; - -"Cancel Update" = "Avbryt uppdatering"; - -"Checking for updates..." = "Letar efter uppdateringar…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Hämtar uppdatering…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Extraherar uppdatering…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "Installera och starta om"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Installerar uppdatering…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "OK"; - -"Ready to Install" = "Redo att installera"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Ska %1$@ leta efter uppdateringar automatiskt? Du kan alltid leta efter uppdateringar manuellt från %1$@-menyn."; - -"Update Error!" = "Uppdateringsfel!"; - -"Updating %@" = "Uppdaterar %@"; - -"You already have the newest version of %@." = "Du har redan den senaste versionen av %@."; - -"You're up-to-date!" = "Du är uppdaterad!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "Mer info…"; diff --git a/Frameworks/Sparkle/Sparkle/th.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/th.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index e1724b958..000000000 --- a/Frameworks/Sparkle/Sparkle/th.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/th.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/th.lproj/SUUpdateAlert.xib deleted file mode 100644 index cf4500471..000000000 --- a/Frameworks/Sparkle/Sparkle/th.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/th.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/th.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 607c4006f..000000000 --- a/Frameworks/Sparkle/Sparkle/th.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - ข้อมูลระบบแบบนิรนามช่วยในการวางแผนพัฒนาแอปพลิเคชันของเราในอนาคต กรุณาติดต่อเราถ้าคุณมีข้อสงสัยในเรื่องนี้ - -นี่คือข้อมูลที่จะถูกส่งไป: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/th.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/th.lproj/Sparkle.strings deleted file mode 100644 index e58bdaef1..000000000 --- a/Frameworks/Sparkle/Sparkle/th.lproj/Sparkle.strings +++ /dev/null @@ -1,80 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ ได้ถูกดาวน์โหลดและพร้อมใช้งานแล้ว คุณต้องการติดตั้งและเริ่ม %1$@ ใหม่เดี๋ยวนี้หรือไม่"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ ไม่สามารถรับการอัพเดทได้เมื่อถูกเรียกจากดิสก์แบบอ่านอย่างเดียวหรือซีดีรอม ย้าย %1$@ ไปยังโฟลเดอร์แอปพลิเคชัน และเรียกใช้งาน จากนั้นลองใหม่อีกครั้ง"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ เป็นเวอร์ชั่นใหม่ล่าสุดแล้ว"; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ พร้อมให้ดาวน์โหลดแล้ว (คุณมีเวอร์ชั่น %3$@) ต้องการดาวน์โหลดเลยหรือไม่"; - -"%@ downloaded" = "ดาวน์โหลด %@ เสร็จสิ้น"; - -"%@ of %@" = "%1$@ จาก %2$@"; - -"A new version of %@ is available!" = "%@ มีเวอร์ชั่นใหม่!"; - -"A new version of %@ is ready to install!" = "เวอร์ชั่นใหม่ของ %@ พร้อมสำหรับการติดตั้งแล้ว"; - -"An error occurred in retrieving update information. Please try again later." = "เกิดข้อผิดพลาดระหว่างการรับข้อมูลอัพเดท กรุณาลองใหม่ในภายหลัง"; - -"An error occurred while downloading the update. Please try again later." = "เกิดข้อผิดพลาดระหว่างพยายามดาวน์โหลดอัพเดท กรุณาลองใหม่ในภายหลัง"; - -"An error occurred while extracting the archive. Please try again later." = "เกิดข้อผิดพลาดระหว่างการแตกไฟล์ที่ถูกบีบอัด กรุณาลองใหม่ในภายหลัง"; - -"An error occurred while installing the update. Please try again later." = "เกิดข้อผิดพลาดระหว่างการติดตั้งอัพเดท กรุณาลองใหม่ในภายหลัง"; - -"An error occurred while parsing the update feed." = "เกิดข้อผิดพลาดระหว่างการประมวลผลฟีดอัพเดท กรุณาลองใหม่ในภายหลัง"; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "เกิดข้อผิดพลาดระหว่างการเริ่ม %1$@ ใหม่ อย่างไรก็ตามเวอร์ชั่นใหม่จะใช้ได้เมื่อคุณเรียก %1$@ ครั้งถัดไป"; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "ยกเลิก"; - -"Cancel Update" = "ยกเลิกอัพเดท"; - -"Checking for updates..." = "ตรวจสอบอัพเดท…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "กำลังดาวน์โหลดอัพเดท…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "กำลังแตกไฟล์อัพเดท…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "ติดตั้งและเริ่มแอปพลิเคชันใหม่"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "กำลังติดตั้งอัพเดท…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -/* OK button. */ -"OK" = "ตกลง"; - -/* Status message on progress window once download has finished. */ -"Ready to Install" = "พร้อมติดตั้ง"; - -/* Message that is optionally shown at startup to allow users to turn on/off update checks. */ -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "คุณต้องการให้ %1$@ ตรวจสอบอัพเดทโดยอัตโนมัติหรือไม่ คุณสามารถเริ่มการตรวจสอบอัพเดทด้วยตนเองได้ทุกเมื่อจากเมนูของ %1$@"; - -"Update Error!" = "อัพเดทผิดพลาด!"; - -"Updating %@" = "กำลังอัพเดท %@"; - -/* 'Error' message when the user checks for updates but is already current or the feed doesn't contain any updates. (not necessarily shown in UI) */ -"You already have the newest version of %@." = "คุณมีเวอร์ชั่นล่าสุดของ %@ แล้ว"; - -/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */ -"You're up-to-date!" = "คุณมีเวอร์ชั่นล่าสุดแล้ว!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ -"Learn More..." = "เรียนรู้เพิ่มเติม…"; - diff --git a/Frameworks/Sparkle/Sparkle/tr.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/tr.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 7a875283f..000000000 --- a/Frameworks/Sparkle/Sparkle/tr.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdateAlert.xib deleted file mode 100644 index 4f58b04ad..000000000 --- a/Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 1548d2e6a..000000000 --- a/Frameworks/Sparkle/Sparkle/tr.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - - - - - - - - - - - - - - - Gönderdiğiniz anonim sistem bilgileri bu yazılımın geliştirilmesi için kullanılacaktır. Konu ile ilgili ayrıntılı bilgi için lütfen bizimle bağlantıya geçiniz. Göndereceğiniz Bilgiler: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/tr.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/tr.lproj/Sparkle.strings deleted file mode 100644 index b394c64c7..000000000 --- a/Frameworks/Sparkle/Sparkle/tr.lproj/Sparkle.strings +++ /dev/null @@ -1,123 +0,0 @@ -/* de_DE v0.1 - No comment provided by engineer. */ - -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ indirildi ve kullanıma hazır! Şimdi yüklemek istiyor musunuz? Uygulama yeniden başlatılacaktır."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"%1$@ can't be updated when it's running from a disk image. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ uygulaması disk kalıbı içerisindeyken güncellenemez. Lütfen %1$@ uygulamasını Uygulamalar dizinine kopyalayıp yeniden başlatınız."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ mevcut en yeni sürümdür."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ çıktı (Kullandığınız Sürüm: %3$@). Şimdi yeni sürümü indirmek ister misiniz?"; - - -"%@ downloaded" = "%@ indirildi"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"%@ of %@" = "%1$@ / %2$@"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"A new version of %@ is available!" = "%@ uygulaması için yeni bir sürüm var!"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"A new version of %@ is ready to install!" = "%@ uygulamasının yeni bir sürümü yüklemeye hazır!"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"An error occurred in retrieving update information. Please try again later." = "Güncelleme bilgilerini alırken bir hata oluştu. Lütfen daha sonra tekrar deneyiniz."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"An error occurred while downloading the update. Please try again later." = "Güncelleme indirilirken bir hata oluştu. Lütfen sonra tekrar deneyiniz."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"An error occurred while extracting the archive. Please try again later." = "İndirilen arşivi açarken bir hata oluştu. Lütfen daha sonra tekrar deneyiniz."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"An error occurred while installing the update. Please try again later." = "Güncellemeyi yüklerken bir hata oluştu. Lütfen daha sonra tekrar deneyiniz."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"An error occurred while parsing the update feed." = "Güncelleme kaynağını incelerken bir hata oluştu."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"An error occurred while parsing the update feed: %@" = "Güncelleme kaynağını incelerken bir hata oluştu: %@"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "%1$@ uygulamasını açarken bir hata oluştu; ancak güncelleme %1$@ uygulamasını yeniden başlattığınızda hazır olacaktır."; - -/* de_DE v0.1 - the unit for bytes */ - -"B" = "B"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"Cancel" = "Vazgeç"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"Cancel Update" = "Güncellemeyi iptal et"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"Checking for updates..." = "Güncellemelere bakılıyor..."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"Downloading update..." = "Güncelleme indiriliyor..."; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"Extracting update..." = "Güncelleme ayıklanıyor..."; - -/* de_DE v0.1 - the unit for gigabytes */ - -"GB" = "GB"; - -/* de_DE v0.1 - No comment provided by engineer. */ - -"Install and Relaunch" = "Kur ve yeniden başlat"; - - -"Installing update..." = "Güncelleme kuruluyor..."; - -/* the unit for kilobytes */ - -"KB" = "KB"; - -/* the unit for megabytes */ - -"MB" = "MB"; - - -"OK" = "Tamam"; - - -"Ready to Install" = "Kuruluma hazır"; - - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "%1$@ uygulaması için güncellemeler otomatik olarak aransın mı? Güncelleme işlemini el ile uygulama menüsünden de başlatabilirsiniz."; - - -"Update Error!" = "Güncelleme hatası."; - - -"Updating %@" = "%@ güncelleniyor"; - - -"You already have the newest version of %@." = "%@ uygulamasının en güncel sürümü sizde mevcut."; - - -"You're up to date!" = "Uygulama güncel!"; - diff --git a/Frameworks/Sparkle/Sparkle/uk.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/uk.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 865d7d5d6..000000000 --- a/Frameworks/Sparkle/Sparkle/uk.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdateAlert.xib deleted file mode 100644 index e130c93e3..000000000 --- a/Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index fb9b9c7d6..000000000 --- a/Frameworks/Sparkle/Sparkle/uk.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - Використання анонімного профілю системи допомагає нам у планування майбутньої розробки. Якщо у вас виникли питання щодо цього, звертайтесь до нас. - -Інформація, що буде надіслано: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/uk.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/uk.lproj/Sparkle.strings deleted file mode 100644 index 63c3812fa..000000000 --- a/Frameworks/Sparkle/Sparkle/uk.lproj/Sparkle.strings +++ /dev/null @@ -1,75 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ завантажений і готовий до використання! Бажаєте встановити і перезавантажити %1$@?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "Під час роботи з %1$@ з тому, що призначений лише для читання, наприклад, образу диска чи оптичного диску, його неможливо оновити. Перемістіть %1$@ у папку з програмами, перезавантажте його звідти і спробуйте ще раз."; - -"%@ %@ is currently the newest version available." = "У данний момент %1$@ %2$@ є останньою версією."; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ доступна – ви маєте %3$@. Бажаєте завантажити її зараз?"; - -"%@ downloaded" = "%@ завантажено"; - -"%@ of %@" = "%1$@ із %2$@"; - -"A new version of %@ is available!" = "Доступна нова версія %@!"; - -"A new version of %@ is ready to install!" = "Нова версія %@ готова до встановлення!"; - -"An error occurred in retrieving update information. Please try again later." = "Виникла помилка при отриманні інформації про оновлення. Спробуйте ще раз пізніше."; - -"An error occurred while downloading the update. Please try again later." = "Виникла помилка при завантаження оновлення. Спробуйте ще раз пізніше."; - -"An error occurred while extracting the archive. Please try again later." = "Виникла помилка при розпаковуванні архіву. Спробуйте ще раз пізніше."; - -"An error occurred while installing the update. Please try again later." = "Виникла помилка при встановленні оновлення. Спробуйте ще раз пізніше."; - -"An error occurred while parsing the update feed." = "Виникла помилка розбору каналу оновлень."; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Виникла помилка при перезавантаженні %1$@, але наступного разу при завантаження %1$@ буде доступна нова версія."; - -/* the unit for bytes */ -"B" = "Б"; - -"Cancel" = "Відмінити"; - -"Cancel Update" = "Відмінити оновлення"; - -"Checking for updates..." = "Перевіряю наявність оновлень…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "Завантажую оновлення…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "Розпаковую оновлення…"; - -/* the unit for gigabytes */ -"GB" = "ГБ"; - -"Install and Relaunch" = "Встановити та перезавантажити"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "Встановлюю оновлення…"; - -/* the unit for kilobytes */ -"KB" = "КБ"; - -/* the unit for megabytes */ -"MB" = "МБ"; - -"OK" = "OK"; - -"Ready to Install" = "Готовий до встановлення"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Чи повинен %1$@ автоматично виконувати перевірку на оновлення? Ви завжди можете самостійно перевірити оновлення у меню %1$@."; - -"Update Error!" = "Помилка оновлення!"; - -"Updating %@" = "Оновлюю %@"; - -"You already have the newest version of %@." = "Ви вже користуєтесь останньою версією програми %@."; - -"You're up-to-date!" = "У вас остання версія!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "Дізнатись більше…"; diff --git a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index f0040bc5b..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdateAlert.xib deleted file mode 100644 index 6503aebce..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 419b09283..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - 无记名系统概况信息被用于帮助我们安排将来的开发工作。如果对此存在疑问请联系我们。 - -这是将要被发送的信息:: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/zh_CN.lproj/Sparkle.strings deleted file mode 100644 index 091ac8cb9..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_CN.lproj/Sparkle.strings +++ /dev/null @@ -1,75 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ 已下载完毕并可以使用!您想要现在安装 %1$@ 吗?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ 不能被更新,当它运行于一个只读性宗卷如磁盘映像、软盘等上面时。移动 %1$@ 到应用程序文件夹并再试一次。"; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ 是当前的最新版本。"; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ 已经可供下载—你现在的版本是 %3$@。您要现在下载它吗?"; - -"%@ downloaded" = "%@ 已下载"; - -"%@ of %@" = "%1$@ / %2$@"; - -"A new version of %@ is available!" = "新版本的 %@ 已经提供下载了!"; - -"A new version of %@ is ready to install!" = "新版本的 %@ 可以安装了!"; - -"An error occurred in retrieving update information. Please try again later." = "接收升级信息时出现错误。请稍后再试。"; - -"An error occurred while downloading the update. Please try again later." = "下载过程中出现错误。请稍后再试。"; - -"An error occurred while extracting the archive. Please try again later." = "提取过程中出现错误。请稍后再试。"; - -"An error occurred while installing the update. Please try again later." = "安装更新的过程中出现错误。请稍后再试。"; - -"An error occurred while parsing the update feed." = "在分析更新流语法时出现错误。请稍后再试。"; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "重新启动 %1$@ 时发生了一个错误,但在您下次运行 %1$@ 时新版本将可使用。"; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "取消"; - -"Cancel Update" = "取消更新"; - -"Checking for updates..." = "正在核查更新…"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "正在下载更新…"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "正在抽出更新…"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "安装并重新启动"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "正在安装更新…"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "好"; - -"Ready to Install" = "可以开始安装了"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "您想让 %1$@ 在启动时自动检查更新么?您也可以在程序菜单 %1$@ 中进行手动检查。"; - -"Update Error!" = "更新错误!"; - -"Updating %@" = "正在更新 %@"; - -"You already have the newest version of %@." = "您已经在使用最新版本的 %@。"; - -"You're up-to-date!" = "你使用的就是最新版!"; - -/* Alternative name for "Install" button if we have a paid update or other update - without a download but with a URL. */ - -"Learn More..." = "下载更新包"; diff --git a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUAutomaticUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUAutomaticUpdateAlert.xib deleted file mode 100644 index 6f05efa5b..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUAutomaticUpdateAlert.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdateAlert.xib b/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdateAlert.xib deleted file mode 100644 index afd653cae..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdateAlert.xib +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - NSNegateBoolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdatePermissionPrompt.xib b/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdatePermissionPrompt.xib deleted file mode 100644 index 4fdeb663a..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/SUUpdatePermissionPrompt.xib +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - visibleKey - visibleValue - displayValue - displayKey - - - - - - - - - - - - - - - 匿名系統描述資訊可用來協助我們計畫未來的開發工作。若您有任何相關問題,請與我們聯繫。 - -以下是會傳送的資訊: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUIncludeProfile - SUSendProfileInfo - - - - - - - diff --git a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/Sparkle.strings b/Frameworks/Sparkle/Sparkle/zh_TW.lproj/Sparkle.strings deleted file mode 100644 index 8f67b4f9e..000000000 --- a/Frameworks/Sparkle/Sparkle/zh_TW.lproj/Sparkle.strings +++ /dev/null @@ -1,70 +0,0 @@ -"%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ 已下載且可供使用!您是否要現在安裝並重新啟動%1$@?"; - -"%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "當 %1$@ 正從唯讀卷宗(如磁碟映像檔或光碟機)執行時,無法進行更新。請將 %1$@ 移至您的“應用程式”檔案夾,從該處重新啟動,然後再試一次。 "; - -"%@ %@ is currently the newest version available." = "%1$@ %2$@ 已是目前最新的版本。"; - -"%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ 現在已可取得,您的版本則是 %3$@。您要現在下載嗎?"; - -"%@ downloaded" = "%@ 已下載"; - -"%@ of %@" = "%1$@ / %2$@"; - -"A new version of %@ is available!" = "已有新版本的 %@ 可供下載!"; - -"A new version of %@ is ready to install!" = "新版本的 %@ 已準備安裝!"; - -"An error occurred in retrieving update information. Please try again later." = "擷取更新資訊時發生錯誤。請稍後再試一次。"; - -"An error occurred while downloading the update. Please try again later." = "下載更新項目時發生錯誤。請稍後再試一次。"; - -"An error occurred while extracting the archive. Please try again later." = "解壓縮封存檔時發生錯誤。請稍後再試一次。"; - -"An error occurred while installing the update. Please try again later." = "安裝更新項目時發生錯誤。請稍後再試一次。"; - -"An error occurred while parsing the update feed." = "解析更新 feed 時發生錯誤。"; - -"An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "重新啟動 %1$@ 時發生錯誤,但下次您執行 %1$@ 時將可使用新版本。"; - -/* the unit for bytes */ -"B" = "B"; - -"Cancel" = "取消"; - -"Cancel Update" = "取消更新"; - -"Checking for updates..." = "正在檢查更新項目⋯"; - -/* Take care not to overflow the status window. */ -"Downloading update..." = "正在下載更新項目⋯"; - -/* Take care not to overflow the status window. */ -"Extracting update..." = "正在解壓縮更新項目⋯"; - -/* the unit for gigabytes */ -"GB" = "GB"; - -"Install and Relaunch" = "安裝與重新啟動"; - -/* Take care not to overflow the status window. */ -"Installing update..." = "正在安裝更新項目⋯"; - -/* the unit for kilobytes */ -"KB" = "KB"; - -/* the unit for megabytes */ -"MB" = "MB"; - -"OK" = "好"; - -"Ready to Install" = "準備安裝"; - -"Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "%1$@ 是否應自動檢查更新項目?您可隨時從 %1$@ 選單手動檢查更新項目。"; - -"Update Error!" = "更新發生錯誤!"; - -"Updating %@" = "正在更新 %@"; - -"You already have the newest version of %@." = "您已有最新版本的 %@。"; - -"You're up-to-date!" = "你已有最新版本!"; diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App.xcodeproj/project.pbxproj b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App.xcodeproj/project.pbxproj deleted file mode 100644 index 963e475f8..000000000 --- a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App.xcodeproj/project.pbxproj +++ /dev/null @@ -1,283 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5A195FB01983E85D000BE570 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A195FAF1983E85D000BE570 /* main.m */; }; - 5A195FB31983E85D000BE570 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A195FB21983E85D000BE570 /* AppDelegate.m */; }; - 5A195FB51983E85D000BE570 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5A195FB41983E85D000BE570 /* Images.xcassets */; }; - 5A195FB81983E85D000BE570 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5A195FB61983E85D000BE570 /* MainMenu.xib */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5A195FAA1983E85D000BE570 /* Sparkle Updated Test App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Sparkle Updated Test App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 5A195FAE1983E85D000BE570 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 5A195FAF1983E85D000BE570 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 5A195FB11983E85D000BE570 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 5A195FB21983E85D000BE570 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 5A195FB41983E85D000BE570 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 5A195FB71983E85D000BE570 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5A195FA71983E85D000BE570 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5A195FA11983E85D000BE570 = { - isa = PBXGroup; - children = ( - 5A195FAC1983E85D000BE570 /* Sparkle Updated Test App */, - 5A195FAB1983E85D000BE570 /* Products */, - ); - sourceTree = ""; - }; - 5A195FAB1983E85D000BE570 /* Products */ = { - isa = PBXGroup; - children = ( - 5A195FAA1983E85D000BE570 /* Sparkle Updated Test App.app */, - ); - name = Products; - sourceTree = ""; - }; - 5A195FAC1983E85D000BE570 /* Sparkle Updated Test App */ = { - isa = PBXGroup; - children = ( - 5A195FB11983E85D000BE570 /* AppDelegate.h */, - 5A195FB21983E85D000BE570 /* AppDelegate.m */, - 5A195FB61983E85D000BE570 /* MainMenu.xib */, - 5A195FAD1983E85D000BE570 /* Supporting Files */, - ); - path = "Sparkle Updated Test App"; - sourceTree = ""; - }; - 5A195FAD1983E85D000BE570 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5A195FB41983E85D000BE570 /* Images.xcassets */, - 5A195FAE1983E85D000BE570 /* Info.plist */, - 5A195FAF1983E85D000BE570 /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5A195FA91983E85D000BE570 /* Sparkle Updated Test App */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5A195FC71983E85D000BE570 /* Build configuration list for PBXNativeTarget "Sparkle Updated Test App" */; - buildPhases = ( - 5A195FA61983E85D000BE570 /* Sources */, - 5A195FA71983E85D000BE570 /* Frameworks */, - 5A195FA81983E85D000BE570 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Sparkle Updated Test App"; - productName = "Sparkle Updated Test App"; - productReference = 5A195FAA1983E85D000BE570 /* Sparkle Updated Test App.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5A195FA21983E85D000BE570 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0600; - ORGANIZATIONNAME = "Sparkle-project"; - TargetAttributes = { - 5A195FA91983E85D000BE570 = { - CreatedOnToolsVersion = 6.0; - }; - }; - }; - buildConfigurationList = 5A195FA51983E85D000BE570 /* Build configuration list for PBXProject "Sparkle Updated Test App" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5A195FA11983E85D000BE570; - productRefGroup = 5A195FAB1983E85D000BE570 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5A195FA91983E85D000BE570 /* Sparkle Updated Test App */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5A195FA81983E85D000BE570 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A195FB51983E85D000BE570 /* Images.xcassets in Resources */, - 5A195FB81983E85D000BE570 /* MainMenu.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5A195FA61983E85D000BE570 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A195FB31983E85D000BE570 /* AppDelegate.m in Sources */, - 5A195FB01983E85D000BE570 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 5A195FB61983E85D000BE570 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 5A195FB71983E85D000BE570 /* Base */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 5A195FC51983E85D000BE570 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 5A195FC61983E85D000BE570 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - }; - name = Release; - }; - 5A195FC81983E85D000BE570 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = Sparkle; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "Sparkle Updated Test App/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 5A195FC91983E85D000BE570 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = Sparkle; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "Sparkle Updated Test App/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5A195FA51983E85D000BE570 /* Build configuration list for PBXProject "Sparkle Updated Test App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A195FC51983E85D000BE570 /* Debug */, - 5A195FC61983E85D000BE570 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5A195FC71983E85D000BE570 /* Build configuration list for PBXNativeTarget "Sparkle Updated Test App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A195FC81983E85D000BE570 /* Debug */, - 5A195FC91983E85D000BE570 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5A195FA21983E85D000BE570 /* Project object */; -} diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.h b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.h deleted file mode 100644 index ac12a2118..000000000 --- a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// AppDelegate.h -// Sparkle Updated Test App -// -// Created by Kornel on 26/07/2014. -// Copyright (c) 2014 Sparkle-project. All rights reserved. -// - -#import - -@interface AppDelegate : NSObject - - -@end - diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.m b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.m deleted file mode 100644 index 54538ff5d..000000000 --- a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/AppDelegate.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// AppDelegate.m -// Sparkle Updated Test App -// -// Created by Kornel on 26/07/2014. -// Copyright (c) 2014 Sparkle-project. All rights reserved. -// - -#import "AppDelegate.h" - -@interface AppDelegate () -@end - -@implementation AppDelegate - -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - NSRunAlertPanel(@"Update succeeded!", @"This is the updated version of Sparkle Test App.\n\nDelete and rebuild the app to test updates again.", @"OK", nil, nil); - - NSURL *bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; - if (bundleURL) { - [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: @[bundleURL]]; - } - - [NSApp terminate:self]; -} - -@end diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Base.lproj/MainMenu.xib b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Base.lproj/MainMenu.xib deleted file mode 100644 index 86e352808..000000000 --- a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Base.lproj/MainMenu.xib +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/Contents.json b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/Contents.json deleted file mode 100644 index 2e9df94b4..000000000 --- a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/Contents.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "icon_16x16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "icon_16x16@2x.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "icon_32x32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "icon_32x32@2x.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "icon_128x128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "icon_128x128@2x.png", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_128x128.png b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_128x128.png deleted file mode 100644 index 4d7985201d08d85342b12171ac3bbe1757936135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15615 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 Z{~t#Y)0yq$!_w)UI^UusV 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 diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_16x16@2x.png b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Images.xcassets/Sparkle.appiconset/icon_16x16@2x.png deleted file mode 100644 index 7ab394c6e1ea2299b4b2cee506901a3d71566683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2137 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
  • g9jS2AUi5e4RpWp#?wg346R~Cfy-1oU}0B_() zCTuz7BA!g1v*OW$EspF}#{x~XGQI=9t!AhQK)h<_@d{4y!=yT7B!K+zraqnmM7pow z$tGwxs8DM_6>q>)LlgrFTd!UD9N_m)z5(^e@noZ9uUc~XJ>OQF zR3nmVqXKfEwF@;L3nFrR9@#az`uNj;tvty{Hk;zfCO7F8&pLb6?e*O&7r3}s)BQ4S z3-Op#ir&?4{&vIYS6>fUo@AuEohP0CA*61`+3%fw<}Dw0HU>@nI4}s_1er1hrmW&j zn58)KuYp~+pL`kcH=Y8-L|L8+Ts%3iZNq;Z2D*=MkUI(dO2NitUH=#-14L)$? zcP4vp_$aU&;QurO1jqoVG%tDWJ6o2&?JS8JjmBdYBh=Mw-}~Va)?>m3iX&_G4*m1p zKPnDC^i5y*-2agVc+~-iMU6|I-L&Y6i|e{hUmB!4Qi!P;7V?BC@x-=~$)4Z;eSF8y zf33D~3(#9#!Tq0!00u|{vw?F>s`b5fou~f1apBAEYCh!6_ct$n{e9WF&$=nqe8e?K za5Zo|&pM^ptH_#&h0000 diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Info.plist b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Info.plist deleted file mode 100644 index 6b1edff0a..000000000 --- a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - org.sparkle-project.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 2.0 - CFBundleSignature - ???? - CFBundleVersion - 2 - LSApplicationCategoryType - public.app-category.developer-tools - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} - NSHumanReadableCopyright - Copyright © 2014 Sparkle-project. All rights reserved. - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/main.m b/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/main.m deleted file mode 100644 index 6aafcfc36..000000000 --- a/Frameworks/Sparkle/TestApplication/After Update/Sparkle Updated Test App/main.m +++ /dev/null @@ -1,6 +0,0 @@ - -#import - -int main(int argc, const char * argv[]) { - return NSApplicationMain(argc, argv); -} diff --git a/Frameworks/Sparkle/TestApplication/English.lproj/InfoPlist.strings b/Frameworks/Sparkle/TestApplication/English.lproj/InfoPlist.strings deleted file mode 100644 index e6e21d400..000000000 --- a/Frameworks/Sparkle/TestApplication/English.lproj/InfoPlist.strings +++ /dev/null @@ -1,4 +0,0 @@ -/* Localized versions of Info.plist keys */ - -NSHumanReadableCopyright = "© Andy Matuschak, 2006"; -CFBundleShortVersionString = "1.5"; \ No newline at end of file diff --git a/Frameworks/Sparkle/TestApplication/English.lproj/MainMenu.xib b/Frameworks/Sparkle/TestApplication/English.lproj/MainMenu.xib deleted file mode 100644 index 5bf06c630..000000000 --- a/Frameworks/Sparkle/TestApplication/English.lproj/MainMenu.xib +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Frameworks/Sparkle/TestApplication/TestApplication-Info.plist b/Frameworks/Sparkle/TestApplication/TestApplication-Info.plist deleted file mode 100644 index be2bc9382..000000000 --- a/Frameworks/Sparkle/TestApplication/TestApplication-Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - org.sparkle-project.SparkleTestApp - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Sparkle Test App - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.5 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - SUEnableSystemProfiling - - SUFeedURL - http://sparkle-project.org/files/sparkletestcast.xml - SUPublicDSAKeyFile - test_app_only_dsa_pub.pem - - diff --git a/Frameworks/Sparkle/TestApplication/main.m b/Frameworks/Sparkle/TestApplication/main.m deleted file mode 100644 index f858e8756..000000000 --- a/Frameworks/Sparkle/TestApplication/main.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// main.m -// Sparkle -// -// Created by Andy Matuschak on 3/12/06. -// Copyright Andy Matuschak 2006. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **)argv); -} diff --git a/Frameworks/Sparkle/TestApplication/test_app_only_dsa_pub.pem b/Frameworks/Sparkle/TestApplication/test_app_only_dsa_pub.pem deleted file mode 100644 index dacd55e96..000000000 --- a/Frameworks/Sparkle/TestApplication/test_app_only_dsa_pub.pem +++ /dev/null @@ -1,20 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIDOzCCAi0GByqGSM44BAEwggIgAoIBAQD2WbLx8Bd1b1vp8FdDpSzkHZ0tlX5x -Hrzm0WWE9IokOmJw/UWk1GQYRJnA8UlufFTJV4dZVL3It4xwqqWWFyN36LWgQUpf -ss9eTn7M7vjk7BVYch7QMs4jGEnSYkebuYfVhUZlg5VViQ+37Rj+ENtBUrkPJxIY -CGAOIJn45uX5oNIPbElFkadU6m7zd1gn8KhRgIepa2k3iBbkFuCbxTPT/aqLI+MW -8kR4jXITTgBkDew6DXLVL9SsJup4LeAEizTGyyTBY5bfMJaO8NaB8+uPrkC3SZV+ -r/LIaBcmU3vVfmw43FGzBlJtGflPaL8Ek9lRK1aSzk3Gr7tPdaado9tPAhUAmn4E -HKjL3lXfHzBmDSrrp5G5+IkCggEAFvGRfoL0u3zN4O+8imTxfiSYcFUjBUly4gIl -NXM4AgFmy8WE+diZRh6/3eg+CO0B1io+thmU2sTFAbV7sHVuGaBpPyFtcvrCHGGp -EcqWwmxuhUc1CzeoBvGw4u8mfCBvcUPjFfhllJJFdIgaTrYXFxqgsb6ZKWKsYz9J -jjJkOlRFIlRfowd1RlqodZYYvdvfWnPd32HpI9i/ofhPdlF5W2f51diH/jVJaRCo -TKECwcYG+qkPC5gkIIgzC6/DPRT8pzCLJ0NoWj3TQwL1LffMSmT9hTGAD1iyJjn5 -S9ZLLkz/K+QoGS+Rv4gboMAxa0Cla7R8NwtXqMD0kpeZwDAAgQOCAQYAAoIBAQDw -tDiRJy5DsFNRIaKe6NlyW1gyjYIhbeOCDt5fYMdX7tOR64ng28ACU5ESu6jRANMp -NYjE9oTBx28C0TXXRLDiblHe6IsisKsJJgkNkNc2DwUdPcGoPTRK/MS0k0CQsPQq -cU0Uh/vYXNQ3rsJMAJ0xJ+yYllm3MVQkbZrWlJTe/nU6M8ahiR6WBelrKhzHrhuy -MZ8n+oXvBc/Jo8Z63O/5e94BS0PiGb1Eo84ds6ramno7XJpTXE/nxphBSsaXCwdy -T97rvDzfDG0v0eo9fdX9aL7jPVODDt0bk+MSRdDpcMlgJzhIpNUtafrTUHIkPyKb -/BX9wwwXLfWGTz5TRovi ------END PUBLIC KEY----- diff --git a/Frameworks/Sparkle/Tests/Resources/SparkleTestCodeSignApp.zip b/Frameworks/Sparkle/Tests/Resources/SparkleTestCodeSignApp.zip deleted file mode 100644 index 1d3ccb8a88abad65af816401c786bd526c0c0a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346234 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

    @bsdTTjm8>e7KTE!CyL(u~XyUEuSld`my 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%0DWx@5Dd5;Vc4Qg_-xBi+{9C(MLrF)10?i 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