From 69132373ac2ef3cf83416696b6fb2ddf5c2c5e55 Mon Sep 17 00:00:00 2001 From: Vishal Nehra Date: Tue, 8 Oct 2024 06:45:20 +0530 Subject: [PATCH 1/3] Build fixes --- gradle/libs.versions.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e475d17e45..a8694356c1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,7 @@ [versions] compileSdk = "34" +jdk9Deps = "1.0" +jdk9DepsVersion = "1.0" minSdk = "21" targetSdk = "35" kotlin = "1.9.25" @@ -78,6 +80,8 @@ rustAndroidGradle = "0.9.6" [libraries] gradle = { module = "com.android.tools.build:gradle", version.ref = "gradle" } jacoco-android-plugin = { module = "com.mxalbert.gradle:jacoco-android", version.ref = "jacocoAndroid" } +#jdk9-deps = { module = "com.github.pengrad:jdk9-deps", version.ref = "jdk9Deps" } +jdk9-deps = { module = "com.github.pengrad:jdk9-deps", version.ref = "jdk9DepsVersion" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } rust-android-gradle = { module = "org.mozilla.rust-android-gradle.rust-android:org.mozilla.rust-android-gradle.rust-android.gradle.plugin", version.ref = "rustAndroidGradle" } From 8019ad9d1588ffb3ed2b2e5b8e8f5301f7d89e39 Mon Sep 17 00:00:00 2001 From: Raymond Lai Date: Sat, 19 Oct 2024 16:17:42 +0800 Subject: [PATCH 2/3] Rename .java to .kt --- .../filemanager/database/{CloudContract.java => CloudContract.kt} | 0 .../filemanager/filesystem/cloud/{CloudUtil.java => CloudUtil.kt} | 0 .../fragments/{CloudSheetFragment.java => CloudSheetFragment.kt} | 0 .../com/amaze/filemanager/utils/{DataUtils.java => DataUtils.kt} | 0 .../{CloudPluginException.java => CloudPluginException.kt} | 0 ...{ShellNotRunningException.java => ShellNotRunningException.kt} | 0 .../{StreamNotFoundException.java => StreamNotFoundException.kt} | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/com/amaze/filemanager/database/{CloudContract.java => CloudContract.kt} (100%) rename app/src/main/java/com/amaze/filemanager/filesystem/cloud/{CloudUtil.java => CloudUtil.kt} (100%) rename app/src/main/java/com/amaze/filemanager/ui/fragments/{CloudSheetFragment.java => CloudSheetFragment.kt} (100%) rename app/src/main/java/com/amaze/filemanager/utils/{DataUtils.java => DataUtils.kt} (100%) rename file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/{CloudPluginException.java => CloudPluginException.kt} (100%) rename file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/{ShellNotRunningException.java => ShellNotRunningException.kt} (100%) rename file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/{StreamNotFoundException.java => StreamNotFoundException.kt} (100%) diff --git a/app/src/main/java/com/amaze/filemanager/database/CloudContract.java b/app/src/main/java/com/amaze/filemanager/database/CloudContract.kt similarity index 100% rename from app/src/main/java/com/amaze/filemanager/database/CloudContract.java rename to app/src/main/java/com/amaze/filemanager/database/CloudContract.kt diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.java b/app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.kt similarity index 100% rename from app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.java rename to app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.kt diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.java b/app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.kt similarity index 100% rename from app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.java rename to app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.kt diff --git a/app/src/main/java/com/amaze/filemanager/utils/DataUtils.java b/app/src/main/java/com/amaze/filemanager/utils/DataUtils.kt similarity index 100% rename from app/src/main/java/com/amaze/filemanager/utils/DataUtils.java rename to app/src/main/java/com/amaze/filemanager/utils/DataUtils.kt diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.java b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.kt similarity index 100% rename from file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.java rename to file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.kt diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.java b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.kt similarity index 100% rename from file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.java rename to file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.kt diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.java b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.kt similarity index 100% rename from file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.java rename to file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.kt From 252518364189a921a5562e209baf654a419de01f Mon Sep 17 00:00:00 2001 From: Raymond Lai Date: Sun, 14 Sep 2025 17:09:02 +0800 Subject: [PATCH 3/3] omh-storage integration --- .gitignore | 1 + app/build.gradle | 24 +- ....openmobilehub.android.auth.core-2.0.4.aar | Bin 0 -> 33247 bytes ...droid.auth.core-common-mobileweb-2.0.4.aar | Bin 0 -> 60219 bytes ...ndroid.auth.plugin-box-mobileweb-2.0.4.aar | Bin 0 -> 60665 bytes ...id.auth.plugin-dropbox-mobileweb-2.0.4.aar | Bin 0 -> 54191 bytes ...droid.auth.plugin-google-non-gms-2.0.4.aar | Bin 0 -> 56449 bytes ....auth.plugin-microsoft-mobileweb-2.0.4.aar | Bin 0 -> 62212 bytes ...oid.storage.core-2.1.1-alpha+thumbnail.aar | Bin 0 -> 63605 bytes ...e-restful-common-2.1.0-alpha+thumbnail.aar | Bin 0 -> 8554 bytes ...-dropbox-restful-2.1.0-alpha+thumbnail.aar | Bin 0 -> 217756 bytes ...gledrive-non-gms-2.1.0-alpha+thumbnail.aar | Bin 0 -> 99375 bytes ...onedrive-restful-2.1.0-alpha+thumbnail.aar | Bin 0 -> 129540 bytes app/proguard.cfg | 3 - .../asynctasks/CloudLoaderAsyncTask.java | 71 - .../java/com/cloudrail/si/CloudRail.java | 29 - .../cloudrail/si/interfaces/CloudStorage.java | 85 -- .../java/com/cloudrail/si/services/Box.java | 31 - .../com/cloudrail/si/services/Dropbox.java | 32 - .../cloudrail/si/services/GoogleDrive.java | 32 - .../com/cloudrail/si/services/OneDrive.java | 31 - .../com/cloudrail/si/types/CloudMetaData.java | 47 - .../cloudrail/si/types/SpaceAllocation.java | 31 - .../filemanager/adapters/HiddenAdapter.kt | 2 +- .../data/LayoutElementParcelable.java | 16 +- .../glide/cloudicon/CloudIconModelLoader.java | 10 +- .../filemanager/application/AppConfig.java | 12 +- .../asynctasks/CountItemsOrAndSizeTask.java | 10 +- .../asynchronous/asynctasks/DeleteTask.java | 37 +- .../asynctasks/LoadFilesListTask.java | 95 +- .../asynctasks/movecopy/MoveFiles.java | 20 +- .../asynctasks/movecopy/PreparePasteTask.kt | 17 +- .../asynctasks/searchfilesystem/DeepSearch.kt | 12 +- .../asynchronous/services/CopyService.java | 4 + .../filemanager/database/CloudContract.kt | 54 +- .../filemanager/database/CloudHandler.java | 117 -- .../filemanager/database/ExplorerDatabase.kt | 21 +- .../database/daos/CloudEntryDao.java | 70 - .../database/models/explorer/CloudEntry.java | 82 -- .../filemanager/filesystem/FileProperties.kt | 10 +- .../filemanager/filesystem/FileUtil.java | 269 ++-- .../filemanager/filesystem/HybridFile.java | 185 +-- .../filesystem/HybridFileOmhStorageExt.kt | 145 ++ .../filesystem/HybridFileParcelable.java | 38 +- .../filemanager/filesystem/Operations.java | 1083 +++++++------- .../filemanager/filesystem/cloud/CloudUtil.kt | 502 +++---- .../filesystem/files/CryptUtil.java | 3 + .../filesystem/files/FileUtils.java | 136 +- .../filesystem/files/GenericCopyUtil.java | 78 +- .../amaze/filemanager/ui/ItemPopupMenu.java | 4 +- .../ui/activities/MainActivity.java | 305 ++-- .../ui/dialogs/DragAndDropDialog.kt | 2 +- .../ui/dialogs/GeneralDialogCreation.java | 4 +- .../ui/dialogs/HiddenFilesDialog.kt | 2 +- .../filemanager/ui/dialogs/HistoryDialog.kt | 4 +- .../ui/dialogs/RenameBookmark.java | 2 +- .../ui/dialogs/SftpConnectDialog.kt | 16 +- .../ui/drag/RecyclerAdapterDragListener.kt | 8 +- .../ui/fragments/CloudSheetFragment.kt | 307 ++-- .../ui/fragments/MainFragment.java | 61 +- .../filemanager/ui/fragments/TabFragment.java | 2 +- .../fragments/data/MainFragmentViewModel.kt | 13 +- .../BookmarksPrefsFragment.kt | 22 +- .../filemanager/ui/views/drawer/Drawer.java | 94 +- .../com/amaze/filemanager/utils/DataUtils.kt | 1091 +++++++------- .../filemanager/utils/MainActivityHelper.java | 22 +- .../com/amaze/filemanager/utils/OTGUtil.kt | 16 +- .../amaze/filemanager/utils/OnFileFound.kt | 33 - .../StartActivityForResultWithSourceIntent.kt | 40 + .../utils/cloud/CloudPluginUtil.kt | 75 + .../filemanager/utils/omh/OMHClientHelper.kt | 248 ++++ .../filemanager/utils/omh/OmhAuthClientExt.kt | 205 +++ .../utils/omh/OmhCredentialsWrapper.kt | 9 + .../utils/omh/OmhStorageClientExt.kt | 111 ++ app/src/main/res/layout/drawerheader.xml | 2 +- app/src/main/res/values/strings.xml | 9 + .../asynctasks/CloudLoaderAsyncTask.java | 404 ----- .../asynctasks/cloud/CloudLoaderCallable.kt | 70 + .../application/AppConfigTest.java | 4 +- .../asynctasks/AbstractDeleteTaskTestBase.kt | 4 +- .../asynctasks/DbViewerTaskTest.java | 4 +- .../AbstractCompressedHelperCallableTest.kt | 4 +- .../CompressedHelperForBadArchiveTest.kt | 4 +- .../SearchResultListSorterTest.kt | 18 +- .../ssh/PemToKeyPairObservableEd25519Test.kt | 4 +- .../ssh/PemToKeyPairObservableRsaTest.kt | 4 +- .../ssh/SshAuthenticationTaskTest.kt | 4 +- .../read/ReadTextFileCallableTest.kt | 4 +- .../write/WriteTextFileCallableTest.java | 4 +- .../services/DecryptServiceTest.kt | 4 +- .../services/EncryptServiceTest.kt | 12 +- ...ServiceAndroidFileSystemIntegrationTest.kt | 6 +- .../asynchronous/services/ZipServiceTest.kt | 4 +- .../services/ftp/FtpReceiverTest.kt | 5 +- .../database/ExplorerDatabaseMigrationTest.kt | 77 +- .../UtilitiesDatabaseMigrationTest.kt | 4 +- .../filemanager/database/UtilsHandlerTest.kt | 4 +- .../EncryptedStringTypeConverterTest.kt | 4 +- ...bstractFilenameHelperIncrementNameTests.kt | 4 +- .../filesystem/AbstractOperationsTestBase.kt | 4 +- .../EditableFileAbstractionTest.java | 4 +- .../filemanager/filesystem/HybridFileTest.kt | 4 +- .../filesystem/OperationsTest.java | 4 +- .../filesystem/RootHelperTest.java | 4 +- .../filesystem/cloud/CloudUtilTest.kt | 16 +- .../filesystem/compressed/B0rkenZipTest.java | 4 +- .../compressed/CompressedHelperTest.java | 4 +- .../extractcontents/AbstractExtractorTest.kt | 4 +- .../filesystem/files/FileListSorterTest.kt | 2 +- .../filesystem/files/FileUtilsTest.kt | 4 +- .../filesystem/files/sort/DirSortByTest.kt | 2 +- .../filesystem/files/sort/SortByTest.kt | 2 +- .../filesystem/files/sort/SortTypeTest.kt | 2 +- .../ftp/NetCopyClientConnectionPoolFtpTest.kt | 4 +- .../commands/AbstractFtpserverCommandTest.kt | 4 +- .../filesystem/root/ListFilesCommandTest.kt | 4 +- .../filesystem/root/ListFilesCommandTest2.kt | 4 +- .../filesystem/smb/CifsContextsTest.java | 4 +- .../filesystem/smb/SmbHybridFileTest.kt | 4 +- .../filesystem/ssh/AbstractSftpServerTest.kt | 4 +- .../filesystem/ssh/FilesOnSshdTest.kt | 95 +- .../ssh/NetCopyClientConnectionPoolSshTest.kt | 4 +- .../filesystem/ssh/SshHybridFileTest.kt | 4 +- .../filesystem/usb/ReflectionHelpers.java | 6 +- .../AbstractMainActivityTestBase.kt | 4 +- .../activities/DatabaseViewerActivityTest.kt | 4 +- .../activities/MainActivityAuthTriggerTest.kt | 423 ++++++ .../ui/activities/PermissionsActivityTest.kt | 4 +- .../ui/activities/TextEditorActivityTest.java | 4 +- .../ui/dialogs/AbstractEncryptDialogTests.kt | 4 +- .../ui/dialogs/ColorPickerDialogTest.kt | 4 +- .../ui/fragments/CloudSheetFragmentTest.java | 57 - .../UiPrefsFragmentTest.kt | 3 +- .../amaze/filemanager/ui/icons/IconsTest.java | 4 +- .../NotificationConstantsTest.java | 13 +- .../filemanager/ui/theme/AppThemeTest.kt | 12 +- .../views/WarnableTextInputValidatorTest.java | 4 +- .../amaze/filemanager/utils/AESCryptTest.kt | 4 +- .../filemanager/utils/AnimUtilsTest.java | 4 +- .../amaze/filemanager/utils/CryptUtilTest.kt | 4 +- .../utils/MinMaxInputFilterTest.kt | 4 +- .../filemanager/utils/NetworkUtilTest.kt | 4 +- .../amaze/filemanager/utils/SmbUtilTest.kt | 4 +- .../amaze/filemanager/utils/TinyDBTest.java | 4 +- .../amaze/filemanager/utils/UtilsTest.java | 4 +- .../utils/X509CertificateUtilTest.kt | 4 +- .../utils/cloud/CloudPluginUtilTest.kt | 60 + .../utils/omh/OmhAuthClientExtTest.kt | 1293 +++++++++++++++++ ...tractSubnetDiscoverDevicesStrategyTests.kt | 4 +- .../MultipartRarExtractorTest.kt | 2 +- .../utils/PackageInstallValidationTest.kt | 3 +- build.gradle | 2 +- file_operations/build.gradle | 2 +- .../exceptions/CloudPluginException.kt | 13 +- .../exceptions/ShellNotRunningException.kt | 11 +- .../exceptions/StreamNotFoundException.kt | 28 +- .../cloud/CloudStreamSourceTest.java | 4 +- .../smbstreamer/StreamSourceTest.java | 3 +- gradle.properties | 1 + gradle/libs.versions.toml | 29 +- .../test/ShadowPasswordUtilTest.java | 4 +- 161 files changed, 5267 insertions(+), 3773 deletions(-) create mode 100644 app/libs/com.openmobilehub.android.auth.core-2.0.4.aar create mode 100644 app/libs/com.openmobilehub.android.auth.core-common-mobileweb-2.0.4.aar create mode 100644 app/libs/com.openmobilehub.android.auth.plugin-box-mobileweb-2.0.4.aar create mode 100644 app/libs/com.openmobilehub.android.auth.plugin-dropbox-mobileweb-2.0.4.aar create mode 100644 app/libs/com.openmobilehub.android.auth.plugin-google-non-gms-2.0.4.aar create mode 100644 app/libs/com.openmobilehub.android.auth.plugin-microsoft-mobileweb-2.0.4.aar create mode 100644 app/libs/com.openmobilehub.android.storage.core-2.1.1-alpha+thumbnail.aar create mode 100644 app/libs/com.openmobilehub.android.storage.core-restful-common-2.1.0-alpha+thumbnail.aar create mode 100644 app/libs/com.openmobilehub.android.storage.plugin-dropbox-restful-2.1.0-alpha+thumbnail.aar create mode 100644 app/libs/com.openmobilehub.android.storage.plugin-googledrive-non-gms-2.1.0-alpha+thumbnail.aar create mode 100644 app/libs/com.openmobilehub.android.storage.plugin-onedrive-restful-2.1.0-alpha+thumbnail.aar delete mode 100644 app/src/fdroid/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/CloudRail.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/interfaces/CloudStorage.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/services/Box.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/services/Dropbox.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/services/GoogleDrive.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/services/OneDrive.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/types/CloudMetaData.java delete mode 100644 app/src/fdroid/java/com/cloudrail/si/types/SpaceAllocation.java delete mode 100644 app/src/main/java/com/amaze/filemanager/database/CloudHandler.java delete mode 100644 app/src/main/java/com/amaze/filemanager/database/daos/CloudEntryDao.java delete mode 100644 app/src/main/java/com/amaze/filemanager/database/models/explorer/CloudEntry.java create mode 100644 app/src/main/java/com/amaze/filemanager/filesystem/HybridFileOmhStorageExt.kt delete mode 100644 app/src/main/java/com/amaze/filemanager/utils/OnFileFound.kt create mode 100644 app/src/main/java/com/amaze/filemanager/utils/StartActivityForResultWithSourceIntent.kt create mode 100644 app/src/main/java/com/amaze/filemanager/utils/cloud/CloudPluginUtil.kt create mode 100644 app/src/main/java/com/amaze/filemanager/utils/omh/OMHClientHelper.kt create mode 100644 app/src/main/java/com/amaze/filemanager/utils/omh/OmhAuthClientExt.kt create mode 100644 app/src/main/java/com/amaze/filemanager/utils/omh/OmhCredentialsWrapper.kt create mode 100644 app/src/main/java/com/amaze/filemanager/utils/omh/OmhStorageClientExt.kt delete mode 100644 app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java create mode 100644 app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/cloud/CloudLoaderCallable.kt create mode 100644 app/src/test/java/com/amaze/filemanager/ui/activities/MainActivityAuthTriggerTest.kt delete mode 100644 app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java create mode 100644 app/src/test/java/com/amaze/filemanager/utils/cloud/CloudPluginUtilTest.kt create mode 100644 app/src/test/java/com/amaze/filemanager/utils/omh/OmhAuthClientExtTest.kt diff --git a/.gitignore b/.gitignore index 95a913e241..94f5df1c90 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ # Built application files *.apk *.aar +!app/libs/*.aar *.ap_ *.aab diff --git a/app/build.gradle b/app/build.gradle index fdd229d55f..c2e2511237 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,5 @@ +import java.util.concurrent.TimeUnit + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' @@ -54,8 +56,8 @@ android { release { signingConfig signingConfigs.release - - minifyEnabled true + debuggable true + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg' buildConfigField "String", "CRYPTO_IV", "\"LxbHiJhhUXcj\"" buildConfigField "String", "FTP_SERVER_KEYSTORE_PASSWORD", "\"vishal007\"" @@ -145,6 +147,8 @@ dependencies { implementation libs.androidX.constraintLayout implementation libs.androidX.multidex //Multiple dex files implementation libs.androidX.biometric + implementation libs.androidX.security + implementation libs.androidX.browser.customtabs implementation libs.room.runtime implementation libs.room.rxjava2 @@ -168,7 +172,7 @@ dependencies { testImplementation libs.jsoup testImplementation libs.room.migration testImplementation libs.mockk - testImplementation libs.kotlin.coroutine.test + testImplementation libs.kotlin.coroutines.test testImplementation libs.androidX.core.testing kspTest libs.auto.service testImplementation 'ch.qos.logback:logback-classic:1.4.14' @@ -201,7 +205,6 @@ dependencies { implementation libs.libsu.core implementation libs.libsu.io - playImplementation libs.cloudrail.si.android playImplementation libs.junrar playImplementation libs.google.play.billing @@ -217,6 +220,7 @@ dependencies { implementation libs.commons.net //OkHttp implementation libs.okhttp + implementation libs.okhttp.loggingInterceptor implementation libs.bcpkix.jdk18on implementation libs.bcprov.jdk18on @@ -251,6 +255,10 @@ dependencies { implementation project(':file_operations') implementation project(':portscanner') + implementation libs.kotlin.reflect + implementation platform(libs.kotlin.coroutines.bom) + implementation libs.kotlin.coroutines.android + implementation libs.kotlin.coroutines.rxjava2 implementation libs.kotlin.stdlib.jdk8 implementation libs.acra.core implementation libs.slf4j.api @@ -259,6 +267,10 @@ dependencies { implementation libs.gson implementation libs.amaze.trashBin + implementation libs.retrofit + implementation libs.retrofit.jacksonConverter + implementation libs.jackson.module.kotlin + implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs') } kotlin { @@ -267,12 +279,16 @@ kotlin { configurations.configureEach { resolutionStrategy { + cacheChangingModulesFor(0, TimeUnit.SECONDS) dependencySubstitution { substitute module("commons-logging:commons-logging-api:1.1") using module("commons-logging:commons-logging:1.1.1") substitute module("com.android.support:support-annotations:27.1.1") using module("com.android.support:support-annotations:27.0.2") // These two lines are added to prevent possible class clashes between awaitility (which uses hamcrest 2.1) and junit (which uses hamcrest 1.3). substitute module('org.hamcrest:hamcrest-core:1.3') using module("org.hamcrest:hamcrest:2.1") substitute module('org.hamcrest:hamcrest-library:1.3') using module("org.hamcrest:hamcrest:2.1") + // Force coroutines to a specific version to avoid conflicts + substitute module("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:*") using module("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2") + substitute module("org.jetbrains.kotlinx:kotlinx-coroutines-android:*") using module("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") } } } diff --git a/app/libs/com.openmobilehub.android.auth.core-2.0.4.aar b/app/libs/com.openmobilehub.android.auth.core-2.0.4.aar new file mode 100644 index 0000000000000000000000000000000000000000..c1a636c6fd68e84738832918b1bd8e6e708ab7a5 GIT binary patch literal 33247 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 literal 0 HcmV?d00001 diff --git a/app/libs/com.openmobilehub.android.auth.core-common-mobileweb-2.0.4.aar b/app/libs/com.openmobilehub.android.auth.core-common-mobileweb-2.0.4.aar new file mode 100644 index 0000000000000000000000000000000000000000..d9d133b777299dcb4b2824fff7ae6d2456277e78 GIT binary patch literal 60219 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 literal 0 HcmV?d00001 diff --git a/app/libs/com.openmobilehub.android.auth.plugin-box-mobileweb-2.0.4.aar b/app/libs/com.openmobilehub.android.auth.plugin-box-mobileweb-2.0.4.aar new file mode 100644 index 0000000000000000000000000000000000000000..f8081f54b4271676312cd0afaf6430c565119d6f GIT binary patch literal 60665 zcmV)5K*_&QO9KQH000OG0000%0P&Hbl2-r#0Nnrp00jU508%b=cyz7I%ME}q2msK# zQ*;F5ByK?ZK_RiwP?~gnqbum`ogRya?#6P4tQEAOR84##jRaAODHn*t36f6GM;jOx zHp~vB-NQQ9g+DbdI_-uB&mXd$2`j$Q4Nyx11QY-O2nYZG06_o@Mgr9H0ssIN2LJ#Q z0000%Ze((AX=F`dZfRy^b963vZEU4fO>f&c5WV|X%<|L)Vk+xi7O9<9NnBKDY8RH1 zphrp?ON1p-C8^rJ>~G(pB!3}I7TEA&k$m&!&Ag$}7x38Sgb}}lcOJm{EB5DymSd+IsKgGGcFZ&fK zP$|Mjx}r_g)9{w$M^B;?CkQVnqNd&I6bZr|gtx13uC`Y}u-R<5Xk~M4@}TVCHn@*& zr?YrEBDbLP7HTTy+U#EE z*`xT~^mF)d-&ylkuA9aDDGqP$r!Pp$gcHwBPa9ci>n7}zfA=a6{=;hTvG!l1qoZ= z1QY-O2nYZG06_qMdZ=+i-2edf1OWgG0001EY+-YAWpgfSVRE#)V~{S*wl3P;vyIud zZELn|+qP|EcF(qLy=~jJZQHiax7R*D_S$jpchBAHtc<9N%8W6dQ8g-aj3+ZP<)war z0{x>9LK1=i{g(pu*CivOEI=zED@rf_|0?z$%|>=MeAxK3@xlp%v}us zMjq?`QQpAT*wN0y_;2*^|5ney#o7FCl*#_TmF=xv%q(pG27~JV7{k!c{cmts{(s^8 zr-Yly-?^0Ie~4&o;B4?WuzddtthL?WdsFgX2mg;pCp#BMBa^?eBl@q~v9U8Yv3B|! z8@&ID4HqX9$G^dr_?NN&kKFVx{c9Izi+_uMObv{j?Hnyk{tjEulg` zVfXLorvC)*Xku*PXkz62H+DGxhj#wi^^pI-?T3Yu3;_oMLi{T<8~p3tU*InxMH72F zCyT#+hKGcWy)}uDosGSL?O&fpXJl>Q}x}PmWnXj(kF!bF+ZsvVAs(>dcW|}FhmwBt_ICRUE(O{8b ziUci7c6@i)>fL?q`}Or4!v~x>NE|}hKV{__pyk13bo3(4Sa7PkR6AJ#K;OiyjHQ;% zNKURrZO~ zOiwuW!}Sg$a2sg?yrO$kesSW7012S_24j3&MN(qe!hgnilVZBcIk_>P!;XjLv7Ut3 zv~D;y0qTSf5N=3N&4b)^V1JfLYVS`L-y_|u`bOi(8+wn70{@0Ws0LoBK|x1@{I13-<-IKOL5}RTxBGvaVKQ9 z??y9B$HtYnIxTpv_8~L5j)c!-n@M8A4wxOGX99NHB&lp%=HVkcilb3kV)j7VaseqEPpiwIeeNun_LyIGQ3=+ zapP&2OuF5zk=m$TvXdATJ~fTf;Or$csf#a&e-JCUergXJGhWO$k3qr zPA`nUaxF zwlCQ!rg6z8#1Hs9ht)|8z&_v&=Xy~dB%diT7gYWY60|#z?#r&$97Ng~X9KxRiS?k5 zxs=7B5g#)i_3*YbFF|^@Hq7O5P2GRX#15A&8eQLHklNk`+hSZG>ANKsLr0eJ$GWHI z=uema7-kZL zE|O9enPI@sqGdlO3>ZcHd|qjvV9&+#ego1a;er!$nxpfZ=6c=lfwKa%RxKS3?N8Db zn$|qdAomCDR>OSd3%&^iWBRs z!g7^yhP?e*j64a%lIO8DC#?>fjE5c4*0SwwjO-QYWA~p0BIB(0+$NJ5eT6QcN$ki% z$4k}c)j2Zb`IO^(Q~a{%fl4Zc$(E7h53ztA1zy9BGxtmat9vQrT-CT3z4&{dbc;E% z5_o4Gkry{CikD2yS4;$Vew&5{AjA@ub=oLA-qth`1i@7Ew5uhZ@fEKM7yL$^N(amR zucglg+Wn|*`zxqunmjWo@;4B<8(p{aQ_{>!7~cNZ(JLdKTYl~r6m&I)6?D |^be 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 T{v!(d>v;Pbkw;&`0D%7kV@9B+ literal 0 HcmV?d00001 diff --git a/app/libs/com.openmobilehub.android.auth.plugin-dropbox-mobileweb-2.0.4.aar b/app/libs/com.openmobilehub.android.auth.plugin-dropbox-mobileweb-2.0.4.aar new file mode 100644 index 0000000000000000000000000000000000000000..5e9b86856a96356217d270c66289c1558c566dd6 GIT binary patch literal 54191 zcmV)GK)%0FO9KQH000OG0000%05YpNMOpv=0O@6aWAS2mk;8K>$|@&yB$W007|x z000vJ002R5WO8q5WKCgiX=Y_}bS`*pY^7AoZrd;ry!$Hz-c2^?r7$EXcH;sC(xgb7 z~e;y@M>F?!7DhgjE>j^|H1;$u}PH9B35HM z{l>25ldzInrQk6jy7n`v6K7Nsu^iFPgz#|=mGpeTd2A{nZ6O?ZF<@*G&|_s>$P6Mz z3~nsw%4}2#dA-@~l{MzvmUX5yC&X^dmiMebuwlV`(g}sN2S4>m5e)lgmC}z%@jM>o z@+%9(NS4-?DwarJ<{i?bF{)RE%?@dwQBKS1|J&r2P7WHoirhh>9K^^UhL^=qm>sPQ zTWcHwxr?rb0O4u_-~U+ZA6}``uJlBEON%oyv0L zccyL2=%sY6%ZEy#(nzP7rm946J7KcGkl!k8B9_Y1!^eF)myQ15>*!)H%zF-h{<(VD zr}j>T!h_7X=Csbp;y0@wi>KRlCw8vZ^5OpFak0Ez{iU@;qWpv&29O(%o&S!K692eT z<6ScC>T-W~S`l`#45gX>c95#=*~Ru!r%QHo4`-L_Wj=)!ig)+!U~C?Zgh|I(oUy5z)Eh3KT@#TgX;AJzUtY;14)HyX(QTf^SL z)Xvu4$kN8t!o}!s^s)bM^#OJ!PWF~2e>0BYZ^r>#fEIr*CHVhGF8d$PzYEav-{vbbfHBbC$z9RPNJJtDoa4ZzvCNkhjORSfmh^DzSe zok>XaO(>3%s0A7cso`f3n2Dn^5e_JmRaW*DY2xK{B})TQm~`h}RpnhD#;?k|F^QvZ z%F3oicSgwqg9f{qYAGe=<_%IQCM$^eW}dIWnKti}2dnp*h)!NuKsTTkU)P zHy54~?sd2pBMRy=`7dXqgsF^SZP}?xY4`Ttnw1Duz7)nPOVbn{sz~;=L-GNjYA9oK zvd{w7q&agV&0%@xZjjQ1Lu+m|GtVzIV0|z1ViYn5Zsg|*8&44B0Kc+k<~=4{MM}m| zWBi`Gj8Vagku{}Mp9wcPu10JZ^Z5;&h$x2)VbEN!!$(;wV~}`AV0p3Qh8_LAVMB_s zWb$K<11a+JRLREb+X=y5!IPJnX#~Q~9$PPEI0RGpG^B#DcCspHxgcb(q4c znUi8CBP86uIc(n06D(IWqRu2-vI%OEmZn)@<(nv)pt`HLUb9ZZ#9j<66C%cv*w(x1 z-<7;Z6MBwxoJ507%nuqj$zGVSih9hf7p~KLXNOT%w-2>LC9Om7FpY@oSo9iB5^9yY zH$2v}--3TsrfLsxj@AD9=@A8!1Q*&ODP82O&6{irT{($6zekppAQhU5)d&Nkc3`iB zV8dc>*@?N*|K~$gu6+?vAMk7qOXDgS8qK6Jrn9uFc6c_VhBk^Gu~xx6of``14A9F| z4N!K``+g}dI>Y?FsysG&1zXy_ne4AznF>xh9hvolJuv&2yV^(@GOI)V{c%|MI>mqP zs=uL3vE}ejp24apG=G(rXADig_%PL4IgmDCGh>Bqno)bq>x)8ki#^JT zfJ~FEq-I?5x)AO+rs9c-{bXFe*xD**@(Esuw!a`16QiuE@(r|bT3(rKnGuk=QFUV$ zDbpxk*A|$$;4M96jyv3sR#1t}5wXyvg@d=T7-mHmR%5vhBloOwrred{tQV?#4qX

5dX)wYJJ@EH z*x$oRVZ;h|y194Bjhr_*GEb?zScYVD?}NuXnR)EGO>+U^FIg6nh@VJLGuYB*id)&r ziuvF;uCi(WS3k$5Azgtab65x*E#N-?~8tb>Xtgq;_Gcd8*>*{sARBoV$ z<3O~$GMC#rTlF6b(>SNok0&AWq8poDIws^#GUzJUOX=D`yM>xXgn?s!uR=ijOy(y& zJflnT=SeGZE3Ey-7H6qW5rD`4bkbvK5N5%#e*Q!YF!1{D^<>zaC1`aZ7{T9t&gE(R z^ZdJ@qN@AtoBR_P{@$d!jznS))eT~uY1Rcazwm;)N^RE_5k2j}J~BN@*d;gc@+eol-9Jcfnef1F>^TpWXBwvju52!aN4^{G=nC|cBoCk@8ZzEz_l@+FN<&4 z`8vq#_Y?BjT4R{AjvyImge<$>FYkz zes;?|?Shc=@#C>dH&S;#RNo*w+gec~YPi4)ibX7YyZ?F|y;hK`9lhpZO*K6Dj*TL^ z66WCv+Rf>XtKukY9KxSB!W7vC&4`0#LQy*rVlz;S)CgD~T?kh8(LfAt5gGv=1yg;W^!E3OlT`k+p@gY$Hnk8)9E(j{Ae>G*^4T-R8tH4#dH{u zP@L7~wktO_CqUvvwt^Vn&AF{~f1tM87POaoOFkb=5TXl7L$kS)%DU@imbqp-jsR0? zI8I6lPm0-aB3J6BY_vuCV$!n4&lJKDXZ3X!n~7)y$by_t!w*%a_CC;KlZ*hmd`e+Met=O7Y>Gc{vXLIJRLI4s*|sD-w!EE-Ued;sdD} zrpmMKt#_IXzBul@6256@;AS*4swxaG@};H_5llIF`5XMijVo;DytaJvQhJMKhTw2O zp8Bkl!3MzJug89s%Kl-As=RHPN1Xc2Z%e4#i`N8d;~ zw{G+a)H=8h9Ud8&E!fDWwCxU9-2H~8rpcg41&+k{I~KD@jgrjiq0w&gEJjc-X)le< z1*-=%-suu{5oZ}UQ87*jEXRUwUJ5bRcA^A~TV}VLOz&z*rR_{ufv3YGPQ_(Kvf2HtJveDsQj)^9`qJ(PT;$79{6Oj| z^CCyoL9q1{3NAA*Gw~J4j@!X~hn|vL5yOMVYj}K20S60WCUzjL2c?IDh0X6-eg8jI zWU{E@6#LZ8KmFCjx?K{_WrOAdDT@5;(KK=5W=_ndOgeh8?T70W@M}ZZ1}3?H-ZNPYPc$g#-Us%spNiqa;fu-;{|YzsgEnF3|Fyc%rdxPKMn@gV|Bu zORYY6je6zlMc(lNTn?*H>qH?iBv+zI2L|wgCYmO7c&ek$x?rb1k$?^ik@qYxH}gsb zF-4VJFb4U6RxDbasSEc>fRU@0q|IX%jAi|{fDs2n^~`M4#586O5O);ZwZO7++dl}7 z35&Vp@Qv!A&1Bc>lSps7&$%9psfCb&$bWb#qQ8BlG^o@FbS2C0p-=TH=k~=&sE&6=p7>?G7_)`j8?iEg)YZrhOOOO6D|w zV@4c_l?U-?OVv8+#P%En16%pVR)5cl&UOqod~I1;7oj$8LVlym)%lwYOtN^cpj_{q zxIkg-^gfvCdN#l=2=452eLxJWWLGEnPTE^RJh~KpD`Bo)=eqV)qN7amnj8O!y!cx) z)ZH%eY^})}FA5C*NHg2jX(I!RQe6jxZpvv)#EiO+?GXrA%nslBCnnE1a~dqgz%vnk z@T&hrTDjU9l6SmMf0o%XrIO1w)>?cE#On3{R|4)=TId%fPtaQQ0Rke;{Qd zhRxmucT~**PSZ1XH`cI-yXN&* ziXf#-i*@&RHkny`f4rhiqx1k7M!Fl#oF%uqqJRc~Hd`$ak(gDdkYY;piT-r9^L{M0MykRP?B!AWf&TO*OylTbNu;6y; z$B!e^X5l=l2=$d3t!5W);}hMSxo{5kT)&Ai;+=1=Cy{w7In#D)&96bv8cx97+;-k& zkAB6cHw_vqS}dxlkfldSw?bB6`nVHCxEf} z*Ht{89ZOXk8D8A&9iAO6*Sg9|d&@cOQ9G0>=87IF~&b4e88Va=8HFbFUX&UQv$%}aUCPjpjB{iKxtP%Tq=l5bL zdNwo=tYT8;JYHO3H8}xV?JO2n)fM--?XIKJnVmZghe~e4W(N7kTh3{2A(v~?FXe(N zf)_W;{If%&75Nu5asGn?*t4^QzZu>c7$`V(hC-z><9hZjlH!uzt0S8X`Z6>}&{&7d zn4+ zb^rV*Kn7MCd6`PstEnvgV)FbU1*A26p#DK`*xAx<)KMQ?icOJGUbAofdv^`yxnTSJ z0yEpDJZEGiytw5Rl>L!<<@VhqvHs^GFVL?!{2oENbKxWxs4KYTf|+>FXurGfqL~=I z=F!SA>IGA?$Gc8-VNW$uQQ8#_WrY@mnl%P{ih#c}F(a1)9Y6;DhIWbk{&Si8d(66h zzT-=M&<)dOA(r}TRC@`uYvLv?MO5UWQ5r-UVTDp5)97y`Z;Y8;FaCSWtl&VZPLS-e zH(LFEE*K!b{jQ5{f95j{;A_~&kD?J6YHm3Rov|VkQ`{}8F&b;rK7=cupMh!R2vfr4 z83+^zS5N|h#JRD2Ef8MU@(wAGcDi5aEjv7I*d!v{s?OL^_hqCYm?%> zV&s$Netx}xl9T3$yPju?WtcNAZ1w1gJ_MkDxbo>gNI4J`wuFG%fAkY8Nl74AA%Nqe zN;Z^&7d|1Dk!~Sc|89+_p(g}F*XR$m*i&rON;ZGn$%80L(I`||e;^U&5Th!zm^a~~`!Ba!f^3LUxWE6}w} zsVVj5yJqhFD4bnxC zAOhYx23&<21M~w<$P?+0wOBU%Kiu(FE zXGqyboexS`8i3n#eKDbKJ4#MGgr{k7wzioJmQF~V*{q+5b|J>)xx$6+^IqiTRJ$R~ z3nhsvlsML~!Zg82JaJVUn+H~M2E%1vp@^2n07z4$6qUqQNpZFM=vW}p!Xi~t^y!^@ zk+S~q&}>TM$Ma-~qS|N{Gu$5fcm^Hn1qyF3mJAaCPXDyS8Oe>71e4T^S-fY1=3Z1C zM;Un^>22wm-3W-GcQvnme@WS@FE$7Zace~k-g0&nPs7UsQkKIOO{W1uS70vN1e+1^ zLHnG*6sZ*PzGUrKt#6f#AMLD_7~<^+7{@1xYRPrz7DX6B5^QrhA95yG@%G- zf1t6j0<5ay4>M&wa%z7?cAOltWF|6I>|?Nns$Zhu)#Vcl6~DNbC%2HprUSji_3aiy znG1MaBoeuPB@Kr4-nB^ywD0USm>|i>M8O7PG*OIpN#07k50P^htcrdZp(L}%cz)vk ziIij2u*pwwSfpd0YXh3oB&1w7&KK1Aw6i3c=q%#*9IJYje|2gElE&MD z%4F3wy3}r5&PJJ#S1st?bBXvNZq$hkxmcjB>gA%+)2~oklt46z3b$M_lBF(N7chBM z$#Um~j)3QMC~A4i<<;`ZIR3h}E?iloFR+VbnR-egtR8`<=0^NQUuhmL3(f%phpKqJ zuccI*IL6qsh1^QEvx?C?IXy)o1T@wFZ@=O97t=QUe3TZd5!~5F=@@(j1X6)S8IWT{z(L`@O zlV*1Dd?Q*ul?{IJ(~{^sGI&mEh`P}+*|1U-nX&5Y$#IcwE!Lta$#1OAL8DtXqb zhEE%h+k(?LPq&_aAa(UsdX?0t@}kp>mL0*gK6n#{oqSbp+=~XJr3^dx?$oDm-zy34I=b8A3#zWjH9ydZoIclvnd+?(l42IGg)Rc z#XEEy+<5W;(=F6RG0$D_%aU(r#T(+}OxpbMJQxH_e4Bec1xi5#oY7nYp>B(p?*4)F zd%mtI&m(6hE60Tr>&%vWM)`eRSF{i~S4PZy*2gw4LK^HZCX56EXQ|?%IA;bh9sTAa zry{OnD1t$bTe`B_-}Ol^Wy07ZeNSgUZ>zVvuk@-ed1)F_fOKes3+~0ZBR4jPfKG{S zzbrQQEP0&{5E7|b7tqXO=W;IG>4C=HWc-Sg8!+&a0C$+3l+F)DL#>pr&IJuZHlkQf zVc(<)gd53P1Nw;3JtC26_Xq?ymC7ZR(9}|u(52o8!N>9p?#}wk_Ezp%_F8pOQ0quL z_oM3zQckf7i@yTDlgrf9=7+y)w!QH@{!4T@-e66w3}FJA({SDb4^gYc%%jMUk}zI- zTcmy9@9C?K#kTaYP=!C@Zk?s#o+4{%q1psiFjEM6xlVMX@H1k(Z?w{{7s72fakA)y z9dRIIdnzQ^Rw}kCA`7o_Q*!68@J$!k8O!V(RXe;@-!=TL4*hDN>e~T6wuy%^vgPrv z$!L=DE{7naMoZT#^C33;uZNK4L|wzBWn9;1O$l;FMql!_n|{rWi311KvR0A`Z#)(6 z<7gZda2tdHR|^up)8EYmwu*|HlBVnK;c5*xS^og7l^blc6C;bR%!tSGnyJhQjL|#H zmYm0b{1{&=oH@w@W#g~<AVB(QvC3NCVm+ee+*iDM#6z68dVup_TZ5MitKL7 zduN{)xCY^%y*HLdLZgF5f_tx?)E#s1;&?iC#8$G25VK;W+dcKr@75oJL(J*o&~hme zto0f~${Py#ZCcU1p;Zb&DGSF_#~X=-U`j`l2<|J7pm3oY)2Fh7RUrXW8gf&I*^;G z)88lw@NxzzGLltJDIQ4q#pE-SM;xV`*QhqR6jj)R6%_UxuI=ET7?QpHt|^m-N0c04 zo_@&gM>6cCksA2)6w0aLAr|H1UX-oxsF>R4@59-u=Mm=KtR8%|P873mPZK8ll;+NS zTp(WCDst;Uh{3d@@{aegl=5&`IAY1)Gr)E^>03Av&Ls@LvXtgv1Re4bX62#0RL<;9 zO9Vt*wE2Vx&rlG23f4k8qOld z{yFsfi#&(JA!*rNQFWKdkqjRR$DwC6EP5Y%KG~nGUlFtLO+fJS8)}DQ!d?{Od6azOvn)EZ>cSNFt-F=Uq^BQnhsL{H>C6H8>wo>XkDLesqWpP~ARs?bK|n13jl|yd zFHZkYZ-Iw2tyOSVuzX_>X`uinPE?##1+3-Y{F??{*I5xMf@Ja`f+BmVimE!a>1u1& z)m$}xE;PE>OJ%ZK&cA)!6%o9SU6D4c%rwgO0E-0*1W3=E3zOpnHBqb-<}TM7PVTm6 z?z=<%dcInEzPrQtq0YLLEE+0IUOF7V$frYjj;HPbY;+^Rs~tx@aPO96Yx07`y=KX+fCfkRWIYMP`wn} zx}P7r3bEPlIM_}pH;}~|9iB7_)7M06XiShoZPqDkh5iExs0agq>&yqHwIB5v5*q1<8IIv)EktHq<&2 z3Y5$lSd3(g0hS9W{&1L&8l}q^=B+q zcx;)pZV{-r?9vSr8CJ>oa~k(#%UsmMUDiQ$MP|q^=WsfFqE**-W@!(rViPUxY39) z_x^E0;tq!amZFn;e=FY@pa7FK58S%x1Y=9>PA{&gmmgb-1}oUj_6i0JRK*-3y_gBi zji=p>2c$S(cW)jj@%k%B+)(k38Eei>r;fFtpn%fQ(Rz4y!=yQKTMj!F3po62U_M?R zxd^1hjM&GLbv>};rMbEBO_0?|sjJq~67ObesK60}CWXO_=)$7VU#7UO8)Ur8PUAxq zRx>lD_2v)2Dg>{_Rk%Hd=4U!+kIB@etqY>WJVF3xfZA-S=}mxh@=!;cgnd{Eb+@Jd zc@YeC>|iO-Lh$Vx2K{Wd-AdZ9Imaf~6@{~s!3EnJF^O1-7NGU|6H9K1Z6e?QAducV zJ%9;w2Ftq9*}E2WHt-g2VJB?GAPXMlS(=~P!xqp#o1$d#h&J|++j;48i0P=J;FTX`NTyg=?^K6in~S9@*gLC0FeDv` ztp_81ScnJaysqs2mOnxf85(C$1(3XhH9b88@S)@)vNoyI3DyED=C0%o_Tl6wMX2g6 zOTG=0%%i1A&qr}1+7QM`3P8#8VAp0=x=E&FuOl;kEAJgEe|JfiFRi7Uz#__|U;7E| zDdW0MxmQi)B|DnOyM(>j;YwWZMu&WkASTSj|B<)4-K3K3v)4VVX(3B0Vr)C}b^piw z(5ZZxFK;czr)f8dx8L_T?X0rRz~hqYG}x+_P5(<2c$reQKS5Tm zJ9>H24GH`GLxX3!8|UWRaokr2f}U2Gr+dI=tq%x7!Z5=s0#QKX-MbT;Wdz_ZPFKGz zIG$o)%q{mb-QcH|9ht2ITW;)T|3MbNBkX~XLRV-R;<3b6u>VGy)|uBeIe%hXbX#(R z*XZV;c?~42M55Oy`M_^s9|VSGfGOcS1rQ;qMn;=tWkN@z^$$VePKZIh5AM}(6{L0H zx1YrpC3353xf4jc-?OS?l2pTU9tb8MsD5Y||u-_ZijVV1OL-_K3dL`54RS!2K zW7i#yp2DwsL4BZo!rSbGU;S|X-mG!aKTuv*b*^PbV@g?ppIPW{U}j+T#_E#1{zxkE zcr#A|3Skey+xilokyG9S_xY6ixArrpe2vpFU~SO!K5PW)vo%!W*5$6FIii`h zJARmB;TgRK5D=Yz z7f<*HGw9NK(?R`<8O+qzPSl^*N7R=J0*w)a#4@!>R0}YPgG#^kX(kj8F!zpLPn%6w z_AM5Z%55~(ozclH=*+L{tUsiP;;?lo`du2#_K+*=u&{UqlF7h@oB*cNSx&NkKl<*x zOt*Y}+${Hic;mN#4=0*&1I+%&u4geTzv|ji=b0AMEu_g?aCyu z*=|%3H}k*LGMi>+ZkL5S?4W>4U%EWZvilQ#$d<;+(wtMr6@C@4)#4_+JJ2x-@MGIs zF`8=RswycYdDC*%pNTqWwl*u=b~Euot@RpgG(*7vdX48xk?o~0*-o)bk~oexDjX@7 z@%u-QFN$qJ&JoU@p9?td8F2#?3)IDB$U>N#hisz?;S2)>QRw2bo*uahw6wKPME&2m z#Zw0AYD`RIZJA}h2iHNzBeLf!5!$4QRY25f5$wsxN#} z&+5ZI^jiqZ@OiJ&&(^8qhSXv4Eaj{Fua@V+6+mBEE%Sl;dQHcHo|H?~qvIxbltsX> zUO>qBahJ$!2%%Hy(X&OG2PKWYF41#SoA1UT?K;Ki)&JHd z4eVwy9GXx>6F?M9?Y%1Zf1D0egTf)3edWZgE^JU9~CZVGk%nupN*GKr>T( z;0%L88s#*wKy|pOODUsNIPv-mI7O}wPh1}!9xmaHR1Lk(=00bIm*99o5kbU*Y4Dj zk!tWVJw{}>Uwroc#zeZyVnZI$(C$NJH@#ge>=p(ZW6!|ocIfn9cMZJtVxV^jn`xzZsjs=Y-9(8N}C;?5~wSzO5pc6D#EY zI&6=vCq%n6cfD9H&MD8I;DKxSF6-F@hmr^4OH|u~=rdkUO7Vad{Um-&KHuy_ZS0}i zaI96~B!g)mas%NjRYGM$o~y<(L2;DYHlp^foqomv+ET8hGxWo{*K29wP8)1&r}tjt zIH5dE(3oG!P`ae-l?ZSxV^9h3C0#7g=j$yr%{hP#@jS4d;^;C6!$?7o4fUSlKk>74 z^xzOcJ`5Tij$_cANcqU!$u1jS+BYO@ZCveaT-|o0T&Ctd|-pJF{^!AGj zPe_ZXtLFu_R}1>1HQtso_0d6#!3_;}UeVB8ban2LNX!rE5W60=m1^3)%-h5z#OH8B z;-n7+HIh1*Q5p}mF$eyaeA0N!4wml z^o2-zWC*J!I=4FQC3AfgRs+`5v{vWP+t$Q;F_QYM!qL1+yNh~q{NkS-S*tSWDdxov z4orh?`@C`;aYEjtvD0Ni=|pAoc>*Wv$G~^Fz##?u$Z(h_v6#%_soYZ2t+%v6UvW}_ zDz#AULDev$F9^Nn7~3#g)g>dY6Y@9yce^!?6kUx;bAOjLP04IUGGn|=n#m`SfYLs? zZoU(TZKf2KE~%8XUr3gbU@kNEy920_xX})5nfRh;_IYE3)QRxT{KAaKwJE|wAfIJ|!fCxA z=fX-}suy{66&D#}9A&i}R+Z9~7a8RpWT~wF>h|QKlXWS}$o6>^QEwu_mXz6p_XXN4 zEd$8h7Q4gEy(uFKH@~^h1Jr~xzO90*Z)+u?X&MibA&@1S=+~jq4>*SseRR^w? znvV%10nu>ppkQ41ZWZ4UwUmTeUB!A5Lr>+r-P(%IEkcP;qQR$e9EZLsZku_89dgAC z-tc+v9B}SA>Q->-$AEDRwni=QLsAbq+#=kTx44Ir(C+$S)KoO}hl9~axH=yz+^E=_ z#ZP*u38Ta%JcoRJ@g1~bxA!3 zT*I4WtD1Ll~mtJTtB6i7$8L}shikJ z>R2=A5ay8X0^-`C3vEJ)4(3FvPfZa_PYYQ6|o zL zW*6*}C~Olrs40nOJ4tgKs{hhR^n#w8d7;$`Hr|y{kd0-53Pp15WwQEc;igoTmBKXc zn7=hxw;q9oN13D8?y0{ZM}lZYgVIG%fme8psEroBBX-9TN{;~LnH9rL+v4192-5T^ z-dVZLN*n!#`^siN2!toEJh=ay@3>wHeo9G1uaQV5`vwX#*<51SHq1zac0mkz7w9AWSW2GFH_*bs zSD$n#w8MP!Rpn5~1~P6b8CFhS%Dv3{#u*3_vU3$b^Shf|X_~_+UBQx%x_!(lRGQ%O z--(8X8S0%)1-}_$yFFPkd0+QlupE*F@5?jvdbF6R;fy}0cdgmJ8>M(ukX7>8J+y7s z6de$0zjBEFB1S5_-9knL7>591B?@@Z6C+#bXUu%%oCH2yGlX$5bI z55DEz^bfZsL?;JW@pL$>_eTYPgKh9Rw)6W#JNfb7{z1WNU=5u7YvF@J{>$od{;!4q zpC?ggAgQRS8NkH`_#bCc=YNF3lM%LEdKy_otp4vsqDl{LYsVceZZZNLIlBB0l%@^e3j@PurawJp?@h ze&9E73Yb4+OY(T=G2lyV);iIXTtrlPN6Jsd39Z|$A=P9~3mqq>%eL>h_e{HtBt=@X zXItl(tK+|ZJRKcE2(W_cpkr5G(HO#=ksPFD!7DAbOh{}d!FWpQ967C&IWuWl>KQ(> z>0J8qzwCp1OL?Z0x+9b5nsw8#*1i@iM%24BkSl~Avn^0ty8z0{+Lp0#AbtMf@VirG#=V!U zbvEyCBryCTLba0CsPX>#v~y(yfGQNsA=Y6=A;f~#jgVDx&frRwwP&uuE^<*>q9FI< zPj%Q`IPFX28&QcHTye>9VhKg=U>W6Ss6S>ozzI@`(R$%G&NGV9lR2CR)SK3yW1z*1 zdcAOFuxW4qtqg$j%*{IbI|v9O3oKcx&6Zoqrg1V|T%~uRrkR)d+saax=-#7s3Z8 zF%V@V|Ni97!HP8}7dYAZ`uv0hvFmpMjby`msqYgdt>87Wc3dhUR!o58kDkidfjZ#E z;Frc$d+E2g{unFw6@>pIVu|s)8RJCBFW!;`F6d{Ad}gb>*p{EJo;h0*IaI5QS;`Rv z3YdO2!;@-C)PBDHyHx_br7&D2d2$pyhU}YLp&+8lKoO<>YLgOAJ26p9w}BwX@%Z=g zpA-Q1EXo8UH+U1#+q8H%&C-t-h>?epyf&uM4WWqk1Jua%a?Ex+$vmxFbl*oALfI5F z7U^mym7A3)%V!0A209FAI5ta67Vk{gBZWT~bdqR%YI}T21A$-`@ia1OPb=wV)V#lj zV^HTCrAs~}95LsuMisA4y<#|Ft9;tgoycW_A;A)ssr)OAzGnejx?tZi~r2b9Z?$s^6-Ey3$*y~muQ%GPnmti^5b5i7SErxh#bjB z5HO3-*#d5}O49{lNFU>y5eNm@6+Z(uwD6T2f_n{gGDldZlM)>}tES+5budrRJ&mzO zT($&?o7rLIb9gmxvasBUx%LhdUqt&{!Z}zE4prz_H^uBQig+mZOljMDK8_zBFOm+T zc`4o35Io0yd#!+PwpNoNdW5y_Y*4weOH7t&1rmY0e#lCBGbe$#zDOE-(F?@^$jp7C zKfrmL;NqI#ZYpI!&d|Tnw)lQgYoTIyK&m~tM)n15X(sxAi8fKI5&HC*~?r)sklwfh);OSa( zgi>xX2&dwud-$q%S(8Es-M5$>XEnuocb*WX7EQNn5Q)l8L3*VCpGCS25!WBz!h#t> z^NcTXXcSw-W?~2i4vtHOYI6Gl8?$q1(pbf`9C*NY`e!!}KTB}Kz%i@gF%-%BA-oRH zf6UHC0s&ozer>~E!$#ntkVi>YXX>LsvR5sNKJdahEpmbpe#PPX=T5|)Tap4mcY!93 zvQHK|CV7`LOAv}e#sNmY24v0wV!FDwHAD-Z3tj|!+VWXxK%t6ie8##pch4N23SNR$ z)~faS$3LflW|*vE3~&&TkiSxZ^S>qq{Fln<|B?+v|B|Zwr}V$qyLPF|IHO1)ewvZV z+!5OV^w~*Czk!?d>R-k|LP3c)8*|mmy(1!0D2dM-RyD1wUB#d}6BhAC?8G_CbA{j{ zM~I9c8T+bI^L1Ej{p8veQ7y{Oxz4foZ1-wE`Q`WP3x1cJ8ZJ6wfibJN7Ds-qQM5{p zy;aWzufggjr4mc7q6x4L;h14+J^|I(jbd6bPR2nyf`NR-Mb|vWxnu zA=3aSfzNFhIAN;9rdRJY#fCM^9IW@GimL;ogU!WeH+E?O_^nGb&vpgh?(Gfxa@ z*Nijl-BCx}#!5rVso}5*Z>%y}KOwh4QnC?~z$MDS?Nn!~RfzV)v6cW0$DDQM&upo% za-0(1vZS7)b-T~m@6f4?lI#iPklN8nBpJUaTs+d=d$EQuZ&Bm)u7tb56m$UBf^dFw z)OhksASMxx1G?xzI3QUVAw@MHxqp(H%ZgpgNyI*tms?7NvDO=zgmWntkY&dCg8h5s zmR;m4B(6_t6e<0k|C`i4UT4Jt+_o|1sg?Qg$cO|A=ZHi5iVus9oQ6AoaN%fGisb%B zFWU)LJtVK{)U63}`YvYyoC@TirIS|2MMUVaI&vy#;{-5x)n&kt*55JYL7zFpb)yWH zUJTt5_(W2*Af>@AXz7{&+)wK zm_L0nQHOz6*Jly+t+eLpG<0nZrwfsIgwA>>i8ynRlz*1Vzao&ydz5j<+9GX&FRbS1 z;TnmW>NGaAl-pPMb91UMPouAtzRZyM)T_=A)5F%qFm3caRY=3j-#Zm3-bOX=mPuF-v*WmgKT``Rcc{(#AQ&TgyhPKXh z;=QxX0!z`pD!?{m?`HnehNx#X`xmt5il!!DxV@`F742vlVxZ|eMk}Yfs^_y>OrDcs z7RPCxBWhXikt+_>z)g3RYo|OF))bdoc~&6!0(xYXxK?XLrwx*M>8@(4+F^CsF_E)L zo2g6#QADvhvYS;6k`f=BsYgdwEbB*oxU7G*90_f*U- zqGSH&ehJvJMCWBu-Xcp@>jUKWD~dS*T+y$+e$Xj;SMx|#oQvsd35M8c(O(DHH#~F* z&7G1rOuXW_J1BoJM`rsR-v!~z0~?;905L$$zfW#hrWZK6UP4E(_SQvu4N+657oPbr*ju?)_MJmXk!7)yx+_13xzqj6ixQ5v75Qo-3Uz z#Rckcg}rqAf=bhS=a=34F_!Rg}N0nre$ds)iNf?pE zZ}9LA;UbQoF~ZN?dg4fXS|mEBP{1I$7Nh73^!xkax? zF?W{~F~PN+Wp5--o}R19c8^j^#!TblaaJVuoeNl8#Da@C{jStovenosRgCpx3TXcD z@OUQW`MSMO()0QGfdDemN)`vSFnug7VV9A+md%vh&AqioZEu5vo(uF7m{iZA`elHAVYs*pb1L>=^Vvw{A&A1`xt z(y~CgjptIvHcMI-b%M>>Vv4w=3i>UuHG;|C@E}d=qCERgw;KK3Toc%!0w{~bFzO}O zj}hZRqTKv7W%hw(jM7+fSrv&~k=%fjpD>U9FuaOF-&AW6RBzx)dqa^A1&^%0sXCY_ zf+myMHtHZfoBAGrF)wg~&MF=1!0Ld0bt31{>hVDf{z$U2CX>kBcLlC%qAF4#iB!aJ z+%9uUbJ8$!_<2X1r}fLin`U89zA1ulN`ZMI()x!(M7ko<_*sLS#lq_CHnNM<_nW08 z1hj*u9&@-B5QUR5^S$_ZX}IWG@6}4>)&UZ8Hr1-LMb`^S>5TQJ(aYZHBM(aPXpnn1 zBR4DWa~{e`si%yP`yckI&eKE&C=NvYRdm&d4g+grVi|u|!5Sk-5`khMuq>R4mG4Un z5iw+1SL94z$L6=5A=`RZ#V39cOhm@IsM?*o<3+Mb>Y|j^i^7V6tlq=4bpsW=qEo9o%{sXYBF>+>(HL_7~lH3m(JURJOX9>cPH-(~=TCT~kv~_xy*sIX{ zg?W~}j&EQK<%PChgj*Ns0AlxmIOo1ZthOgQI{Ovt34M1z_~v*wU}CF$esm*XLU!ha zjIE4O&bM-UwbUC56t_Z(M^pUgjJgag*T20 z_MtI_uunG539MG6DvikhZL7#BG?1n?*gE-#*lo55GHwg6N6u4HT`5P%YaiP498Bqk zElC7WoFNTELFhH8vR@GY8SiT`QSC%%U|<>a|81hY|69EO`(GO!L@%{5_fJdD7T*>f zAsqvq7~>%5;fn?-2qg4Ta1z|01R)Vr+^)%$3sU+`&A+?Q*`@IE#L{@2@b<~+lnR%{ z?ka2U&L#$>@^JE5qw-m$9>mvg8IP&G$)${4U(-EZI@T1}y+1$hTi91~I$Te4xgYWZ zXR}#74gH?N6v5jKn-PbB8ESON?28rCTBO!;Cu1f)K747?F=LP2?6^~u4;YbdG4vY^ z(;ewMm(|SJ_-pk1fa&sx>dXv328ZFlTOWV#S3c|rRcZv_f*2ojR_AV!`T5cCad_>A zYi4^9OvhNc$wmb#WoUfDD82rX;&$xTvLU6k~7k@5|a(IGB!f#U0Ody zlYM4!1d~`5aJk6{Ij3jo$DlbL&0R1WmcrQqOBmM4+j5q4J2La%8a`uI@)Rkpk@6r8 zvP%jijAqnEWs(}p=88?=O_F3UC$t zZkvmuD&tUCh(_=>A6hXyL3kYs;W678V%zieYW;PV7$a}T5bh^`Dy+4r_Z<>k*h1gS z2Wf)lyD5?LVXCSQ274gJu!A?6uJHR+s#76Dp~JCVz{b|W>BfAh14Ejv%%@=M(ecf{ zP8bWucbd7Hi&dwNYQ#2~R+8k4 zAEIV+bY+HlK9zr$epMWJa%v8G5?N+TJL@m7Q|B^ zZ*pl4$nHf(SBsTMQOA?k2sFc~DT9+y|L}oak6N`Eo<9+o%hB2=L{7amge&2Bqe)cq zF1`w|X${$upJlR^3o_#7gj|o*cYz^<(48z z8UGC#h4B1(Z?DJDNPCDN`o}MRum1SAJDwnlS)py=@-)mgMWY7xjHzrwspqpuGXcx_ zjx+{5OKNG&F5;a4w*pBcH*h$nsR)U`_+@T1D_N729b*JWq5al0jOe&+#PELh!qt4X zN3-a_?N~vYt<{qRRR=9x3rv3v#|c{K{HZJmuHT{okA;f)=uo{3`S z0;&j{A2>UwhY}j2@B##Azek?TSnSLPvnWbbM^A3koud}ayP^YM_bB{LIem6u?8|b5?@eH z>rG$8T)Gu4V28M8FU`)A-b1n(;Zf4l+IkF|SkC3zCQnf84u4m9WDEN-f;$p{^x>&7m(hGY z%59-qs|n^PHXBce)3aR8iEs9^NnF%mKX(zV`ArXykVSs!%%8yt!DS1Zb_!LAl`u5T z3;MPLq-!C4BcGM1W&Oo@z;Z{5oTqN<%(8|v`ODSVor| zV8ic6+ztik^~a-1Z867Ej0d3W5b_cMGnWEpy;?Px0;S`Bk=#|=@N%)VG_??D zG|dL}08Xz?kzVs)Fd#vBsJ7VHkk-tnr?SI+eOOAy3_~LAkj_@3$_^8dK zW)`j{u>>0!&_d}$WS#Uo#hDKozbJr%a$LLF(jKzD@kCYKXx>6k1Q{Nm2nU6XQojnk z?OS=6U3M4p&mTGM)vBn&9+*zq<_R z{JU34@VciChIc-D%+fJ#luM#9sl+Mp{!R4jQ*ND^JVe1q3As-emRmm4l*K%8qa3A= zQOVE-a7gApU3`G@;RPKihQJMhMTJnMwlBMb01Gh=?3Wfto=XmJ>B> zx6{RP-tO>p=IlTj|9ZX5Ra z$?Nei5{m_;&XlO4E!j-1B?;R*DA z!By3ZZbZZgyvu?a4otCw@Ol->h!oK+I$WKHRG+{;<*ygl?rtEquDyn6qY~e8Xs77y zy|s&1lc$)>jbe!N7O7$ah$wBnVowR6Uni2!LM&BS80CjE>a4nOb2ngLYLH8EqQ+Kc zje{GV85p^pwC3cQXEh~92WOZRy?$EV+%`ZK4Tbc?q;{JTb$c7^}hLKWr{?# zT+i-d!s7_~Fr{jPsXRb{q~g5_JtJQjx~iRET7qYGxox-l?=*+po4c+H{gJ+`Q+4;* z!IF)SqoK`_fV30i3CbDUzS@_TtkX-!TolR8=6tHN&5KPM9x=1M(fqd6p2?P#p~k3^ zw37Ie(ZF=s<~6FT+~!IESPg<@o3zH(n3m1WeOflZ$-1#Obkmy1pHDujz2RUBY{&2yiEb;Ij^>!$BiUeg|)B|!<~ z%^Hn&*z+K)=31@mu5PRPq`n~V}M!Q>1I zw!i>0JGBI02^PHg7Ejl%Dfxi&yP#HF9KPubJj~e+jgTce@Msny1S@-ik89fh(S8g{ zz!~KuE()$aIu!;kHKGf{2%$H=9~EPYYSkrukxWVgi^9K@eu-t|52em6ENgG#2C?n4 zY5*aE4(j;VePpdI`TC00Gd4>M76!a4-37mDlGkYO8AdHXElA zxK)d6Pgrx+^?udG(ahP>*lU03=I^`3CW2rc__zf|sjx3FD^$_r8c}VxCA0ETQ&Z{g zo7ElZ@#YP4tkl8jPiahv(|?`w`D4nz3^k?Pm5y>rpU=}sV0o-5_|wm3dYmv>xQ>s0 z=2q-)d#>!bZ&?GXeNvvC>J|R;yy*=e8x_d80NDS@H=XY z9Wr4;DEs7}i9XMQ2A=e`EeZMYJ*%j+2S# z*wZtL6@K7-iw~{L8!S|MqFA9l>WU2d<~Z(q4igs#6;XQ#Dx)5x&-B`XxdCWaFll4@ zB4_PC4;&9^O?(0U)JDp>A@F^VVh6b=r3HjA-JARO$J$ii&Z%pza=inQPtM9-vxEyltPN{n~d9ne3J-UbVJ=+ZV0Dv97s|=1TQI%;I zaH|L`%Q1gbN2n-GuN~c=`w8|>h7#P+vDY&M+*MxjBTR!PhYZo=en@B=I^8V@^NW>V zyL)iB7%DmLiOW)R^ufL9Cxvn%aDTLOf3%;{svY+25Ms>FxY?GB^=#~omYgBoH3qVEM@PZP07w8d@_i2rWSQxH)|-Ytxe94T7V9%txkx_PuH?t53S;t{sf z#bq>4RBsgnQRY7#iCGqM4;R_1?KAzxmA-7BNI(g~ca4SY7LFy;r|0DX!gYtH*++;Q zy@W6e*cN(zTqVvGd=4XbvlM2J+$?Bs4-@N+5F1{cqF&-(Qf&3=I9=QC8^5CI-O2}Dmxk6Kc16_4N8PYE{HE!Z zZEWQ>g6q~1F-sFYDuK{jSR!(uO!R-R#3_k!A?>5oR6rXJ)}%(~ChtS%rraJbD28U^ zM#w2A5c%1_;rQapqkvQxc4d}rwD$sSJE-0)+rz?v+8%^Rc34^dO1?|hgXGDF25br8 z(i?LnJ*qirE2!2AOVEl1cdjeLtNXoTf=uxgRj)O650UB@Q{snG?pc0;t?PY?eko2H z{iP^>#3=OTSVoytte8-|QjY$a?DQO!X@GWy6+LXCF_L7UOnadql1};)kULC?p)1!g zjX5R1oUUbWQW4og>D9G6EQ5hBua;$0T0b}(O1@_*m#!$@in#O#xxuPqL!UugF3z;5>nh?)Vt!iK|1oDC z_K*sZ|8bB62Gc0SKu+=P>M2v{!_4$E|-(?V{X7KTu?ZbO#Ac zz(lSp?wcgO4aOJ$O>#fqEceVj6rbEtItaK-*RVe4v%KQFl;u+8Me0t27|<3#G7%92|xNTI7%R>G`W;)2zh;(h*el=pe=ra>T(|Y;`2&P|D*a2E7&3 zQTFhom&1{Sek)GQn3070ipx-pVs2S&3tMJ6Bb5s|W#`~*Uk=mszj@QcOlPW`ra1Q% z+~M_IjtJqz-5Q|0%p93T&BN=cHP&2Bq>p6PQ!A9tZiHEwmcaJ1zmBv*ZhJ@MD zJq_@5iR|h;(=X(Vq?*){S(($|0)887nh)qxb{E^bDas$Zjdl^Ru0}4xjK1>m&zm&5 ze|2factc=#5)tvPC_Irnprw>6h-9qW-haucQ?4dbJEr)TaLwJ$O}sUiBK^!n7xb=M z=tI9*!c^bwI{%}-(LeD9Z63$3FJDO$O>1q=aHM!1jTg7;*Z|lq zu3o8s8Qf)Nn?XK3nWwX@+sH26e}a`ams_sR+{O%t}#Kb zuLDL>{z%)w5#E_AOzgr?(%ic#k!icJ*`=)1upb2R65GiOVr}DxMDZ3~VW+0^DQ$OW zmJuHEP$bn$RjNGdJZWXg6N1c4$#P4aSkeZGl5E^^k|!uJW~K4Wxf$G}vD4$sEE#HR z%oeN_7hNL+{Byt@r5dvAjol(|HQ$HYRT70b`&#F_3h^j~|le`HOheP(iH#uAnZ$ zActm1WPfZcwCC}do5aQ2pAWKGlA63=6y-}4S;&1hqkS|e*%9#3ERGF*2h4V*AR~gO3 z;&giYj`Q?B=iyl}@Ev|1I|@k=sjGOy+#&T(wf0d}YIUhD_ZWw3rh&6&i%UZiCw(mW zadl6Dx}yI~la7L?dktxO5r469P@27QXX^v0HqCcf43COx-BSCoew;$v*UnljciOrc z^R@Pa@O@LbT{ilqo|*k45}3X&8-#GnilH!U%d-hrPeGq>Vv~waaHK7l zj$<2mZpZdJwE>Ul(v||;R#Q#ArNiLAHhHY2KQC(=CUZbayhm<%$w?{`t$%fv8P3fv zIM-A14Wu>{40M4Gs|BLL*=8HH*GZ9KfYu$i60KrY5|sOJd4jMgs`<~*AM~Jb- zXq`nD!cIp#($Jqn@DO&GHV7x~l8nwg<4)878xI}7cyhATBjBQA4_9p=>x`eDCt(R4!O#}~uzeN2TaoPON!433-ocUf>1%uW3%CxaCI z+^On|Z*w!e@7$j4;`^dpW2g$HtkFy7!}{UAgyQnNHFt2cz#fL~=x1sI8*BX0A4AfO zEBNzDr88fW{lgA>)r{zREN*_Td=vRGS6W!@E& zAhGJ%`HRuk(=5bP;tb#n6>-delUmY0+zP3}O&Gn^uO^E?52wVls_S#5y#MX45`Kj_ zw7u2yETn^Q;6jEW&YJ3z(GF^r;JTIMU+f63x|d)3?e-TP=WYYvOP1#Y<}j(m0sS=k zL@ecKQ|_gvU}&B`qXW$yDIR5R011*l{lfe=$*MI4DSHi425|04X2G0pd6k=xye#HD zq%!cmpVRI2*HLbv>J{O)lFn6`xp=-gS-w^xj=aKz24lnf#vg^B)qmbG)e0v+KCSjsSPt?KBtqCCN(YT8@Jj1y!>pD)C->$k z-{U=cuK;DzW3zL@>Yp@s*v5A*b!ZkyD7!4r-%hY>(kl-HG^#R9yJoJJ2<9~Ik@O>d z3}xk(@IXN5w9d8A93aw|$}&+YZ3&$x_LE&Ac@Op0e6(z*>7={77aQ z4Zs%QwWz}xCVg6p?@u&j^l@)!=7YKX_pH5}AY`&mubK zZwY=jU9^B|-dgo<`c?`Hk7d>CY(I)Z@yR(?BzyB5Zh$XN+DyiG95RumA zbg8LwIOOVRw#EcXpr70chIE5&BbLp!vD`98YF2 z)M5KBL9qx0-bXWcdCHTp#5?sfo~9*?D$2tc##5TK#wBEVGU6#4+3$f&L>J`e;brzn zVL_o(@=fjOm&cN}QIwh?C8WIa9-&ZYsb!2sm`92GX|a1oL|+}v_6S}-AJKd+3T2LR zk1XVT1zhcdjxaWKrYgDNkK+t1P?DD1p)tBFC|Ka`XQVlw0XT-%KpHI8+ZSbXz}RkU&sqe^Vg%f8sughrMDy3>er6Dj1l}|0~?L`sW*V=F(>W;Z8E6`M=yr zW=Rtg!|0dRM-`HPw%7?7(Yr6P(GNF3wrj(NME8GlXV9CWRnYeNAwSRg$m$KGTaKbz~H_w2HJ>ij`(eG#K$X(otKGZ@cjIQ0FXil6T}%p7C(6Wuw^z>~6aoYCKlrX8K@C85*9{|HL;i zipc%yFXzl2#53nwENAe>U!>QQ7KO8$v-c_x)drmUDqD52%&&1?c3y=qddf>ON`gO? z&t^QytYq6=Y3OQ@ts&UYAwS|z{Fzj{_p4Ifc9V74D3rEGBmA|LD|@@9U_b+HdGPqgfc=g#JYigPHZn+Qv@x7 zH$E%P$5e~8=(4b3bumAWRQ8`c1kl=t`kg!`h%q{wJQO}awS0Fs&`8#h^|fkAnYWQ% zu&I!)Dhbt)wb!Ai-cKrAQQ`a(AjmT7nrpbUX0CN7pY>?fS^ItT2>a|I5txo8xfp|( z*EWN=qHv9OWdZ5JT0vG{BgDD6)HcM%fS6q|;pFo#r;>^EypQ~Dy4-R%Mi7jFGSy2K1QiBI99K-CT&S1AiB#{Q=MC{1dC7y+kOdER zBvbNb3#0&37i2+42u)Rd*V*sA)M$o^Y1NJ}izKT4mvk>FEWDpeayYptqJ$hnuMuwb zGS}D0TZ4+`_eu=yQ|+o*Hm4JPNL72UZd0!CcWXJsZr9(Iea)2C(=1ibY{+7lF^_4C z#yfloBc6Aw&fC9)ucg1`T!1ZlWlh^or=``-Dbj}N*rBz-YHttv37*vdxLtH8GUAG> z&QQqErm}3K+fbqdj6OrTO}S5u%uABRzhv);-ar&j9*o*>d6A%s`UYk6+e=TmMSJ>=~=fjp|p-$9LDk|c!sW-f`7DuB(S$PK{fVuwK?ufp>%xjJFcxIJ+*IDL z(&-IRrUU+`JVVD{6-%NZJb?X|Tweht|FYAR2CIj%PO3#u{R30-LCJA*3`g;?2T|@C zrI>Qo{O;@9*xE8Bo}1sK8~?NLPBg^dsT4rw-^!Tx{p>N!F4Nam8dq5xBU9y8+gjYw z7L#Av*7n;h_!CXZuJ32*@fTRj55-#}=>#0@ME z9oZKMKwjTo&@4l|qOUhIE@*U)+ZToZZgS&rokIb0tc_W#yE}GiWY@KV3g;E04UX>! zB;$%dd%*VvZh6NyvQ(8#4Mv|!4Tn|Q1fns>XX)G56NM>TZaBh#exZInEOu5xADBT-;5vC@;| z_L7^WfX9H+R*oo>DUQ)kj~qbz^#@1&ph`caPN6tru5@aDpLD_GTgTx#$h7)es7RH_ z)Lzi87C9><)_oGlyKXeBQ@_GtH?@nSagN&c!!xJjk5g@R09g>>&$z38!m^zBh4pyu z`B8!&rT0JONlp-$eeX!V%-c&95?ux)2~__u#tb9#gXlHc{E+*AAO5rVe18~W_1c}{ zuYQPn+!5vJsSMTQNk9;FEP#o>C)|Jdo-w21z#)sRvpEs#!Vv9C`f>Ni-(d)#+%AC$ zBG!L8{wI$vsdgOX{==gK|L~~J|05p#-{Xt)|2J=HA=1&dLau{n{)Bo+Y}sLxCi}CF z-3|yDkl2q;Sl5=eZLZ%`{|mX46<5akf!K2?&&bmwmt%3r!Adxq_Mx1?XXzP6{sYZ8 zY2hrp$#Ux1|g?K+xP4VU|jHIBy)brwJwaWd0EQ-7@5#%F)6IULI_ zy>&E4Vq;^0w9-;SyXvC17CQI9#+E=MCLEa23;b-*a@3NB3z{zNt+53-I9g2|%NHF| zEs)i3iyMqMBgeA2k2!olS#~ev64OKPf$(=NwSU!w{$%O!;`{WSlxpFla-x+eU*jW| zJunS$p1Px7+9lyxgZEqF;H#O}o6Ry1eWqm}nlWr=yj?8>I#^|e8+t@;6-nEVt@$q< z_)OfTK}<~|BFXscpsOfBOOR1-o_Of9{>wpZXECbvCMj0?E=dY8yC8c~WBRoA`ocXV z6yipX;kwPc*S?HA!w%IDFNCYY1PnK*`MkNlECK5*BL!1BTO+X_H%Kv%Ke@Ev@G0OY z4thFYrT@~ni5L+NRl==pDV0+n{;;VyGe4V>DT|gwL+6DZZfpOL2jbXYKC1(*KA-mTZAEb^QB_7=7_=VTh(qH$11Fp;Ub*u& zs7ig6Ypu~acP#-=?#MRi&sFxGc#6vea_a}BrI`rrqMZuk#qJ^#h~ymWceZ+3<%_)- z&1DOj{a8_i$=Lqp%J55nk)>I9BQ%2PW2fqn% zlH>>r@)o1Ugy2}ay;iteY`<4BFg_#fIJ0uwJ*TXj(tH8CT?DIhSfB&9d#p12*m~+I zvzx{gTdqDrl3Om*-_!WHizYIR4Iy1HC<_$Q|J$GfCpV2O06yOxc!USR7*LYUlW84S zL`c7u6^-!Kp)jMPFI6kDA|v@YCyXk%>7eA{W!pv$zs;+H`c6P%O=qla;Oq&VN#m3F zpc5>LrP<}f7}K9eruUa|f;%efBb`v)CJq;aT{C{-_`4&PD>P++11oHD{=Td)MQssy zCTH$N&~ekScQ3x$y5;V|PEGwrQq80&7Rs$ueqek?|M#74m+GoQXwJM*9)VnD&t7XL`qL? zhsW2KZE244;<$Gje%5*x(xvz5qHay(Vjy+k?9Y&9pu#xeBv50#)&6ot@QnqXTh_NX zD=e@Pw18KXh-d+fkKX8skET*DBCxApNIkB^y1QRG+@a6oZa}{sti%`pmob(H?V9cf zd)6StWljHtcznr#`!b;%tW2-LMrRS{q3H*O z>(J^)KgFKgLMw8c(Rr?AJ-&JoN_bW`6;!zC-)9uC5sFcTV2d*#7hOoCZC2vKSVx|# zhQ}D}-}U$FEmiXtt1aJT%NOX;z$kPA0o-i!>71Jv{p{j=n8nI<3!Vwr9E*8#_N)??{-w++6Q)i6rCQfM5dXVgOO^B`SsgmTQrylaG3! z0u!=(X3q@HhUTyx)&@fJj@eulq1KtAg35`IbA0Mlr$9s=UzS&Tyzc2wkUi||Tk_GO z-_2c*Sp_=iHqc2{C^)*BA_rP7!e|jq9jR1a&H_h#`$Ts_9!NL$DC6*kD_$Ch^K^(| zZ9`-*oCCUjx&4{o736zg4OfF6ghO_WAj51fJH6JvcJCm!8Q%823W=CWYt@NIfDiK( zPbx41HvTMMv2WCLLbQ{7KfUBH3dqoMUm^5Obp50{Kh83nIC&1^@i5x`5wqaCGDBf7 zO&U{_S5&M!9145-CD*a>@=zn}%FrcIBasAOF&`$Moe$1K{qcbfm%#(mwee2K(|>8; z5ce6}rND!MRbYXES^am9jr_OB_Fp{t{}I`0es~h7;|5#@n0ZijougZwx9VVbF8V1Z zhbK9JSuZy4a7fE0H_MZ)ZtO_2%>0qGv=FWQi6tlmu8b-64kP{!g=S^TzrI9#J5K!L zvsCa=^9%a1gSE?gk*(B=YYfPp+r;~@%lq8>+%xyqedB-Ab@TOU5B7Z6EyQ5RU~?R$ zOapK&HJ{dS%`~7{H*d;6SNGJY(ptf7DsCuCqGh!DERTrE)|l7Vui^>6l2+)jIYqXQ z7qkoB@df!$U#kCrLN9yt)^B=TjPdyCIXT{i5DYQ4rp0gAiX3Yib-bt}YuII>m486g zWY+l%zrDetx2M*t=MtM#6+3g$s?24FzZ7ntav#35=c8tH>9mo%pn&TzyE>C3`cuYS z({qO9c%hM3r=>a|C@b5RN-`h8E`zoUyMc$@a9OU_B+X5B3ZR#jIo)0KgR)*g(Dvxm zrt;fms{tFAl9BGzZ41~F<2i1!jD?j6lDt+KXraUF zAE+*t@{;*X-QgGlPzb2aAiA2S7(3%`KFgG|*Am{^E63xw2;1}|xZ_G&0FoqrG3<=W z%7aYcWfHYOUHkH%h=SML+1E`Ba^)}oHA9+@8#vL{Gw!K;ar{~y&xCDURs~Ipb4)uD z3L9OwSm?z?*Jjs*gG5pbg%Oq=w}JH4DgbT0@A)Wz<{}S|FL9=JxDW;m2d^M;+wCJh4TQz^8$-_A*7(2;+G#~s@w{cCFFPx*9vk;4L>Tr86 zI+%e$-LkaIO~^AQrw5^xRSZ$0SC0wGLBF#FkFc>u6_WYUC?d+?5rOSBM7OiEQ-^Gw zy58HG4VhleZpay@O47Z`W_bQoa*`oP7a&6C?243jCp8vIHTs&XZNdi zWfZN^*Vz#Bc^?ST)*^>oEwG3(wnM{)BvlOn6}6HD4ijN*F^S1N*^mVLLnsGd#^1WE zs5dT`)huI*V#5~ahCrZ|HWnzJ{P5(k5LS0XzpSc8ROD(vms&JVDRAA#`%V=J4tE#{AsG!VbzHFqN7bBcB zr|Ir2H|sN$T1F=I)R!xE)vU}Z^K^YFkruI!EdJD7 z@|k9mW22t&-_RdHjoa8Ekemqk>OsBD8LLY%cDtczHFrMo(FLEM-rPA&lNAr#T%LZETY|`W)i=OJ-wt)USXq2{)bEY5Bou^ z9S`qC3cuy=82CWLiaWr;h2{P6c>-CcW@pq=HjUyl>4V02AhpGZUi31x0!p#9)Ch~& zBV6%CdYuPgAwv}sA=e1PLV(LItxP*%f<Wb+nyFY=?Vny-DxtLr7*;9?W1tc!4CL&m? zJ;7Zi>*TjwH&8Cw=f;{l+^W91NR~v>Ok-zQK*T%^sZI;?6FY`HS|ND*F1JBi1R3TK zM8%NPql#>YCf!ak^xuV$hlAqLpm^C(uB{La|Lhr9rErZT+B$-$oKX>8aYVp z>{lk7BZ58V7XDvHu6l}sTiN0=60~F8<1XdiXTyJh*U{~dRI=bR=vY#;F+x@^poD}$ z-b5<5on&>~=_MbU!}z?9xX|^^#ktYwsFHQMPt@Skyxx!#+I@z( zqiuz-b$aV_#x!1ywYfjo5CF}_Jv~%q19x|^K7KuPVI#8=Vn9;Y8e4L)XwbsHlB453 zh&OOcqBgJBN7Zt;C<3*-+0oqZo8+mja~$A0uf7$&a$U1S=+Dcta}lSn>&w&W%i`ao z*>*lq()#iIEF*ezv9l=;v?|=>7@k@=AyWr@h=)8yoTpb;dK&g*G9#k+h#z$t@1jan zjbt0gPfhAt+_)ID#a*;gZ?()mwsc}MnoOmPj_L6Wau#aZEESrb$VsQ+D*XV^H^|^M zyNxk>HI@tP{bez3+UzEJfl6vokFTxITe1J8$#tLeW#KIfd|R8QYa~489d8SUll%y; z;rD|DDKv9(=8nnRpE}9vzGbyPwf#ZdR~I<$hVg@{Q{LT=ACVy6IIPYL;MOrFdcZaU zkC|Z$x`4#zW*>;x++;jxohKg5aAF~lbCbWtm1Fz;0Mep#L))TEE|`aQgK>h_x#hdg zwCjE2W621Qo~KMkt^?a{D1o* zFhI0K!+YiDH{JSDvC zfe6WYDg3XPCJ>*0JIdZzQ8Tq1KJlosU*ad<48o0U3g)a}7^7;GQ|PzoB=YrCaUZ<_ z(?4W9e|)o($TzWSLF$K(yp!OIl?pTQjr7)TO-E&FP46$5y`u+74PX0fOnbn^ycyL) zh+eee`ZcZ-PKoZ(;ys)vyuC;K45c?-t3O__GN*Z{*me5DP03d|gcAu;2NXi#iU^r2}I4_3=DGq9xwnnL%5`@)6e4S*`px2hF68>XnWXr zXY0_JamjE|=DPR|z@S>X z>r3>U{gyNK`6l@F{{0sssH$IWbJp5pVEpt?iZ!n5NJ{A`Yn;6WThG~yHFOo1?FoA= zrpjOanKGXlDQn!FrItcVom!3yM@r*IOG&_DJ4MNvyuE6 zc%Y1x<0WTwv@|L_At95;Y>CCkQ19qw2O52VI6P*`71D%MDA3)XHjrn=MjCyvhB>=! zS+EXT&&~P44LfuuUJY)Ue^;nCBs;Di{<7<@jlR?)S+o31{#t@KhtRBHx9ygE3YGaN zS85@@ulK~oei@=(vsLiBGk25~T`I3AO%+`S!XBwEYEy?29p$i_y!QuctE~{V6G)g~ z?jR}jAwj51RiW-fhhjlvfUnR*Ex04sSvUm|No{7sE&O^oWaRc&+Ff_bV{kt_F7I_y z=4gIgYExh}lvGCRYYVCYrjkmh?Y5IwmcM?aO=I3I0Svl-TTv}kt&Bbp!m`TEnzzr0 zD+a^fK+#g4x31?bKD4RNSvw89seHeaZH?J&4%I7D;0sg4${8Jl#sFe!prP^?viSnC zy($z2b5n!rE-KES%7yL*edFyJ_%|6t+;|jO36Gs-7wm*HM2ray$mC_ zDZI%u=uX$6xVb7Xanj>N1n)i#Q4Q|aU|xub;vQWwIK6c<=hXbc?yMOemBkY_(+ju3ZLMUj678r>mck2L-Al{p=Fqf<7CYKK!bvmV zv}pR-DJ8*KnEcyHnsLH7r|^o z*!*bhErt>COH7Vs*2-N=9epa9ACnDgeJc4B%EQqR33?-5h9wO;I*`)u@^LX#te1a; zehY59?!!&ty?9k=)+CnOlX`VZ4G1iz-oWJUACZdPej{Gx zl*M=rWBcjy2syn_!w zcf!wVIsAZFYFkQYTE5xXbc5T#>NXe@n!!05-H~!2cTsHYM)jxJLH<0B`t*3@1A|C* zRlP?kHv;(5eUM_ZZFE$H;gQIHY#v|-Pe6Z}vssubFZU}?T!=qzvJ|lP@U|#tBsk_# z&$`|?DyFq*YCs$N4z?~b#PEt?D{OP9iK8j_BW*O%s=qha7w#j35&S(!u>+Z4jQ9oV z4a#c2;g@_h`wsTbBAfVQgrFPcL&@Px*p?f}cd-4OhV*98?auT&tUiIuu|`!i_jh@QZ|zoYXdZXj(XtEy_k#b)^sa;D zcqsoc{R8IzKNBnqV^cRr7i)7@Mh$CoPx*i8cqRVlEAM~n3ADCcw}$b)YD{!nF9GCA zRx;G!5b~R)GDG~|piR+jE+|Pj;eueace!NDCZt?4!A?;bB3!>c^Ug8x-NJcW;id;6 zF;3q~GW*d|1C~0Sw~AS(*Edr=o}cxfw{Erszg}N7!Qu~W!<}bnXf?vJ%&YS8{R(uH z)S9exeUz1}u7g#WD=Bu=&SXoBYJPrJKXm6$S7q96@OY+J=i~|6Vs$Y8@z+Tmz|r}> zVy@1t)>IsWjoooFX=ThsWK{PvTwtz6eP;jQo_R}WHG2EH@<0sNB&4&Vs|-h{)3;PL z0ZoxK7)o?lf1WUW;{6&ifwD1kMm>!+`*JoS$qWE1K-9l^#d+}sMuaZ;+oTArj0W8@ zy{pwoi#pZLl9h+NshG91lZ(+CcNv4Jv6Bmn{{`MlJ_XYA5q(!NolBchRp)s^h5Xdh zx_b)R6k!D(%#4grlGotq!l;wigbT7u@W^pvVHQK1{ECuGsVzomEjNpU#d;mRlRb4m zj;ejjv^D8aqR)xHqSTtTo5-(}#lhw`XIu2PeGV0YXSeT?utP?W=4;EE59u*CjV(c$ zusgF(sup&1c~cgYu0>?7mf;pS3LJ~isdVe^;dP~|?T`@|T%o+UaqRnNGSTMS;<>tq z3`0uK?5bB4s%rV2nAgIZ=$=4>a7f^LYNf-2$!VjFn)j*q$~oIaFx9^-dMwXcxrg>C zR?>gSJ``ZZYK8_*o*Dn{0yu()>vmpFKzm3Z;KW5EugPN9wwdMZnEjL{5GNk853;~) zQBh_|jViFsb(}b}Oz+(F*HP0)AP4*w!HtpvcAIeXgypX2b(oBM{US+hnZ#NlFTh#8 zjDy`;Jg-drVdw>iLUsFts3KXb$;vRjHVNwr0lEu3yaS)qc|0;kIQ*MSZH>)2&AoSv zO?%8pmt#8%hrdpT82EWNF{_4Ee`{r}!=iBF&L4piUaXap-^OLGX>VSNthMk-7!DnF z8Sbzu3pA>74~jK4cqGX=gFtDX+gzh{!dvPHOZA8;ucU(){V=4fOYcopcr)f%A2O8BUQIP~tb*ViNN;Y)nmKIJl^T&0~(t+g$W_ zdt?8;-EOxfWQzb@nrV#D$41Eg$ zaxx&rq|kdm$+mS>0@5D4d&vnY!nTv_HB$f^6Lf{mH%2PwZ!|;EYbBLYGlV?PJ#3N% zYB7t$IwJGF7hx4bL+Mjq~ zYT5X{B|XN|MEM85%%>pDUH^W`q!E!KZItx;=7Bpjeys#|8;Ud-A`;A-I`AMVQWt_L zMxz@%Qj5CL$sQ@Ct3P|3){NAXwOYkEQ>V7-g(Ix&1?Z~e502Jljrshvm$OODJ-4^# z{+ScEO<2~jI<8#7xS3}YOBmB8xq0rIw@qvtOPunGUgr3OO&<6q&?-4!d;t_AyR+Gq z!`pOu5NfRdAI!Z|bgo~w1!2}tiFMt1gm^ST`bX>@lYO@p&dTZHR{vTg(Gh{sam*iBHY>?wRi6YSMoj6pkNt@HB5V&JL#Tbn*m;U3-Y zE)eRsx6|+oX}fowUM1$G>y-HFS506Ge&=QGl>d3|z|W;VLFnrb#Q(VoyDr&}VM2m{ ze8Yi&*!&lou)U+1lbNlvku$*Vzk5;2|F>05GvohwR3i!m{IgCj;sOAgnmPWP0i9Wm zDG4y|w+BuXDC7rBC5wkJ0tCH1$|&b*459-Xn-1c#PKCai#otuXay_0ys=t#oBZagO z5o$$x`1b`Wr`lB%xEYSh(ucWOY1yYWJy)mM%Z7eEZ|J=o_92)XH9EfX?&>`!t@(OP zI-7Km-KzEO`bkykx`qz?k>pMJJ+>SQK2#AJ3@9q@5p*NZmAcWFWhf@f76XithJN#9lYjH~^y%s>bf;H$Tycx`BfTEU!jj{@(RDkHT`x72 zAG*sx5V}=$mi#O-nc!A2oneIUKqJ{a2CaeP9ks8{k{p=1-AXN*jm{>2BAY_N!`G1_ ziIGDiaE~QvP$dZ_M{?;CW*X4;F;M{IV!bGyEJKMU@m+zm*z{bLnT>eu8^SG4)S7+AJBKludI}B0B6P3(* zoI}gUFiuxlxPT zWwLw!c{SWUcj-BQ&i+qvhzHLzu2XX~F6KUa2jp*83F;VK1j!wlkiA|kB3d+q{RmaL z=rf(DyU0_;l&|0Z>QdcTCri{*GKu0swzdyc(PR=Y8=F!;POl2%PJoO63#Wt8qv2GR zampu)$wr4soaioJ^B<=%9b13|jYdH6fsQv`_;p=YYE@u^uUUcvo!@6 znR3`1rRQgZbaXFuG)q*E7nseXgk!pQ=ff39;p)z4`Mq+W;0|zhf^2#19f}oL7g?GQlf$nUNF=0K{*k@C$+=_h zFYB;d3LiGpkwJ{Le>4su${9wo)VA!~n-|z8``=cvC#c3(+j&-&*uWRCl5pn<=VkzJq$*$L zmPFt@rY6}BHlxYk-EosH`M1!v{GccXQj?@)CZ);AW27?^xhYr}S(qH;ja5`~3DIo>>?Kc9KB50-KJ!z{7+6Dr zfFPrQfY|+S;IoC9^MBl%|EKF*m!`EUx+adVf-o2h-2P`aZBm6cpvfvw4Iy_9#7elZ zaY^100X}2PnW?mE-K#{XD5r8ELe+wHfhp^B<^=ilfoBYjF@J83CQZQWNpJi8y_3oB z`~95=WO`Q;l*|H~ql3IEKZ`?-=fHwvYn-n+ZpC>gV@{^nkeNQ3uBg&SvLdscp+RRX zuDX$biw!7?R|$+w1jvnFfYeaR2fo`tp31k*1I`geVd#sGfivWNnU|~G7FzR5=Esrg zMjrEZ&Z-kHjKO0ikH(xeRLKezWG&uwC8=%e_RQy(y6c8N834NE=P8G0eCgGBgiJED zNh!q@(U=yAg((E@SPXF|iiH-B9{Ox96}i!77G~22>B2J;mM9Wkz5ctyY>hAlKXdbD zY7uG-d(YiT(#kaBLJXfIw;9hGD-;nMg(0mH7WK88_Sq^EPdX`YX1=GJo1F{{FXkL% z#*Ug*hT8niAgccv110NF=O}|}rE{yu)X79>G%%tqV}60_K%8~q4q&EMP%K$DM)eMJ zLaB}=(zZbuH<4qlnrhuYWg@7k?@Em4fZGf6 zX-kZvlPxzfdYJPnaFsK1r57$vJ+C7_#OqV39UsQU1PumZnwHS&f`)LddJsvnx2MMa z2^JL?IMJzEOatGZW&|9^1Ve(i8E<4l>@h?Xu6Yw8+$!(Dm9|uMzBh83;)JT~Tb3TmGW;XMi5wG~d!-Hur3#3T zmeqs=6SYD*zcN&=8mQ0|nD*<@B1vT^m!@9~-_RDXoYSo-i8Z7zVp-`nruSB7UMcaA z8)h9Bv}CzyUHz?%VUbs^pf#XEW(Y8>@S8*CommjWQZCwj7+NAhw31b}m@b1d0Vn)db${9+T2Fmg&1L zxz-^s#JC}^xY=r@iTy5tJd^$Y9HA`rjKPLzpLR1{x5(yeRxZ0mm?6!oS)&)Z&|D8J z?%M$7k`A}3%rnyw7q^%>XFN9uG!9e!gFf|9tYIoJuN-hYpicZnj{5NW;2-OD6KZ=r z%|Kz*VQQ^*O-9@d7{0bP)Gmw*j*_*n*teld=YXUxO&`u{@wECQ#1&$H|3lt!(hk?> z`l}Q1F+Y3_g2-ZeSzc*XH~q2XT#wQ5v}V~0Q>DpO4}YoQr>snT^8}_^K4Q;Hnh<(3 z5?8YaupK2xG)sW;7C{f^jZv}VvD5UM@(2;i<=GcvM#q^KR_!6SFT8gji^iHLUGrUJ z$vC^1M>FDv^nvWOXxOhvIGbz@cA`I_`5w2Zyi^^&LvuN=eLbp4njV|WpD=b#cK4#0 z*>CV0R77Mfk2n^^Iy<_(ZIB28xTkI3IL9SAs_?BZL2hUEu_k0^Pg@8FjxdI|=YQTL z;vJFlp+y(Ha7tbU2d;e!?UTJ^Js(u3Wu=^=ZZ+qmrX-kUYG+D6v>Pa;z}}FH0{p5tqTtC{a^sRLu&gYm7wcVOBHA zQHP4#D&9#1wZu+9>yhIOCyLs}i*OwwQ=TjIG-w85lR-(R6(R~c7xC-?XJ^H5$jVx> zJ!LXI;SWi1oV&UPz{4R3!6A!PeJu3V;Oka{SdUFa_NswrJy;`T-`#g!iw>Nq4t>Up ztfO&3jtk8JP!4=&TtOCWyI&!4QGmrF=8S$lILZhbty)#;y#s*jxc#mI+24MrxUYXp zT3NeT=@$4$mwdp3fH?kd=z9QLfHS}d2=Fxf@2yWm*G*L%MFk!fd-mcdh-_$rE>6bWRm!9xon~Z$N z?DUkj*6`d?!{+z-xp56*+mBi+-(ueCa=5q|Z&qQY#agKPq*nnPWiI{U!dIyk)0gBq z=3~s>N>~xE{G3>mDGZf-j*}35d5VaOtOm%Gqyk31`y`t{CO1}HtL;ePi|mH>m*cG_ z0@}0jpppx`P0XsywG?vsCD$cb9>PoX{xqp*$8ffBOgNsT>g3qTi7$?7Ir&94!mi}4 z+JmpJ9#Rf~`A2R4V5l7B0IbfJ;WQLsnw@d@%YH+u;%9*!=cB*xMil7gddcbf$?o9R<{ z(p+;Pk+i4NJIeEe&|A4{`S_sRm|#tx|8y~gQmNBa%2fy_n-QlO8f))fe5uFlBaWIl zY2iO)<$~r98*$38cT|ZrD2JQ7gq!10q({rJZ_v(NETc_b)p+ZMvu;AJRN&CjQhUrB zmr0K};F(?FvE|uJ#8+9)1^byefloGGbgGn^QU^fQ>*sg^9vl?~9;a=PKq#wkEp%5)6(!Q6vrl^>;4xRd~%Ku%r+L z3k@tk7R+`jE;I|xM&s_*T*X#x4VsWfAe)$s_Z0g4BRqq}lS zUiYu?BAO%pO8)+n8liKAY9ZNSPh)}e8HJ(huns?8KV3Tmv+@|}5tr=c&DrB2QJUDV zV>+@JJBavT9;JRyL z?iVOy>a~1sHwWgiHj{YP*`IJ>$Sz1dgLyg9aEUxQmh=bA^B-j3p7udr5zYwG^Ku-7 z%OU|%QcsxMUd#`4P=51NzuBT^hP{C=m{ErIpRd-N?yK)}vQeLXk4W@RS7H}(_?Rl8 zZS#E+$wrdr2QA^`qS;Vr@>_!pq-F6v89PoNI`|HhOw$S6`RD$?AL~spI%gcl$bh{; zUdNfX?xj(+iP1$)vJqX{#zg{JE$z4nyoXR%BTvg0NI_l6D2;AmqmpE2S=k>8x_TZh zMP?Z!AE&q$pM(@@HltF76fEp==mx)BOFqP8eFN^A0^4i*1Ep1d5Z-WV@VM=x$|&RT z{c@rh{-nNE0DFgKqHX#g!{lIIK3|z?AIL>!+&%~eZ&$Q%#U?T ztVn{K@{-=0qNO7;Iie}p{q=7mM!U;(AL}0xQ-Snf%R2a9h57#&dH+Aq99OG84OXnIQJzG!%|y28fi#YDsF=Z6J(IlTw9yIHiDt+;$LB%vWf#4@u=W?j<=tG* z-u3LE;1qcmo_6k7I-AAxVaLVw`x8&k_u~aN$VwgcFHC${r}6pb%ub{6G~$|5*EyG{ z{9@>@C=JfQcq40kn&T|Us`@kkNozAr&-o{p9ebcnE~`L2=|Rlovx9XHz`lDa>3%vB z|JbC(Rh$H(8!y|*J3$0K<{YBiNLDc;tA%~wsmS`gI2oS*hZ_EJmACSBb+v|UF?dHV zhUdD{>iJpObWPmy^(qElI=YA~Fg`B?+DpvV9YH;4%XFsjFf-I?^~A`SBJ{E(C2A!q{0GR>8F}Ew(b`Z=HOk=Y}d0C^tg~Nr269V5K z6w3z-1jXJmi+Q?X@n3FqWXhaHw3z;;0u_)?IL+nrwKot7Eq2xMF;k*orwpbw6^Ec{ z$TDQ}E0OIr4by{-y|^< zhPlYqpC>m?OY_RA-n%t^D=_n|tXD@4V z(rQUKWT}&5duuYiB;|2$EAO2Qb+8LS7!dqa-b7hV8ao<(um23(RDU!%^o}qA36wt> z`O`bLlt62eUSF8OW1fw#M?G3kdr55zX9>B*p3t2DJn+ZYs%J<`S>TtAw@FI3l@($v#}K{-|fOO`5*=m;?x{Uw$wUDN(lpV^K|D?(%zSB8MG+Jjj}uJKu&Ijj8F zJsC?+`Wn*qBXZQPy1}K4gxNq*N-^SCmV=$+f#0SobA5}fQ->NP!?>~u8DI

+j#5 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∈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 J?U(-C{TB$F_{{(S literal 0 HcmV?d00001 diff --git a/app/libs/com.openmobilehub.android.auth.plugin-microsoft-mobileweb-2.0.4.aar b/app/libs/com.openmobilehub.android.auth.plugin-microsoft-mobileweb-2.0.4.aar new file mode 100644 index 0000000000000000000000000000000000000000..c398b8ff3f503f187c0059cbde644e7a7b9a1194 GIT binary patch literal 62212 zcmV)5K*_&QO9KQH000OG0000%0DK3fv04BC0Pg?*00jU508%b=cyz7I%L%|B3;@u3 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

bheC)=( zSHdb7kG9LN{675)dOx8%JHM*>rtcop|MfuK@AuYa`LX|t+b_JWl0-aQfTHRmQ69Ln zQ1(t4%&Y1z-tUT&+j02kl^s-9Trm#%*NQ6!!5MJX_$R#YXuzqjm`~rsrA}RIaRSZd zTN-5GPcdDnQ#b9q}|oY{UPWSBATOYw;iN^LRAJa_C0SCFXBgjm(Z0hzlxAMoHVj^!{dC z+$1zBKZWs)6!DGW3^Y82WhB15NB2!Ne*tLvBN&FqKhexW&pGx{a%(E|&JJ@%ln3$V zD6T_h{T*t@+dHmENy-d&a8e5@fNnQuklZ`<7M|EX?M7$QUmUnjqu`A-4V8w*aAA@+ z7i{*r(9l2;^A6FL+`lM;Q2(nsG8gj>b$^YVw>9PwXP9}=fATp=x8(x8=JLrD9)~4S zY+7_cP1<(gXf9{l!>%=hm;TlmwSEo~AnP3AN2n>zZWoSTj`<8WwMqRjLcs7%?V z9^EeTSHDZJr~lLU?)JCAE#pX81PudUw4^6x9ma@iw-#fW()$3$Y;=h0DnSl?S@I+1WBO<5$&c|jOR!|_u`!fY3nQx&$Ep1RK4}%R0~{Yp$Q$7! zHyiU-iE2edIGmi0&w7b6BU@!Qy6zA3D5Q9-Fsiu6LLQg?~MNrKjcQaDnj7}uM{Yod~qt(-TLT^eUge=G9+J5TN# zpmgnkm0ewAApBBh=(AE-q&0gV9Gc#+FrVAq>z)04y!&s8axjtw_MPlQwY24@X>_{k zLrKKBjb}PQ(JZqsh zcI)_p4Y!7o^wx*)Ga@AsxPO+88(6lp{F=*9zjKO1P0b4Y6imvQ)D~5k0CQ@&S*=N##Q3OnEC_8x`Zwi^}4HaMqu$ml?OsZB-Pi;=ahwE*FN&OD(8&TA*28Brwp$p(=gbT8JTg=&%3^LLQkNu}QhU10Nzg8kVCRj$@5#U9Z~6 zr8a2Bj&XfE8|0cw3(|k`nPxN!Rwl1m%X86bTVmtisGQ|iqZ#d{+qb-}eF66bdwtua z)-%D0PMHHh=eUO`u%b6U(_WMAt?U_t5#EJyLc?+Mlw zHGNTmuEgn=pY-rNV?yNe9JOFGSgo1TzN6Cf_E^(wN%Qr*D(KiN+_wo1rW182@o|P> zBHoTNYCD}{0h4MDVK(+0YibsD!-oB0dr*85)~I@zU-dn}R#&}5zl2o%JF@bUM-{D| z!YE_0wJ9+B#xxkgrixKlWvZ^c(JvNoGbPX(WZk+Vj<}z!9}&HokB(7WH>#-Gj>sdh zP(89CSDW{>*go|HD1_d&S__nb%z9}ddK-Q5mjyoFgv1~=RyHRtU0x|~t*(-(#vJ9= zuKvS;hG7!##Q8>T-$XnwYcVt2BY?mZvVEx5|jV2I{rT9WUn~OK?dYe%KKP>$#av-h{lk16A zI*{cIEf$C;5f)%3#2M$Pm>5Sap7lODq$7n4Gtn~~jszJn*3b9>?pSuekrR*56LOC$ z;QtM~M)4Oo5)oZ9b}8MxdN^8fo_6ib?^rHFxSz$GwwPy{)9+6rbE-btWTq5kQjCK6z*

{+*YWd$$Zoas>kLcDMsY6rdzCvD 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 literal 0 HcmV?d00001 diff --git a/app/libs/com.openmobilehub.android.storage.plugin-dropbox-restful-2.1.0-alpha+thumbnail.aar b/app/libs/com.openmobilehub.android.storage.plugin-dropbox-restful-2.1.0-alpha+thumbnail.aar new file mode 100644 index 0000000000000000000000000000000000000000..ad32662a69cc3f939c2e1a81ae0ae3d80215d2af GIT binary patch literal 217756 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

D# zoe$K2@pImS&0*Dh)U3qAxzay|>B#(s(2AE)&-KX1ShEMdTbMC3^UZuajTRS4T`$91 z-Eo42&syFsmf%Z&N%nr?60D*JX3>$p5W{Z_9N2DFnV?*VLH zJIYInBYE0hC29xZg7Ns_W~`091*>Z?%^_;*9U614xCahSGU&;@Gq*RB@`(yww{RBw zu-tdhi&tNG?|lCAJ@rbD9YY{I25SJ0d9xh}(})6th3bC3zt#-JWIFm5s)w+;J($nb z2r4-=JC=PC#9;n@?=1loP$>}YZh$~Mu;xf-iVxp}eUE-`Zmhz%5wr@8cD*eMo!Y|E zSYjp5!8TS9xxJ1L>`J$>56v3v<;dp0qrsgIioVMy8k|CY`Qq{qqrv~|NGeM>{8zq% zGSV_1E-2Zbe20<9K5WB7Kt^;0V^l4Ljt7<)^3SvR@Y*`6SdGcGM>1ILe8vEO(xN zOwxSkOU#A85~VB?g@w6V)-Ohf^EnwP6UP=VnH9_orIyYHNcO;d=M6g5e@&F%BuFPj zRS@9gLTU0)R_c-!D5ry8<1iv7?J{a=0YW;8DVji;9Zbgut8 zNg+aO0IQs=urBM2tzpD@`V@jqGlQ?&M1Yl2DNcKhq6tBvLBx)5De&g)y+yTeWya-@ zV09uT%X1d;Wy66J`ue@MdMc>nxd#?kmEDl3^9*tXk@M7Az!SgywaNp)&7Gqq-`GJDUuUNAwUdErC{uETC}VCc4W zFd+|M;tlKaGG{!Ko_<7&XAY!%uJ$v?Xv(Lqfd=Fc?APD)wuX`>_NX31ih6qFR2!|% zbZV?hTm?vCE_^Szw-q&_IE4$;_}_Qb2RT;fbB;u4ckb2?*ZUTpFV31M<+LUcJ^3n- zu=3*eRXK_v*-g$vXIH@aX1uwlUaL&#d{SD$cd{H*#Az(^cZaiO|6hO z{AP7drAfkr*Dg@V2hW!h`v9Cim4i3PC#Xi}8ZUttaZ zehBfeBT1Y;N0OlGZNI(0eL*}!DsMo@!&cWVTVL*e5Im}Vl<{~dd-%F zZ#e_QrQY47F3=eErkODW7!4FHNjj(`kVCU9*Ix+8oz;R{oeWUIIdzI38;JmlCaqD| z{j(tGK=wQzayi1~;(5kyLzTxGskljU?FK&IYA9z0@<|pu4N-2#J5E?`DU!Iv;3}Wq zK#MqUw7tyC(4sk{mght(v`O;>?5m&>QPqL zMUm0SW5{5l#{6ta^=RXW&BJmyxXi*81W)A(kq5DO?&dn0CJTsDcrxI9TJD4+@pziT z0|+XLX>?zS!YZ}WF$!R?+(EAlm#9SsO6sC06T})(GG$fdA@hdJT3*BCM4Vy1`3gk^o6TF`&BPh3ksRF~ zopuN39wWX0Da9G*!v44CF<5&9CbeG5FWP+&+F>ci3wgJQLAvJeFB@@1%~EHj2obzj zJynmlWWsxOnxlDHQ;boh=(Ne;YOA_093N16eXx`y9zWEKrldf6@njR%AiI<1pl&?} zSPPsZ=aVH(lih;leboOXL_yjD&8Fy)e(6&4a!m*XMTVqo>9q;aRFI-`Hvgs2!bwBHa<~e^&d@{{u?F!pWcPP{m^!&{dQ(Z z;%4N`Gz@=k(h+-7vc*!5ZKQ4%6P2aqs5mRB8#(`z=Yk5ElNr4=90IKp2|)}c4nuGPo~J1x)Pm-3iCfUrVbRB7 z){OhTWFy{$S~$ViqG>t*S3*=vR-kpCjEA)P3MljIjMmXHTkA2`n&mE^nz#mYQduj( z;@|mD324^{z~`CL{O3B0HPUf>V!P*!L~ODl;R$%HW9oJ+cgXKMLKXB;1b`fKGi}}4 z){`brwp*oHt+KOGH~FJtG|pS~piY`CMet_Tn1=eFGNhdy$V~_jV1-ewQFTevl;40E zH&w4INH#UD^GJB*FlE0`BPL#s_u7&JENhWv$3bBM`k%OjTePei6ssK5U2+%@UfSwo zIGJu@e{lQPDB_cN7)27maQ3|yV- zovZJ)Z2 z>N+x+Qu2x!jGC~?-&c#emEt7(9Basw0Sc~d&RX$aVhms02g`p`knHYHvkBLFrngrd z6S!B^Mp%f{u|lVDMx4wzYXeF)3N?bh>1Q^??mJz7>l=%o5Fv`=L6lI$+LqZ_DN#DF(>U7DOJt%j_HykFvAD*_jOgVf!A3pGY8Sg_3E-lq7DZIrl-Ep%g zD^-oufsWUxb1VifqOB-IpV!(XtW%SVD(5@4<+?6UMdn;%PH--HTv9h5SybOa#nRwH zLCY;HN?*ZgvVIImq4xJ_DB_O_ETfc_`~57h(e?s6b|--O7->R7nYA_yskOfvQJ5s8 zj;}>42@R9vlHoaY{jJM-z3Oz-Ts2gPiJ={_FO9*2EU=ED9ktH|(#k+^33%X|B1tti zq1a0$F!D(gm#`5`nA6kTjxIkj>FdnyS4nJon{HpA6O>kBQF}-b`LFq~!?MLK9stSa z-Pmu}it|_Dv#fJ{OF<|sic(N}Y0~&_wn9HyFr!x;dvO5eiR!a@z#R!gIdc{>C6JB- z%mu6Uigpxd%B!pDsb#F7&r$wC?WI13`Y2Jv!VF^J`mq=T%K9jA{p6$}a?F`K2lx!3 z8SMjM<1L-o8)%Pq?H;5ps+hy`| z#&?Mvv9su^<)(dauT}efwy6uUs%aoKc{WH^B}l{OmHS+;;)tQ0&u*j}Mp<2$k$}Ck z)P4=l4k;y?jTbbsR|El07G-uEopq1=bq}v7Mmaou+fG*ll#AIB;9|?HNDHuDjNNXl z?JgkmaR+V!gxWF;=b^iPqbyM|hFz&*(WZqo9D!Dj48Vf0hb^qPUii!LJOp%#C5v9b_q8u zgnhth;L!7jd8RvZedmaU3tw^g>el-FJUGflQ`G(p(vW;fajr9rnR1SNtRyn&z(0K-e~m4Sgv$ zu%{`c>tK|z=8_-;rjuaY&SVlud!Wf5^WgX4W27Qf-(%*2iWuxngg|O|QscDIZhJ(M zm1gx-=)@we^>%E;A{_3_+0+SZ=0m&Q?$0Ts@aaURq&?(dHeg4~qMRIozU;mb z%tp7kM3Wk*yr5#8SVDE_w9p;sRLcG0w&*tQOws6Aa_rW?Td`7{rwNfY4%0|do9owJIggeIS3s(Mx%L2ony5%Hq_RbQ&gzCHV@U_b1M3<_nz2sHP)VT(?tI5j&>+u zisH)gID`h|KTSQ&t*aX7qPAu4vRtlLhEyA`blXvX_**^4+qfEd0L||9K@z&0I|vx~ zihstpTYOQ2(*)Cguo@K3Duf@j4RIL^tU|DY$zf_%3&_Zr-nS!o^o|uUc|JEOD>Ut! z)N9Hg#FxirB0Dhy4W*;&LI$8qZIu)OEJ<%b*JCZ@c4UJW5ZZFG-^;^+AFb4J_<T{v9Uc)Hp_B&r6x1Sq*o50sGO*C>ZFn5_}*ko=9FJWqqTMb#x zjL%n`I!Gl`*)68_NM?;j82y6_cU0q^v*`g~h+2V0B#W7!>+s!s@_+7s<$ z!Cw)7OV10dZ_hzg?x^8Vz`)neC;wA*L-5)$-*o2bJ|lriQ3mlyJsb^B1h_hi zUy0TBvLTf`?B(gGcKhY_yH#10;sjso-TCS)PqcgPwUoIVjy}fX2>gw3r&|yA)Cs`i zm0$Fsk2^`9D5=tp${Uf6_bouPc9Q6N;SeH5 zRg}&4%0kPeEDe#xy?U0(Nw7H@2i)=WWZEwfS9YaLGIclUG*KR7J=>{$-q^e8LK9IK z_1NPm6J}2F;pFB$CsF-d`Z#x+nC-Ii;#-=1nVNRHw%4X!x2npxd6<<9r%k{~s7u4p zL(p-kO4&7w+^h~zWg|JUij^u>bmNfJB{s#8$yqCLop}Jgs3d%gJ~5)!H%g&I!%3!2 z+4{golm!MIEE6`0pD`^%a+PJ6(1(|VA5|qsig>vHKA53I-nDaXV2V8D6W;D8|sddQ?1DQ+Edxr4ARj&`l)!)U{^3Vhgnku&;{6q!J3JZ*77kNR%D_QN=wm3_|!OL9PrtY^~ncX+8Y zReTlLgz)*m61jMrQQ0Hcbx;=6>$kw}-qDhV=cd9fm29yUamsBqa5}-{Y8(y<+onZP1r!kJY{_|K9crMpGjjYKs|vlw6tC3 zE`B(~FW}x7aPJe_|*(&U|^PY5#tV?zP6SiTJZS;p2*L1c8P<8S! zgPT)@sG?W^vmLroO?X_y^5t0ewzgI6h?9Hb)P$QOH;Jq4@re2IDFY7xGr7m4hE$L? zFpjSf2jAGn)M%5<_|<0vD+AF*xvSQf;T2}BrurRi5H4nLs(Gx@e*5sunc7hRh^bYS zl5>Uyb#Hn~Y|b83qXul{&+6A!X%b_Bvs%O;ECo;0bC%y1^Ot9EQzuS-HqvgcxRG^ci*nEV-dmSilQAILYAy(=~GEp{2hM=)U z5$e39dW5>|HV3TEHIm{vXta%lv$V)kzx%!*<9+uAyzD{wcI{+6?y;4>3TE8%#96&1 zy^L=;tRRpp^v!VPV|&zwld&6qz4SMTWNJgSg_Yreqi4q3#cV;jehj<~){K0|3~9DC z0;hnl`iU{H1o!oOxXT;aCFdgH%akxiD7_@EP5nZpaB}#ivA+dkB8L zFcF5H*wPOe$d?}tSPwoJ6as_ThuG%_Gu+6RnCOrZ!R`WcEsF+cITV+QPz_X62vH5c z3iZXt#`(&|`Oe11MstgXdGq(p!*q9(b3@XR=={#EhnpvGpa6U7XDH^a{=PN`*2`8UI9%l^zO;<7@wZ#t-(z7=@7p%S>tZss|O*g#0m25)njObA{u zQ&2V}=4fC}c*|upb5q?t4ehQ99!k;pmm^iI0V82(#ypK<4N$9d1MiuBH%V`0eeY3h zDm19)yAJ|MI-N`?J@g>90Cnu#~JUjnZ~ zp<9K`1z?9NTd&HOm>FU|qpzog!F*q6xlwRoYT`--@-!}{rBbD-pwyXLUT811Us{VAHiia`#mE45 z{bUB0@My}axARpE766&6qqz>5E%u9MBIb+=JIVhTTRp8W`$F2VK{k2hDx|(!mQGl7Z4<2;7ck)}<)* zoi<_RBr_|T*v4kXkc#v$iFiTfX$ugX9XiLG7$pE&K&8K{YW2fEgjJYm>%Y`3K-wD! zs{~-6BQebSR%Df$d6HHX%z^^2v*6+pgn9*7eC>CUD${gV(8RRH;q$ZlYw(>BYG|a%50ghyNV-;= zn;_>mx^9*O(hr7f7sH6gO7#)hy^TDXxff*`6c6(vP;ldaq=8O2JI|HQTs0@`3KCL< zQLV&+L8;OeQwx!txDVhoJ^xlTN2ss0fruqOZ!M9VW_xapr)fWjx^OF;h8tFQ*e}{G zrideSWF>cUU|;#RtcXWL3ml^;F(k!D8i#$WKovJbo|to9BaTEf`)Vk9}V7k>L(gBy*7h=Joi%af5> zMg0)N)4BhZ;K(A|h#0Dtd#aa!yk`c*B49#Y<%dun*ND)blXW#V;(`x=8Ln`G81uDv zi!JUJvd5&R7G54TgFy<(ZAx>7T$#RMb~d5^-A;>qH7LafrM}_-ZAK89X6^fK1=%tU z0k)pt8%Sng4v%nxP6M=lBrY->X}OLR!72sfshI9X0Fjqwjl8FYvb=y|4yp`tkyJ#U zfKBy<(E)t@s9^PoHkj84wXC$%0!>*ZVLrZ6TT7irG_!G9#%1<NCb^D(*pV#+rnSK1(`qeUIN!pQzT?wn==GZ31tx76 z*1N_1I+jZ9(V@Tge_kLWgH>HIBc(3gE#&>NUC#h9VvX5-eXeuKHI<@&Ky7egKd17 z^Z}d@{W5d*0#jI@u#i^A)awtSq-gCgaiN{pPvGmh54JTtwmv~6{zd<0CGKPBD6z#2 z6|Po$&=y5vX(ng?f%qHV))d{TCqBzI#5ybdj5>VuDO^6}Z*&;rKnN9j#)`TH+>ZXb z$o58-1{r38wxq)9ShrF-B5aydA1PY6Ga4>!ZVv5S*&1zXjRN7rp>18!kk84u?;IcK zhj4pg`789{YbvK8qlnQWg}si6XqAg#BgvfF#>$a zhM&ERK!fZo2dfZtt`l-Lw~Et4JLkWHOXu}%4$_r%QVg6?YLr)uW|SJuC^ec<%GDe` zr$l(fxK0>lLBT28*%(E&A~y@+0TY0b=V<=R(%mQp!mg&uEha*84DV=)G%M*r(B~xh z$D3pTtQL*vIq{3Rv>tH*VxCWwu%@Y-@_Q;udhEvFNF@Rw`Rzi(iz1 zg^0ys382AdG>+@&WC^rs<9fe1Nt9;_Q$PsIa)20-8tlb&i{;=%1s<^iH0-QMePfjc z-MG==+fK?+ZawD|oSd$|qt17#|A`e@q=*%=O|6X>yIRm3 zOHu^(Md8575jlv2$!TeA;^m3VjXQHT0XK6hV>w)`r6dQGqAClv2e?;G>zAokUJE^^ zyg+OTR=`)55IkcIB3VdPQ8A+0Cr%ZZ;XKWTHVCTdxqGQ?k|}j0w>SfeEEHcz%dGU4 zI|-vLLHos-A_S#ZY=i{Eqft=Z6lra&^9WGL6B5v;OR?KA#wzwhs}KV{%uPN~BQ|3p zgw^5>*HzSS3$s}d;t@|6)0f3?6bqV`Tb~=sEo^RWEbK1KD_2*vmOJTDNU% z1bGs4zO&QzETjqBST&UpS$ZRu3%c#|YQDF^;peMh#vsbfEaDYS%*>jYnKdypYhq^B z#LR4ZZ>GpC;Ku7mFE|vmSchXP8y>td@OQ;-Fm6;uEF@hLfrSVwY*{*rj#|G7_1FTV z3R#TNy>kWpcT&KAm!{|!XAU;PC*|};Hx^&;iJjs?zi7}@>SAc=ElQZ5nXd68akL=h zdYQwv+5IvHW|QaL`#R3nZT1 zCu=JF;!1I;S8Nww!eohUj6Gle+$7d@Tf&X(35LD3#VxLZG?H7^*t)F}F3;L6){WdL z>=G*Xi)+PKz2Yn4Yj6rin(OKjo9Y+epd~)^{W=V1`?TUM(~3O;ZorJ~GpBEvIo%`R zu=8x6T0DCTJ{|#&n`e9RjG0^T@rYaCTC${#6%p>p!sbvTw~D62bq?|KHlMhi!%+Pe z618YG|K?QWIz3G)rtQzmPj@vW**8^CU)RRK&qv`M!etyr8HVQcUDll1 z#FMbg)W%GA%#2qyTfxF$5l$qDDLmzqKzNRbr&yVQ>&S#O%wZPdY2dGThP5Z&HlVOO zZWMHjAAr&z*sD2&NHvzBE%>Q&s&3>%nS5TnkSQv}i?))MaNjLn2Bq5)YFQE95%r57 z(a$o)55%D^}9+iw10E}0~YcRPA z_=ZmC8J$w=Gpb6r_$3S+p}IQ1_%$oR&xzlFBjCEU0WyBjn&wVZHg^&L;eiCz%))&KrLZ|H9)DB(0oHTzKmF=qwH!%tZSjvj@h7%>3}G7p;?BcM zwY+0-rG9n1c51wLWa7`_FH9!h!6d-JcMiiepaH1nfXOyOgEpqY2-DyMF|>7Z18rqR zBfOfJe1I!CrqCw#=wPj)BUoY$%7x?4KGpo+!hYg?V~b+u5_`$P!Ujt?GC7yjbU$toQOH3UTI@k%cQ zM0`!<)C~Sw#$Qn6{c5r-c)8^u7+N_xe5fTo+q91#Rkik;a$0HD$e6wtiVCCvz8yKs%CV5VlS| zP^Sb4>~4w0TDJ?yVO9q;(pO==6}(|X&@E5auF6$#Lf414uW4@Z%L--| z%O#v}0|7=0gxZT)+wWdXZ5nYjGS@FxNqEV2%hmm5hlxqwNsYN>6$q*|N`OX@Gi)!B zYZ(S>Bz$1o`WK5;3!Tt10gtPFay_H4vJIyytqez>Yo~gL#vA16jK=WV_4BqQ3yl?Q z;)r~vPlgz0+3{Z46sircX~97ZaKlXO1-}(^OHYrbB?hNK-(tuKY7+1FYAX<}DvQ)5K;{(-lAJx zqLEbtl>JP60z{F;b2mYW3^(uC)=+d-sCFv@pEsm$tZ%Hdj)u_>fPY>lFZanyC3f+d zlcS-{9*M1aY>w9YhhKhK0zg5Nc_G z0+m*Ut5qfF?APSiee$dF8|n5$Kj@a%TRlmkTLsQY*r#)_73sJRyBKH$)-|8*p&RDFSzhdsnS$$E`_!@qO|1Pva>fhWDP zopGR@aiE>$f_{uN)FWq6#EwUj-xu^qsyXS~xSg7MQlq&##|mOa{H8?&5_a5me`1q- z#wVYa&oYEyDQ;&=F?I(qieYgG`dT{VJq;(iFAaP3#sWIa0-82%4CpeOQs5lth(;?C@LpJFesRAVA6Y-SSPJ z`~x5I!zy81P-UMwf=3e`h)D-;$v@&D$-B4M`{j|?y)`zOxIy^QQ=(U}U%sQM&R^M4 ziy;j!Z-hs&zAi^21Om*pv(F>n6Li*pAFmhg)S(A%`FEfE2Mgr`ZNIGUx1c-ztN3ZH zFS{STL)U-G4_USRh-tU-rugN*Ig(rZ5y#$hJ(fV2uZ&&gbsop8bjII2vgq(=1ABFQkR3p+ZxW<9%{*H#0hhgJ;n$e z^ucw-3~~tk?p)hQUE48OY&><2&~sxH=t(2;I6eZ3Ml{@cZeeapmPvXBYND30NLB5a zul325uD3ZI9!>wKz+e5p(!E}oVI1)20(;Nz8PMG^>U6O;)yy*jkM|n6jKH~!z`2aT zxs1TMh_o|uInoZ>qNe$cd~Ay{a*YC9ug9Tv#$?08*YF79daB=;s;`TomG?ZJ?h(gr zOz*SJ!zq51)+w)pa~0acpD|O=7kH87)T+Z^am)}>Em1yts4>!5sBWnpG8ok4ghO{H zTZisWwhrB$%!8V&B2p*g*rv{_VY1FBufr}bsLye<@EEgsk1_UWW*Q}FMM-rJz1*%E zavSsD7>q_V<*3B@3w&gpphM}f;$F6C*<%s_cT}epTl0u$nvR3aeB(rf z#~BO2qd7QfC612EbrK8PGNCC^oJabNg~lR;FB*$=oWg1xQ6gwzTK=U(P{b#a>p+*5 z7)yP|4C5q0JCj&*8b*k2Yfnj0lPI?q0G9cTSqA)T*$DFM%!CBpl+L7gM|RR%V7-#O zj0$4~BrjtnIOrxA7&SuI#UZ`2S?!Awbft5yE$RNKVcdD8_O8#T7^|6?SN50NR4ZQW zGSyt)>7_H)bfqV87_PC-XRI|&RfK!G-&n5+_h}FTTjJFT+SQ*JplEASM|%g!(~UED z_HpFp^kyv)S?6j`j2+Ak6KM-nMmTor>k4vko^g26B+Jn=$zz0I?(3NcrGebG-c+Q9 zw=A;Jww1VzS}3uQ$dCtrtr3P^VAL6)KEWo0QrpGXfYdiE(g!q!{l*q8p+UaxpCdpL zyJtgRt9ot&F0rmm%$0!OL_mlSjtbY=gVO5<@Z07y8dxCR)Gt6(h|DZFNqCJh;impF z@mOpk)|%!QZUbEI_I^V5)ST$3iB6oDDYl_WcGPFI7_ITZwm82^B}sQd_qY3uvyC0F zd@$Wlg1K@ne?IftyVZZLaUQS!^I;YO$B${B3y&JYNn~BK!U{wc!ZTmmf_2F|>S3R$ zZG{N8&AOp9=K3)52P$$Ii^>2!Ju8BZy=SJ;lfKXv_!6)mBjwt}2vnaEmpXje|BWss zHiBNw?-^~n6JFc~{D8;SrqDlaAFmKF{`K5Qcfd_k8FD(W`b}&|DV%lh-RWuPzHJyZ za*VMoU0h>h0P`KjU`@f*1`a#;)h6f69J@#ivexm~hXR%NgE8oOAP-NmZxE}G%OInekMAM~p_xrk4PvROQzUEA6c<7Bt^ zj9ckyZX7D~F17&~<*Y5=iNpDgUB+FwUdCHD#WKHfw{Z{W-HSO@kg;l&M+Tt-D>$C^STEz*+GFW*y65QCAMTW5->Mxr- zovpi#Hc@mKJ$K&0z3$%mN#&boE z&gX+NjHj~jrj~lY@m*c*)0pUZNk_S7v#@t=0_5}h#+s()$YwwgBYYkq3Gw102RmnA zrl@bsv5OSg;K&h0)24Wg7qcjX$2d~coE=4=#~3+x`5xU3h} zIKS~@;}xIrBjYC-C;p397vY^W>M#3B@XWYSf-S>a+y*;hw$;P$@0z%5*(6~7uZ&;& zj9(h?Qn*_iw>IKPFOTtC96z~6U*xo~j-n8tMJ=tIO_64e4+^Hg&muP;K4NYUH8=W= zKWNbY53s=rt0+#zsLR3NEzFrV#fB9C`^PN2)d%375PzcE^6IH2+sr;5U?*b_Tj!lpO|zpMDP6QY=KQUncrqfabVgxJrmjPSa5Hax}eumDcPTQ z*ZwbCUQ^9Dv#Wo4jSrb!eaP(UL$J%qJ>~$MHQFyT;2dg_3Txx5Iml-Q81f@5$S0NTKdnEV4)qTDS!Omve+U>wT;FA0 zV>Tw_?HU|X>Hbml&dDVBXQzV{$4fJDc+g1vqCf7j=gYP6ud z=CNLL6eusgrgCZqe=Xy$3VgB8s~?H(;@CmgPO=a~;#{9OfxYp=bzeJM>LFnCEB)xU zH@(B)P>W&3FIg+CquEerX{H(n3(=D zDJtU9!+?7?HB-!~JT=7-b~%b@GAz~_C=;0i*wL$#ORK6@*Ho1*o#Zj6Lw`sPII?3F z1YMRosxles{UkNm(saVhy5{=LndU4QM9kS9Gl;DpDacosAy(#G1Z|mcg^skzq5~}B zIAVPq;4mMB1PUdX(0w`aKbX)FLmm&%o@}4RIdKvmFU4`Fwno#)(HM4H>bOPLWXwfb zD!neV#?Xz5*--0D4C~R-2Vf zJ*uGXHfum)OJo}2NV>9Ys*VbJF4a86jhnF-?4+{c#^n!NVea1k+6%2R`Sqa)@aifs z?Q_~()#=OvUSic=b3HGy^}NK^vxKvrC7ksv;jD*lX|8A8vL6o`)9w})Un~~A5atlK z35N*|--*vliZx|VRWA$mYAM$F%vv*?{#F|H#I;z*Y$Uw3!vyUf5N@drHHFtSLiwo+ z`^|c6a5A@;XLYgXJ|!-9kEbcmg`iu^1{}F=Zi9rs32@i%Hp{e@DuZ9`wn=_96?{3? zJGLrRP+(clydY7-NVx{wW{U@BOVM6yy8H0}g#Y$3{hYS5CLT4bYDgKErLPh$?Iu|qdkzZ5P3Fx$bGLa5PUBBSn=Q`@p9O~lnB3-V zg8o;iNU__z1Frc*7&$;V7jNTB)qizLp7nNi4jMD>@|ky<-;4pYDD_$MXzm`UEX#9e z_{}{CEHihQ_o?fde)9o+{h+#@v9=Yy-vN8teDmwH+t z6|^Ju83>7xk4d&&^fz`N9L#oxaSPqOo8E6eZtnA$kD2@3gwY1#g2@V;iXLuun+L&i z>l>p=`}3Pm;J97$ka-w#GHg8@RN^8cYc`rNCXb>{Ov^N9I^pve=vc$H`;Z!m6Ww^O(t#c@Kr&uiZn?KU>+K+M6 zS!_whUYS&+_TQ+L@Dsop0$oF#c^!kEEKL0h&9#2>XXdLu^QY!(cqdZ-L32rcV|~k( z1ehiW_HgX>nWZ{$JEi_Gw;#35grR7Zo~se`S3dKXCM4GYf{kNi)>HPno-#P7O^)ox z3UATak5}{cPv5%dqY%}-wOimQ=W}_H-iX&$A=)Ga|3K_D!CkOdJem>Nw5f$d*<9*5 z^d4vx#+ePUYwFdS%yaQrmJ<%(=;}qovL5wVM^%OzS|Z(_n%SxZG3%VVTu8F__f`CI z;>uC)M}-2Bu-DCstLnlwc6Q%ZQM$G7|K%(w#bd=4USAaV~?_&U;ysVAIc`yWK&cS5lM9aGAhZ zmkWevGlZ?C7LUt~{mb@dWSi3EY-)~d%dym{oYGb09+ww!GxaTtISQ++kzaRH=XYh| zXm8`7%MY>8)+*R;?i#4<{i&9-^E`HI#t{4E3S^PbH5l(Tusg8Ka)rcpeNP;x`wPRr z3+hNvUsXl0jVm6f&G1qOy(BcPcg;FaGUsx0{jQ;|VF+t*4F~aU#asIT3pgsqb<+h^ zihFPjd$jqH6dmxpM(KJ-GpfL!r8W<%Rj$Gp6olb{YhBn zt_fb(aaiW~n#w6G^L~_K6jYMiw->rAkG+V=f~zCPUg*8Ch`0)Tu6$P^4-2b$cmuEM z)t6Zynu4S&(;JpwNA)u!|$;3g}EDp(MtGL#<*5VLv7xsLu>OJzr z!MF})94%s(*STHQ=pBy6b*(2@n~!=ENelu@S)_2gPWQRa;EGPrGy(4{#LL;kb^Ojk zg!@98up+Q|2RDw|Yi(}K!7J{t)fpw4VjGG)t}_KSI7yRD=aV7i$cev>uUG6~Bi`QU z!p_0Wct6n6onw z>n1^Gry*SSYoF)h7;e`s*qrLR6_E%wsf@i}$nClvCb-y^=vaPy(5iwvy{Y6oE<-EyQrcp=}=5-EayfRUfa$?ZP%;S5v6D1zwl65%%lAFVy08J%n12|^Q&Zmj%&BGuYP7&HZ1HALY7{L>+!#>v`*S8^l z#h#uR6U17gn_3$nesT0-Q>3Myn<^=(bC=O6xbpogSCrLMlr1e?SY1_y=`3Bf zYI*sh(yH>6D{59Qsw%6hsjOOERtiObWaUYvtIKMZtz1}BzM{OUymWcZ;NJ%{vwp!iu@h*e1*;EvTmx#sA<3GsV9U_j*xg&SNlai{O7deC*bi( zj}gla3{1G>=REjW&jd1Y>DASF@SvTYV`b@j>?h*Crgh)`)sNckN{`FBuUm@e+vQA8 z`$Z$#FUr|cET@PPv1Q?ytc-vhDW@3tHSz1p@_1w*11a}YcV)6jdpx6@_sB#9J^wi}GzIRXnG+cBLiU!n;!95o(4P>FNY!n=#>dXiX#qY3UZhbgX zBZ_@U1$8?rcO>T~ws_34VBlC)I3q9$znwZXdfC{(80)s(N=|aIL8xUcvd5t_UDPt( zc^k!YQ`IsyFribi<5Cwp9@$AFKk2D2I$${wU7yscnALS>u|dm@3FIjl<#*NjF@b`S zo-8v3LA!4*ua=EN2e2;9<(e!P~s?*@_|J7jS0+6)eR?Jk6t!7Fb_jG zA+fRffc=S9V_hIlAg}<>%?8v<@w@OOxhxP^)G22~V6ig?Wy^3qK$Ts>DdcD6Tqz=E~II&ahY)Wot^Xh?` zf}Z-+7fmLFU<$}m#56I>i-+Bgtf#&xLB~D8r|!$ZkqxpA`_PuAA;Bd|$0>u&!PmJBqCi$VO?{iX=7wZA5l^Yg_?>PH#7-d^fae3^C#MwZ^y08vdrEfH zhMV|3$Zpr05G+fZ>dWjLTsq_1ak*|wxUmAd171D|v3sC~hJCnszizut()bhKRN!{K zjc_Dg$a;AJM0HEGNKoiFzT5QaZ!8nR(KBbY~eMbqRL2Xb8T3M zhU|!j8?CkAQfFifd2wY$=_+3jb^A_^M4|Qi@+x!e)DmBQ&Qv=H1&GCXlhh~Q=b|B_ zC&h4DZ4CnozErSWf_o=NQEXaHP5c$vEso-~ICK&&E}&COk)y=P(V80P6R0F_xo_(D zsRdJ~OrKIR70KcfB$1dgea`r4oG$iFomo6({ImjfHO+BnX2P9WzT(-lQH(2?F~xaN z9EY=-HecTVOTY#Iif01^daSV|#_O9lWs1(98Bfka{+u~8RQ`-91%S?!;yL=N7*}~^ zJ}B<1TMs2MLz#&KAQjo=)z+O41w)??nv`ptOHdMm%x-Cy3=7;aXo zF>CEUy`nTJ8uFp+<9aq${%16jk0|R@=S+;xg;7e^Khe|k z$WSmCpP%JDNP`Np2ID)gjfUjq@2BB;1^a1a-l(i&w(O@dkMh7=AL4r$D)7@%3eakR zsFFs~S{g^ExIV(YJY5~-&{$j%jn`mQDF&WYsd4DG;o@_+1{oH-HPk7jFi*iG)iv}=A|e!-|VnxK30Z`?!$nW|fSY#Grhn7t~>#BY{4hz8SfbUc|{ zoAFO{#S1gSsf9-aUUY^VGZchJ3$CTA6)`mCV4TBYmu)8sug@G#|9=M}b5u`V>T zB;z2>EAglY9zZ>rXpR4PNI`tg#OH+|3N0*Xr^O|%pz9eL5Of`)lW-^=xv}xY#2hZo z69qxHDT402{d98B4LGmBHJUs~tE+>adudG2vzHrL(N0y%IdO73$&*#Z!HjlVi+V(f znYWLIAEr~QgJ$(J(#oohoWp&n7ZFJ3(7{B4d zl!zB7`}htVkK}Qa#B8YlH{h1VtkrdJg|pV=~>cRUI@ru`I*HZWv<^ zB;HMI6&=IK#&uT&(B9p1mvpJBGL$TJ)6LyNgVfSmLD@79SQVlONJfOdKuvT9uD^}n zr>L2}hrI7mBRx$!@QKoM)JiYWIrKmH{VPSWRL&CPXosjkdIg=OD8(iqNQf3%lwv;( zu~MA(6_8Fr578Ve6#|XYQYp`R9^mL^v%a;&tvqUVFWV7 zL3*@66b3vIPyU;-$N5!b)C~JIZ#2OW+ z4qya^)$d!=?ROg;)cqDC6@4fAM!^v}3_1sDbQp`<+(+NG=$r{UhcxKiw-uc`T%A|Y zM&HqezPp0SoJ*AlnIjN-{U`7<44-+0AaR=fv{&c1(UBl32aWmmA^JYk71zC#8FcOC zQibcxgYJb(`V`YTg$yRm1~*`2uz`9g38(|4g#elj4W<`k;QRub=9#?@ z;Cxww^JOOP`{;)jI9&iI(g5cV6*ym3;QWy;^y3nMU|vavdVt}18b18T;2et2ydVlB z!V|Rvo`Zl^oP1JNi^7Pn5aY|3rRahUd({Is8F*T?ub7AF&)s&gmI!I&6erHdaoQDp1 z0AUxV>`gsoZ(;^A_R$}#Da*i=A&n{fgPO88)s+2@F7#H3i>J)39^ffEh!6kSoc;u) zuLz>h!n}MD%y8iYX8y-u24?LKijBMPrC~w$UasMf?aaNoa1bKm+7*S*&_=y_-mWfG zd|PDwg_-r=g6N`9^?*zN;Sl|uXCE~U;F|0TqP$Ag{14^d?bQeApY8O~LHcA5c^OB3 z^W@%xA{ASv8z@t;Wd|NGZoH{^a*SDnQ>)p3Q=!NBmH3&Xab$Fyqu+os8cB4qGPeK{ z!BrE(u^98x1sI3oHxrsrNK^t0oJYIB5^e_N-31bO3*89xxdrI67r)OU?^U`Jh;kRb z2U+<;q(7oP^a<@!$aNAr6asV5RNzY>yE+vD&C+Og9UUtqP|`p>V->=gK)B}=!es#A zo>BV`+>=>K9i(4>fAQE)A@Q4_VIV)@z zqt*HsW8y@D)0nd{YR*QpIv{d%p|NoyA;$2WHS&bv&z`d~O(6C`gW@?WctRXU1a8R_ zhlOsUR%_zAUgCq*64!GVU*0L^Z(EGii_tuPv6Tklo0lr)VYHgUB0Ys86HC~$sLNn2 zPfA$Johxxr{X>|{@6cs*2n+T}EY@~<01Ig^(vQ+1$ApfvmgDI(P8_c!x$7{sO!avY zUKm@1JDiJ99Gf(u4ylcqvc;}No;|JRSD>0gGZRl@S_|~F7L<5{-hHCbnpSVMN@H3J z)wC9(pOaI688oeTX^b;|V zekumht700`v*;IMF8xw0!|yhF9t`r=;tKkWxSoD1ZbteR`jNO5pS$Sy;$C_~JVbAb zN9Ye?FRu3?e?L91h(|m4cnDSl&CB=D6f5-_P17l~6zBB$7O%Js++1@FE~iqeoX$gi zqF#}p>uI5tdW~l56qmE|9;aM!7Au$-;Rc<;I5g36W8{yEt+;YQ>AXadFE5nN^A-8> zh!&cp?`mlxeL~g%aA|YZBuMT|$QFZ;HEBZDq-oUI4nl@B2-(?+kToen)~pM)I0)I< z%%48uImMqX#4bYmu_QtkRV1uck+8FE5;n#nVXf_AyCPxHl$7g2ZH0P<&M9#jGczno zvJ)DiU}5J15%6J^UlgY)XbjW@je(k+eMo#UftqCeH>e4q;7_0?VmmWP{&S0_L~0Vd zr503^A^?-vyz~jJ>40s(UNBZUUREF!s$Az4Y!|T?p02F(3Qo~r=M|i?qRuNgMLpV# zvla^HJbD`|>aWnC--Zs9)>@0WD=rb20s*h3C06Qg z%Cy$lew6<+?zqqcdyO5W6U1e>%D@`)#MYS5YmEMdHKy)bYpgLXVIklZmxB~(1M@sA zZp*;zVgvJI;;IT5mV#!N5Ea)Sm!0H~j@G^KHr!=Zf>JnjXclcx6@QKPJ9j zb3j}_nb#aqDLw)pe%Zu$eAv`fgwG6o=4Oi<_Rx6sJt|x5-b2H)#m#$YaJIO04`m(} zw^z4`JD%j87;IMsgxv)${#y!@s-nrt=mdxrKp80(8K7crnh#hl7G7E{Of@sZbjPgu zKo=G45p^f-v=tbbKQh^1Z$zNL+^rRuyGw=#hwl^jSj1*Hq$Z?6Z0=FS=5D3H+^Y-i zDH+C6Q;vE712@K@xBO=ln}?C~22p6?VR1i3^+3BYSFjeGZ<)#ytmL~XP%;!0BC2oS#hos{0CvBWW>y1$;gspN{%fVRWiC{%wh3Rb#P2@bZ}Jg*x)h2kwb&Q5pCj; zAbJnMY;SNl1hYqj!wdI|$AZHlnB8+o>}Nug!=hOZ?(Y+iac?;Bs1nVP*sBN}_cu5U z78fPLw6W&R#`Xi^30Pc|^&9#dXL%2Z@966cb=`hIv?KdaiQAazDGa(Hag}&We8$Yo zptr=&AP9N`zJucXZQ|K>@m$FOW9Go1|B!eI8_@;@2OScx2--~{PW=p7f#85(fF;Di zC0WMI?BL*%A;BRK5ZPxj7~)|5LGg=r@vA*F4%xI@XVdO{*yvSu43#LDRdYzZE@|DK zj+=u6Fl-9?YS4p2;tdI8czzu;YS%h~8R2=TFXFA;q6(s=Sg8ya;!hAm+r-sv9`6&z)jRg}Qbc?pM9u;k+Zi&YSBt4Go&NZZJn=2r=hZd!(fc-#b_3*9ajIPZt<%Qu%84x0B|t6UUY6m7xma}#+z37 z9`6Xx5scAgj^{f)!>fL>wyyiP2)Hn2M`XF2#hE5V zLNizK)dw(&9iuX|VBQXMgr{U7XCqs;v!^QFV zOpwQj#_-UK|$2#WzMAsQxCKz8?8 z65>|MwNlr@5Uu2SXavt&sn=<=mHH2aT6I?nI@wBXw#ylF>~h9ByPUBBYg6k7+!{M{ z1#xRS#jU9n_I&)rN^xsCk6TkI)tXM7VV6^_sXW!1PH}501*g(@@i*}<#CNn|r9Org zLgfjxVWrT9PH`JnYK>iv+t7L3hLzfYmm%m{Mnm_RCf*}c?zB_TmF^Mmi@&2Zx1m$q zhDxE0VOHvDyPRr6-BoSq6vkmaTT0i9e_#w5sy?0K`cw+_O|Vk8*yU7x>aMC!r?@`- z>?#_7mrTA(Zuy{{5~tHh@lWv~dF4SnCAO0vxcVXaJFCI4gR86)jHxDuuK59@#6M{~ueNM(z2 zsYQH-)If12eGSZD6l$%c`=MxzB98>;0~}CJ{>&~X58LJB!zd@Y92FbWls-9}<`@M^ zpB!dsk#{9&k)3_R(j_yrjm9iMRXz}s{e?%QSJ`N!7ZF09ebQ&CO`d9%uG=qttTst6 z+h}B_F61wPIdmTEHT(e7Cb7jLUMw?=#ph&vAb|jpNSw*G(}j5jBItq9*^{?l4hVYk z_sfAnkBQoqt;WmIL*Bhy-@tYmSk8$7N|oVfgKl;=DZK#>dgu*%bR>~bI?K=laxiq3 zfq^375(njQrO%-5PHnl;ZHx64G{*|lA-X6QH&l|5e?X3eJ~8I9>u#YXdAJ%?oh`>4 zl;aR(fk=x756I(!8QF4T5P%eFl=#LdGthFIEP(37E>Vn9k7;jSe#+u*ReVZP@nr9b zh*~xGdo~FO(=xC z#9{`-dKa>oqoq|6BIDS^lE4^8vuv*FfQ2-nG8E8ao*n^9RST8$S>CB!LRH#vM4gJT z;K<;LfujS#IEk$#)uN42tKs#Z2lG+Am``8E?;iYqTbxKAVgK6*u|O1nwayU>akWU4 zVVB@ae4iqgh_%Q&8@cC+lg0U>T-<^514ut8N|d?dMjAx*F+U^6u zaXC3v76aNhP_0gZ`7F0mC}-WRw~Sa4rm{>qO-@%)N11X4h?omrhzW|(WWfBZ*%ceC zb}9nnfl;_w5g4~7Fw&hwU{d?E5)AXe1Fm`1amOJ{uQr4x@#f+0&3y0Mf?;ua*t zJQXU#(Qzsi@)VHo)gYyn6cklpl51e{UJYXs-oYVGrCDOVf~bz^oNcjgbi;xQQfl06 z^OdJno@kL$#B6XHr1V5ZO6Ri$ zN-ofaO5^TWc_NciHgEGEo9s9~w-leNkUv_xW#e%hav?io<%yl*HsnG@H|?+s#BC_T zxk_0=dv5Z*UXC{zR5c;X?sj7=a(K3z5;$>qvcBvTDI7?hA8UQ{(!N0_1q6Wt44QkPGcx0IDc$RAr#iAwW zcVIeJDKR$Y`3lEkTyCUels(-bl+!7cJI=~0#vZ75v^T&Y?T-d#7lMQPvF*9rV;*h~Qq1h>(bgh^UF;(8YQ+ zQC8@p3@1<g0g8*)}zmuYs2O0nq|b)2ODVQ3N&k_Q_UjihP(Nq%lRUYKo$Ynx3Nz zZ7;!YfO#dE>H(gk-{Ql6JVhL|I4y_*Dgwd>Vbllu*?Lf(TOG_~(JT}34lHhZVNK_7 zx7!ZO^Q$5CUQl8_Cck(kMt`4w`N9&OKDdPv51Uo)L6qfrutQOuHQq)8#OTTMu_h>F8VJ zQg^7REV zPMoW-mR)_PBUW8wEvK|&{bHIUzX|o!0J@B@QrFTldAGa=6yvuv%SzoqAx(jHb@I^-kPTEM;!PGc=RqSnI0N=e(R3q2a&_aPtQwGh@b5L*kg)V>KwTfEr< zYT0AFokKp-Cikm77Q^%&3;CFmCwO}Z@8YOpTKFu4$GyBb7$YwzapeVFZSqhG_W&Xy z-3lXP{1GBI7%dPIo;60ugxv}j20g6saV&G-4*2&HiZCW3AJ3~otiL4OPpCp+n2Pch zyMbZ1(suk_D{iCf#O<^T>inGui z1jV}+*l{O@!gvBVCiV?jG5nx{ju?LVP|~a`$yv*jF{v`(rIobGa?38aSk=g(rU?hH zODrF1vZvQ2w4YagJMQN-;iB}Yp>ni2VTf*V6YM+iMj~b<3%`TqcWerqQ3>!3B9e1J zVcRu@Z7=Z${rlt*3#FRF7&;UOs25#`k@f8O1xuXmBeolpEbx^ z8bqN4kLh9gbag)T^EUZ|AQ}UW81cE+v?c1 zZQJPBNyko}*tX4%^~BEqR(1j`1M4?HDw-Umg2QL2WX~>MoUvn)iTZUvy`bEfxH7M8C%CfV@4pUEl_&VmYBvt z@}zu7&=|ZCGs;HF<+vTRIG4iRX3SNJkn(lqYL)^CDg5Z)u82~}c{xVB*^y2iNgYHt zQ6C2hULX?j_nedY45miGD57-krF3i{GgH|1pfEJag4}e z2t6g#z3`D^8NW@5GHx))5`8_An~}bXJ9R!;K?=m9Z=~TD6uY|?F9m+GZwRW9k3(oD z34XG#L&y$NgD||q$R_FSsWbxF8LudgX8Or*kaXRu!2YoM%ATyS4_^0Q4DG6c#c!HC z*kAGR%D(20?WzdsMjh$a--x1Q&V<<2zi|YfqF=7jeO{^#T?431iD(5gt!23O z6b@bU%J2j^ci_;D5!#X*hN~c@;(}w4aKO{|P2gkXxN_^Z9N|p_&EU-h%^=*02At1F zv4{Pr)yOQT9R|DldL!n1GtxritCLxWH| zoX5X$Xmh!@U@|(?YuFV{mKqoH{>~|{5ap=%kRfki*LrEdu_^?XibS(w|1vt}gkoKw zj*C^2Wel}4hgXM?*odsKD(i2&POBwq10AO2=>|U;%0kc310lh9MbhCMRf*|BcBId< zPz3cgN+;b_H6e(>tWp-)_tgFjtLwid1giN6f5rvGJ=PBs?W6l*902MEDBgcT{Q8EQ zoi`k40m9ie1|qv2objuCVm@!~MW+tm8khL%t49^YU>sslkZ_7%Ba9sn>LMdmn2#8m zF7+t-gWwjaQCrHy?*;9sOeOjX6OH!Y+aTvRs1nU%)2;j?R36%U08FxsUbv@6ujQ8T znPEb+C17`U(O{`|CC4h)^b4AXv^IgQ(8i~87$YI@+8t}2k_b<7D`xWcLR6a=Oc*^u z&>@cEy&ekfb~57>Sk$!R`+4kx2ex!$m|p*~$lC{2RA0f5@KQ#JrHQ4}$Ln z#qk4Y)jmYqjHA`K1*y|Yl=)2_@IWpJ5n4@eI^p^PYRbK>@8OcTZiGYS=hJOl{V>B> z!u!Nr0}J#1jEDCKZ$!Fnqi(5FqGJ|s6O$i`aD89RT!+8H@3d_k*J8Yc-4+brBCYG* z)|ecxFR3qMVZi(l)c8itd!ZuCD+gLd1o#b^KALII-v5sJIOGx9OCy%Mpv+3ly&r@^ z1GGuX*Y{tyIuDbK6SE)X>8GRugY2;%on0nd#13-=F;I9RISMI}B+nW|C!IM%OeaSZ}t{unoZW+`X_(3gz+)*Vt5 z%oh_#yY)lm>g}3P19U84FK{~0$Ow~zfAF77^+wW!b}Wq#<-IUnI+?B`ck+ldYv{g4 zjW49_az(~^*N=CrN!XZ8OUjWK+3Xy$E?}|U`9$EB_GMMPZ5kFU5d}@i^JFfCr~M~G zm|4$6etAGq$7m^k26rpvU*3 z+v8wel2oX{NBMc?vzVaqVoRr}Q#T|#@lDjnjYnx*!Wu=O;&FKvD@UFvd6p|POX6x> zS{7)>u(woh{L%tp+bUEjCd8{GpE4BA=r}llAYbLNheHBw~aHxy0 znsBXWX*CtD?vpU{*P0hFGix+;Bd;OOB)K#~74>K6hx{4ZG|R06N`w3eZ26-6hLQ zB02&bqZH8#C0An2ExJUDHJhh{eaPAY@Xf9t|fey|}7+%_IEu|xI! z9&H`fs@1$5g=kVKC;!3uGr}nZq3Q=#Z5YndC(Ki9bcbK3wq}NBsD((uFtLexE#|f9 z1f=SMIU0>GA+*lwE0WSe~o9|PMzbJd&9)oMU-yFy=AXSvy+kDg4`|&Eb&$76xou`D6x(uz%JMLX%xUfQ~O9q+niK zV1D>ZGCJ30z&Gr5T?l-qe^3>>db7*85JKYIdL@8*3k&4rp$;XW*$DC zOgEz4DVs~I75lGAwI$5lk9ufsl++ab8qJjavs_w5rDAw30|v__q!wn0^E_#Ux%4scQss?x-sCc^)V zHoOPl;YgoZgPx0)Wfz=WfHYE)=HwEC&N?L>5TEd0sm%$|+(lge6wJRQ!OeIaiDAf^`k6J_4sSW(UcHl<(|sbh ziLPgUm&twc5jvUr4Y!H%;2M68;YB76S%M4J2VbHexH1VAP)P0vRr}#T2FnDZJ`PB} z78KSy^#N(5PO!Q0;HZ*`SuJU$PF|mJ3fl0rYWIf&`}63yfzc*Q(tg{sks2Ede6&G1 zzgwHYcPrw#30A@(p%t?CEC33Q8@1ZmLFJ2S_G|Bi~i< zpduXM;rFnyxtFEv%llj#l4GDPWkfsS8vHeKUems&jcZw;X-Cx#HA`5)eb_}jb9g$s z4*J_758wqZ4*H{T+qKK_5#yYzB14DN7n|9lA=7HFfyks| z`XiV^!(1Mv1>prsR^}o9$T2<8eIt1Cj%eDl-5AYuuL?)NgVrtIbmP5bj?lLdbZ(q@K=)n*_~w%(I; ziUi25jz|8>?x;(}qO0{Kr{3LYh_60M)5qQy;>;VdzVgfMy`h>dGehl9}+3o83z-=eM zmEG3pgc=c#ZR|{x2iPNUVx{b+GRYk&qzhgx>?3qPcIGbtBi;V|lx6B|m>AtZ7V>rC zwYy`Qph=GZVL*AYBXHs+(JAmT?HuDm#-gd>&_fX+zhVFp+Ts9KaBfCe@v`DX zC)yg~*m5XJ7dg#O=@k88yPEBLCTfRwDE-t>S6QeNUe*jvags01U-q{j-QGgwB7;?3 zZb`MBeOcr$!;sI#5(5c8y!y?07T%I3^fu+;*9O^Tb1TFpVk)9*8YzKQubM57g{hB5Ic@`r&wr*pVryg#bNsaxC5bNEJI~u<fNDV7Z3ZA4Iow-f*^{c-j78`%V4SYBv5ABuF+zZ(4`4LfW_o-EV zLf0k}DYt%7t?ajJeoMsXURyix641LOg4yZY9lNiNvnaYon`r#*e>`dxQ1FAs9;y)N zg|RWHtMcZNYx|fs$K)7$CRGgm!=$#{t*7#k>R$8@cr9_lnlZ;T9Qgwwh>zT-Vow+1 z?L2Pm3MtC&td0Po@Q^0J9>NAEO!a2>tlcZvPk@I%4~_h49y!e+kF4f^hl<~R7JeXS zKOv9t2eo+m=t-u}f+rF{5dljls#$ktkQ7g*zY`t~!1-Y@r0Sf(D9MtojR4b#f$zDc zK!SJ9|HR&x^5dHaY$UlsE^3X>oykSWcpmJEz52@r)KJFGnF$D-pm7tV+CzinXo5Jg z#SQpfqz*^BY@FzzNzL_}+-bB9zsavMRZ%!xtFmN5@w-R?8hfJp61L*`MxKic9Nu7` zxdY=?K8b496M@;}5A01@YoO9mp{Rz?TWo91f~PiIYt^nR(@XSj12ieQP=MUg_uNjx z_uT54?LxUcLLvVd{&=7S{V>)K(1jpciR``sh=qa`HKjeBF=P2!xEGdZz_oC~kI#8N zLa2w&YMnn2DgTGVPc+AyGQk{TH|({L^MRd$a36ov#9uiFCqz9+;%3J(e?zhTA=%y{ z9u+-_TMQQNStefl#486R37Ij1tz^kfxG5RVlm zAR%8QMtJTnKK}rZAXMCWlcae8LZ`%bsJ5=?t<`GI!H}qy9j%tg^yQ#<-N5+j=?w1Q z2wui4n(0*gPvEsated7pMx9SP?b}-_2#HJImWBgUjK2^fbKu+7c5F5;*VKBFyxN`;dyjVH(7#7hFMv$;H} zsXr_JPdC-q8auk~x3#(%Qj!~`xI?Z%5CsX*iPu5crqB>we$fm$s7|UoRp67x8}a7a zUs6=)uu*4+SsL6eI6>Yjsze4ZAvNT+NOU9|(_~JFA`kELcjPz=w|fNoL`}LzZ>XHS zBD>XkO8@mQ#BHb(T(=9!!^3&dY$0lmbdF+B{F&^81y*E0r^))pPSl>L4Q2k&7Zr?9 zg}gI}Gc>iBp9lkm@u>8&PPr-`PH`J6cs}zV5<5kd4KQN};B{5cl`z$mT979rybRS* zUJmGxir8r>^Tl-3I!djqP#x8P$=4_9$fBC3@|%-oRcwTs$v2O&<2;rL?G^29*lsmUiaIpPy@gFyOpk8~1A-k`=)Nlh0zA)k4xrQzYm;+KV)O@0A?3EcSarAEvm{$mVwp_r64;6_C6Js)=Qrp zP5tg&+M?b40&2JzJL9u;e?=wMl4lQ3_)?PDsmDD8WS>{=k(=mJx;8i3V46o{aDm22 z(nv{(MjA!?g84vKIm}-r-6pxjiyDmn{(?plV%fo&JT>|Nb>FFId9fGPd#WL-H|vU1@`T~`nL2Nhw`T{zZ-po6xmjW(I`a`~u3PPZaoJgHYv z0Byn!!=Pe*QCOUV&W?lX%|?;WYFRoX$F38NK`DY!|w zN2ki*=(Zhv59ynN)Y>l!`eBFx<3eHi^wt)HePQKtWo!EIuI#5GXa7+1DnrM<6J8-# z@`f7q$>6OqFy?s$DTcn}CgK5xzo2dfHT}YLE%6fHYEWTdkErC=HeMd6)+40e0)~@B z#V7{Be*#=@0YS9wz2Nnt9Vh@|7%xf0oVAobx-+fvtXNljVmu zK{R3L^Blvu3ByYVjo>z8$TdL9)=5F*A#a;4w$tNFI>WPBg1}T#oIsxW+RJD9l%OsT z(XBd`aL9dogGA{uHDr`>Hn$Pc!JkHo3Z^wVTWak4kOKlxK&iLg@wh_5STvgjHeOFl;|81Eh?Fi-Yh?MfmO+l;KAzmObehftfi%XFT3y0Gy9<9R zYYVN99j`Z3DX2NgW19JL#IThw{0q{I!}hoU5?ZGplEI#3jVrNj!3+9lHBNE^9@av= zY*7K`v8mK-7+qDR4JhZKDzp>lo@23o?-0OLMP;I%nB};_T}WFv+_CMl(#`O#0xt5g zO2s}SF7|dkYv>Bh6wnu{kAt1MvUETMgZ|W@kYoTc%<&)q>kBT&cNS4FgkopRO|b## z1=sA zim^<9JwdPp=!SfNf?MmOLgmgm2+J<3P@HT7r=TfUg*GP_%F;lZhqlCji@Mfr&CNEi$jle@zS^aAo4Ekf7ZSp7LlM7ip4rdq7qNDxJP&+Yx7omiD`D z2FVpZZ*E-29vb44TSoaI9q1z!K_G?@mMx03Xg|6qtuvKx;nYV2#sw1|EB`>(1;z}9Hn3DkGx%Dx*>8F@rTcOqI8Eu2k3!-P%A`>*PC;- z;*!k@!SM2|DZ3)0nDu|ee<)?YmN>YToceZFTV>4t&MluZ^B!^0ht)T4iLfi8zgOsr ztGR32}7mW6gNaginz~+aT!KmD;#60E`B{x zd^RFrNa2eQ5kEIM+rX*5!M)$XUs1tU*Q7{uP?i?K3n)ZxbC+g;;6NIRUZ&@JaUOj1|EWI5OD80WR5egDP$U?OBq5#!Cf1;0_~@bMCNBCpgEIQLH~h(Ts`ANnGWLuS zhuCLo!8iec=!$L|)zW$)wP(E800S9^_)v1qEM*`0HbL^G7bJlD)%dxOHE$epMxPMw zi1HZ`3Z#z$naJxZPiP#*r25b>agMYD)GdjSBhXC|tzDwuNS^!UYP~m0D?zW=kqp#J z4lXpW-#nc*jQHnZQFE%qc{U8|pW3xWwOVG3629-e#DJ}jo1ZsuutIbgSW3TsJAg75 zb6MGmG?&LJGFY@P*$PU4mPay%`%C-=P+*2=02m~H9Z#q@?qabG%3y$!wY0+!5Sy!C z#cg+fScIL824>ORz2hD78w7I67z7^0*$UdF?F2?*kKFD$4%YRX)+e=w09y-GT5n6PQ^$v*7JfnL!_DVsF$8^u$Xi;)`Ox{6jN1+to_&z%mumwNQU$ z_?LGQ{HFy%xBCn&|DK?=q;KpE#zr{tNHfesXCx~_nw#C@HZv?(0FyCQTa_3M@6Iu` zM3O92=kagov_nbD2yjOMP&ULchy5`tOe2lRE$`$FwbQqRhkIjl;%4@g7 z&Q7-=3T(VKR=lVS(>LChIALe90>l^eXQd>?(CTk=9m=BUl=( zxkMH^Q_}U>niI5N^OaKjxF`VQl!GCi!i|q|a_U$WASM{s@aJT_r-dKcO)E)~u7SbK zd_Fn=?RZf@L_Z zV=!FGW0+dhKlF<~pt*GW&jzqPaD4rWbkoVLKWCg?gZlVJ`)50Jr{ECvz~K*Y#VqOa z<;@$?Q}Fy`&7xS&#K zvjE+0*(vdjw}GFS?Qr0{PLwyT8Lo!tvKpkyoX-Z_3(6+M*fY~O*e1QyJSI;@+obhl zik>Lblj-ZKkhP4!>kQq{5lIo!xcTH}-Uy z{(z_tleXwTSUm=xv+YT2Enn8rmGy_XBlBczt*!so7eMXUq{*+YO>pK=9C2=l`Oif= zve96vi%1jD+9Eu%xs~L}iWBer!;cyNE2;j}X2(R&-Yl*} zqV6OuX?i6Wl{L9KzEs7*yFL(1D|Au0ciX<2v7wCv&`%5Q-q$giWbD)$kWr1%U>|R> zhn;Qv6x1=Q`~t3(s^wiriE@80xOaiN&j59{aru~C^SJay`}kY)a&fbY;4yo)DqIb? z@efLIlD{4#2i7^MnNJ6{8b7dQ5eXi+AgevAemQVsReq-_V3zKMz;^>xgNnC4BM~l` z^Rm?V*Q8p|GM$^qR#2c+G%@I?tz6grfHv1{w?zjlqgfCInyZIaF_yi0zT^#9eRvGB z-KBBqO8W@;SJtptQw&B8QN)smGa@4vRS|8Jg1P_2niMq00z#16%{ZKJ$}zEOKGQ_# zH&1un!TGDkpdf)^5f!G`;U*`Sc>1IgITt z%~M_%&eh{hKy3o#N#ru0jmnKsqVx)+;-K+J&r?wlCn&5I2`}&J{OCk+$+-NdQ=P&m zJ6>1*UHx(t3xdg38uXO9z}h!oj@!@f?A`J}@2KV>8&PLuH!*?$%PTA_+>+>)CtzWn{Q^RZPhOU(ZYkpX= z)C;s~*rtPV-(sBtl*}_<60f-$`He zP!N$d_n1t4H?jU--9(d92~Rl4AK?;MW5|_cPC3CzT##ZNlPqD?SrK(B4+3K2)J@FT zgML%UbxrUGHj!=!R~W>-wl;=F-nW`RDo603Fn5Vzra;zy$nCXJdCWHIp%@l=eMvIHci6 zFHH+pVvdxjCe2r%wk0+*pWug_rinI>Y1J*JYpRL##T8S$W zFA$F(Xq1KkGgzeh?L+2Bk5q^;@oYeao}(H|yIk|P zh1TD0i++;Kk_e;OL>%i!gOryz4VF6&QVIYx#53TmNRIhfL|z>p8U|Kvn7a1Z?ta zxKByCjQ|FBf}t$UVHT2F>mxoT{+F#DsHhs;HvpStV6W zDH3Y;!Z^~Q25mHvnK$@ehdWtnoPXjgS8sDL`PR?1%x>90-y@RM=COkq7J0=+l*5s? zp-KDi4dDv)^PhjqUr~u=jH2&c+OM5WOh7W%V@ZD{6w2wB+65&3dZLNNM2#~l<^qQa zOvTft(L1+#W<9ceE0%!Qhxg7pG}=dA_#;{PBaY&33FR`w{%g$MveSIAAqbCl2q+Jk zzXtZO1h=2kLlJvRcT-Rsyl6sp1z0rN*0A33<3*s$x`E`RKHZEn6RxlD-lDPJ@{_XX5@){EGshL1EugpoG)X*#i_t zMC3F>ooGnPSsHo$(Q-6fOlK*Zos4U_p|^zML`~CSXEWvOG)|1=&{WWB^HEqJ zV;)blm&*O7>b}a`Hq#$od5YWe)m6zpw z_|tITVlNgMj79{yac-qm;sX5R5 z_0HVmpS4@$3AXGAzvOr!6o;{R*8aF=;R9(=7%7>DWzH5hATNGTR9$kU;#L-YY;mMNsb{)akLyZ zZ7QyDe{4hQBx^X|#k%?$X#RX42SnO86E1XrWStv8;!F`x|km!S$i^zd@nw!X};5U?3n8kRTv7{}(`^ZZ3`%)^7g?6Z$_|#@@+} zT+Gql$=Jc#(cynMp*`v{j%Y0C-~2ME#xU&WH1-=L!oOM^I-8`C!_a9MR7C{l#r|bG zhos{0;rjk1^gWDpI)tG@hE{(XPZaHziIC_I2iLo5_n&ioI%Ogf0_{MWMV6xcXF=|6 zBbq**={+8vz*b`7kT)T2c(0Q3l72#tA8wIoxd<@GztiRxiJOvF;`#O}-l2a}f)}BZS#_*c>^kD?rdEhOtTE8u3}jU$ed(-1pJWo zcfl|DpHn*5#x6)(!23B{e|jltQ#JRnAAqAE)E22KUlc7mXOBY&3)Xokte%3O56V;9 zSEX!nA5?;6IAXUaQ^Ef3dG*9uan3b15KnGtdy*5awOSTNiw9ZCGS=3;LX4NIYz*B= zqf?-{7>>T1F0r^9t^!uV3YDK%vnn%wg?&3c2<&QwH) zESvN?cL;|{#fUV-H!>1SxvdJ(rJyx1^>S$lq`f=o?zbhpg3ebGA9%(1xzjMeG5Sep zpCnxIzrAyxvGvJeo0$x0*P)n2LVU*h`>o#W@melf|S6#3jSPu{nuyr(K!)8 zpNZF`=P<5FKh!OTw}bRN~Zb-IRZZpMI^;+zPFm=xA2xw7taI9)XN zrV_J3Blt$NfJu$e9CP<}FH&}{IFKQRY8?^`SDUe5=6CGTtzVAoUWezBGV8`+I8cBq zW`0G?zZr6hl~ffRPwQ+PTJ7>uJ9ba3omGQ@RWlL`NZBMUr8$7E!8`k=`7Z2}a%w4( z_F_KSKLV1d=EcdXmWP*de{p@Ip`X-(5u%WApXx2SbIFOs=cJ zDCV_;?#*NcAA?nDb&z@a^x7W31yCFo$^{UEcU$y!!v+)n-FQWabiK11ib0gXd-5qS zHQ2cfL6<62xX-|v<{q?ZqUf}``z3C5Q^Fj;zodpc7@hK3Ao@|5%etd`0)yjV$+3HH z2r36(qi%*c6u1)(Vb-c|V{iFsFB8^PntWp}+o!dL7-)GQU(DnWO(T*$oISX=~WwnsGzSb=y9N!Zr9u9 zm_2wrNBl#!ls_Eu{4huHt?iTl)VD$o+aI_Tgr4WB^C2J?vGqm2B8+GL-6MHUn|14x zdL&67AA20}mha`xEHkcRD2+nz;wDO8q{oYqAqUsJpDGYjC4aroL|&*-pJd(EJ}fs6 zFl^?Jlx7O>PE7dor)So`>|f`i#A_*Qz*DdhwxYpYA4CX(9cqc^=!wXRxpXVpAsXN& zHN@}_bcU4U6oA_2Up$+Zas)WzUNKY6MuBsY6{+H5fq6O-+J=*rB4vMWnwuHxS^RFB~RN42Ym6pV=y#*Y7M4Ex8gdAEU*6*{IZAUZyP z25pNdNnl2>?cA_CKBAzSTyYyax?1rA_P@iDet`*p0RaTWl^g`b=>KV0{!jc}|MvF7 zU(^5TO>b$&t-pSHPrIVT^F69DlcSrkEM1SL-)h94kfk3>s8RK7!JRO@zOnPP(BMX)h8gL`g$Znw>+K6 zc?o!V+pXw*jm84ON1+Lh#bL|j{N*EPsfhji%f*_s_8(PjIZJk%U2~t~){?|dQ-$otW2uF$Ut{b^nsG&9m*JexZD^;cW-xM;{(?oTo92{Kg%oAo8IG<< zsPHQ&nd7}V zJTChgPWgnntmkZ1&Mm5jRd|OuVp6BIIBUy^+4K#)&G9WCmU{E0Q132jYROU6LO8ow zy;U|g!YrxQ;*6zE<^A5}c@vL!Ft!rZarTK=(wJ7-Riiv%G1*=&lJa5{Jc#EV&>tl)U5XU1@=Dt_K~~qvwqJG25N&0f5!2aIxf_{? z0q3#BkhQb}jujTH32~6m6&FkncshSTM12TuQrNc{8b->D`={qFBw}t$Gm1p?(YVEV z|1z_FzdT|vu$gARJzBqXdXWY1h32J9>w|4ogV0{45JEw|z}YQRQqdXGR(`00PN&a( zkMt-?uGoMO9B+w+77fK7&3oF`&6gXxRp02#=IB?$Nl z&eFUV!4%L`o74V*CBNxPt8)1qFZzR#$$c!?;BP$aeTT68#j=c#tJ?>;uB5dfstOTX zl*Ru*?cf^U5!P&`hie>_D()cap+yX3?A&8pRnPfz_svU?^YQtFl&w|$>g&sfs#gKA zifP<1_*|%!-=Skf+;nz(+G;10cqp=VM2Nb+Pg4pfx8G>qeUmUOwm~!$^f++@=J|1w z#Db%8?@=q0i_ZP?hdN4@wXRN}Z~|q2p~@$t!oWVIMjNHNgtY)#E3M zf={m8*>fz1K2_aDIuY;-=PFzeQ)zO#Y^=C@7~IzMHHTpN$m=Rhsp@D85*SCUC_P6j z(Vjf5l(w#Vtk%cbTTc^a&_hD00E6i>NYsKW%{vXS%#3PIO*E*ClCg;og^tog1TQkQ zB&I?T95_mdRR(f}ePNCzs8!a4cjSO2L@K_bcXVdy{xwM6O7Elfn_#ax$hFknWJ?`h4atq}cIBaN$?2 zh)i%FD`8h?7d$RVvDc-;DyK(fs&n5p897L#h^cl?{W>Er!=F8i!qnL!@iwGbXA(c|Ar&OuC`q#RIS8_qfr}*UjJMG{(8imp z@`)XwHxda%6I8BvaYvzhr2)%hjpdoa>=4rC^G#a`#;&QLd;DP+EI!2XOS|wKC@XEg zQfRRqv5x(B@7gjV;q#*LcOU9$l-x~rZJiyCUpq1Zq@8dUm+awyMRRAE0mIx+4=T}f zY61VqUGfiSe6>j~M}$1xo_3@$q!3+$l+I$B1xvW$j5%FTQH?rf+-Iq07V~r=>Bnw? znzL>OUgYKNWOiy zrcKnV`;Mo3f~YwcQy^-ie>V0X$6$8!H-%79R!fS@-i{UgeMS4kdB{BxeLS2#^tX!Q+FNGIT~VXd;IGgZ60Ew zKwQqf7w(u2Z5lY%aH+09KTo({6yrO}`*yKC(O&9P>+aG&jnTsI+7=RsdZxG|Q-3!{ zYcSZyOr;S7E6)?t^&s8MTTIiL33OCF`k4&{yx-h<>*Q@0?F&J=R1L&pF)GG1QT?wr6g8Wg~LfmxtTkC4fC@#|tsA16Z6cb=G-p-gn*##-c7Wh?(yNRhP*7$Zw`@?etv-eN0)OcYj z?bTymvXh807F2$zsmtl z{}Qm82bY&HZ1UL~T%t`syD*yXWQSIeqZB^t5XIq)ezFTgV`Cpj-3UXK!&9Y6wKiOA zxz?$j-|?khGCaJ}E`+~J``fg{nb--p>%Z>~*i>t@;x4(H;GY${-%)v8n)BXzy3Tt> za^l90m40`0?)jx1FLVUEB6^XYoUYcY1=I@7^Yv-x3X0ABZPQFwA^jKw@T);Yx8Z=xXHGvQHvUO}ZAWZAtOkkl)L+N}Xma#F_Y%A&*D?^0iV+%y(*xdp z#p+v;%QyNvzDU=%*P2N9+wIjAFZ02)WC`5M&-LhB-E zhgd0_d;*^Y<1Hz{PsnF{zL4iuXVYBJe1N&59Nk3NtZX{Z-J>Qkx4UL8EH#q|n_z{u zQuYRq%xb<{#i4KA25xYad8h1uZ8@pDX=GCCEyZdG_~lP+tt4HfUBgY{Pm=_ zhq_q<3I}YAOv^SWUWJBiW2qMsuC-0F+U#rc9SUKDsGex=r%^n^6+KkDe!nia97%V3 zPoX&5=Zr7c73_|N6IfCG$WI%);+|i3Spk#lL_*r5;HJQm_IaViP%bBva{?q^KBzo` zL~cGPN2BACVLVjW?`IPNn$57Mj$bS-_Ze1vQhZ5=1p3fYU()w*WWgc^)dDej9Z~un z!#uI=aW76kn3>Q4zHyGnqp2H;2^c3ZQb~ADm?eZ;*0YTTl4>7gPKRXp9d6Ru;I*QI zae!ZXS-;quKu_xm?X z7J6L0hOk!(XUNn>AMxW@7N{La`MO`^9o2>gMlDtRh*sVBW2?>mW*}SGuidq7vd7jk zfa*Aona3Pa`k(f}uc(ToHN>U+Az-0DVS}mcQ4m5eN#1vGEV7VxqIfGn7>|;YXMLqgJ+z{rTX^VuXg7mOV5NU{LYm?zxx`E6pLC00-G-%uR%w6L3g<2*db9#csekeHK2SFs5k*+Waq^fs@=zde6Uhg_J}n5#z`gy ze13h&Z!Q(_ zY?tE(1|Txs17poU@A(7D;`XwJD&D?zfqVHwmOQUJ-k$+DfyV(|;d5HG6BHLDI?h7> z_<|r53-jg}c}E0yDG85zbXLreI>kqH?oMBSC8iM|l7Q46|3a-phW!Sd^hVSDKm}gb zUX}HV-s^tk=e&N@VE%oqB^gs7o#WNidPhy<7)$TP!-)yNMKQX?Tv?ys2cGQi?D zxOMwQqV=IgX<*dYE%lWI62kVQO=-Ao^zkIg)6@O9n<+kZpCAbOV9RbiQAGi~`-{33}oweT9gm}Dt5eW~&X3IOR>NTO7qN^=Qm zmYQn`qnn|n(+GmIrC6Gndo-6;?zwC7tbm2DGftQF{J?T1BKR-?+>p%PuN zJ~)(P6`a+`FdAvkRVVcmsK+&TBM>&lg2)>==4n}A(^<-jY*MSS1vMjyuOiU!4f#cC z!8pt1&jwvP=bxEg{`3lwX(6sI#IPDzY0{y=PgQFU)fq4_;+H%*ha1XdB;i$6k%_fG zDxO+kR)KU@oqbTMx~|sfh^B|J{MKyU3eIcQWrBAas0MDqxJ-8_yI;%OolcQL3jNV0Z@P(+g*Vl8`5uHdv0@)9@efIcP9hQ^RRBH~7>1@J|=XD!`3s3xgH4 zA5Hd=tv)jW1;xa@i6sI{K|VJ)+IeNZ%-f_`lkmi7^u)~i39VX!nDXm`G67|b!QvD> zAijZ5#GVs~+eWmPx$smUd(iy%Y(2L4O0l3}+MBsJlxN1Q>4DLj)Ubk2M;4q5g$!0? z2!kB`*^S~pqEUj*wPjjXLGi#%@qEK#`ipd$gYG&Z$*c}NFwrur{u{)PN2Vs`h2Hl` z^{mD1lkrC^FYqGgW3H29o7)zp@t38w#cHA`_5c1|lo z2Z-{MOr);`eYJB!}FU0O;4TlPtE| ztcQydimX>I7sg=_B&$EjqLPW3Yo>G-+b5K${1F<`m_YWG6mwr63+Juspy4gC0ekZJRF{mzpO+NbV%? z^fQBmO2lL~v8NC_or_o%C_t*whOks;w_wRAGE=4({DXtxh)FKCw}9E+VUVIONT_z7 zHU!!H1?mXV*qDv5S4h-Wv{UKpIRra*zvao_K-mt=Q*>|U?OkoYu%6y_|LsbTM<&3? zG?-#tw<+1`n57+DW9V0y^rvxPVQx4V4#d#dc%B-P?;kMg+|wY679{z?Ul{Mpo9X$b zD@`e0S6kA93p~J~s;hHXovek1l57w;GOScPMq{1LiPo;RM@GaK>V)kQ1{M`+qeJzz zu`l9Ms=(W8*w_-kEfnH&60Bg9wQRlq4oAOSRw+e`1PZS{$&i$|WL?YFu^eQ*KUBw0 zSsTT~?@o0Yq~xoYQO0F=Wb>5nr;8;O6{%aw!rS_Jn>4z!KmfUf-oqOIR zy}K&zvkG?NIz)}DGz=bUqBPL)i;5n@=(t#@y7j}Dc=EFv!i5V+|sZ|h3IU8SJPV!=CUrSR%_aIq1tX)4|@Ak zF}V|8z<-U{`-#~W=Z23pVe=jHgkbW#+x;un8?M?9vBX#3E)fDUNEP6we@uA@>9JSN z%sI2zCTRr96RLvsO-wd?BKC3}Ff-WzkA8mH5a2SeyC(L2%7EeX`_9ff!sB!p!*xta z9GMv!p{#J9TvonsGNs^;BM1>2)(YJy#vieg{oAN(@bH|Vt^WQ;6-+e@4~PJSy& z#b2d(u>dF2^UU<~OfCAM?A1krcI<;Ch}K9S7!$7Z(AzoUr9`N9H{yXZs2hVBq8@aC z=H1QZMCqkmRpe`nO9?N2y&Ixerie(T3K~+QHCQ_6y7(9I z*&tU4q)q>4T`aIqYTQ6Q!Egv`BL7NI-@IPF-#3ax6C_@nNCtAApdU4!DlS$sA|@y7 znLQJxe*Kdm??hlhQcObAvl1niXbIh$#u~JOKk|<3cYIpGD+$K2PYHK;Hl8Cv8kay>z4da2@rNi z8L<`OnViUOc(?^j2`mJ4(nCCgrbI2`6{6EJavfvWj0^I~78>1W2T5U52q-UQcA|gR zX@eyIAL&9@v&4$XH3f^d0!2CiV;zDpkA+r8{QST7h#|mOlT{ju-?k$QqI9$4H`)W1 zt71h|I-~42;z%iQY!+Vt$863P)PG6EuxatG4`1X_0%) zsw7e~L~jLw4siWzw%Xe~fgf&gH9Z=q4)lPr^g?;4FkT~3K0GBPC&pe&#u}eXzKuy=p$F>u&3Y7r11_9c8aQqlP@pOW{ ze&+Yar%+Eool8=-hV*r^iF+pOgnh6zSz&` z>OaMm_09-l2gG?Re%T%->=)Q^PMv}kAG2p3Ja88)Wym^uB+Ven{?jVk#6`TmLjeI1VgLbI{oAdw zt(CEf!~bfQJO9fpPf6A-)mc>=Tk&fPfZjyr(wGahk^#`^q zSD%pfvp5+nXA&*Lx&Uqj`uSo zETY|jZBCYV!Gmh7Ml4rN)`!YuuKP>Uc^-izxLt>1-Nw9Xtiie(nwI%GoqiVJDWGl` zHiu!IX@;;$%tTHzlxmNvpAoXW0YMMWy$zC=186NqSg7~Jw55yS7egf-i4d_<7L3k4 zEYEzBUa{dZ6N{BeECaHV>uMFmy~+E4{(5iZR(4(O$X9T}~i2c$FB^#kVL6_?cK zqmX!Sm&gT;@bEU8WU)%z%7~Tl$V3=B?2lNPB!QnP85oLdSjOiY zAU~^0fx1jY-#mMQ6&}*!er_8(|6;vU4Zl7k*&}os-%ICG| zq}EYpqE2fuXWK6(&TkUcPUUjSh&2U+&OUnK(7BYW8bsY`u)pUK>8kES)zEdCDubm> zPniflf7nVgIj8NvRYdiv^MH`=<%#E_Kg*z?N$roOsOZBMDeH-6qsag^q0pBa{gxy* zN7VTXQJ^6qw`pY?qxc!wNl4Z?cUAOucsB{sUv;gdCn3NE)5*jDc($s)T4Qf!cwORaoq)u@IFFBBfR(Mc9XEi`{& ze}wnl!I!Y$YOdS&uV>`2rfTpf(vH}yKY11@zInKlU$22>EDE?l*l_8Z3K)AdHMKi6~a&Xjli0Iaii z?NiPSpHSB=W0}Y^i2sJ&IYQZF)oa^fno3sllC;4dt6h~lzA#1T8)>QUQo~DPTSpDu z7~rF)=b-xl7;RM))?-Yshaz`EpT-71&(~Q8Chz#?4Pu|#9;ZE z*qGKi)tSxKYAsO;_tA&~!S+8zcN1y3=kGv(y>Q*jeiTRFT=i`bYysT0fHp9&?}qHm zZnjz&{u~{=`Rv#$3Ov5|_yBt_bRb3*Hv7tYx`@tK@36dKc5-q)h3H~W^5(_P@7^a*pPI}y#r@W1hhn5DTu**;y&035@LxE$`Ct{ZZDCzsJPsq-X7mvIk5rE4aF zz}~qi*sui1Do>Rj9LeSZXZww;3L!0lNujAWPg zs-wK-kM(3fI!g2rI|kIc(P!~6VazKNY^GrFp*|vCGU(h{+u>{GZjgF<7&mnplgx|D6&`*W*tLE(6 zM7AFj(hvp)U!}HT9lq4uq|oW2qCR5{XM>HtNe-V;!ntug1;;WHxWd1Wm2V&ldwRqK z-O${glv+XK_xXpg<7bmLIu}sYzJ=BaTz%`hDR5R;iS1&;l>Jlc5{69n#*D+}qHmQ? z@IJw=^*}U-CdOnK0jRa|T_UmEsqSS5rIKj;b@$5o?ad+34&obmo&IECttIFFXZ}lI zomar1TgdfgIs5*yP-!Sm(lZhQ#bAeEGSHkfClNUS0W)xKf|3(!jfX5-=(n0w2&tIM z;+OK6OUkd;{~3RAi&Axw2LS>i{vGiwas|s!V$sA&{+s|;)+;TCUdnWyE7~CO1%mFe+3_nxeUJ~dM4HE@X^~t{ zT}-%jXTF;He80ZJ0_pZCLDc2{ta?i!qYN?R9tEXUOf406uvR7$Joscs%uk4~#V>Kp z%4HpPpD3jFw@fs{J@AXud&x=&mNa}9HYP`;ho-mO1<39)^$&5s&pr8LovgETB)O^-2~q$4F>u;$tjf9cIqddk^duy-<2ktS^?9 z&cMw<0+%zckE{O~I~6ub!>ZroVayjDrj*J2njv7zUgEAgct`Eaesfa)Au{bCMRF`2 z*LgFGg|IQ5xU0WhR=-qct8xibp3EE3wVrPqrPQdiPS>2|U2L&vR;8ii>++DOv9)m$ z%%sPE^^;+;l#wYHvJ@=gR`A$Yb*wm9B=ZiN?18Xz*SKv|)=J2Ktp#Tz^LFPd0`fV2 zfB+HGN;YfRjOVQWQ8g=#yjRo%?KEV~?z)Tx)9o^Rlx0i20r0pA;CU^$N z?*EB(9a3s8K>z^>ApP6x+V1Z%#wvDJwg$#ZCXS8(TbqB>^`M%TE%q?#m#MoJ4Fy0# zqU&U@rD^TtOeLeihKeh+aDc^R%!OnfP*F4$ryWW~>$-D<&3u5Odj-SP#C5G<2 z1Ges}ONC~+Rf^5x^Fn->)nn^u$pi_kn&N0MG`M4j3u z3oTn|kw^Qfo2m0A49L3Ua)n;wNS5D^ndV8{c{^#>@fL-xCdvXbusL+=WrS@MbD6{^ z%p~sVT4~o>C#Nmk8_U*1$gFO5Z?T>bE2}gC^VetWs9I~)Grwa-m@4!%LPUcKJMZ}7 z<_|kp1%gH+PMUC|!CR21Q^^7u{knr!t)V8=B=32b09sT(`_4ml)74sX-zR!jx`d2y zN@hPLXF4a0*UQWxgZ77M7To-kAl}6FM1lZdzgWr1vW4nlLpGUhD|KTOw??iE`wsMW zkPg~JD+VBrlMzb{VF3aL(q#%bOL0SC{SqmC#8{j+yADJcS*Q)q(VK%D1LZX=Wbq&t zt{*Ghg7I`yYW@!Z*N-Oz-#}iawOYJ6Q%!AsIJ%Mr z%!8zoi`ZJh;H0;4Z6Xgbv6t_9rX>6>W`THx1UXAWr5%>wVO*4w&XKEYxZfn19`DQn z!GdSzS$61OZbLs#MMAA^rMjv929+0czYwaY|25675y`|K@>oh7@k|)xNiup;%mQ9ly|%nm%@eH4VgU95QcxNvci{o zdFAFj9@2O#s5WsEMq&G41Hp&JzD0koD($n4U^yGfwi#n`?Yb$kwNz&j$WrZ*Slws@ z?&Zykv;LH<%Zcy|br}l?=vvl{dIyfiFY1o2p$@R46RO?zY>-#Ot^^b%4pz~|kw!YS0Aj>K+N|urOst8l@)J0*c5?uzm6au|)hE6z93?b%(|tjl{&)^OF?lKin|r$xZUk^HGW7Lfy>C8jG5p4Q5Q#1Ryi3}Fd=+=Km>@$ zRiAj!ZneHW4u^&mRXv=3#tA8^l05=Xm6l13x+lUAlNuw%&g_iERK+vc>n`5M3fe!O zZiNxPBG3H3?N-^tZK$G z8Sf_5l7wzlW60zxvK@C$cPpwqm#rwB$HtTAc&+H&vidwHT;EfvUtOxK6!ZQ@{Td{& zyUWQ1eRE#=O%LT=kC|K!R9(A3mdXJGQ^YI4HIFP_O!Pyb_jLtg%{nV%T&HJ@{*X^tTZfp%JKWFWnRqNY6W zA~;n508cN#Q!|hEZRCe<*-o`s*)#3lNSK0|;nCrIhB=;VZ7$&%tfi0rc>L8t7k&FV zH*v9%?8fp`G1Lhr+_X<*PAY?}5#?SsZUi&$BuL3rk{}VdFrjC6=P0`uKPvA>bjRG9 zlIxvz#ec*Qu!k+sHiH@59tE#|$ZXChL-rxX587_LsZm^n7i z&5^T9vIBqjafKn&^{1q2{t5Pr0d_P;)X#ok3QCi%J`??Ka)vU{=^V;Uw7Xl2cKdWq zl({K!ns0ux+h67mZ&25|IP-d?5`)opkNM$7h@*x4Z*h5aYI|Xj zkY)M3tO$?z{D`-})KxyBL@)MtSMqK#%3Hf9=mZsjRaEzI3no&bK-KW`(x`X41_{#{ z8^#nrW`v@sX7Lt+Ci)HD(n)ZK9%kwjqi0;rtBSs1x>5Xs7I*I@JV{uK(!jgO2M)en zSi6YT4m$P^VBP^bHaqT~QlMuy*ZgWUeP({n9_8Ps{8v+8De&~@`n)}@K%&1bfwy35 zP;R@Cy!p;hikvm8?~CUG*k0Rj@c*f<`4m}^hJPJnBJ96gU4_g|j4c1<86|BEm7ENm zoE`t!xKq_}L{`D@nL4s;hnLaplB6h+UvB_zLP4#~;RjETL$j)d>O9FHDIR4_-)u3P z2XxxC%=z||B9h?vaXei@V*`31Lb{eFYcW5V93F&guuGW}y2_0h}WZry4N(2pH zHEa13P96p+>FPR5jjIOky3Ib89hKck;Wgu|=JKaGR`D&@S(8d%1cpV~1m!y~H&fg! zHUL~MmP7QhyyD8@E#Zk9P+~f zBsI(YIPVy5E-(eNk)S#=b}@uk%haPab5qmbIs#)6x~ROUP5h-B$=I8x*Z~5G7Hv^> zAM*#gtJXI3UR$XlW+vV&wB_1l@RCdC3$SD9xnb(NH0x$BRL>ULE2)KokQ5i;vugWN zSYo$nlEXh1=Uf9cXVgEQSB}=|?ffFoFbpu(u;j)y9MAjUl%-o`Q{UCxQ+EuB0~LY- z;C0b~Uy}}(&3}1cy)0Ddxw;6In5e$6G&9PS7{PKVJ8gQDw~kjh9ayLDOhy*11bUYS z@QvL^K^3)F)2Vl*NE1gRLk!t5#t%>g?aGSfH*LltN=RCDMAsx>=~mlI)T%fdM{#_}tgVj1InC$I#LCoGwV0>&%!68=h>_RbSlgb{3p%fBdd>i#AfBYU1vQ zuiShoC-C&{Ytp_Jyn@{lH9+B$R%982MUdM(TYA=EK)YPw=a!6$kqUP6#HGlU#u?7f z=)g8KP?_1wdYQwSdk9yvb)jeHR^IXSTpOcY?^?aWZZNpuChWB$KF?KW?^DkX%!%3o zfPacx`<3@uQ(lI*bTLUKL?ve>*m#IRmaNF$qWR>}`&{%4+tZKt;k)jQ zJ=v*Ij4=eo2FaQqKSVG+|F1ZNOE1B9=0@z=S!Ho2gIID35rra8dyD{*GPrc%d=Daq zC)hXNJQ;l%cj!1J)j41x^FpQ|U7S!9Twh%z&r_ydIx&-4@Fx3A7@dNBEbx?>j=sSENqWXEwJX`br04!idcA)y>1}PC z05;Ah|G;~r%I06ZqkM15q**oRt|nD0!cd~5vGydr0c-O9fng=3SusR<@7W+pHcp?k z+2~vc=;35N@aZpz;p5<8h?${aWY|-7yz;$dvqv49CNqD^XK{{Rbv|Fb@;-k|Wq)&j z{7%q62Z~bE<$z z-hk-TaZ>3`Oio=Qw9tB0GK@}@cE3;x+Hl_d zj+t=iJbV^4(drHy*Wo#ZK`p1^9dq}k&rVF)HJ=NFZfUBSsn~PANXMG9Ew92Pehh_@KWGHH%<&8bWYe}26ThIE!_K43=8K z6l2P|aISTQW8X1Iglc^L@!3xp#X=-sg6V}|F)={a6uAI&#P@=2vEI;b5!(?O?<1I) zAlr00B+Vqm-EQXyh4f2B<+#kZ(p6EYRExwkUBQvr3lNTo^l{29p}aW}iA{{qt4G{= zHiF(&U<)#j+UYSsa8VMf0m(8~*2d*{(Lc^D!opR^KB#DAlFMlZYJLqrLJq@O^D{9! ze)K73i5fhOs@@mS=WLED15VqMo9X^>jz0d+rgIU9MWCFMGy|?uvCkIQ)Li@x* zxL9e$oriy^dQjf0GiR1w@&2oGHIbx2Vq8mM@YDjd48n9U^Eg)CPSuK^j7a+&9=GzR zv6ESy$U3T{K|aaHdRa{wfo>{S_(t<02N_`574t1_Xoyvs|i#54I^GQP9Vvb62VhtL!mtZl` ztwlrH>sOZ93ASgLx6!Mf{moyFrxd%=*%zId#TcUjsDE7YlLP?c7aE!tuYgaKmMVXR?{2QKR z?rnP|x#)gK2NPgs2bO$G$g$Lgi60~X(^V73W{*iT`Q%=utw2di9OXsVLsp@bB#Z^S=c}898JH6dqg6HO3`H z-U0vZFc`9%-!v9~(BjEN;v~bM!;fU%$%V|e%9(7TuG;p3TO7{E1_A+X4`P_tmI}!G zLxDC|!>!jFt&Z2PZ^b zc;vG0#fOgAq207FdW|xLX-0WAeTK(lQAE26Xq{hKbJe*1&?Y*sAdf9m!VbxEqni0c z3Oc`Zxl(G8g`)@^l~#M*XAm}a%#9d?iHAQxM?ij{V`vfSGNlrBzwh zW4LXzj65Ye6s7PfkGIL2y&j^g9J!eR+nF07GNW}{#`oEcEgzHSR-ICM6wzHDqh=rV zYP<`^4ICTXd?W1J4KDbx8m*+$qlx z#3+%qt;kkwS<&Zaam4z5Y_{7SbZd0}9cWz>+=OAMmCpxIyqzBr@g1rlwR>WR&{o`i z(uC-rR|a;n6~?MO{zeo$#iJ;3S37iAH{sR*PdDi=@Li>cCbvJzsPifl%7EV-F!q&U z?%I4H;R=0yNOcSw7~u?z3^oz|=?pgBkpHarLh~sNJ!l{xQFI_6lmGwq{@=lpzXoO* z^;^fgigZ2z%pYbiI9<&1PmJr1IocFCnyc1uqJ7#j@n(#Tn*uYn9w@SrvTqJ z)u*G8=|6HM#fL_5sR)FKnWv858M5o!n>rGfT7&%oMxM`Ej!zqo)32M3)1AxTAJfIY zkai&5KUy-GmKjY&*p?;=4K?&iX-t@j^;p7RBTUj&Ds#*z4>fbmjmayhQ=b`CHtUit z52bbM8zW4X$~buHjgPL)Ov~C#&yN8n0^M5qOPG@RKS0jPnyO63(iBFtH8mFeqV1aiZ6ebLzfipTXPMJ*BJ)U(oI+&`ACsNPr zR|EkpU1ATYU&kX9s@I;2!TQcMTZ>=^8nEnV;H@L2%_k?gWG0hjMC#SRIBDLJ>q84_ zwaEzS8O>B-Q&l!~%Pd6t?;;INXqU!JtV=5#LqO>inXF4W3JC~ns*Tr7WP8uvG>gpX z!Gx&H>Vp0ZQXW;1w}E*$Qh8K4&0e}_l+Wo=!W4Y$w4J=iKGfi9N#{Ve8=i<(^V=!k z8C*mW{^3Oo07neK+n!iBCiDZo00;qjg132Z^PEEu)X4d4W%F;Sd`N;otGV#!^o!UH zfztb_X&0)6)^;j3fH9kWxzNjT;C4R{t3+E_(({f=QJ5TSPVQ-VYm_Hi2g$-&a1^a| zsM4G+QlvKOXeEiD?1L!$VxgmfB@wfYXuSF5C*(#G6fj~(+vug+Yrv5ii&4B&4sr>; z$vat5HEn)vPDP9p>~SyKcfFRgJ6Tq|Lk(W)v8n;DQ&1o%J9JPPjDfB<$n4b5J7H`= zAMX?7!_tj&%OsWx&Qb56x3fAmHM5c&V+@TsD!!HJOc)h$^^!t!*Z=G8XzrK$Xn{>p ziJG&p+(!B(N>>jMgSpQY}`M@D!ec5fm*w zf?E+)<`wCrJo^Yk3sZn6cbO_R8~b{Y_T`4StFUU+OH?x+%b>}*M=IYr57i@Q&%p`3 z9a*ge^Oty~^W0Np_e&V=VSQBqz56+R18zedxaSMsv z^7V<7iJ$GpcedOY);>T2v1@5Ee+1;0gGfD8`i5@nr!jI%SoQd2u*r<8mmQbrZ6rq3 zxExZJs5&pWa1vZJu4Zb?^BZv~v3-D%xyon8!m5jwm6PNS>(z+0!hUQ|gW5sT+4e5C z$XeEveYndM(;zOdQshKUh6My7je;FAJNH}NUlRnUYDk_#KC?tmCck!SxbTp%swSwB z1-%rq`B7MZY?ICFnIr}r+|l4>v%4nvM2YT}-dd%$UCC&Gx`B$3avxRv>{VPg!PTa_ zi?F2v>3=R2f2=eHVtFoLni4}N($!;3q2NxE_yJpD z-+USZox%p-QzDmLF|Uu@eXc3E7zQ;>(i4jKxp=k+tgTIpH7ExCb!=cMgE zRQ;r~zjuoPBpCyWf`O%LCf~zIsp^MT*!m(unWxRm0$1tQVcUYTD()efoAbJk#m8$l z(fgtBopA5z=J}R7f;(H1&{pK3i>_W7D%hLm6>@c=y2umt0$h7bky+$pp2`8mr_;Vq zPu-ku^;!7UBEdmY`BZCOu3kmu-!H2C&X^ANPwMYS+ya^C-(3rea0B0t(J>Qc?(xuV83=O zVXN{C9Xk2!2X8CXx@^`cm{BL~%&^ zR)Y^8Wv}fr>@Medgy|NjJ)x%$ns?EaqBo(u7wi1k+zgjN;;Y!?y?wvBf!OaChGC#O-U>>i!z8t1-R9SOZp?( z8UF;)FjTxN+W(yvhmOtpN-P;2cuHqGEKl9QGO8XQ!8R%!Z#5jf>e+okGrRVZl*0K_ z#W0qPruHS~iqfjslQ{R;XOi*-1=+DPmi|=y`M}GTL^E0UBC>=sm9^A?I|Gl;t%Pp@ z-^ZVrmY**-5lS$$$&HId9S{TyS;Go}d5FpwMY1l?V3cBwrIVu16}VXtwdX8I%riE_ zM62>=-nV}zTLKKnk#UlrnPiC3n9>bnIbJ?!BaqFmA}}|1GH7od%cH(ftUn#T(bn?B zO)6TH75mJ~kC4MvN4N}Cv~)74O;>+p(7esyq{p;ouqjiHx$oB11!$}5el&@gE5~O0 zRe3xXmq2e}75uvL@61kTNj)saHHvltBUf^2ZJi5A=h`hM$Z|TBfNY@UBn{}OD5f~; z7=N7tMBE)dp6tH{b5x*@1xZuB(4@KWOzcw2CLwKVKh+^J;s};=)qbMP2|ecVd#Iy< zi~Q9x;$fl3p8~Xt)JW0xTi~KeA>@6bZXKPO0iByE(?;484ibnp`vlp9y!~FHF9p1V zs5zk(?Jtn5G(OF3x4Jvvw{&R08Ww5*gB$!1i0_aT68!zO2R!F*nA6-Mw-W}NjneVp z^gDwxwgY0HLS-e2LrR_lbKsF5#km91;olBwaKcFXEX26CC%=Crv(+`T)=j-h%_$;Q z?UHq!?$n)$P}#w5@3C>nbemB%#|V0SAVLM>Mfpbc*#1D^#qka5>4hY8zEeL$`49MNH&YrHG4A7U_Dn|-fvvSGrz`VIU~ zhgWMm>>C9E1hftR*WLa9aCrX;5&yG6rK5%jJW-Q+(Xm^##`YbGjA!;e5zt4wzQ5q?_k+wwmd=b z;AJV5MpN8r(oPmz8TLH#VDf|4ipz8ohKA{8%||5-wYtfY_H_>C(0RI4!dJy-gG>iO zuxF*og?hergXUh_LBNKh(LS0r1ra((o9eqU0x{W}mTw-Ij?$|bUow4F2 z=@LRm5#+uIeanh#sw0ZmPYIsR>E!xJcD_O9%!Ou{x^=9krwW1t4hpAo$)qv1X0yr5 zf*`l2)ke?I>=@CLty8z>M+7$n19eQA;yYZ_LF`Zn|1G@`us8b>B>XUPu_|)$fGF@U z`l2Y=xyu?GNRa3Jmd=_C#;N7D%?&Ay(hVxR>ycp9b?9VnHmFaR#8>s&kD!NRqvCq^ zG#^cZX43w3g*nlpB1A}j{oi0}DN{Vtn2qod0jP6#+NVL)F1EA`Xe!l>R6m~ToZbQ< zOL7|ImJGMSyV5;+u@J?q@)rW7C~rmHb$U>WR0OACPjb=GgL<5zd+7@~ofI zPV-Wh3}B>rvmu(=_gM-sVGW^GDsS2fEzH><$v)iXEk-cBml4htA~kGA&|Vt2E<+Pg zF_${m;APpwAmUA?EgQ6W((0+K-Z8E(nv47O`D#X!lsn!|9`_{_}DRr$>b>LWGBsl(!ySwFzUG=QRHfVn5 zg0+RMRe>nA2_RWW<2qAT!>6}`&%;}_U=u4DntPv~A1=OMD@j_8D2~4WSdQp*JDs-V z^bML)na}(3dw z18wx19-KTVgvFmo^=HT-@lXy?R{^$=(WwH%FB`A-(4PiBxTMv8(EcnsksCO(6DyT9 z8lLl*nhA{nn~wuqH9N@m&f>}AJ|rmo-oJ(25xfIwiRl2kS~f16{54RE_vu~R>%i5z z<|5QiA$1jnyF#5#m6@LYm>ebLR$|qDXWFh2`-Q8bSw_-Pc37d+Rrv&cCrxC@leEz4 z_#B$ST~fog+M_vAJP@`hX?(n#r#9i-*sYYf%}sS z=NZanvI0VC)`B2o?DH&UtQgKzzpuAzRx6=`S3vL(WsM^A4$&iqtd%B*nbG@K%;Kaa zjZX=f?p-6k68SIU!otIbKz(2t1olK-7lIfZSXA zY%`FGeG$u%OPe_m(atQCpTIzRDD`2nTX3tWBhfxQ*Ou;6W5+04TxS5aC&n6`6fjiU zpZoD!{7OShMBBhPk;5od(2umEp9%GzObzvZoT)yWFy4ppozC3X@Q^pv8^&4$z&pLY zOfDi`nE8IoM-}$q`1mP){BX@6_!t;v0dq-m#+YS zfLMM40a^cBA^8nsO&>}AyN%|*!Y9|Xof5Fqx326o4FBi7ewUFKGz z!fOa}$q^~43FRzq5&YeyBNl_)znsntZicpr3%Vp*la%)MQi zdOlaO_UJs$z^*abt|cnt@uj)R8dhYBm8DgUS`h0RzCPp(kkZ@ANlJ{(hl}<(B6KaiG#)2&hs^%+|EJ{u}*W*fe~Ilf%8-1 zXl}Bx66e!nq8YYCdWaxh)+<|Q4crUk&{~+Kq1SZrPUqcTslZ4QYL5b7Yl!7ORQNCZ z>H7HzN}!G9e$dpLs-AqV`9*@;*tFM@yv4{81R8;O6xyqfz5V7l_A+D%MSvswF=+4i zV9-r68<{I>&K^6!&mRf3!4aolmZHKrr*7rdkq#H9hRNB5JunZGU(qvyQqsiH8#<)% zIeps!o4cE+6YePS0ai_F_p{hd({C7z*R2&zZy0cR#D*d5GkOPBkzf1#fju5`p`F~- zHocn1|NSzsOAn>)AAs}{LoJ2{{Ju#Slk-$|E7lg>7u) zch9G(FcjeBE+U=1F{!II@Fz+SD&o?_Wqj3Xd=5%k*D=%obemq~YvroP#IH9@BdPbn zGf9u=@U>|FKI^lUB|(rTe2%Vl&>c-&%fpCcnP$1%+QBlM>KS@#t7?q(;#un@y^60P zz_Q4?TD{8{%>&t%RK3%86?=Fc1YOIIw>_p213EP!&l122vV8g&cWVDEqDp1@ebJ?e zTjQ$F8;bp+0-`}p|6L0&Zx1JM#BSLEmsf3J_LJ&9vb&E{G=-ID zb`x190kpbRa*Uj#I|F*wW;c$T3X1{Nq5+QIq$}rhmVR0uq4ZkR6glWwzz_WU2|BJD zX>jYmq&yNXny?&QGwSwz_JlF=FYw+S4AcfJ&CB8m^Ho=s%iBEsdex5>k_ttc3c`;6 z%w+R&r_V%LMjoH`|4BNNF!!KNncK&4CB>TeV(H>cX7N5oe7h}1G;74Pcc!mACn|&o zFvU7?qpECY((P$dHqE3;md$=3c1OotA)Lq&!xER`&7mwmiW7)S!U~U4qeT^ZjK-ub zDtQad?i-TveD|A44l+zV#iJEKf;eY~9(M6VMxOm)M_Jr2jXIQ;{3UceII)?@C-R*1 zv$X0kt7mRAQ*O~;G&Qq(kZBCRB0+4Mk2`Pn>^d&Yp>x zn==u0S9Mbn75QXVW25?_l9!xdnZv zEP)29N-}7psCYZ^dm-{tvtkBy6Hl&miG<)i8JGYHJe+hXnW62yYovWOiY5^ zIDh3pQ?STBr&;_nmW2(eBguu?0LsNu0-vX;Y@#F2rS$t z?ilV*?i1W%ZYd@*H}=cj$dCqH7&s;=cHCr4D_6{Gtf*%aI2WeNQmtD^ye#_ayR`Rz z$YZ((Vt>Fw00FTg|ED{2{{r~`Ybo}>dKYSz1XkjDSQnu5E)g{Am406QR&&6=g!Qm2 zka!g{lNtd_8kdyqRA?m>`ggHi&ji+Yb7{PPm9T%}Fj?>RP%ik}{&AuRZs5wyR#_iQ>u$$%UB>f8&lkw&1D8sCj<>#x>fZ__+ zhE@|b%DAX_Z(V1nWligJ3*md_#ik4ybyZ0hW5uj_>CJh%H4|ai6U10hQbut;O-C*lCu@*|Uc@B0DSUeDj^~=r+^X z;Vx!}6}sF7Z{M-`cd$LfeKtn1U4BeRY-F+b^z8PXbBZe?`oQHjg#L5j*Aex+ET)rQ z{Z=pHfG;3U%A2ohPyubr8Q3%bZ~GehArW);>0f>JY5E!_X3)&}tPqEo&pe-eWCO_% zUA+LA%+Z|?_T(Wr`XPFlNQ#@@XHSD4NOKbjz>qZ-Ex=8i9JXW>(=DB?4a8JauHlCq z-pZEgTVU%BJS7xafLsoi%``|tS#iZWBw){FCtICjb#$-D2`*p`g8sF#=w&f>jMLMuio4-qf7*hw;F*5l~W*;tc8zHpZ2Vpsus&h>T58^ISbPWJ! z*Xj(_JN`Xp?{AEiu+7+ii-imjXKO^U;V-9zkX9>|A z)Mq-&wOa>7dKNZk-PfyGuyAZbLgShdbhfQdZ~)s;7q%RSV6e1i#jRFuoDqkzb`((& zCIT78YV#x|uiRYOU~L8EtxDZ}6=}x#EmcI2fRdYenCd+ZOi4A9ER*hj zOk(_&)`+S|lQ|1-`3h@_{(M2h&JV_8>FOk@EM<9p*N1GQ$FYc(L9PI<7Am?uxD~Ax z9c7)pSx=S?a(Z?=R=a1Ssz49nWi0NO$ec1dR>t}?Dhw482|})P<4p$U`4=^)EUUJQ zSWp#LvUM(T=siBD6W!r1pA8Zg4DQ#!ra!X^@y+naYaP53fln;2Z3MV*gf#& z2)^5~4dwz#NCKJOZ#Qn7F8D{^*}PK2^`3KIC1f~?@x9^kr0HUKHSlKJ4eG5vr|r}GfsPI&f%iW?)IaX( zE_nNl)(nmXdAS7Y{t%1~9D1*Q#&3#~th1%E;}^fvc|Qjkar0mN=<~nn{d0?EK!FA! zDvw-FpDLGV^{n8_ItlA3^Stfxlp*9vk+9jmfRyQUzG~_~Ac9$cGiY{wKKjJ_Zn&Jw zOh_kV=&FU&>Z^12Cs+4$XxSfaR_TQ>9ZFY-3Z-+w$Ojv8>_buwyQVG~hK7Y^y7XMw zvfmDNDbTSh1TR_5kSaz;%X`~HrmCwF?h zIH!elm)7U`jUDh!x3kg|?-OudLlkXOU80Sgi$Ili;Xh%c17b-(X5YJWRSv!Ho?s?47nyUh68V-HSBZQrDgZ5VQVP%Lfm z!AnN)8sU-Qt6f6z`lP$NL0v+Wfug9!3*J$VehZ9e@u8+qBWAqY_1BFs!nB7ZWTSrF zakh03jY+V;)OeIw%AzA%RLGaChQcPZ45O#4{a+>qF65pqlxaRu=Xf^KBL3p=;|i3h zxGs^5@$aL0aPxQG8#h6msJNpk6gEM5FMo8?yc~nV`0&%*m~UMNx(uRu(%r&W{JA~j zySK$7xziGM$zIaB1MU%~)VciK^JxTsjwas89w>x9J^_q&DQMuPcX3t7lP10rCq~yn z_g+Yb(Yd?dyag^OqdHvBZVAhU(S<7uMBq&joYhf87*qQj-3AQ`GyMINGvnE;)u3R_+Asm$76`Cti#S7(IB9{)>gkv5$)grq!^NWG3B#F2d*yRwjbw(p=nyd|D+*_Yx5zL~ zZVJ3)Al1)KVm*c_OK$$m{kfy{CVz?G4CFV=9g-lWj5rwAE%09ZZUw)rhK=P~d&JuOtXB|<_#2{sy zS6NkS*qj9@5<})_Y~fjC(C2|0DT@;hXF6%=3x_(~j)4IijNB%)Jh-et;X!w#%4l>o z9KFaGa^AkCt>eBMM{b`EVAV*IwNFK#R5NE5Hz>L@y(?sSyKI^)R=DgNkY!=oV4@_TG3sF~(yc?-W|1|;|C zAUq%$!(gN+2U(QqhEjfe-=y8QU$l1U?sfW0>)>qk@@ze`dtk6=aR?PfRak3T7Wf&n z*3Au3R^thvZ}dzGQe$i|sxhgtnWfJ?!m`3>{A{+*acs?840`^DQby}bge2!D5RlC; zARzt!=w~YIW@qc*^uLV!{Lgj}wkXP%#}g}NRpG2gw6%B_K2@E~6g$)o{3!p$iW$l% zLwo^zgx>QNps8RpOWnjI=s}=0obm;{tcM7W7|!Ppr9+vVFvhVT;heBYD=}<)y zN#@N?yi42r!)cAI@9_i2XUwBUqXD$hm-#wL2?V(jgDWcdi zwC5jz<6^wc3+4>aG_Pb-Wuu}pRH+BZO!F7{1R?9|M(pK+q--lrW7!-ErwaWa0l>o* z&dSz>C(TCqn&IKHv#~c$#IV9E=m7e_czzQLkAhHa5o#lQtz4(nX2LhSe7K)7P{;}U z+o7_$17?g2A|Cl|SWq2!_wShkenK{0M6xNW(FV8D&blt?vn<=t1-XjGdevjOdHz9x zejS5E*+}G8WhW{Z=W%7H{ZYn`2{sUubn|WPU3#jj)utCNwa30+Z3XPrw&)3>hv~; z+`UBiSat?~T_3D9h?f`o(Wa;o=@2bDW86KkkSdsD-uXplm!j3G4VT**FW-FVx?#)>aI$?6+cO{*R!1o@ zYjAliE#Sq*{1k4l#%1V=#AKS{!{bS3=^3<^CpxAu0znx0< z*KIc1unI$xd1L^Ch1OUiHIt#KXam_`(Zv4tF)UZ}hUxQZS`nRZmikq5l@Tp&R?|C& zAbdi^-r+sZco|`G%&KrX%tXeMUWXjD_v`QASi!`#3+Sg1q!+k>wYuyoX-vL!mU|a{ zYxW-{JY_SD&@p^d4F(u2N6Lr{+1wPg#j@cMrwMyD(#o8gz(gU{596@G^D7#|5gW;r zo?JF3^%q^URUeTxR*3n6RMjOmE*dB(8%ss%qQSaJldu>q9+^;N3YAfyWtw4d{4%_q zyR#M`=Lk8374=yLn&-C#Vtj$1GB_J2KwaL8&js{QMqHz~1h&<^8ozub+Z+$heqL6vDBfsjgb2tcQ(%1MhdHs(7b^lHHbXKK^}Wc{HVDe=qlYrw+lm z&H*~oJzgG8sd=m{t}6$omNxA#uVooh(2GB_f@W>)PX}p{93Kjwc5`*gm%aS1f4qx| zcW}A|ss_>Wmtnx>qYI_Ykmu}yM;Jb>wu!uRL8Zm$ozf0IqYmRLjQ;@`!wji%_CeF5 zYwl4E>CCaEt~>L0@(U+;eZt!gkjfN_KzQt69zVRUTQ$+qPEUOOXuarP?e2ZSaYzek zh|#OGusnKs$L0$UT7!um&WUVzUwRYuv|mr8*hU?I(i&6^I|dls(#%wE4N%@VnDq2SN@G+RZ&4nKsT-nQ8gGemWhD@>+S!!GhPEdikaers zzcvf?3LS+%7L*EfV;GPmpbc!noTd$O)|3cJaTw2;y;6;mPD0Y?8@)5s2f6S<0CJ8!9d| zDtqCOct!;^94sacvhrfSRfy_08TGF;$uf8DPF3{!SYZPo7Y#aM>epCFp+ezZrrM+$~ z!Rf!WoF#`u!|pdv!naZnFjo6zHLQq(KBjTs-&B0=@M%_*QAJu0%*5q$!sxNy?mT{5 z8fV(BG7Alo&w-LOl&hnYkd%df)rPa;JQ@aUdL#k9-?Y%HzKpNQ%n^Yd%!DqWvt!o4 z^cANn6$wFn^f161X&gJy@@KPO%n8mJRUP|0#82FBohNaL=1M(srzM$%CKkpr8gb<+ zZ{*mP#-wK;8K&LicP^tVASB%hMF4E5lpk%Feu@WWTNpIRw8a*)i>&h|X==)SD1VRb z3R3>%n@`OHyW`u`8`}5cQ^8y)fs-GmiM!1hdtX0gU%3 zqm?q5KIHJz)|`VPx%sU$AUBF4xdt%KjeR-M-}&(JhvTc`F0v_2+oi}Q8)u}MWg(A6 z8H+2zRc?-Dk#by+ukzG``r9fRN-BBJzi@TsJLr*H` zEA8u>fl%cpJk}N!+jyxX+fbVv$r98U#?u$zR{f2u@vJo zb6DDE>%=~tLcyAi3e3aM?a81ctbbBe$aYdHiRiey^Kf@Aksa$11Rw*-7j+ z_Eq*pK+#cT%Bz`Ab`;x{39D6I53dx8WubK&pWm3qf1&su`~E{2WHS;*Rt63P)QtcH zWcnY)qp0z}Dn}RdztQ*)qk-!7-(8olD~aU4Rip=adi#2aX1B6S=<&?xYd;ZdBdxHp zqypwism!gbNd9iSfWOV;(OKub$C`6_p9!vmHFhy&Eq-My3O(2{*3+o-mUuu(nI1!s+X7*e8nu?zMELtrf!|&)L-2atvt)KZ69T= zXuG7jo?NB4Le1goy!`M{rJ`Mf-j(MmGftD?FU%}Zc5g55+wCoUzozlb88gQt8&x?{VN*+Pmd38*=*8K@#NkT$^Q01Oc+0ZZLUpFV&%81$|V zS>$yrA4{|?Z>O|}|KeUJxM4(3$%k*~f;lrhZO}5W*BQBzqNf1}BsVe~|z~;nvKLsLo9YZ)!&@P)1_+`8w%! zKCGOHVY1^EQR5PK*`4QYX3vBgBgY2B!!n5$GJyj!o!;`gPfrfc%LF3MkQzc!^^UM+ z;QK)3UDYM2fDT?<+@<>vd0=hVgw5Q1Q;3&^i`2qm${Nv?5z{Ek4T%9l4~4B10}Ht6VQfm!y_ zJ?p3iYK*E^82kfWI zlQc=iBzLOdw;L~89W!zDYSnFY-@~}po06-$kVNw@9XZc8MYcUECj4sGz#Z@IS!#A8 zYg~40)w8M5i=7G<5=)y~Ny;m|`(dLKmEWG6IccxNK{fD7_AG0ZSRf%Xo4ql8)1Chq zM8{H4>Ye#?lckjNrNHxc@YTUcMw>HLQ9hF>Z%i9ET?$FVkey;ke-<>x|GcLI-OG z!i<@z+LYImr1o)k4~m9c+!$fldm9HoaBN_021i}R6iLIBuB2S$X^sC=%lHNP*=)5* z3nE}Fu2yxN_tP<4Iz&N#&_HCkuiAn2jMB8A`ffj5-NOD}G{=5AtL&B>N7Hh(Ympur zaKXH4)46{2;0B1_#ki!?0JP3oBuYIOTa6x+*^P;K_v0_J#{}96b+HP_UjDlHGp-nd zc2T+1e%0`(#hM;>J>fBfGhVEwcd#P>{$ZJdGyLqeY!=K`9@5b9nqZ^}?7mvZpbtBx z;Prfym7=X7l?-cSweV}ygTs_hfR2@AW90b6sq2~HXK`20&BB9Vq|_w$z{va=VP19Q&#j@d}#R0xAB5L*C?)e~^Isxbo=s=+U3ui23mvvk#Fj@fjC?6-T=h-dQ z@}8dT+lv5h|NT*#V>PPzmZzF#S38WIgDFueKDhiqn&IHDmlu9W+`s*k8)HWxL<_kV zBm^i4sYYEJO(zl)2Xs6T^N5Yp*~6~Du@~xffq(^BaS@tzlcF3Vbl~&w^xX{_uDL0D ze4x#R@evS(#MIu6W_x+*^2#`m;mv6HfsP^jPJU3BlXK(mS>l%1RYKHx*kRUMq`FWZ z*@IO4W=12d1jf^g+BQ1#nQEpkTrMvD4y`^2IQ12H#c4x?E6(9pPtG-c@r;b(C!clT zMa_tD-!qs`M?YE?LGx0yR z#8tp`f^)>@7KiTg-EpZRC}o1$y+ME2oY);&yk?NzI8qI z{r7AEHj7`g0}Kd=3AmNilc$)ern?VvE#n${ym598+b>s5)%1NM%|Tij+TpKK7M>L(`E&1nE|@( zn5$Yo(POY2Ra%p*F5Yp;N!8;^VQ~&R*!Cn_(fM9snj?tr(Q__`Fv7jn!lT&GQ~fkO z*w}|;6C$vO4THpD^v3J7I*G=6a3qC0#A}qybPdcqy~tV=2%u|fu6%T*M>itVz-gkjq{mekyMUq0D?x zAI_=LK)w7`gQ=n{GD|w6?%)+M+gh)&B%P6GjFp@X@J=b2>_F?a_fvc|PNQ3lnZ~G= zPu?K6DmbjtR#Rz487Nx3rx@wdWs&*kgpH1jEaTe!Rw z6gIS*)LIbD%k|<;HywQ{bApINPyAO;F9%C2j_)YJk2q8a3e&F3Reiq!og%Qi@87Hl zVmPs+Pdb=eZ*d^3-4rDd*tP>QJdK2@+b9Z65TQGDf7+3Hsv>V>uOGX|-5Cb#lmsDU zL-m66JCUN>pe%y$LnwvL-HNksO$u$v=TFn*+?&F{v`clBK6^sR+TOdP%0)6HZ8e+mZdxx6ek)8x6$JE?ZOTA9&vZy?(0 z;~C)T;~Dz~cDi(bE9@(q362%EvMF~1hBMZE_!r^b?)39 z*(Es_X)XNKuPrGeK4)azy~j4#1m2ZAW+u2P_({Yj62gv-+sRs5M9N~4%QayDY>hFW z+*J9pGNN8c%qX)}iweWL#$JOI!`N^r$s|(5D?6oXy-hvdScU7p(X1^)hMANOmr$wR z2-|%YU!wxT&jYKj^CT#kTQKF4H{^s?<5&~1Q8#9Vw>K~8Ee(U)HSp5RF~10_hbQwH zO2lUe@89n$$!{eZw6A6j!rbUUy1;Tki;K!*v?Q=5p-cFMwDyi<`hq8xsk{%Xbt0>E zvEGve`%pKZ^A#K|4P(92c|Iw<-2WN&EX!i6cfl2y^XGhD>l(YNYGbWu^J_o}eEEHZ zJW4MClL9v5hH$3*^&Fy}5UqEZaORbD&&wlIlnW0+`(yyW;soNI0bmc%Z25yxZDfxS z(GqA{nKmsx-XM-@gOmc|d5mz_N?v^XhZd`F5hFU?{RuQ9Us_S*XG7uaQ=9HWDJ&d_ zZq*L+(Fu|8c@L4rg@c!X`xiPm*Vip%o1-6ckZ>{#%J`DfHfh^CIP1;mS7@QdI)J2k zkAfGLxOuKV{XoSFRqR(k(Kx*GO+Z&5<@@(>(GaDyD!jK0e7BmABIfj*TXwJ?cF0JH z{2#5ro7%uVLIYgg8nvgJ8NmTX#d*Puka^rAZYMXl1BBfaBacWa8USF&?v?J}8Ite2 zET{SxL#m*Gfb9Q&Fy!x+y19+1w6T-^-;ez7wgTl%MI_a~bxUH&B=KO~@UwvMczEYH zAF~KNlnO)`vt9!lxG8A|@nkEP`3qPOIvnrQoSjDR3&9dNnUXB?#X2UOa@)@g&aCVV z?G$`-Z$rK3EglZMZpW$4?)zoF>2DxA1YPk z*Q2k=`%*K%JStwCe7{%%U~3YkgKl15i*ZAMpsS};?uyh$d)Fig`H zu5U1T{Uz_FQr`|m5k$mZ9`2a=J4I&(KllQR&Ot=GEP}dXpSb^I$-8NjrG~V!XI6Qd z#@;t%yIjSk&cS z2w}yOvOu!p~P-IgswQk{=fF{*_GsY6CYsnPk}L~b0J z(RX8cD`oWPiTNKVycp99#QnQL$yAqZBkh&|TgC5cA;+j+0^IDpr~a4WuPUA7>8?sK z%C;SduE}OQ<=1j<)DKO_Zs9}otSJRG;1|^ZQ~9~vto^8&=DHQ!7mFz->@{4o3}45! z`$D>m4ulOuJkv0^sU^{B4Vq%1|C` z*bV~^srJOkOGw0i!ub=nVJNm8t!0;>Jraor$=_oMf^@LU{kN^2Z{&^RM$MByj@~LK3IETNY z{Mlbo-tj*k<^RV>_y0A{tNbg@PcGMkBHlnFSXUqe%cIpTX*4QViqYqSMJVH@W?TgQ zRWlT?V*S+Nbm5%m>otF036a6el;N5$H#Fr`+J0km=Hy{(4-`VbL}D7<@|@1TcD%a2 z*#74IM(RPKW>5;(8GI=3t8xQdM=0{>J*ZZ`w;F#aQr)lUtK@uCUS|nYqjAGBk^U>p zU!|g^Y&>*&RFO~kn_8!{1!dl0OD>>FbeObPGzd5hGShXHCQK0D68E6bS$bt<{Bl*D zTn}QAPlOag-%GJxPR3)v9y@SFM=hLVW~d+0J4&jc+DOR<$lFh_=up3BOJ22QAIueB z!em{?X5^Eyk)a!$Zpc-whr{r#U9&bZI{zo#exZlgLwtcwF6J*8FYUvw@`v z^){%{OAsTl&c)(^iJKTPKxDwChadbMytN4|?zCqI&Wx=eIu?J)Rq|5Ps9m^3Fb=6d0qQ? ztPdtp=XrxLMX^H+U8t0y&#tg!7+&=Nr)EEI<>;Lo%ICO70lQm-^h{ z(AhSuY$WzdW$!m7L0&p40j&c;f9c0bVaI z9lL*ZgAChiu)?Frg2kE49%D860wH{idwn5%4N8@ONbr{zy8)|)-Es$skn*k=FX+nU z?QiC)dfYrO`p20?5SU7-2UyLlAv06?dY>&1x4D@&Wax1V`SK7UolmIc>4}smXWrk=y|4*vvGYbU73~;MDIpV~EBtzf z>JqN^0&lBG>25D%f?i_zcC%@-Z5(pAgqxs3!NeR~i4#Pt< zXK%*r$@Sq=g8451T#!z&#}lthCjg*b!(7;7d*vVI!wLnta%OqOFMqzd_+1r%L=0>w$zM! ziE3~L2KJD$7SV8e7Q=4=d9N)wJMd?7?fm8CGI2h20pbuW4yi*sr1?f++7OHl!k;-B zt}bD`sU13N&SB^8*)jk+3|@lI8zu!-XC%$_CELuOj}{Fo4lv_g zrap5AUC4p_KI*ZnxM8w-IAsg!QIW|u`4VW#T2w6cL11t5 z(i1dtY&ZkdEcRtcuo|PdUwNtxBY`tP)b#{TaXRnH5v#Z4p+}OEa3bIHE#u$Ir)Vkb z!e7>o^JZ&b&dawSA`KIXIt-XxCWi8)5pCLR&CFVRW%m`zPb`t+@TBvRvxWQ?;}6$A z)$L8JKHS*BI9qo`66qZ7HDVbNH6ZIrCygrGqfcKNfWb$!u+w6Qpqa}rmYzYoK1P9= zzUJTavP|shQIu(dxP&PGO(is z+|#(RZcC?*72fbm1A$oplglCT`(Z+%Hp?DE8*%cK98SZOdK-vrynQj1RfjC-^!eYc z$_<+C>A0FP!!DdW{3$nol|g*2iVi*fgRW**%Y+0Eg7hnN)$2H-oA}*G&Rv^+p(fCA z#fdpYTGVl+AY9$T2J!)Lil5?|8gqQbg0o$oCTzNVM}4%YStTC|Ssu)htqH((OzO{A zRZD3la~z_l}Y{ECqGGvzF88*xGjh=BB;DE~o zSxdQ>;waR+e-|hPCUT2HPZFjT7vszaWj61sY;)&moV~@| zHBVY{I0!z9D*-Ep>zVkG8YGzPGfEiXbdi-39TQKB(=E$B_$VMtc)Ly)OC4GDKzxVU ztE9gN>ulg)(Wd+PQ!y`v*0o%2E-kqm-!(kIB>fuL;pC8W1a~pYT&q}AAw))7%88it zEBIa)0ivHo7Qsn0m=wzUuH~*b0G2|VC zyZ}oA?%b?VS+t;v6VrNew)Ep3X<^n(N%Xex?bNayiEo(BEa$3&S;G; z4aVJTh2~!&Fn2tq|w;w{{;5?PEWSm!UVc@kL zG<&F$no6hjn8e5rvifHNXoaV2b&5;NO4_V(IF%x$KD=upL3<;1q3n1H?sy%j9bM{< zh;~2yhByhoXSEV-{x{{HEKBRQ4AGjfjYEk3@)=K#3j z3;b;!I+Ljv$}7I`_4sTi6}*xQw{gmW|j6X;CPakJ1W$x(oPxr<@XGs19`?L8*E5-Ulc89aV@aC5Wr%ZtPWs7zKYnayR z=*5Edeia4DEFw*~k~_un)*k}Tlc%l_gLOkZ0MCIwNHX)u9|B3dpBJ{6OIeZ%h=-8B z>h*tE-EH*$g?hYh&*@pdug6K7vzWJ1 zhLt2SX)wYokDl7>OfFMlR#j}>bQl0SK*hgn)2OEswV2(xa;~q_p2zO2&tsEl>u-LT z)+mexGL(C20+D86sVLu~ygWDF6G7iog&DWoHc-o=Z~+5o57(Ag5Xkg8JeFSts;gSB zFR)lTyM+9v2^V`}zB-%I?^k+ma>!ao6*gS0KEf2Lo_}K%&f~h8r4+p2XVT;pbc)F= zE;46^Ng=RSGj33xy~a?Hc7;)`q0gjSlTqGW-i$B6K!w9NJS)Dm0Z1jl$m9?U6Kaeu zh)Xe2io-BTEm|)Z4qV|eD+TyFQco&TNI+#`8E60Li=|n9aNt?l100#bW`SbR209*+ zF=eLWdp2-U7|~M_MKJ`AM5+zb(-MU%!lcPLfCM22+j{^ZI=~dmv`3g;04IJdls$p(vLXZ zr2~pIX|1=ksYB3GO5cpz-3M+KeYN9P(Lyp3Z=BoqR5R*QOmr5O2;8{IwAy!|uL97L ztC6eqr1h@BL1~wtK26--3xnwmm6lfeIIgEq25!fVq9#f0qplWg)PkM$mYo;bWXWnP zTbEhvL1PfzVs@1TE6#b}1^cVqMU@(~+H8GrM6~pb1zjy&4oM$56_1_l*B@0HreQHD zMPv4|3W~Qxz1WDi%ldqU?4+3{tu3f4C^mYeF_z`g!wj?X&|Mx{$F`4iq4x)29$#V0 zC8YNgRflB2T+^SY#D*&Dja$t#P{X-4rB3NjkuMh8Yh zVMqB$Ruo6G_AxTtpOmx|qmMsGXbNq7-XliZ@{PPW>h8K?;B6ODu5T31CCAWDXH>)) zFRkmb*9Hm#q{YJAgX_-=#@H!Hk`u-#rt#ZfFH;cKeEeG&@-b#hyj8o5G|jhZPs8CI zXAk}m+8QTSUo(>EhrR?zgunduBBp(Tx(!K+EAb7TFC|beRh843eknLIptqp?S#Z=D zu4AE$F%=GNoFKPh+vimz!=JTbpZ1HI(e3yayjbt>f>xKZj0ED|1EWD6K@^AL?R z0(Nv!XL4m8hClz424{8olFZq!8Z&yjkM)FxwdP`uy*ZQaXYIb8kulgfVb|tbfcp;R zte(;yz4Smw9Ub8`EduF=kbYsNR#53JQo-J-_%IdvgJuBh&W+g*XCHPp{pZj6z1Tpc zm5E7H5nLj!XBN_PviQxY>g45G&4)Z;-QtvA+V_vC(e zsd=aoFkC2!7ZP{wU1?C7{Cfn403S^JQHB|kLt2hdka#Q<2SRSn`b#p{VFs@lcEUd~ zX8Y`&_p4?Xrrmy-CeSeq-EmQ*W=WB}Lvu$PAANhvYEK}qnMMV%!Qh>-4%t^g?uybCqtEf$eFL8wc25wZbrIktoc-;kH`n5yT zAuR*JR|EENX7b8=oau%)%~KO8aubGOPoobR0sm z&wu9QX9ho;171WLubNT*Jb3kIcrNkOVR-EWgln}FrKx4#-gaE*2W~w+-fn>Gf1~Xk zgEQ;eZqe?fV|MJMW81cE+qP||V_O~Dwt2_N9osfeKi{{{-ur!b?eptBRjX>&nt#@x zRdbAS&FdOt{oOk?_vr;eTr1E%$?*eMRzQ-!AhEx@(CGkxWYpr7iq|pLD@XJ z)TO&C)-}6WPdZ|sk3n=g_E}7%RS4T9&k;0t8;^suIxm?06{JG}XI@DVS?vBZkUXY4 z>9QaiT19e8q{!d#yBCE+-E#{IH~Nq2d$Gg z;3FKd%j~*G>;pHXBhVw1BdD<~v2pCYJFPb=MU!~$9b)XW;Dk@(~dYman(chm!`Nt4g=$yimjH`&7 z+Pk_uKcQ&hW#~n^MOtXiWt|;@AusE&a>7xkHAz_~ahc?;esMziP!p>P#U5`F<;;td z;_ADt+sq`GmWMbq8o+1z#A}*o>q-0T=8Eo9QrPT7EILI>wrP6-w&N5Z<}=|rtM=6=O5t;;?IN6LUB;yf zhD*BZSb1v9LA?QHj)JLkkwDq8_v%WehUwUSiie0>%&p_%A2hgBrg3IfmF#x7?gP{< zt7pcQXG5+>$JI77tytZqsFb?Sz-@hj4y&Y7S~j-4p?HoF9hyo^-MK}XOexR1{=hw& z1sWL6xK3--6vz`L$|j>bmyrg<;S1xa&sqE+POeHaO{%D+v%!|JHY=MFqBO>eqMJ$aN{qKD(Y^R}2}&I^$GJ6psKa_fp`{@%L5riewkROLIZw%UHwpAE2%=GytTq)NAmk{U zOwH~SDe!SN!;f}ZlH6qTno`ySJP}b=Co6B-vkT23M`E=u=H~Sy<7eG_Y-2a(`VlpI zjn-1a38s?8E4Yr-93hPh$uVak{zPPVj&-zonP3Gr4+g#+p&I>RZ?Xw25&NWB3!G;_ zphSCOiIy{$2>!g-Zq^s16F#Xp4ni~rI}!$}3yi^WVwIKq5$j{`xwAs$s>`T3V{w^u zCq>Yz00kv0Sxeb>@%{ar4N62x$9DM=~*GMkZox(eZ@|87) zIpODxBg+cJZ#6ry`l>M+UIY82p$|?|XHey&Xv%uaSr*tZE)G4dwBVlcSF#cS*W)qv@w z7?mi^Vum9v5FProo^{9Vgoe1qr5%!F90KT@_{0XXK5^ifUYwYvkGRacdKr`zv3(%s zzaV`Q+>gjS+jHefpE%(5Nt=)LX?sKl+KjZA6DEe6&6!hU>=bBIWvmrGXVhzE-EO$0 zDTztQL)_4FyeMQe9Eb?u*dp*U{LilpfYP-PxP^PYwOZyK{=q|$a>%ZcO9|*Lh+9$~ z4m1AEfuu#G$8Y{KWcnbq>qU;E7J+4GD{~+Kn%V}i%X~S4<3EVR@3FR@yQQS>D!o`c zHF`#SuAS&_2{&@S0mIM1n;BP9q}bPjdWuQ`jU(4P&ai1qgS)+hnXBn&t#6vqf8smL zbql~u1JRz*6>Z0oDL^p8VcOM8R)-j;Xj3d)>!P3e(0ZawGIXc`=Z5LEQDZ8PU&rPb z$D<9kl4(8P_e8|rYUwbMb)=mm+iE+$Hj?%?2{xRZ6WN2@SO|FAFFvF0r$N&h&DmpyQwA`$%flR}!;KhiTz#~kT7c5`>% zKYljKi?8@4D(WeOq8x`#Pj(0He6OT$e%8zL4O$74QU38@H1Ffa3yVAWN1VhPdFK<> z&S7+OLgqbow@wV%kLVy3#mccUMHj+ zh#b4^x)ic@ahdY3g05@f)aT{KZ|y8n=Xffk!8E&#vXO<-%#|2Cy-N8qufI0=KwWT; zQeDE9;rE$LB-w7#z=g_Fv#Lg-Hz!?_p(^&S)OMEzMys$WR0>O?IrCwrz|1? zzhuqWvk&fROItX)22OZnubenXEHVHdvgqtO`_2&nh^)vg$}HQL`9tTcYC;M{=(BH*czKQni@kc z)j}l(>6Sw;*C|NB8Md>OIaf}Xbr$y3YIg+KE$Dt=tkJ^cEHg;Wo*GTz?jn3N3m2ps zcd6-%7960(@=UeD@TIThp#i>S|JRRu9;Yp496%Lz3#FH8asy_-hRS-=02^3I>2mCk zX2C7jGpVxldTdRX3B8O}H2NjtYaJ#?nlFI~hQ~=urfcm$x2{=O8&@@sZkgE>d^~EX z`}0iM5yDUcK{r3PK+mmehp{>>S8{uYsk^h`98^_rfNM}veecS3e@yJ2{M>?tA_@al ztVmtJb5>fsql`#T?}QAU^XS2*??kOd%vDCLK!dr3zFH7BIGAWTT*aDnY=_OO=|n+Z zFO`L(;p6;1vGbHQy1cMNQ0%XO$wr(fePJQALXcvV%&}0ASB51RFf*`F#fdOu^gIK> z>K@|XaM-Q{wdf9Cgn^;Vn=+Xniwp|7ToG$6RXPoO!OJ{skRP(i-@9yIr-*|i#p+Tp zGDp~c+$v;ktf69L)6Qg#j*3WIwEEjgS~_91d5GkxxAe1LBJj}Cb7ybn`lHKJw4;e_ zj50(BO@lFux~)6Wuz9oas23rW>%Q@CFMnavFwxDcfI-=mqdCzI_TEQvaUYZb4EIO( z#=txS-cj`R1;8h)qWx#144^w5JlC>#b402mUhWj?+euB8y~D2m=%G@s9EQf_;x&tHRA!ynqmXcq_gHs#8-Ix7O6q^Ldl z2wvcr@?Kb$Kn_Q4>&j86ruHsCQXF&!xYXmzoI*q*UE<1w`R&DGS*D!Df#O(m`65s5 z;4s@oPBIe{iZ@Y-!;%Q;ZCdHRg$;3m{3vi<>$@F^3M+>hnnDa(*%(Vj@5-m!zz6Jl(1h?oyKtC%7^bHOF*}ygi9K<8rxDvXs_dR`(SyR9~ARwkL^}4bucU6PK+~OLZ04 z0-8w|+0u@H9je0$ztzXG-o(mzo9-gk&1u~0t^!zP_0ft=9D|9dzED?sl5vneSh$18 zppM8-a+xf|OeTZp=(|5MWu<4oq3ku>1A*0!zCp_8b8?+1{y z-knR?+bMV7i_DmvCps=n&PeSDgcUx_tJS{d@xSv^$$*E85;;rXe@ z_QdFj?vXHftGRnPHbxDsl)S1G!Ak{7oLr4OyTVGpa={eK?JX^LFiZA`uC&YWlz`W`cjg7CJ?Ji6Kh6F?O zE~N`Wf)G+i(rtV`0KQrutq+W6zZ8>+bmZ#?@S+5A%~6 zd5?(P;oOE2`5Dp_x1XFnS4I*&dk!~_S={XXuS~VC5Q75D^BmbO9emxsjum2fkE`2T z#?ji*g0Y%FN}T4mbKuUn*HdjwN2f2}nm|eP1>+{&9-iyUP~5~bly5uePkKM^+Mu~_ zM<8k6Ukhu{e4M@?f=oiBLDD1Zv-TE$O9jRFjs~(3ZM+Fri?jXkE!lQ$jW86=kCLHt zY%BTe-{4q$HMr>NqUPOstgGShed^ zbC_y4@syU>VQDUw+hsJ18oB^IiWXs)*Z*i~YCJhlxtum7g9ot-K{U4@p55P|Mu7fk>yfL7z7 zzD|{udVpyh#0)!$2B^b?r$W}hqGqRTXHg<4o|yPzGA1Fkkip85Lsd+Z>EFtRpE z>#Us*8MbS-gV1VP8hzKHrlSIKgyYUOe@!PpC#Ps%S zN#nvD$3U{|rikFb7BBesmdRVny4i)wRzCAmgVP!_pj^Wb7*A#a?(ec}9rz{8@I5 zUaPDuzErgc{VuaZ6Og1w@5cHAe3%!{4*Q`2V`>|=n=CP7lK#_9$r^B-@_}@Q9VHn8 zRl>@M612OXyZY(#9r#(17kZiLaRTI8kAUx5?Zlzj$@x4c>24fC2dS#UjcafTQyMX%4 z4QxIK*_}YYx$VdBzH%2Ksa#9C#?M=~MZ4f)jV`r8cdW@(^9mjrujN&S#$H5LCy6K9 zllsgj#a2Rk^*Og_|M%Ye=6Bm=n>e9!w>d-jrfaNq$8o1lC=NA_zU*vI7Ee%I*%jVC zFE5osxHroVX58EDc3Taq60=Fu8=`mipbGaMstBvBW(6Sxtyv7{cp+T@OD5la4>r$M zj16N+k2wZ$6Wz$p^vE~bo9$ziNDXiQHrPW4EnUqPk5VVLZE{q^BymTuSsL(GK1;Vk zZay^jRa-1{o3`(*reiWYv=`fOUP`Aw-8*73!fRxPG&Tn0nAE?Ixb@#ON3VUZGaDy4 zy);tmYbNMHy5)$)pJ{a1V5lsqyX`HRpR*QGBm*%(N%o0o@bhN4iuf2wSY`fr>xR$h za`R>@geFB7bh~Hm#1-Jd=w@S*0Hv6xS`vI;G(3-o_ApH}wY^Ho5@X9Gd3lLTjCgUL zc7hSei0mo-^?c)tGG1g=;EWHuUu3LxRXT!dknT7biyj*DAMgrvRNijKnWrK!b_eo* z@#0|pvv5m3i#^Odm4hnBr%6-AP1zaU;hrLv4FrSjaPOoAUp-djn@XBtBu;yC z1M^MA5#%Cf8+f}8JcIbeJne|A_vM%-m7Sz7JYP!p9n#@9t)%B8^wYDUQ&-FE(+^5o zbhq|D)=j;$*9`>ld$d}38Vpe`bO0=E^<7)qq#8Rnc}neQ((CHw6E@d5+GoZ<4iaE{ z&9Zbv*dSAW^;q0w*eI1wnr0D@O+z0=DH2*79zB#_O8LPh z(|&)o9IWKsvz#0Lb^9b99`Y$1$j|wR+TF8~E6%cA{281Yh5@bh zi$Z1gCU$x{3qKMB2!UE^ZVQo1$$26TO=do??p6W93R0VM*d-XNfuf4YNt)5m@U8f$-$uH>wjM*{EtXoj<_T>|j4P%Gd0mf7)_knrq+dLuV-fe><#EAj6ODynaF;wb;ak z4J+naziL*y4I$p`N5@?yy{Ny}%f7Jt>Ez)MW_ zSsq3Z!Ar6HuC4m0eP&PcCZ8zf^SDv*YfLm+d^I_npLo{s5V;07iQqh21xJPV@n}B8 zd3-zHp^Jo4<1af&J_pkCit_A15M@Ja2?uYf6ndT^{*x3gQm7wBWtZuJn(2raG8sQsietO}QloUM~ZEG8VMSN)}Jt?z_Nrk&+jH^epM z_xLjN3w=a~SVy`w&3W$1aD0dZeUBEJmKhz;>7z5*+Pb}45M_dn-~Qa2+O^+rtvkq9 z$bjbuU_R#bqx(YtS4xuFVaFp2_U#)h%(riP|4~XJZ{TeHf86ynspvQ%t6=y}lgc!& z&stBYQGlUB%V6tEeSD({N9ijmDsEOE)TJjI`?YG?fbAy7c@Y!D_W47!>%RXc(7{? zt6-H(eW~g_Q>`9w@2!if3b0VIStc}S*ss#)hTQ*1F;Z#WSKV%UudkKVH34QE)i)FH z+RZ&tXqNV2Ormy=(}Z=XoT*xfB$;4Ag)We+HyymeLO2b{govE1+qyV9NAyursy}%U zg!C-gSEA}xL*z)!YRfrV0GvaY?tVx-JNhK#TP1VR^!>I*f(}g-nW@pF5=`;7?GOkv z(4X>ftUh2*-fri;#C4O<+xdjOj>tU7k&Yi|Lw%RC**^7($Bu7!aAMXvyfX zeu)LKVd(7IMCtfL=XN{-28{1xxnz%OMoGks{$;0+VpdO)Wx@`GV&06%e2f=Q*Z3Ip z+EX6ELLgs;{t1pd+K-k4y$Eop3WDmi*tY2uiWcb{#w{O58}@`saZif8*$Ni29*~O7 zD=cx+(^jk29mA`;f+cm3s2edcqm~SDV|mGcCvQh=;YbHw0uJ&0R}X5V!p7Vt+QRhwKrhKTEjIC z^>7?`F#hJX3k_rI_1H}??pXaeEy)+00#J$+3KYr`G0-4Ar>Tm}FPbyoeelT5u|58P z7{2Yt~T%-Cibz~X|h+@{qSHv7PhGWSx73`?0U`P(SFyo!w|qn8m3 zcp}=l(jV#w7P*nglOj-9l5dzU=$Y63NSGZ-;S`Qhg`rKhBVN%kal7||UOe??t>JEk zpBse=@q?r4pI*)+_y=G9k2LK_aktpBrl?6w_uNBoHU^4q3whVr;zbWV4g@l1Q(cTm zYW6?WuD^eeavSzCP8!T^4$^u~8a8?57RkI{V?+Y;R_}cPvE3%hFl_e+F%|#SD}$11 z0M3r2pVF-PmJLmhv2E_3|7`?B+Zv|kN1C~uELd99Ouq`Wb1I$--t-*P?Z3_T`u(D* zIQV;%d%}MEX7T^mQLbj;Y%bv9Y^P{qYhYvYKWDxE9_lDxKpWm>i#1yzn2%r(m9>)E z10e-1{>TOJ`9PZH`SMzc6ytScHd8j-)1V-_PpIhU-DreZ1n%Q#Z`f&e)XjIIcOq}s zg{>)C3&{y9vwE)?9*{r}=hzPP)UT1qOGBAC%%vfQ%6jdNWz-Y0W;-;(rW$$U#7pPWu{yum+TF^V! zs5Ev~QIcAQk#d2Qec>Kz#*uV{V^^(7Eejbu4qGjV%HDeDF4C`~LwAyLk&e1feoCR` z>0DKbEh3#qrA6Oh74YCvC>X6xZeRH`IL^_KtTKLxeb+oDAIt_sX220I6io;c7bGGZ z+~Lp4GAvj&2t!b#vSlM=_yPOlp8xy86puUD1S&ni>o<}j+EiwabUOdh^{DJDNR>80 z;xiJBTl*v&qRwia%sSU9JBP@-Mrr4-YZIb~2kFbP5@S3&SxIDCFS&joUuvU?&9dP;-#)fPCPdR)kf9U$jh8_IkBpU{AvAoa1P>4stSmVq} z>AI{;Z@;=sFfxO)TN|yHW-VZ+wa+uIOz+lo{VrK;wt@%qwm#es**Te^+c!2l^hPAXzu~io&C0f_2?{O%M!#Qlk9*}tPv-WpOQ$Q8; zrX%8U5itD+*NGN!tA6W-^>n36@Itfi5nbFakbQbL8)FkRPA}M}Q8hg>Z1ci1?_c4Hfow$_qiM5F3IjT%F2l@csUw1{et7B-GI6e?C%a4t~}40pTT&iM-K0vhtN z@+D_)hTVmD$|SR!zp)mTDXqf8iRD?X>W=tC9>;X*OIn|NzX*Bow2MZ9qV83vCzbEs z-`C#m2C=Z!x4ai0D-+V|muZ#_+v#j|g3r5rPnt?;*0U;77)=jCsiD#($*fS&Vk-&GH==r7wH}d1TjhtuRd8ddC+HkK3eog}i*xgIWLWk}y^f8b#> zX1Hmz1JiAkD^OVCj}o!sZPknS7x;l`{TI~c@AW4eAIT=pV$Eztn!LuJldhgkrkxQ+ z->FJ5$)#IBLGx?y_>+lCA^HPWoNSp_zc7e=H{{x=e-w)>4V!1DGmr{10!U?E?zson zd(jm6IBYtI#YXXPdesSGLv%fhQ%BOW&H?bKMJ<^Kh`P|gobx*-QievM_YoON1#<5B zcOfb(e<#J?+j=K=EbLtZ`~fiTxm(0lB(VugOoe0kKjC?#KffPv1!v-svgJ>Xj~aRB z>^jO&6gq9*b!q=xgWd|1SN?#=hQ+T5D*<@YPU~agBLy4tP)-~Yh9L6pY4s8E9;KDC zifq41{QUUDb3E(ZaX0?-y(h`9}$$ zhw0!rIP?uQMm03C6w>lm=U!lfcMXY|Yy-T9KOz1VYnpSl3w{4$4bfk$vHy=^jgpCh zqmlXlW_wTk-#daHLN1O@c8>oBIWig6&G`}&Y8Eh*C>gB1DX-r(d5ci3B{ge@2$fB2 z6Qt^=OxZ4h&THtUarp^OO}%T74bBvE>;9+~K`T#u;DNhS)Jom9Oo=-&EhK=gaqAlu(v43I; zYB-;r!D3%LxOeAvL};V3n#v#O8i`X%50E&-v03NtY)#sNtm@WjXOded&jE##1`Ti& ziaCb!-fU~RU_Y`;S&_4HVXT!$ph9=5_AEFmY*o?%fQ@G;ZGOq<5zI?_qx3kHH|3Cn zEz~`NOeanwrAr?rT@-?JPW?5l#hANzTBAFiXR6o_xU#ZZW1O&d)yqThrxP}>RY-Od z`Wfqw1qV@M#KXT?=pz%$Fk~6B%pulJH)-DFizX*|4Hq0JjYFiyn}jEYjyRVE+ygvu z>_`{_*x)*2+`@CisoG>zPV%~s^snTH^oF&BH9PfTIP*B422l@AlZh8@vj>T%sgTrPc(iX~7aKnie4!gUV8?b@laC5^6Lo zMO@}3g^~DdY;jl`eWzyUGqJ%x8lB_vPZ+Q|ER-E}VqO6?51&&pP&QdI#jnoU#ZBLB zxNq;@(o$llN#`A!GCUqtj9u+COF7C;J&ENB8HgML2Zw`mF7d)28yr~g&V7Sn6N!OB zPNH`?y<Cb}iefg%l#1Zt&vQsl3-Z zJqz#m5JgU^3FA#0pXs0XND-g&nxlJKD#BK__wkl);dsuJ3nn_X7iE^|3?X~pqn*q*lZLi1_wJ#y!{&z|Iny)Ln#Ehf+(HoR*P^pT{; zIgMWbNy~H4-hI!bi|{P83wxu{xN7HfI$hMIS)>vz8YG%6+KzzOC!={Fp;pL{eR1X+ zy;&!=!j|#@2jTZCJv8nFD3rkf`}+b>5n~W(4E_h}@yIXDco&Q#w5gK`|A20%JgEd< z!GzX?KeJu?roW|C^b?I2#E!AvP$B$EBoJltf5g{ECcvWflV5P$Bc&Y0#&#Y5BRAM{ z|H_T5;=gjEjNoG{A2`k1|5t8ola4Ykjx#q2iRk6Ha0am1C;gQhWaJrZ8JqdXsat|- zZAT;Z2n;yFoictRz3mcj?o@r!X?gjLxwHT6GGP>k#4uD-^+%v8^9FDCJV@0upbKw} zDQlo(=X0Z2;bvh}{Sm@h1mE~8_z}0A5TQPE_7Ej0@t%8lsD!>;+fx1+PI&iqYX!aZ zLA55jk&-=7%01V=iF1#K@w7j?gklcnue`9VI4Bta^OoFWER&0$zGo!l@cuoJj8nZU zlwn93hGQxru#0s&AuffJkXE>4)op|XiWGz-gcL?H%@UGIOq!9nhjdrf;E)dDBO1qv zUwVT1@^2Y}XBb3k1rXo9tt0-YGX(!{SRiNb{EtoD|8%qcCkFVl+Lu-kLqgQQE=DOD z2J(EU)#lW&qeOOt`Kk z+OiCdI-0@)&T11Y6&)LvHI)HnjulD`uktFcOV^J4e7#B#{-yaryHWZNE6r+Bbond!9=YG`7ngLt4<3# zi2;)4DvPTN*j93xWDy2{xuvJPVgu=XB>Bbty^GSY$3=fL+Pf_UXu7mjZPtco3m`B9z1) zbT=91ZL|NbChx_MYP?fD0IvhP_D?L?O65ZoiSah-s0Gh*=&{VAx^-o?LU^xPs zK@^i=@wmdnnx==JUNvTg%aU-}a1wLYA37(eT3#+AZdeG{0q2X>LJkvEW4!p6a{>A1 zQs~5Ikfzoo>@H7&X0fk1)h&=aHZ`0*59d^>G80Qd$g{J!(>U~+boPp)Eqr~qczAcNpUEi+ZyY8Ry2bC(+XIXR^ zrIu8zjJ@L@DVk5V8Mo(X>@My=p$QXPjg+(2=B3-WqM!-tI*fE25!ubiRuvjcC|-c~ z;l9bJ*X`lJ5mfA5H~(2&*=pZL-Red}Dh6d|ueiY@$1t>6j!~!mBL``Bo=UK5Z!Mc0 zBE>7tAfjKGL*z1R*cCKhAVby&F^fJmKOsq*?;v&}WPv?}oG?@nn<+W`YrA1N)nlPd zhpz?Mz_y$yNDsdbNR55pk6iTIx|NzQe_>lo68tEoNU@qDBMFYAvJLXd9F8{-CSTYN z<~X7Z#n(=I(mZjuI* zSlJ{E@i%Y*wEm9YLpZdz7Ybr~GqLRBPxeVeBz6yliDa>|cqbel-N^kOgzPAR#|%64 z=M%UqJ7aj~x`_?y$NX?|*LjaQy%kVTio?z07xBW=ug34#gmE7qiK~xfZ`>2E?kN}7 z)ayGMs+%`s4fX_IOh>QRKJNr8t;POMPP|7b62bm1ig*a&WCu`jo_f1sy!ZZ|C!fCU z?Q5%X9tBBn@rgM_5FB?@oiNTsj~vNoeH5Qeb7L+cImR(E5^{RG(@lVMCzg{N2C7|! z^FmOcU6M0%Lflh1>OlwbXbbwvPN z0_}nZAluC^JmdsxIEk?X7wCGL{TCVv=Di1=$C$uyQ6`BSkW4*yQsC`5Lg&y8)YfP$ zvH&uv)+*iuB=z~-3za0_QHP$jJ`BDCm<{qAVRIxos)A?;;XPrq0x;NKKBz820U{CJ z6$jRRtF-INY16G=ps%kohywy0SKBdh* zK!`8bVjGu09(b`8XbSiAtQ)$aU8Pl@oAb%=u?^vIJ4QOJpZyq|HATmr1lG`y0 zjXdq&ZnXPju6Eds&BEg`YdcMpFBD(RA>`m|M$U8&zsOu}!S`pI1mxIE*sS8TP3emf zoQ<6RkWGHq2W-?2IO=ocoX`H6I`eh!I%uEZ^aPV#_?RtLYiY(V*_*33Ycriwg8wZm zVme1huUNL4>`CYffUXRc5e)!j^G0R2cWy;Foq53aj~aXv;&cQl(`Z@<+QFH}_(^`A zI#!5o)HQ3bo#z{DFiI2#W#XntfV+f4aeZTuVFufC>byHgrdzi_^PP76sVW7#nx17K zPsQMSwWa_NzJS{$wvxJ@ox;92D(Di`kJ&cap=SS@QI>)-(df4x>MYyE^+&6FsM*mY zSpk16jzlsv^Qe$GkW(N2gk&D<+F_Hdrt@Z5#&$2a<rrutH-WwbqaO;R4JTnuJzC9z3Kzy>o>O$vg%ROs1qn*+Rb3jw~7Iogolx@@6{EsRU=M zIq$`BvG+&!3AfpXI6i981o<+Gqv0Essj7AY`BT#m&AHOAnsz#bNUZB<87>-o|y!`QV9Xe987 zW>)c|wS{YnIsL&Kztj*qJtWQ$PaM@HdbygKuFzz)DSAJ|?`^BSreOg#Z}#oY&7~DY z$>GbF^ki#>_~VUCrDJ0aWrg$I>w%-0x*TNSZMtpwtTK2^i-yh_%XMzuwP+yPw-o5p zz&!5|0hfX^)4ge#bg|t$?wMTWJLI@r)vIu4e3LA^>{(d`D z*Z@1i8w!HVPWd$a9uo;M_|{4Fhk_GfTD4@zF@KG>vRMb??As!*DppVuH|hbpbBSd!w|y z9}jRl%%%~d7A$4iWpOz#Jx1>}#Je<3AiLE=}$?R^N z6yamv=?)u5q@WZy4Hg>m@?@J%x}X*+qWFr)mi^%yUd2d@^u*HCi!C@>o7OgVRwjl> z`jha2X7`=08EM2dPs%!^-3%GSP9aK^#z=C)sME_}-o31(k!Ltrj!v3)w_=5<&=~NN z|4wCE!N`?Djz+$VwN=K$!cnfs#n*Fxck(TMdYdx$fXSAEbj!b_AJgP(2=am1{V&ye_b{NnFexz_s9yTOB{ zm8Zw)iD|z_#U~{urLt1elGT5!C$SSLM7!HccH;g#BBqY07cTa(2NFilJTF7-fqe0O z@ck?P3e$|ECV_wZ_5k6v1~P1nId|2HxW&x05JI zloCIAUd~v@s*$sU5b0g3cqW{w-9|cBCp{QH+z&t5w{msYzb(;~5**P-%=A96DpG}}uMzhpG^+6hmng-g+ zB0<>qfW*c2N>-%ijubl<5-2cQS1x3)4*QL+lLwGc{e6aTgMfvkH8Xp{IA+lwkt3MU z#{*J6v-Xk%_#Q4au9DU$_E<)z$FLvpXRZYD5g<=Ghskx_s~0CxjmhI(hEK5@&1uVGvOA<(99&; zK5IT5LJufBXug5q-`6|8zJ)6YVA5+u0nwkA7u;&@-8Wbzby|yvdmyf0()t_6&$ImT zJRL$HCm--ol*)}#2RGV+c6E^eoYDbfK_~hhUb;dVb<`uI6i#Z@Xwu?LqspCk@5LPR60@EEZy-Y{f-o?eQ5npQ-YjS>bq}htKB+U`LG_ zl=*{EAKs8|?j9eYnDIeFBAIbi(S$K@uHqJ=mo)TXWZ30o;$)}}#b-fq9(~D>oQ5Nh zgz1a9exGZ(VjaTdH{(01E?iarI3FCHGlGs&ybepZTwwX9ar-4-{=lJg_*+ z`uW3(UFR#bo(=t>?6zfBp$-bE%N*R5$}Fqwi7b+|*b4VQ)*ZL59UAeUJ}Nrpl%3@V zm0I0Zk5ISXgjPH$3vD3?5n0^jwQQ@snxo4@<%^QWN6Q5*Q;d2d&d2{)d&QjPpo8bz zHSKyJZL>^wGD`^wDFD}^m+9Ij950SEm6utTeJ_~?ORlLd@!~a;0b{F%J5nfS-MwS! zt26YROrMy;d^-W6NJCkqQt%$1a0cIqlxs!a+tM(R*(Y#^h$B&p7A$JRd5RUt^o(ag zbKH8lDY?&;!p8YA#%ojCltO6~9YfD%g%8>M_({8%nYcc|d=WF14+NkEuU14E8to9h zMQ^x*4YEeSEY%XEC5;~lnC>VOjzq$sIF3T|2KI>D4aFYX9*R5B9U8b?G02TCoM|g*$FNuVg*?(j=Q{Eo#xR*V zGyd}sr=P(Od?gO?PU^Elt)5Ask&(_%7F09J$0C*YIwS*T94J`JB?0rZuXn~>8&K;w z4aNPef7DTD)SfBqw?(ts`tZ_`Pd6nd-T9fAB{7v0c}Lcx%%W4zB-eyemV)k=cGKCj z$3uUGf7N?5;xNPGO&`z@wwc+WI>f}Q97dBsgV}E5=9HzewUwvoWv722!#tjxZ{_<0 zOP`*cGnrRN-r@M^6`=e|cD)?oQ$;xeefSVRy7w~*K83+uL|KzqP^sM3!OHg}E44f& z4Pdr>w|oX8UPjAT$=TTK#oaK$?rMophH{f^RqMyPL>_!2sod)$752~F+aVPN$%3ox z1CQx0Ewp3pHTG8n$wILI)m!nM7Ca5wo~T#SKP3Fn(SK?>k3#8<)sM5Or*G^1--k1T zWa)4w{_4^dwEuMAyo&wbEt7xu)A|>Ux~Q(DgfsGAsovC743*!0Aqv*j4w}pn5N`$U zADfC$(TRV@T<@>r?pUuKn4YdIHG^W09hV!U3#Ys(tVkFS!rLtucjZu_0P8tmD^}#- zVWI}D)SnP2+cz+ieRB3Yn%B$a?fQCNcJl+Z2aCf{m6VlnJKd<}5CQBaiz@s-wB1vb zCQZ9H__A$Rmu=ftm+h)9+v@7OaF=b{w(Tz4wr$Px?)`l;^X{2hYYz5anJ1YmPh6zepM>#zv-b2LCE?&1= z-JtrPEP4jnhfSm&$FC)b>2YADGa6AGVl4*4UG}=Zs(`kZESMH;SEY?!DB~Pp+yQcI7V3xpIsA;45R9B)G z0*=$4{!Xlr23}R@aR!ZSKBgDd;1!iS+Ul^Z-y*~y%wPX}C#u5m=!(Jx4yGG(aElF7 zC$*v=GjtC#09y<|$d?-}*A6#B;Ws!C$3G(FMu9(ka3;ha{gpg3X!YlC2fb_dnd+Y@ zu~8!`n3m^4S*>j9kM6ULUwrV}(SoyGJ(r{mecmM6mw@Gadosl?k ziRN0ar4JXk5N;1R$P5<*s;ZAPP$yMZFS^cCqOAjqj_qU|jg!UUJ`uW#;F#3KVts%% z3*3li++298=ps*+ZE~zQy+(Lcjw%vdRX}!bLk*S*6nsM6i66nlMW`cm2%77m>)p6N z0tF*oh5ITHh?_v40_R1bHo2)Vqgc(zoM2qUpayVKa;R|j42Cd5n)#3wFB+$$G+R9; zr5N51z1zVc( zuC+?vGVwej4l9225Hi`(YvJG81u{89ms^pZ$DC@#_u^+MSeDC8t z39YAY1M@D4zFuKS1~!(bkZcA5nz1evIw`Ot%PALK0y4!`UADa)*yG=8YBx@IekQ8K z#@5ubU@qfGHhZL7)$piSL%(nlbeMUzAZR1n6*>m)dQO(!<-YsPSHzO@4?IyXe=>Tr z2T?a{RB#`ztBvdEMPd+?td+KKGm$!NvfO@2X2EsZt@n%nQy^Mb4?LBk>;a9n;fqHs zSUsUz=32vY+$o$gj2j4leW^ zVYygs3{2w?5kxLQ_37HzVPMU*G9`&ullS43)TR!<->Jsi^RhAk;%sEvhjFmts<>pE z8IbsYkX~z|DGQikocKTJ%BqGeY0`X4??9cKWk1i0Z586wx_eiOjt%8Yl70_; z3w)bA%kiaaEXeE3^3LBCNFsk%skG$Ve@R}Jy#B@L_)S?+F0TreSeD8(BqRHx5?{D* zq$wkzdhKed?>u;U?N3OionR{3rW<{C=%SNs7NEYU1#%)Mn9KC~hdptVr3({(+Ih?%$kThm5TI%( zIpz66oQhQ9A6mWLP>qaI5|p^INzXHi%J!3v9VYUAHjZUvDsh6Vi6`vIb=WtfA~8Wb zK4mEC)uEBW$Lvwk!5ZKlYcU~rjn%dSC`!LaCpu#219I*BFSg!NH{U!XhlALBYDKh0 zOcuxn>h8--!xv;j+}=bB#Y{e!xZf?%!2HcHL{??jm>6#eB14-F(nWzY9)9UF)y=`x44{$iX zVA&c|0{nyTcE#=Q@FzxFA#y=Gfaw=_*7Y`}W7Q;HP2^kR%U3;p>{Z|?r^K>H?{0ye zvhk~JTb>`Y*Lkx2nBMzgKZ!Cfqe?`1xVRMU1qYPCxP%I{VFy{WvLM`=a1Uwjq*>YM z;!e0Edp10%LDpwsTQls&^l4Q@=i$T!+Tf+g=h!9;i57r#Xt%gq?`9QoK0xHs+n`~{ zxa$HQTE)2lftyPl*d}KB-GbN&)|^q*m!p?K;r?Yvg*V zvx4E37UmDsg(+pemc?kfNjNiRR_Ve8|9n2kqKa{kYG9U?=EMD7|VwggLhhE1@R$a>S)T71EO}Y^1Z-@AQ8Ylm>WP4fC{h&xPT3S z<-nDKwf83WN&w^%lOT&B4bVOHcMt(wkjWp$65l-MLN#!$3be^%@rJWX6gGDc9bXRr zt_mpohx?6xQ~`ti-@Q2gzf|%6=)v$`UGX1t-^rSx`4q9uX4>^8%PO||)MCk5y5=R_ z5*(Pa?i5lomF#fR)#9N)dW}TXWmT23*Zg;^-d57w-*!TN6}z*Z%8$5hz5VOV9mpSW z?JNC-vL${Xp6+$;S>wNbp6I`CYaG6zcJPQ;aWFgbRu$|yF6xc%bSf%OH5Til$|?2M zXO~--*mZ4yMamWpwhq=v*jLu$3+3$W_{GiDnrHpZmXq}Bi~6kc8AVS5I&@d9y7LHQh?}-fz)FKMM-mPB?mmV8 zpoM0Wt=3{!Xv7AK>-@_8j!_hA*~CRJ z8F0i0xJahnk@2G=U-can^U_HXb8E>!`|;^DT-h9lc6BPfd1|x106!Ta>do*epjK<`pxI2x#AS6&Ww(pay()4v zrQK+ir&F%W(2Yd=#~FgCSd5~XWGqrwk`!WtpDcvBta=0L-Q_LvDRoQ*L6@Z$p*weS zZFt7NAyf;Jp@&dt0wZzETO?|K?B#cbwH)Ltn-{e<=LF*XLN0@o5-sWH(BM8N&Qe*+ zDzB+ihUCHldbnpB+pV}&zoy%-YDjokxN7s+6*)!hnu*o8^t}5GRK=0&Z93Dye{uSH zLQuPGRIM)ZslBJ`A*9%LY*`aI<_DQ{+U$K+Q6>fQHAB*P@+>SGBxEUr4l-=AVW&F4>K0Gtu`i2 zknVB+lNr%ifD35*7IrMQf0z-($oz#@QkU5G4>Q8;C0S+uVFpe6!wF?v6_tFm-M^U8 zQ)!tWF2ghr8E7K;TM{1L;RI1jpnO>RFe<;Eno7aP(_sA(mk@3WM zte}!f2YHBliJ-5sx`1tCJ81O}GidH0otqUuGk~@V@oHUzD@hiH^5!OfEZ1I7LtDg6 zbm*$}X{l>zam4E0UOjMbBZRnLQy`z7*Uo+xjgu8Wb)tj>RPDgL?ALTyYo^naa(J@{=%wIYM8l}W z*c%<+%Qj1S$%=khsYXYzwx~fJ< z7r$*%$(!bkqqsoTRv#hbXm>H{S*@RVk+TiiM!?(lkPY}RH%8_@&n-#Af4Z*OMN$vZ@ z_@FZ(j>e|!9&U_`Kt5}*shzCux_UKRJ#;y<*3BYiU z4+=1S`urczSTrAu(4x!N2m-jFDKqtpo8rp%26RP&0wTZ^00sbKKxQu_fbAb>P=lrS zk{_A^XaM72nh^gNG`ft5G4LnE3x>Mw6PH!@Mv`wwnr<8*w2+3@5`+OMo-AuD67AqF7OAqePgnv_x)`K&${BrV0$7aXS*A`*Hp^_#glfAwvSuI zp8A&Ar7iSREm&|_vWQeTdz2o=RMBX!+%!9%^O|+c&lqBvR!-oc`cCK$8&;&X#MhQE z9OF|zQcphPMX*3<7{F3W6c)XsG6=fu5i>*9_&}_;k|(U_W*jNvIeU9WeQN4m-sS|w z2AXa+EmnoUA~Lpf`t~{e%IHZeL8MGcu^oeyV~Q876GCfG8y168$*G2SL&k1T+pncM zWMUpf0y+7dxH?`)UIkn4rveV;0GGz_^HiD~w)o><3rm(ZUv^BZiluP!Hk9iF*F>~` zRZ=!6hrNWC-Y7VE>u~4D+W4ldslM##H2Qn;wqp2Vxa|RIk@EQpNmm#lcQAV{PdtUgnW}6dBo`!;0 zRT9`bk}DZ<%*;)>Z#aSA*Htn0Sj<|l$C*AeoCwM3+P3{L=T1}$d2~+iN`b77I)Qm< zA>&3)rEhl_L$4zH_<_IaTm)zuCGF4^@-kcCwam|)97DxzT5&+#bPx$*2R zTg!}PkLNHETi7?gF8dHR{T+6qB#6|1gZ}$a0RLM{EB?OY<2@LOg?V03*iYl-?SqEi*E= zR-vzMaoER2SiL4RGsfO^AyIOY zfA4li(J{MK-#c1;{!H!_qN^(_36?C|xcYzx=CWA3?%HgwcHVA~3-v;6!4aw9)2&1l zoLD%=tc=0kjV>uzwY_D>XCSNqw(LO*SW@wFOBzY-HS3}{=c9=@w_moC6U6Y$<2TYW zdAkECcCbd}q@<55AdjVCs>Egq5W}iZ#XzBxz+hJY10Vw{q8f{!HqkL8Mjw@AP=d7` zj`pz@SyZ(Cd!ln@YTZftlbjOKFSuJ!&A?MdeK-*HG6;Z>p8|z!QRXdhaRDnXmat2+ zUhtXKaMF)$8M0*BP13TFJq_{Z@JcgI6#t$CI$fmQaFf_Xy~o2}Bj7088`)3J28k7t z=*m-81;6(Y_Pa~vl_bz zrfd|El=6BTDuVLRSzWTK)+sn@EXBGT56IUw6)TH(vo6@5;X}xC@H*W4-kpNNu8NA|LtcXiHOW8K zfbo|OK8e(zuL8^G!R8&$a&MY{Yvy?zi*XNaolw^~vnqhV3f5HKl;gM5yiH*HydvSx1P#5WoAMxXL-;kh78#DC?7?+uVx2M$nL{QHa^3r;W`o3zWu5YqIbq_s$W@T3=-#V=#HNdKth>M=%ZbCoF>M1?hS{m-BK(1Mjef#r1}}@N@Id={O^3cxj_Sc! z;<9&tnGpDMU8cX@&W#215-HMKg+0}wUDZ$z3*-HASnup-z|(CD6VSLYzj|HfE!dA#?*z7>8bi|dM{Yk9JG#lq$EHgJz=ws>CO9Fg2kP{p9e zAdwKc&OjW!=}ZVz2jhtH175oi+D0gl$yS)68bY@gtqskLT$wM(aSZ!B9o$dh6PqAm za|XBFxBuflyB66J8hCaGh1V*?s2XYGUhBOu<9siPF+M}-6ig$O*-cvR>PQT4D=y-p&i-8pr=*S$~T9rN(M*-U-YG|^HoPvst7 z)67`bvX>S~>=2eFIC1`%U&hKd%L*4~Y?)D2Kn7-Kpj&`vOThMi7a~mXb6p)kCU_st z-)MKxhQ+`It^tk;BU_!jjJbrl<|eaW_x7^9pN^%r@J6KPsYca4B1dMm=ivAQ=HEk% z|01^a50RaTW?0+uA{+)6Eq!@+-hJe632cLGljOdS`8xrw5Ncn(LOJRWU1Q5{( zOe8eCt0T*-zJcxh!Isvm?q(>*s4PaX6q(;L2`pG$;}3Mj2gMi6_}$Y~ZCYSdDxT)^`<3s{Tam$8P1%kHtQ3eP=pSx>4@4FWIBiy z%>a-)BWyCj9L7rcVBzuN#P@|W;0oH@tn=K4t{!Tv9l&EUIa#&@UO`C5@i}HDFU=hjwLa^^Kn;~s;R;p31#bJ}mD*?$URT|= zUmZ3E5?Z^qe<#q8i(6$UqYxx6}YaC@F7*qlIe-oy6*|*e^ju~jf)i~S4z#ayja_-v)9BUV6r#r0Y z3-#l1JLO(Buv0Ln;2%g+aoQ*yku031dLc@QN;-`sUJ&$|_{vFVs+sh3R6 z7u!k2qvi_ly~6Sp_RorcWN7Hi#e&Fpxjuq{SH${lY80@XC6#IMuXcLO%y@H%v2k7F zKFm*Wip?WhKRT``MtwcVb$Q%x(bz@mUtF+01eHBf_^fK}ojzMl%1@;h6GfNg_+hTi zvHAUKR>CikVexpIz*CJ(vu}tJq*6TnRn3y5AoR}5lEC2+*Oc`Z`9`?FrS4x%h4s^E z{DI;zG41!8YP%{!P;*-HGVxXxRes04xU0t&Lxf4z)XJ7d$f+5H(Tb3!2Y3hV-Bmh+ zU3(ED`!&C8v{@=YA>=xy=J{g&jYDaMyj_~+-W1rg9Y=Je6lrBJ$|>)&m-x~x!|1jEqqU4w)nrm4_(n5NP za=K37KUceBY%e07LR?L8B^h#^joAZNYR`=HfP!~RLQHx}kRmrO{fwp3Nt9wKS;Nk>_YXtxwfxPgWLU4#RTA+fQcvDpL3Q%Ib{d zZlI{<0Gk+jy(O7#!VK?h40uppEq#BXudwxjW~z`Xm09%?TzWpvv1mxBlU|r2fh`!J zA8KfqGb^TtNr_e@x-o^xlZR!?qAW%N%8v!Q^#wZo)5pvan}b)l%X)4w2_*^MW_`XU z>$xjX17tGJCes5R94mGVhRL5>F}F~)5=RB(8KpLUA%5(yyYM z(4Oyt3iG*p#koxiL+ar8t<_Z!qa(lmsNH>?pj&Q}B((~)!`f*W6O|mJ zZaLs2=$=5K;eHZdOri8@5Fv585e|Ck{Yby9EFk&3k6dz$e3GRI7VM9|AfZ&RA6h*_ zRYUVQi2(A@tBj8wv*yV&kj9Nbd&wWijUc!=QN)1#!tNul-diJWFMQK4S#ao_NBcyB zCSRjKk|l`ergxIu>l{1<4%7|54-}uIP;ZPpoM1RdX7B#je;O{+@Ax30K|qfGJO8z} zGj?<|cV-eXGyBiQhyR=p_|F8H)ZBEyAHw>cT&v@XPO#meR7e0Ov;U-WU!6&weh6&* zxwqF?L<5PJ8+lpQb?d!+Q7Ps_T>a*H?f>TwHaR&8vL6U692jiU-LRp{_VpsBg?mf& zeh@jDr0AXZR5s5&pT!i9%hQCz_xG&@NXd+u7DET(yd7N0ZZf^@f(}IjALeuuZSjMC zjArm^qptcmOV}!XTZ_Ds^!KlEPP&cbVpm-Q?Nr1qTexYxO0}sDcL~q&d}TBPw8%cK z{qv2+HdPL$q$TlHCDP$oZY!Q-|McAk+qx92pm5C~g>XFwW9$|4WwQ6p@Y+eas5SFl z4tg4f<+i;w6XPemK-@nY2Xok4RY1GyTW9@tq_#09zpI2&FTfU4f=|%#wt>-!?yrGswbe{Vn9@3WF7oI+P8z?z-O&=VfQr z99dQ#K9|o<%!Qx!C{o0^e^n9T-^8krh-yua%|R z2UVS#DlYl)ycOOJPWb5SS=tKvgi+?mWSe}wm}LDUA_o{WGwyf>cZ)|+XbTB|8jaW7 zO2jP2lToDcj|o7&EGXeVLR}@=$$&VVlRRtZysD5JVG#Qp%OWyj3`=Jtyu^BTIQy`Z zG(cbq<=H0L%+muqwL@v7npf2LvIb6Q18u-(bv4`i+!=EKg+>=a(H4aP*w8W8S~ZQM zqIR5KO-As2I+bF2Fi^kVIeD|)<3V##Hr+v1i6lxYLF1NKUgSI?FR^jJux?SgrQ70a zb9LI>u409~vQDXxS5O*6JRQ7M{JVv1Zj_{^Uzn!+-Ck=H=Sk&Dh}Kit%XHM8VVX1G zdXpwuXhHcxu}+(Cnt6g>v^LYNg>eGqB=bD6%|E*W`RS58+jM1l#|^c9yYT~0dG0t` z$^2-4svkd(9=_*DBe~S3E;y5>-M(vaBOlMh)@Y!=q9wxw{&o@RwfUUua)+Sh5_23I z-m3EtwyGx)`~YmG*-Lwi%=&)k8fm&UcnRAAW_I4_aw~a_W@&I^ZKr!hlK;4aF zSj52wMqCF{Lt`4enjg-k;7o#Aar1F!eL}Y?PUy&n#ftt8hqY$2yP808#!;X)Y)cEg z(6W?2Ddbq(4FhUDc(UKmy_?XJp%51-l_FsJ$_{U4m5(5%6b)p?O#QU^c3MI-K zSGswBDh>}MaOyP@IMo$hDQK##9!^f>DoI;JJ*$3-JAXdM) zrf45c!tgbrZ5&O_3&a|KOG@D1L^V{O%WdyZ*1pK{D{Mz{ABF=X&)CPzxlS2G3PemL zIU@BtF}mith*{KRL}z4^Y!ccgMv+%irY}mq+pe9A7@rA|rVe`s9=O=6^00b`;wXi| zLs-J8m;qK=gF+ahC?3Eq7Npwe>XWkbN?WU>Tt`%ukVK+>%W?WNn-ZaO@VwtTwdyZ`S2G#VdMw1;Mt5= zRuUG}QA=hizRlmVzR}3u7wWEhX3}32I9bzvO)KSAlwy{=kve;OF{bo{nC6vnh7IK* zmeLDEqbq0Lv6rtPl@&e6e}|_0k;;HC5NMQWOnV!a_?1b55%u$lCeer6-+7K(OV#rE zr|0*K8QrCgX%@RD;~jFXS$>k+!okYHOmW409O-IldZ@wMot`;Hc86F*MgiVc$M9?m|NpYz z?L-_B^XQ*KjsW?;abo`eJ%h!~UCf=WjBTyF|92iYX|AiHYvO!oZMcW!8Fd15iVT?l z)JivL^Qvw&I#TgnO@2}AYXFNr##hl=c<+v4u=Rn#FT$d z+5d z=5q7+Ly~%u8cqU65zedzjO8ogLwHjx*S{oYHPWo!GY1Nx>$Y;+toFNHE7+^5#p~u) zN#&CUceI-$X&2KaZPRjTDCxQzWMJD5AGM$UWK2&!x7x8ZP3F^JMd&w?z*Inx z!lGZ!oyat#x8yyw$k>=sDYii`%67xJ__dOfg}xfhO0zlzAAo|ZNHKTs8)pN>b-xxh z(K*^aMmrj07O(X8bo8iS2+d=}M8D-sVlB+n8guXnUC?6?)D z*7XV=58}+}!!R-nO=vtPg@PT4JWsA=p8nNT1|;E#5D zctJoTq@7|RC|4ZcEh6Pm5BX~wj!%I);3agpWdRcbwv34Ri7@L7p1tTo%gCy?G8oa6 zz9{+;&4D6;ENB#ZYnyB~jc1}9n<)YWT>70A*#HpO8}WnNGWr=$vfuWTMOcVUxLXtg zY`63=5ZKtO%x`k{y$Tdbmk)H^Adzu5oJtMVP1LLJa0CaNs3l`fQdhT@mb*VOe8o3c zJsj4auc!yedT2c;Ek3Iaay+_LygnHN@RbXl66&`LQP^x3iLE!4WOQVH13MfZ>OI@| zPq8e^@2V;}f#WqlYO6mN)|yYmh|(@Z4&M`YKd@5I?N|B7WNwdS72iI^`Us)k)!!d& z{%$s6m{>-V{_#NonAGS^F<&UATrVo`I$I%@5m3`ZS(%wRD<6Wj2V=u@7mg>8Pokby zEglZc3d`l*m5N;ZxwUncRg5!KjQd&hV<103d9Nnj+#8Ytj&>fCk7h&y9wgES8l@~X zEj4Q{{l9bzMe46jxf`-h@sFkEKC-1$dngS$hQq#%b6Pt#vO321Z*3LLWWC-#oYxd9 zkp~s0!8R#Lyf#&7OWaf=lMZJ1$Jn4m_N?f}qi7WG*|NrahhbAFkCYAQbC9D_ z6WdDpcy|#shADvP_&wDzLQHua@+V#i9TXXbl2n~uzk|NejVu}Fl@@P`*BOPuYd+vr zNM}CeY~mEt<>A)`vXo|SQVqafGM7T3KkzuaMtmW}>mn3gLG$8LQCNKBJ!$)hT!%7p zOukP&;j8rNxJ9SK)Ei^mM$qZFH;KK0*{4fCJ5!M8xcLbEuW1-(cw~-GduD}e4N<#? zU|g-hPhc6JLpt^~$umYzm!v<=;Hqo(tb6VdPEVH{E6|7&CK9P$UOZGNU_zEcV7hvl z`{BUgkZ5s~XB35k)EZ}%`Vg`VVj0|6ei`JpVUg(#naXkE$Nu6kagT>LeSuUAK(E?s%n}V^j9O# z)m?c(FlnnwA)1reTt8oQ?G+8v_eci8WVQfd58k1rR@^5%$g%zhTc8o#Duy!+%tndk zfof`?Ao!6H5j$&IoyY>4yt7Y5o&<%uZPYJ9*hK{gh_(6URk5%4}oDXA}m1dn)#p$0YveSx* zNn150L#J}I9Ze5iZ{H`HOutP$vUVEzyCx%$y)-=R%C{9Kd)YjZXn#FFFV?_VcclK;Gj#)%ewbA}T%T;&(n zrmgV>)U8Rd=QP@G&cA_97T2v|t#aDrb~>>y*Rt|eMOG-a+PU3dh=XpuA~)FfWWqgt zn7Fib$GAx@N5a26~AkvOaS^nyz z+g}@GkB<&0?M*)j%_f-4n*-6&IhF*Z>lkJgC*ww66Y~~RZ8n2R*O0SrP;T0CER|{n zH@P+x^6dhD(l|c$U-3=P!7afC0o^=GlI9Y?9-G`ER<^_*if*2ogPkb0N=yVeVe}dx z8o&r3)enB1>y%F~xdE~dc}L?yR9_4>j4V`T7}i8 zP~(%W=3)y^2R)9CecCFtcfvoWyW~^eFZJJ)8Eo3Yl7gq02kNUTs_7zaoU+2P^rl@F z++Veip)eIzC~J9{6tmL;AgYX{>(aI$m*$RM{fO-P%O>47w1AS#8LuOcch?iwaQ3J_ zCD}_t;;s)n`1)4>S>`9bjAbgwo!&tAJoJz{{Ogo=d-HyIA2-qjMloFLN>+j zP*npXMcK_LKU(V&8c zJPDxU<6d^z=D^8@O9n6F49^d&$&JKU_(y38#{j}E5-5kJ3v`qkj0c>pp)emdWiUKR zx8X+79w!1^P?K4Fwt(f?KJTj~SX`&ry9%8VFU)K=8S91s`24affqGm&vw7py*oiv~ zlv2%h)}p*d3rBGOA*%-ArU^#zpzL@RP2d@P-=6Qr%yk_36;|u%Uhy5;&-D7#+t1TD z@b)au&J}*ku@$oCov#6bEcRiBacWRG)Be5Q$UvtJ=uNqqzNu(^ zvemPsH94dp8+6_EOKNxT6CmJ|t(XzyQ2Js)z9FRy$lFDnqvAv?sBaJe zt;GTdnH6={3H3|t__r_TU&Tk4`%W9EA)ET{+&zeHYGy|#ruG9xjlLAf>>K!{!!erQ z%T4T;6rW2mw>71nD2C>})@5oq$bIx;_}z@PbE;Ri$W=SW0Q~YO>#BA@m(PF%-t$?2 zWPN&)tSbxGp-Wn?3B_AK27}`r zg++ib&(YBg0{X8bZLDm0jtC6FX=F3x1e+DBzY^|KXZ~^7`a5qCjk54$v@g4v<-0cW zeK8Ohhs|y&)XvrVY3nLMb)pg=RFGh%3U?AzRVPz!`tpEuH3&CC=@@L59GF+QG3=9x zf*>UvX9{Iial&jtBLK7=@hDOu^ZD)^bU)**(kLvQnBEa(9Sr z-+FQsnym&BG(9eO2b!?NN_ch}0x<$P2mSXWHi~kyWzrd67WIi9w0m-lkI;~2*S}i7 ze@x1OnmHB4Y{c4#;yGh~_azD@njJ7T*-Tf7fkmCwt)Ic2Us@VLy&VBu)%!sIVbheOM2= zA+_c&AA02bO$>e&&l#AezH->08-MoM4s*H*vyHO6MZ4LTPhG4xW_57g_8G&QmG>^sj)1Yso7KuI8I{6^S&PthAPpW4N#6pEU| z=7HU@>z3o+QGLNYHueWsOLQ7)|AR@LJUT?N(Gs4!kZd`Gt5?T?x9>BKQN8E#$ZqY8 zm+xj#+hmLv6}FeZWK_wm?2M%FS+^JJ4OLZA=Z9wpTU5${LB|u30f|;rH`j22;VB+; z7?~uHH=LL%YZ6v3-dM^(Ko@b9)&DgZ?$TN%)J(cIK7@hvEcHGXb`DzozAZ{)oB%_F z1wohw%^QVGsS!UFTc}Dzmy;J4I!Nk3f*T=ke4tH)3GN%N2;?f}8Qwm%i`z8xk+~L9 zblSj(5RXwHxu-6tL_Ic{&>f`gGPHF-%^FNkNKGB&pt{YIQOg>XqN=+hP<%K}>kgO( zFS#w^Lc=`1G4i)HuiRtr#)?479^wMyAL#Ipp_%uDV3O9pv9W#^tmKao_=yRDQK@;; z8Gr{F6%Z4^iA31z^$7|zdKOer=$0Jni6-+5 zOqsCoG=CSQyaDI`V{wa7M!^U})B#4_Q6f8Kb z@&>EUbudlvtA8cqP9@$^|#`22nR?q?7>`$WdD{{U!Q7t1Nk zIw&FMmcm=KJ2u1D>=2ZAHbp4EzJUY{lx7kMr;&a8U+gGA3pwR-!|;W2doGC-1s)T8 zEZpxV6~18Qf z|9og=Z}GqS5>~0|E1`>E2+U(OS4l(!z>&hJL1JKi_zH&=CYqVbDah>rN=~mw1k zI3hN$v)1$HXAAHgQcsv9hF=l~c=pbh1T_%h@8AtPM8H94UfXzExc4PYQu2omM{YQ3 zp6>~N%Dzasw+a2ujh2HpLs!P?uFy4*M6-I?Iw=eE_DIGp-MCUs*=fd?jI8C}N2y31 zxB#lq8oWxNlG?yL&a88J7V2)cEIx>iUx`k4QZlAW54%eK2jG?fUd8T4o`BAga4h$p zbMebKIPa$97^hg#cNIf0O(BEL0Z6wQN}@^`!W_v?cI7Su(BHa)#U>~UqIu^>Ko2>{ z0H1c4cQ8)19Hfm0tR&=--xaIy?xFI~(O1VAq=|>@iIZ*%$I%0s<^S^kctEl;0ns&d zynWIAqDU6pyR*=nT-YX4RhWUu%Tr~SuzbOoM5%|eJVieenjwcTz!AgRPwgW(^rAOS zy2D$l6G_`8QOFQ^qMA(&Rza&T{USV3i3v@n@`mHoh(L&eEh(Ku|2wbNqmao5EzQ?@ zZq(ODnoO`U;0Hb4^Ir1w#lUvhASSXHV3SwN=0q=;9&q)+|8qtWLWgEwS6aLFYgWYJn|pN5T~2|#I`W17aF z71(yP2v6p$KBnRi8I-YIX@p-hj!u5MI452%ajiPYNTw{iTqnBd5&Li_+{qDM_aDj+ zkOiFi72CZ*L(rzTWXa~@g@@A)LehS+%%i8aCfG7zvoZbLXMoW+s(X|tJ|q=Bqxs6C@V{y+GMc53 z>j({>6+&+Q>?0@AN0`*4&sD{vN~!E@!H%??up5knBNx+hAh6<;Oe8s$H{Mh@LByc1eB60EK+3#wsHgt^Sn0h7nk*llPy}Q zzFOD$(Cm*HUl-GE<#jkt_zjNB^zOKOx8-Yh{m(FntE6IIQfG!wY+bxY>c73!~Qn2hK`Vm#F4glGm8TflRB9x!Qt`5Dax8T^k8NHm13;DR~ zr=sqE40?n+^cZ0qjYITGU=gF!$#p&PmBMj>u24yY6@Ke7=6{(SEL5$^*y)CA~abukKs4g&A!0YihYE;GQ|*NS%f| z7g>B#BFKjWHdzZ&kjdvPXp&&a1)4)54-8@2>0Unu&h<#woLy2pA+%{`2iWC^R&*B> z=m1}_Ps;73BrHw@@P{ANT@<>~JK(zk=wQ}~hrkI@0xE2^RU2$9_TRJ%FIIq{>}mXL zE;C$JD4FbC6QWhZAMX^3xyQ*5*e@otG&srbmE7(djuFMjEX|pY^nu-Mp~y0X0+h^d zd~S`_)rvVpY!?OcXA7VOizti9S50z58;z&OBl%&j9m2NE8GoX8@iL_hc6#|-TG#9_ zXS6X!7*ZosM966-nAtyT zHcR2h58g`aWT7!_4j55yW#wCjjF!EW?3+SP(nVWI;+*$xpJe@LUW9DIahOkIHw_w9 zp`-SBqjm)KS%U$jie*QjWkb zG4M2hwBQU7*Nze#jEE{M@R@y_uh-MTfnHxq8FM1JjCHN2pB{Y+DNWX80*7#~uJvqM z1J3CgMA5!P3QMMc&_Z5DNyGrh4nduPe#}%M_S@1vN6ucOpbbmGpiKYvyJQ|B~m4 ze}~@?67a9njq50!jww|u&UaPaWD$|ojnc9@0Vw6@knkLV-stiS`zS{Xw`4U4zZf&N)9I& z_FJ3NMZbuN9r8uLkk>ajiRUo?t=}Nu#JOhqYm08NphmzodFV z4XPU564&lVp6FP&%DsDZ`Ni2*N{i^Vc0=bj62E-2_g}N4YpTT-&eMDM1wN#}`#Sv)s9wwK< zG3oy9@u z?V^_ce!fVXF5K)PWT@PZM;=|R(q8hbF+%VU25UnJvc*D zj%X1F%a-m(j@;9(jN>3GW)W*}T*=;Pqn!@l9{|0&Bdx~PyhYu!miA)c=@3Rg>vOne zamJCt{`wQ~!p-0e{}rv|sE^6HPy9kINP$VZBnhO-BNt@Al(0n4&M%WK1yxdA5-P4V zJvgPhSe8NWiTFQg`==mXpk`SVZQHhOyJy?BZQJ&2&$eyb=GV4u+wSwPb9dZ`z4pCt zdp(V)i1A#RSrwTjxX!sgEs{qnj^h^>T2gDHV_BG{y?Jssl9lBz({39Cx^pITq?##B z-;3ugct#5hx%@_bPh&BglypljHmm~fFYXJs3z%K+$#S*5-7ZEgmZ89xY~mG4dZ&r~ zu?Z<3J9wwlA3M18Od#q_C>ip%K^h!tyU!6?^7=wVtM&98A4(!XLyQEH_g*{Nr$&S) z$bGrf>z3}ck$i=;9XI^F3ixjvYv}3Lh5`Zz=p7LV$mV~RWBqr2b*!)0 zSq!dXCsPxJfevzxav>3>U4m{ao!?xcT0khDNKChWHM$Ldz?oZA_k-MfR>gRBkH?Qk z=zB-_Fmia$nI)KC((JuKNyy^zIy2Sda{E2q!x`}P{a6R24@d*4JX(=$tIf{TX|`?I zqRL#L_Ni6l`0jr;70YnzQfk0Un)064W92`Fl!4!*n-t9K-Mo{Ys2=y$^Ewgj;5*(h zJDx7rR`LQr)>>%&qppu9yqDFz(n9tv=w-vcshdzzd8^C>j!s`@tAC*JIkoQiN!q#b z*5MR1)z_(jrxY~PlxhNg3dREgahh}{x+Mq)9b{Q=`wo&K;dS2X;Q0>vlj;HPkL{Uk z4Y);aOT4ULGIyYr@Jh7oSe?0sYNJno+)|5{#3szfD)S)-hxa-rF0Hzw=l9*kGMLUOT~wye8vpgY2DN`377f?CGfLlDz(TVU)q+HB zoH)NNe8RscB7WB%SVB`}gxwoZ*}Z@hzkEq_evjU3E_*9VLN=scrxn^K z%VK#>zEp>ld~9^dnmA|DmSuz&HDN?({=l2M#6I(LMwr-SuinOv9S6}kv5h{kbAq2I z*`E_{8)@5G!cAR5x#Gf#F-cR=?D+2&JB$DDbY%mDCr?u{j*a!jaqdCx8Sa61AdAC; zgx%iTtAz_sl}GPF*P3M!%%5tU4PumPt#v#xT!#7v!{O8LKf*#RH9gK^f}#ybj#ftp%GWHjS1^ zNfTYadpY8IwF&)Wel`(WyF$JuI=ZS4+S^BI<}igaY)RR?4F`%1O* zF+*rwe(Ie)!6b8=D7?F9oiZy)9+g`SQFI21vZRFgqR5*jafA<(OA0|Qbl;>1UxFmT z>~T57k05_Ya%}AbgBbi9-1mt*?(5rwsXRao5KFxM2NU*}nBy{*oa7w#GWM66a6Nma zdbpZ{rXb`U_LeEwUv_S}_%N z)ygJi0o)!ixG>*UzSNjPXin~cYYp+ieZy=DOlnC6nxLm1MPm{>?-+K9WH82bpuASw zyj+zhgEB8hjn9_qoX|MWWT!7jC-fFGsh~`KUp4OvkWAm67ui*|?pk@)iXmUij<39a$L+QtS>NoqaiQK86Dli0|L_dzYJG$|L@}>^S{g_*VL}{C zNzE;rPm*{&{y+Ti4eXNRfmY&7~_iZFe?|3zp!X{ayxE6jLJypC?ZybIq6i zUdMV?(}-a8X2umGFdyNb9&tL&TfS<&RtV%H0_f+6;C;nn+O;+R;WI<4aH7pPju%&l zL(SlVgHCMhT)Jm*(o|$s(@S{XV$Z5-nb=)hz?7uM@dP#8DsrsTpLuywJhHs$S~zQx zR;xU!C{}%Hs_N*`&R_|+E`AIaQVcVU$PMC6GR%SS^6fcHgr<~Np03Sij?X<*I)0p% zA+*DUpWJ-xhFDE9G=vp#G?UbIBda;^N8ZlZxT5=?E|CVs_<`_X^bso;Co}GytCx>` z03AMeI{n>qxUu+f?e!C}Mm<%*l8N}I(jvl27Qgspq<#p_;y=ba4{Uc89~~E`LM4p;sqRk|9>anzC-ei5iinq%kx#HIG!GzwR*yjVUR}A6s{>C`55y+aZ0s zb!O6~!yy(S45=mekA}hHdd+`;M03&=hvAE&oD-u(L%T>F9h!E3XCE_mO|?g%_G8S*&~8|95MeRUR!dE&cK#;qMB(5suTglK;!($j<>(}$ z$!*~<{i7vzAtcKP#rp2bD9oE_2~sz;4DIoQtdA5;iuvo7E5+J)LpEl!|7+;mdblE*l-F zmy%MuD~DL^efgFa4ooS5XS=R(HEYcTE=K&|x$bKkcg9hnJmbhSS-VA4LmYCwn+$K= z0|dV|mcQoEY&Xg5t)`X<^64Ms#u zwvlH({hiS$T+$N!z_MJMN3~>OT!9H^vGd|aP-tpzX`G0 z7|(#3qJ9gHOKIH!E%T)E!t0{?42c&{mYNtregtaVx$yM<&BL538byF9F3Zs|YtZ$ke2V%_grT6tQ+<{%h2dtyHL& zR889}t<-5;NQQMPF`eXmd9D1GOnR(c6w?3(O1*iV;Vl7%jeBm<*A#5#V$1Qb;) zRP@9>^6#WJrzCIG9m2D}b3*&_X8s#3;gJuiR+_f1JO_3sq7v|Eea06T;|YIh@=EV3{GF`%ptu z%MOIa#pOV|)9Sr{x5TyGb8>s?j+C%)LO8jQ(?iIeaYaw4GCicTWxpSKV+uKDf`N0& z`Uq2Z@Uj$ku^s-EU1l=R)O~-Zz!zxB+iKPnCo9zD_|h}k*W8;GJOVl-hEZ*J!|mX6s^%d*X2>~LEc;l^=Y9As8BMrJlI)tLTA!g8CjL* zNJA4UYhPf5CC{HUYy6wQToQV5gH+;ZlZSlH#I`>wwv%3)Nq5{?LTSp%T|lXs%~0`l zlM*wbOr&w)9Hz^zqBC{~qmV=*6SEf@#4e^Obv&WIPpgq9&x}E6(zvE^DT{H;xe27!B7;WW6Vj@h#3_JW;|2wb zt|Xx>M8+B6IjL!ZpQcxXUuF;P%rNAT&*C$n$89w0aV*;gB;{o4di%|2npbpErz6sS91pQccR0h3R}xVzI%#WVpA{mTt^|&%+ zgyto#MU>5&S^6%|_l6KH8yC`Me0}b$^6I}z%UYfhE^20$h$e_;vPnkrAjC2eF)}U$ zjW5@}@%8$YJ4~-UVJKfcW5agw9sG{uYwM;*u_N{1cTN1WFK^-QX5!~3Cn6)4WH9JS zi7Svw;J&r0dWj~sU8oCJ@pFEBgJmgxD_4RjJQc&1YZP*5Z3v{QAA~p0xS&Na?0vA9SO2=Jc~<@wJ@9 zyICRU`>};l$y1|tuzaeOoaOU#L}K7?-fK}~QIqVsVovvPYR>RbJ$=yS0ZIFORMtu* zunMTORX;!8*~06!Dc*}mO+Q9TpH_F#Oqx{p8dq;}dBikhNN#b_s=QV_oWbS4S~Yl? z(Qu)|WdBBNb{QG@K@0o_4t{%~{zr&ELfMJlV6~CFfJlC}TeclQM>*4g+%tfpK~i;S zwPyXHvuJsHdEo8YdE(npH+N*Bt0SN6Ip3PiHFTW+@DUt!9+xJq%jT6FecLdO zU$ZR7mrhmkdGy*4gGVkdmurYY*mo)HP`Gmt;p^SwGh{KXRBA#FeMp!>z{$%Q+)6`D zc}t;)uQh|+Jyvn@QMqkp`lL70g4I*pL3H0L$4E~_D;Zm?z|d)xFW@8=8Ip|IT*9$Q zKO+?ns9%ywK$o>?n6$T%xowzSk-2zk9BfoGyPTw%cxtR#b)ciGqtY>`O|zpi(9!I* z#ur#AIXRIOV|*vfB=XV;a3jVh6}V4xs~VGwl~=6<8U{CN!oT2>R%$C(;h>;!Gat4* zQ-R&_l=9bWCPmx9jmoGL>vnWP^HHb?p}<_FaA1kGPTjV3zeg)( z9Ci9`K@RV`a2#t~8dUNSD$WLN3m+9h8&dX7?lIvK#D2|ZRoe@S*N|=8JML+kT|m4I zinC44r5>Lp7|mYz;`>23Y)ll={S!kAskHP#F=YDl;GJ4+t2lz5@uj!?0r6y%+_ci? z0CuU<6yazmhG9bksJU-E`C!Fm6AN^u^(8I0*25oz^90o@sRHSJ-(YG*G&)TimkH;a z+_g5{E-bhQVPrM4g1TdWM=T_Ei3oqj{0Dn0mO>}LGU-CrjQQvVY5V8I5coGQzN8%v z+*dy`OjF*d`T%OP9;?j|T7i&Jg3-Zwz53E*n>jVl@ca784f1nq{G)6A2JK}0vA8GD zxa6)L*3GxFO?T7+SZ`mqSgOH-TxX50vwTTgsO{ojzWa~GaQK2t0}7_VRGZ5#;6q|LXsOmp@g8H3RN5%y@>%;TREQra zrappc?y0yl3`0EWBgn0l6^<}YC)7U%cn-ogV9a`OZj%XWHxXeyXV#$R$gow^&k^;(lubH!P|JM~^rmg-HeM43;=VNl{B!|G@r@%QzB<=u zH$>0X8~!K?cQv{60%FDQl0^^-%C$JuIG&j;TB3rSxdUYh``vyJdF0j3PAIdDDgrlaL1;8M})F%rU|h}H6rfaDh+%<8x{oBf9l{5I3ezJfMaj_ zSpV)4j<&tO07BkWgh{)E>&7bXENs)+gWI5xmOt*0RKwDB_FW;M4IWpT$;ptj5#nPKh0LFS$bma?(0ybyrBGy30emRaBA>XuIrAQcDdTd{7vI>tXfXe4-QPH?Sz}K6&4OBi|15JW2lChaSHXwLWJoTa8_DlYiYrasoey6Z@6kzubl>a8mbo@(iU#i#2oVz956H%V$ zJ{pIhk8@t^hPyOvwBd>Awi^r3{3ZM38|s}!rDpv15{-8X`V1j&#rTrR8=6TWNVa1<8r96{is{_4^^0g z(avAGqShxAf=W24d!UD{U=-?cWpL`~#XaiE)po?{DXP5sClYZA`lv?4<1>%a3lBho zG7cgGuoO!h&CFKUlLtW}Uk;RjUrCC*(=b*S{?N|jZnpi-7*W6PqsQYX=9z6q`fyk`#zuLZGm8th?kek z_^-5vV(*CgL%Ut`2<&8{uO?CE2sN5I=PyYJ4K zo&T%a9~tRW>Cb#D1(QRd*1Mv~cPgy@%gmSVZY*wMM zSNadR!b3;=Y?qkbr;;|8I{8|JO3h z*3889{~MpCvFn1Xf&O!Iv8tVVm|{yA_fRwnA4|Wf1ptqFZ&B%Wh|5D7HBt z)wXG&b=RQS4}xZV$}!^UCq?WRAutSY&S4n}eG0<^fZF>?S~eFrHB4<}J}ws$*k`7Nps;vXYR!03yX<cMAjQ^C5ZAu-2t_*-JMtOnMP{hZl)lmwwkz0jB^!pfGoLWaDGoka7WY?WcTLW@A>6d8yJWdI$l zIf5U{-oTV5%d}JKYxST(h=s0wc$G|Qu{%_K5U7=t-^!n@-8OF7cTuMh1-nYNx(#2Y zPmIG><0sg!)Z$(ALs?NUMJkK4=8}S^uT{)a5L7!+&LV^VJnd#v>^)mO>gRa50K?1O zFMdG=zwrrjeOsZJ$sT1FPKBY8ay?VWxpFre^Qt~ECikc}7%;N< z)ix@8OKHPbqN@DKNQ4auK9Q@zJM|zZMKjvd((3$1cN~Z;4&=EWz(R-BUs3?)^w9?W+n2&FInT*7jg)EFXd4e@U>Q#d^i{JR zT>Ul0u#UEJig1wQ39T>0HgdIi|pXuS+HX44*%b-(`x1QIzHR6xS7ZzdZ-d~0+b+I;H)1F^MvjWpx z$*WHwyCJ@`J+(U@N%2qj07Q&tFQ<1`snxK8l$Li@>bkNRS8jd=6mHZ>1^>L|n5%_A z=JINczBe;#t2wIS-NbptS<6u_QQpDJ(C9!+??6&+;1kmZHeUaW%j9 z+yb2@j~&!q0Nt*btU+*yKZJxG?tHSFYzUzE-jhwr=5sGP40o4N-`3-;U&roVzE+f6 zaGiSGH``39!e18LR^1LMOw(w}hL1MHqnsEAvmq6~XoZF(QsD0~3}`BN{ztzUwJcx% zc&Wtc5$l)VKOX{%-_Ob5qmLEZyBrs-9N0vcY2{2eLJ(>Pu43+#eB9OVA;pfx-&r6D zKscn{Mgm~ZNE=0C_y=p{Qo{#?H%yda)lKmYHcVWRW|vR#4-OkxmK2Ph?px|7T*eru z7b(S{`hmImSBd7P+{4Q{gC(OPrWAiIkmNj2fJ=F?h;goU3nMbsGoHMT2yK;Y|7}#+ zzjwXiUmrEQqhY5BWM{}e?&3?G`TA-b`%7CIy%i83UcaY@-wAm~rf;(5FI5D4% z?Clsj8Q-68Vte&Q*YwpLzUZo1kfj@TBwG5Qf%nN8#)V3A+OLV`Ma&^da=V>CQu+as z@_SR-IRISax?@iEB0sFM?^)!x?QbnzG4k z@1_D@Yk#LoL@@^Xlhg7RuvzVl3_7Aq=iZ@t<*ekyd19>eymMrH>;JvmjYni~avu8d zC_Om2-r$<)x`ZB-Y7$5DE-I`-t{^J=4F>B36;**<3=#b0bLN)*=t{STQ!6o_t>BBUDVnmYdf`9N)+tk` zVg3^+`>{VIkpGR4u{4wcm{U()Z2IyGPm!$XK7JFO^$b3Y>~Zqm)%s~lUHpwz;^F1n za*Kd;K>g~-GC6FU9MP(pY&8M~;Q^RSho)3 zB;D5yEA;y?8zED(_G|0q)b{|FaQ-&Vm@L;KzK zy+%Ya<@ zL0E(&{3@zGwQv0gv7l~|E_DOwIK9k$?6R2M{r!5O47{Xb<)h+O8>)crxW~hTIGGC@GwL@x9cjbWBkh~SzW|`PJ40pY-m%>uhuYz7pM_n#-gdId7 zPwb&Cc9gTvKn$x2V*dK4GD_fh4(-uojcwE2%z(cjn;BKA$6;=@O6N9>$%S{z!pQSAA|iP*#_-6?i5D2 zwYgQ2ZMso^ePT2V^C}C-b+%Qo_0AX&>BiDKv7K?E9nHLpV&Jrs;%dg9^$^7I0!*&b zN4IOrNnj40y8)V@QfzS5hR9xZvvkB)UUU=LWR!=L!VgQ-l(Z2=&o8=Z{wC}T^R$g} zwi`Kh8BbxZLe*qYNDEO{n5x zq&W-Q2)}y`hhXzKllrNjM&_eAu^{vftEI$;vP`GZySw*b2L1)8k#)~em(VKQBuO|F z2*j~+$qewW73p1-b5@74Wm~jYr6ZnxTek~pVLy9{0f>6UVAzMAPp1A%9!}2vOqq0^ zFfoiW2O@hP=`tXlV8nICFo>wCc37Qz#uF1HZ+x0-0Y2e05Zjmi^IlYNmd~~EtaQsX zsRgh%%zO<%&TI56Q9CiJQBPAivb(f5lhMK_83z^zf^kZ*I&~fkjWP%P)UJLN(z5oE z(Bi>RxKJdZ+OULMnAwq-;!c8b*eUsHL4=%O)Hny9&dsdnmVqiQFGY9RmgOT;rChBn zsu&5R!(M*8*9>lL!IOHMQa09cR+AD;E$P@sDT);QW5POznksH28I?v&wv{qX*lgG? z+vNG)xmOC7;#qaQ*Ozq!hL7I)4Ne?)SSoI9T(L=kpCp1A4*j*zF41}Xdt0ckI53=D za|oK7>lxEc945~{Q z6nWamrP<$Aw)n(9v8n@M7afpHs3P1GdB_<=36-tsWZI8t2qchI{&&0B0rOzP79jOY zT3~pX)JZuuCn2gtok?LPox{QA>x8R?p7AZkvuL>9Qf|aiU%qd$YmBv(23K@8>!DQ0 zEhFw68q;&!M_HA+4uc86c3a=PzQG6tS;4r5#u~Qktud)PF{6> z+-;ZPHSI*N!-%yZ+@Q=fi4zH{Wh2!D56G!OYw5nZ$TU&A$}UKG3IiWnVZbe^Hd4S6 zBb8WZUUZtpjWf#fp6|9>g9+{bG+EfIzG)BdQKhkV@wVS-D9_nwH0Q39fc%AJq37 zA(y)|^yXcDhSziz%wf^4rNcRi@K|iyp^t`Vx8)3=9U)1h#}NJtg_qH`Mbcz$-%y+p zlc2W}tzCMxk<8}uU%q;kjx2HeUW$pgOY)Ey5I|SuJl(}{usb;~z*d@5k)k+JSUcEO zAXoXG3<1fM+hZKQKyPpTdZ5dy2pta%3LWk>JB8C3gkNu)*S3dJ^Lg-4F2V^bPtgfV z0xa&@xLQbD2(o59JU6cyUc~TAsiC1tMR}ELyG%l2zTyCT7`ywLe*>t#no(JDfLXj| zN(o92Bm(Ev*wrdXZHBnF?8$fps;CU-R6nR(Bepwd+_CA&HX-u^Jhxh-0(o=AVLV1P zAKG;(@Ly9@Bb{7&A5i9Ub755~lA#(WYf0XMx3NBJ3;=gLfjO$ue;R#DB&^ zgU_?Uub6UkfnX#}WSQ*Rgf(~ywzL7vYjPse&cM_iJET+9uP%)aRaf2~s?p)epJ!2G zwWL->wY}Af?OOnDbp~SRMxG#0A?_BU@e~%B0oKPzF16N&&V*la$&1y9T1Wnp;bzC`S9oCEYqw`zpja( zywUrvwhTH$16ZebC|;S=Z`#hVmZ#@i@J(mm9^kEt18wfw&Csl}W>L zMBXY3a~yJp4(r+U%q!U!a)lge^5vuP({Nr$m2s6JYiCQQdG0k2k`z4oC6T=_mFxH0 zs1V)3NYtG1%H8F8$HLpt4OZzjNYh!$yWw;#j#1i&M|t|#Y`t4wlI6@51RBo@-=A1$KZ_iJ&1FQ6>#kz;WG%Es|^ zgkq3}%*qOS^M9u2&=bZW0*i@xmfgR9S>@C*|Ag>+%zr^5_`WgU$`RbVeT5!6rU27u za~*aBs)H5R-^L%=klK}ScHR=?-b9aj-u8qjJb1gK0|1{z+plx0eNjQG{Q_t);L38e zlCl60ms5VGe(f&<8$Qft=w4sB zH=p+^wU=0#D~`yOAbG(eFf=f6v{*>pXvObXz$;8qtvT3ezLCPFa->Lud;u`_35}!W z{Jm>6?4krpbZds!_i*-!#nY|ZB6|a*Vzo>=g1kGXeXkbbC#2m`eTD?PpF(^1oVueKAM65qzi{-HND#+Ua5RspKsG_|V7T!HKlOTF=YR9=sf~WX z@&rzoFRJADlubk9wkgCY#;H=ITci~ncJY11jLmH_T~)O>=xE=pryGOoyi!BhH~j~7 ztltRyg|@zb1@|NNe}9644V-5IQ01$CH;!@dEbgA+^k?^QJwrsgGmL7x-9QJ8Zo2(I z>Eph74)-<@dJhGiklc}+40$a*_PE|^Blb9~zy8z_dL{~d{Wm2Ck7>$*^dDByh5`g+ z|3A(u{tvUJ#}5ycM_YoLi1t%QZplH@7zNXU8&>40o~l)KMOjo9FS* zjn8ZEr~m7rp5M=ifdKd&i$8U}zPoj%3g=a(3JbkSkJ5r`*8z{Y*rP9Cxhh<}4M%Np zMY1|A+isejFQCTA3VnN(eb%boOr+}kxpUuIM!d$fU2KSD;z*B;zt8f&{F$%t8bL^J z--Ueka<9Ha+qGI7;rcsIcoU`7iB=lTHrXv+=9rvM^m;aLr6p2UO{BoT`{leYkpe*t zztSS${2=#QiyYrFAoKf8wA8}|<$sBZ=ML+#a{EV#t+(M>o^PME|G_Rr5CS`%K)@|w_q$}pIWX&Uv|49cEza9*FTk|kCT`OCz_5T& zPF#w6v6}W3ba_wji3ec{KhbU1TGyp{(K zKB*o(U=U#8uO7#M*qXiMewA04i{Ij#_wJSpz;tituL8PJDom1d}yphaMro?Xo5HpnzxcX z_~O`vUt3Jq*n3BgEr3-SWk<`w(P&+<7;ga3#ePx(K$$h48oyo#iq%Ad6Hgv>Up|*m%yJUWw$*kiB#J@e; zIY#UYm{$Jh1Lk>qeA5aqx|`e3UBfr>yEik#^D&uHrrs*3h?ely+O3zac?AHzqO}$$a=5o?HY3Rqz-hs4*1`AO#E#1tn0s=C{9)j*x z>sqcg9Qtz7koN)5420W`vsys;`0(BZIv^3ffesrg2!}_eLvESJUH4T(gO|JZ6V2J* zQEr!wC%vm*XAh_C7-RWM(VtC#ojph6Q3aC$PEPi;jA3HG7*C(f?Tqj9o!20GF znnge4;{}rl(+cAfZdPwS8a|nT0Q# zW2o>L-5-lQlIsDhk+@cKsR+9{iqc>s*33n&+PD&o^%iDLbSy)-X=V6|q>K-tS z^Kdg;%@b``db+$QrO&vt5!<73zyYy2!2$ZZf&V2T7e|daWl~W_)i+HAA*nmA^Z9aI ziLg(kFh)>(-xm~K4+A6Gh{Bq_=oc&;Ef*;oTtH-%BDyHr8BDI4BEmV0rX`D#lY&|| zbyff|@?JwQ>ewE6wyByMPC(KzJWTp1{gfekUg5BRh(T;#h}IV6HUA6Y!zXy3!Ts-T zofC8)@vXzX#}`7~9;vz#$}Zwxi^$WheviL*G<{iADA%u&UFdT+xAP}X@DBf0q9-*6 zVeDOI;iw%B=rf<#aN38KvE+?#J?=TYi`|4L$CYq);j7<){5&ICQ=5Tvu}2iRXJx$N+k!BU0Eb>FN;hN8yfmt#hG*COa*})Mk{W&G(v$C9ct+(qP_bf{6h*OnblcegEyElrszr z3pY3r5HCCskoEs4HvbwlJmAAq%1f)~x#8P`FTqZ1|g<>#e6ci#SV}_B? z(0?2$*CWVdi4uv_i`KrydnR+SeBMexjzFM@FoodduMa3Pt*JoxGYSY^5^=vFv;65TQ z#g{cpvNgp%ohKXYWmGLu`ZdxLS*a<(t`7^zVztvUfH}EC+;dSPu-@r+otm>+%ADA! zikgcN_SI7T3u-KNDW5SVo9UX)w|h+v9uAs+{**2xP%xnm*s1%m(9O?J45LWmqGC`{ zf^$Ar?I5%OOBYz|4gbOI0rkDrT$3%gC#W)XJBby1cLVK(`Sa@{GLP*|p8jl;I$ZMe zm=^{Z*HhcF>Kf^~y|eIRmJhnkMgAf4fYBFo>(X)1h!wXc3UpT}U9Bemr2F?&;&8@5I%PCT6vNv|o% zR_btNPU2#C7U!3Z&1l(}e{X_s+F?4uybRD zSc0Ir`s)9XJl%bvu?Hez_8Xrto*Mfza(6-`;)x^URb3AcQwRP~sD!i0)a|c|Ugo0^ z_7OaNNXS4_Z8bzbC`tQM2}JIpmo^3Uw_33O4(tHZEPGouDo51>{N`h?q(B{Yi>*udDD0wZTg9F8Kf0$qu^_55Cd-B)y zG=)+tC!?(c0`cJo)2QY z=eDAfjXrMk-)n%&+|^`k73cO;nCs((pHgBN4(r>4(*6xXHFKv5@7`5a^7}_D|GrK7 z)*YEmshv|>-^1de%S9GiW&DMkhTJhKZx3|~V}ew-)BL?!(~6%kZ8!?;N9Iw(@{oN5 z^$h>RlB)c)tHlTF&=4v1OSm}85a;qz@x+7AEWnOH^o;jVXSCQ?x{&azU%YHcZpAOAP z#K%ZM4V7zSk@G)#Y5Kd)vvgIKfwL&THYP~-DTBW(5}A3>#RW?WT=%5Bzuune@G2avbj33|h-MfUp`3|reZF3SV^-qxU z@nD1F=vyQItP*_6JZKUf5+$2%wU8 zc+_8`3E`KvL$;(?!(d*oQWonc>llBBRN$85*%8AYVC?E} z<3m9T?8ELJamGkWkLN2FNjn6qEZ&6=Bc5|0c)G)=rr*Ps4KvO8S5w6EYX3b^^ zlg2#J*i((s9dv&HUo4?A@pN>gClBlq0ESUrQQd&{v%;YfFU&SQ*N*nX188a04fzro zTm0vd*`NQ`z>REhfJ`BPfE?ie??>S%*jXx?IonzNf9@$c*qZ&H6Wbc~O&8Qv{GT{` zT3BQ>cCtp|z0jQ@?o9`CJYf~1#v7?cU zbD4t~EQ%Z}KCdwm{fCv`{9nPJK-s<~l-2_sOYPW~Y<`P?w#RS#)63gGzm$QGZ$*J> z?zp9!s`5khTCJ5W(xt96xi)ID0*?GzYUYdfYV?33^QI$)^xTJ#P5RC1vHvn{KTJ&6 zj+v`?ov0SM%Xz_1zS6H|xZAl&y-ze1+x3+2feQEM&3)L*2q^9d4{@BDcHDHK$s3VR zR-|imT%7P=vRv63u0LA_>nOdL!-_M+K&AhdD1$Nw4RcR61jB;N2OX|1O7=?<#}y0G zm2341eiPGu3J3v6uPUoWsPE?cIk>_VE#c~<;^*RRMOqU^sOIb&ObDv8o;Nn=oW1qYPFaf)uKWiXwcws@Um0mURE0m6`3j}+-eBoo$gWE zl5V0tAIw*B`;?y9xeSo7LMYrpq&gCF5bf|!&}3CKSSC!V;PP-o9Ebh7mw|Wk#7$Y$&#Cp~fIaqxi+V*q)asPPZ zSTGlM%vdc%jnHI(O^O=tD0?*j)c_-~>)UnS(h;pKz!RSr3xdTNB{Z0X(=9Ae;e)r@)(k-~=EPZ4>T(r`)bNE)xx3IN#cJ4;Hk#F^YCCert>?ww>YiaYR zxO?JR^4e5avx@g#PW|)vCalHorp2s?cIGo(!7JL4ms7Y%^1=V|x9OWCa#fRQA3lf@r?GZple0Py!R~N5#^>U$uTX+vFvzBfO!%D?`pUu?VCUYydJ~4=6RtaO;MRzM{KI4#7h-*y{ z)?E*OoH=OM858(gPkt$3eO8Nt&sdT$dV@w%4l9~Thn{d^MR6rs*21J++?oZ5Vmm1c z)juPyfUHNhss)#+W3vgX=G4G^EhFg|`$&ojzpaYSq3-BR*U{rkni_3P*dMEJ$NGIZ z6eUCL*+`3g9&tA2a;8X#d=(2v&4!;Dr;QJImnxK?HC*QT7KzyPv?#p(+~kZem?^O< zcd_bHQ!2s0_jg>Bt7&&vcvM){GBUYl>981dRxMbjqIMAXu*Ijf*V0w$wjCSIci3 z3h;wn&xo$YeG8(@y6%2;%IuA^xh0l{e82(R>($C$%g@}SzRo>j8<2R$n~-er1-`!L z+M^PM>FGk_bE65HJEgb;|3AFFV~}UTwx?ZPt}b=i=(25g*|za7+qP}nwr$(CZFBmZ zd*{yFGZ7Q-hcj=)j-8R2k@+ciK5MPL@|W(<5cSbp!$_p{o!Ag6HZjw&O4yVzhSAl! zCSb+WLv8@${m$F!8!u}QFxrnu%^n<{+QSD0*eO~s1+IL1kB@cl?{nniQ^DKyZhPE| zNMjxK-dA|~hJbL*4s4nznq77p;r_v1Vi+5GR2n;pmF9>KL^xW2J`_X}ePh4|Ls4?f zCxnsJ(-6;awU0ZQ_bvIMNbN{1eChQ~kS_o{YnOLYC!^c1cPi(WEetoS9glqr6z*31 zhBV5%SMLKw^{7|H<-FBe$oH2B7NLl}kLt983qw%bq^+O|_hJ-p;Q zZJYTl+U5&3dlP}?>4q4aF<+5)*!i;FHf*ugI0K!l6<8x%zkc~`oyZ&$mWcxsmMwP( z-3!Z3__p1~3!?itqZl!n)MSbvZ8+W4#q|a9B}^IjzJ(Eb7x2T`IQFh~d{~1=`%&*j z^nK)|p03+U-|MZz@SASZUyKn_J%ljz;@Dw+Zd|cHsUUDxLkdhL(OR zFgyzQE|HuDMo`bIl`8JHnOe1o8@dsocX#B0wlLiTV66NimfnfS3?_GFFrK~mWfps9$&dc zkwFr-5_Y3ezzp43Zn?NmHPSBVP1croIOK3MNEL<6QLke;oSjuP3{1mU9gy2yCkD=6 zbGN4%j(iX%>w#kMQ_dxRQ3&XAbYh7>?vjE3(t~_^muDP-9(c?qitNK%s8$%c*?$1T z&Q6bEyxX3mZ}le9%w=2Tb`Lr*Eo@U-Q`S~U3LGnP#;`i#R;n%UqottHlIlEg<9RN{ zY3MwCO@|%Mm4Ibxo&SXZL$Aqs;}P6ezE-h1SJ-9K3OLr(iEW}fr3=Ck7Jtukn33B) z3R?z+V%SKVQgMx6hjXTUQm&;C_i74OpcAG*R>oGj(MA@FkQJlsi`0$y?UbfkNGM9L z_+2bEBlAI5#h`iD*(fh&l8Gj@OULDYd{*>Mi#Pny#)j3J)trZh%^&kq-+TBfdTm`pS=6_(Jwr zxpK+3#Q6Nu5@svMZ-hLg2iBAqQV|?vc6Ll&cJ(kKe=+l3b=_wO?JwjyMBhlP(4Bxr zx*BBh07#91{s6)N2q+P}=&lcTWX3Bp`FBghk8_SZciENr%Vh3(wcyk#j*lX$u*jeN zkM>SES-dx);*Ta>oO$@60c_QC9p^ERGpNbJqzjYMCk z@6Ah|>ZVf227`xQ0pIY|OVhU zXl;rQ*@G;G?O`aXr+-+)i-qgIv;}7C2H&8HZ5O6jT>XyePiEg3*Mofy9q`BQ>g(sG zi*)2#6VRLw>H|ayMb@wkXAH#*r3}Rhiv!dE`!fH10|SqQ?F9e>0qOj0^ZfsB1GATK z`2V2gN`X@HlZ@)+)dx|Gd^9L2EvW}YX8!V@TCPsUzAwBVusr3V^g}lwA981#`mz9E z_!qnDjP!W->kRh$%lBkLAljRV-JZp+N_YO(HgfLS&@>j6%0J^tIG8y95OdXD_@|g_ zDg5Q1fFs9)RcfmioHH_;z{`7W8BnLm>kdR;+J0FxrR6M>kUw@ZT?l+FdSRS6xn%K3+Uf@1a6guM3uU^d^MXNHBtgleVPV8vq)(HZK+>9x!)25pU0{p<(eQ6Y_Q%fywc zV$azEft(LPxXlgZM#wB!Tw9oaCvQ_x(H(p-;Rx(9h0{2|3X}=b=%JgTUpa{dQg1y# z9%B~@%HFx457CUWybb9T)ArLTM<>K~tt90V-Id9&*$C+1Pte91m8yn+s8Z?aBr<{1 ziJoy0J)nx|1DR*r-kz8{f!O2OydqTcFejS#?0>;|EJOfgZ*Bh>}aPu~RC_^ojj za`8QK4z#w17x=rw8DUT8PxX3o+0cC>{rA=1b1MmF4FUv&2mbF*G5Wu+{{LL?iW=5f zLdai6nJZUAV%W{TB%QMh#K|P91)4uw0*Zc9Q*JbrmE$J_n{;rl>|ac&aso*AN_qXg ze+?k*{rDv+dpi=%pV6qoWLbEWtD3gTzKxyz&g%Vrzm5mQGw2y4odb|@4h(Zt5YF2) zchd|EP0BT{kam%9*(_O(8zZb)Ul7qIi1;i*bN$`C!Pu4z+86HHOo@1{x8X$;r;16~ z=vF~E`z!Py_CuNINJ0Y$K<4a{?T(;AeXUnd2+VH}v#)Fo?n_rh^G2ZWQYXvHUG<0b zKrNWSZPC`U_G?3~pG3aV3}*R^!_*Z=FC8j*Otwf|!-`yW|I(y=KAd1~Y`e+QlqHOe zL6c{OCGUXqb0vN(Oz?K(Ude1`qz8G2K@!3e0o&l)djJU+THYW`E_NGN z+$p)GSj!aM^M&cC=hK4Y7*dt}R_=aKGe)-u|KM85epfonTzgBHjwIi<9 zg%^2JJ3QCH4jsL!BWko9B1z96JVa!`QWY0_riN>GGUQ;iO;NuXja4Y_cVZiyOT+l- zZ~RD@j+>U^iip7Kw>i;1)@;Vu+_$?+?*ccz$^%Nw#L5sXLKy#b^bVot6BIzosN_YL zKJK{`xx%T=&*&@(G5_odp&&aMlqE=iH*~_}%u4NpK+v@e~ zGwN=6LQZpVMl>_tIgiyIH{SI=NVewI8VKVHB;K{&fbPN$l0O!BqxZiAtGrRL)04se zR^fnvO#WRT|KBznYb$$0S^+ylJqN@85EhjG&&L1C=e9@sM?SYynng3Y7<8a~7yM5c5z>Av zLzOk;ro_cCQ}%+n-KJE>0ufE+-e|(!85LF3K)VsANcW5f$Y?zmqGm?TRFVllM0tX2 z#FfATU#kLi0>ZN`Uu_V%3!|5hM{p)z=?6#te(j(V%_ff^{dDH0GGcLY6|s@Y4h9c; zhBc!`PKw~(oUwv4)F>{YF4T=Pj{fcHcJ1{G#c|a#yHJdTepU>`vFhBsmSOWI1FCte zZ*|NWBT{Drn)L;S-igtMc4c+9#2&tm+&;Gel3)jaE5j9m#J0snJ$OcJGh%>&{Z58) zK1UEnP!k)q@gg-e<1e~X4ltTx7hj`CH|%_vcZv=w;0GxQ8l(e>E77y*>-1uAvOrAJ zRch(^k>)_&1p7_9$~FB3CXBAg+c!6*27Dc}JZr%(FnE$yOIlTV14PmN7GL@d(IK0- zUUTQ$OR@-5S6PyX=Q;TT)aB$>8C%M^o#Nay!+ny@v!NI^tVI}77aU1nSk~sL>^lw4aW`G;)@m?b_8+oPAoUOUEEFVSHTh` z<;Cu{w;v#sNM@7r&9;7F34Os>&(Rp_-9{#*k?-K1XEnI_?#a2QKdYB#OSK$Mrn?s3 zS+8VF_Alh?RF>7mv1Wz{r@g{VOHU+?DXOgIr@KQZE~HOEkxHvXfC=~+`JEBhQf3si zKxVyIri!w?(S8qs>a{}|fnF1^mF~P|1-TgZ|53aa9nAVf%*UxhAx*h6p>wgzgv{0? z?IT^@%o|x2U)ZY@9vZDPV58HqFHk~IGhV!-E(-{cY=%u#WFk8=n6ewttc*k3a#W(G z7`O6W58tR?;1${BnWn*u#j5n#6PWN9xu z*=e0hM639V9quE;E}3v&cb-A<&#LEWL`eHfXG*J^h3s%_+6k7=riwp1aq~^D04^{j zzN0+55v2QJ-!_F3=m$cV|HK_oBU)Ma_;TnL43g}U#h;+Nhj?}){xVTe2G(+<4)wubn7a^w2gmY@x;z6PO}@ zj`w}{{?nf56(KN|^+$5Yv~IUFtY<2uYvWvzbgNGfvG@Up(2|0g+kdv&+o#H7I~@DTS9-3bFASVnh|}(z&yc7Q{|E2}HN!F6H=f>LM+3#sg`5l4U!mvU`Z5_; z8jTDaAv<(5I|QZHio!uDc`aIKbkW2d5(6A!M0lG+hLUoPUL66VsLAyyQv~4{z_!E^ zjhyYEM*ujLL74KjEWVp$1l>CJQ4BWplP3(Wc!O_mn(8@u{-q4N@0I+tna`?X@VqAqB48^P) z*n$ta&?iaUQe3?z5V&&8B5vK_ABb>QSVs#c{e;JUoP`*Mz;yuk?ZqhellhX0+HYO8 zOyeh~)gwvge!h6+InJ{Gdc7Xa2BO)64wBz0Pti_nN1-+5>`)v}P13mGZrA;J`l=k8 zu2ihtpcNmpn9*$Xra5w$20*1UP3Rb|h)+x?+d~{C4VfvUCmAGbLMBw?E>NG1@S+ws7(7t$@~P3OM*uAEZ~Q z@KAH1c|CWVi(~Pfcj%J#veT)Grf;ZJmyTp?cqclplJY~3GUo0!sj^AEr(Q>q+UU!8 zJg}Iw4N*|R7O#(j3(7Z?;Xv;D2Qu0Vwi>Y+_r%^msfs;5^A%i4B1P z2F@@WeoYn0NE?bg&Krs-mZ1hh3nuorqgDSum;q?{Z0k$=0|D0{(9aiCLbd9rS2)EJYoMIp%BU!LD15tv` zCs>!oBKGKtOZn&eU<4}X#)xLoX&orHamAuiUAPJq_8=BT%jW`80osOgkf&m)Ml(l8 zKMV+MGE>8nYOtXa=fvD(s zqJv7e^%Zq)0tStQwq96}Prs1&(*0QD860f!=!azl>r%M~#9blDn=q>Ojc%V^hO5S1 zEvWQPfiIIZF@O#uLm5p!pUY{)U*4-N9sB@eOl=eqxfU4qhglg$P~b9S&YlacZ@tTM z4||6UQmnUHJ@(kl*Aa{*xK(Uj_d0SOg25qn)lkggJ*D^p<*}%Mli!n{gjtk_=>2p& zF|&W0&IGQ2HH#+lQkqeYYvMfxIgd*BRCPvUYTo%PS4Im9+Q6#mvMuXo-MQzXFd1wE ztAk-bl=z})>7YMk<5<~SSvfCV4MXmdg(D_$$set^-l5JP0_U?Z)Qz^&IXXB?0Ea6& zCav8^4vxlP?YDXB$E-+q;|4h=_SMRBs=`OJ{McgN!3IT#Hf|J^;!@*n!J_9P2ft9o zWx^i_xfr?YP?j093OJp!xGZBuS)Tvo2IoJx@%t|~TC4tYL%>?mT4FHk3sHi6z4T@z zzf1R)1A|7Jw14p2%JX)6s3-L;#faG=W$>a;wzAd5^wL z1Xu4{^v(I&_mmjT~s2^{WAkz@Z^=G;o6m%^i5#Ll?f&d?~k?DOVkPwz{I2-LB-01%&H$?u6 z8}VKN%?aGTDLwNB{qqNK2%DSdikwk=7^M%eF)WE`Rb3~`ynj@>j78?)Z=G^%V|j#n zI6~Zj{PhZg_#t40K0&YlgBnhd2nwF{xy&JsTH691Hr>10J=K4yaZHbD)+u4V$P6wr z$D2>>#`}rZfH#ZUn!V-2k}t{5Hx2Mm6cJ7og&p$(iEa6!eHuLNP@?pYgoM+_P9Cih zHq^u~B1<|0KDx!|3?F!-kJVHgAmYh2%T(tl@*jm^z>wUh@EtLt^Is*V^EGej3ZU`T z_LTwS0EL4b0EL5ofWk&#qp<1vGS%F%z(Ftho@Txp1SS8>z;$F5KE?R@7iM560FfX; z00E)=0s_+hw=+Y?#m3ssLCng?`hSW!NGV_sV|ckgxjXsl@$vHu$ALAyJm6=j#{O81 zqf!e;6Z?U&z9V?HX_=&FY|JuW4@yIm8Rrg1vo3-chwUI*rax+^Qi%K-Q}%)K4VIi) zY#d~W)|B`12Zi%q`gvW3_u82C`}H>68*!Fk5#3YO>AYzDm-HsJTGNVIlH`>l*K%3P zoHMsJic!CnGWGC)ZvMelT2{=L(L4*~#&MBDy0%(LZP2->-qwa?OO}oe%O*0t@DR)P zZqa0BnQL$+iQfR({?&19LLZ1JOF~L9^u|;O$0`ggB?Z8z@oUrJn#eY3lY!ZsF_?JSQ3K;{ERjePAt1PG$N0Z^~~i zokSozl44CZWvKn>llR;G`}tV|c1^lKmc$yYNxb}UJ0{`kl8G$A#doWfO>`|7Moq_& z+fVJ9k)mm5#dm^q(RrA(2|nkB44h_?iC^G}ibr46RpO?!LL~XQ9Mz#VFCgRFKgA_P4qJCtCF0~7-{iqk&Z*vl#XWm~W#PLp>#p;?mSLg7brrI*&sN6a|_Lj_c zdoqzuH(VCEcjGWJ>AzL5U`b-d9}a%>;HsV+qKk9+GL&bGlTahXGTZpNg0C&~B3!OQ ziqK+m3u;vJY3iNC@%5+Bz@&4_U1LpVi2zF2{JNT7ksmr4Ho;}^=K^9cI!N^Ow9APL zlIy>97!$3|;OS#bn?QfN?^lQ&jIV7_AIRutu;O6bZv4B?z~6LWc9EEFot)Hr&=e5QKD zfz=MNS>|7G-`IEbz3&9^y0|&oTy#_R)a*-gCG1;L@z*$@-r&W^yxJ%M*>1UN>w4hc zg5*pQyfi1%?_;dKlD=6M@F2dO+Rao^A)2`TvoAfY3CGdmuImU@kH;rbXs~^t@KMy2 z=R0~@ZE|wm+sBags+*3S#bF4v6>bc+f81~A5GK734TJzo+-RLe;Jf-8w!P?fTy&>l zfXY(8PDF}gt#@AbA?P=y+xQA`?o#vs?`sBP1zQ~C)_AcgBA~Tj7wkz@slRuQtx{{Qq6;#7&{w5wPOWf zFA9c%U(}{}U|GsefuedlkIMgiqI$a5>aGcvzBY(PX4s^3MFx)^$)JS&h(ya>0$p;Jdx+`nhia(TKZry*(AAShF)%Ywm zbn!{ffqQoFkrHJlJz$9m-(bUJiHQ-$O^I`mo^}*K#|aZhinZZR(1^7mLe9r|t&0z} z(8 z{QUgwamY-7nX}B)Mt3-2nCV*1bu76?Y;L5-V4f6?GE8F>c&<2MO3A6Cp3*d~_Uo85 zlX5kTctZlZ&|=nMvcd+HLIHLDD6_7nPNWAgVJCGJ5nmK*yQ;}lPh8KH$<5=snr64Z zP;*p{YacdN7Ku4{RX^U;t}`Fy90?8_(T>v2)oD$9*yk;z&Te8rOde48go&F??@AhY zM@(wKns45|vrBm|J(y^2$(t{yT-R;zbGb}2mC}$lU7@~@yx)8*%Dj!G2VsYFhgx~C zvrQ&{NT|L+*A#j4Fl`=_xHzNEJaID=Lt(8V}c-C&zS4S!-MQJrdAU=b2Gc`1i`bgqPNjC5ky`;1>Zt~+eBhPcRDaE&j zB3xN0m&o;ZiA`S+9J5)8YB(md0F1?Au_cxx#r*1c5~mvdWt}VwS=}(IIB^na`}$jU z5IaruMzKPH|;ZZdkw zEO!}}yDhT*%cXIg1LbB?&ZI-TG&pkK+pH-x%gSJ;?OIX}*(R7~TApWNGs!9LnOPpB zWiXG21WsUXTtk2U^@0hABzScUDnO+n44~w0iWb)pUN@oZ9H-t%?yg%}_6f&tE;i;W za3vMD3%imnZ-WrVNPP&&3XgW#?=n41<_e05VOfj_g*QC zWR8vGF>yOp&X-c~eo8m)P9&C@1tY>N?(%gIYNHn^`v@iHa9+?2a?j?52gs>;C zZ?g#~y6REM^_9ohU3q-^kw@ei&|wpv49=^W_BWD6J|&Z;A%hVGreyQ;Hdf zi$cz{{rLWK5WkUO?mc@5)+*7&cAQQ3SNZx}rXo?7x^uQ;}Zs%9n5EVlzCZU3yh2FF1& zycv<>Kd%aXDKYX4u^S#I*~?q8s~tPJx{3s;Q{iJ>`+k7M(+SxCQl$;|a8& zq&p~4$cmabwn=r0w4lAonI=A|e{hZ5`fNI4vwh?D>l*3H&{%i$Bcznp5ucgw5QJgI zFDQ3$_qWquB7`=A>RrfvGg%ytRX%eu=b8X0dp1`}iO(&coPSuo!x|JuarR#ioEKnVxwyGTC`SBR>wdpekO;E~T%wlGFe6Hyd)cq#NUalr45H=^s17S{^Wy!PT zU*Cb%zLYqOqV&q((Y~|t<&IixR+3O=eMRKz{AvzIA`8agh?&upZ0^8I2$$4xE#2c$YO-v@@J=3-?^0+B`W<=G!xddi>Ju; ziz-M>mEnq0D2A7gk=iy~XyyI86NRUgFzYytds>7RRXw~h%9~Z-R(_8=5UFQX=g;Nz zX%k^MPubEuaj5sQjeLPY`9#FHvV<7L!hiw_Vj?B--=*TC!zzUVo=V~?|Fa+tSQK8u zc;;_e!QDKG=fCED8=8kDloIAGxdyKIF$EGtk+mdU#rV;v3yvdQPhaMYo{9gi0X5R> zvtcxX13CaJj0pgdc%x#$Os7*e!$)t&04%$EIbI#j&*tna+h|*hMp9k3NI8juQD3)c zg`Jq=>pBDzz5j$BaTc$uZujXJT>1ICa1LaTWuL}k1U}lwqj}c#9)do=xgf+jyOAcn zB+#_NcV4$%Me6#g{B+Zc*)z{Xie_h#yKriSIegz?el)Pod|EB=E|1!x!xgUrMcuYb zxRa8c*(|vd0IkWyeW)b5E|N)J?*L9rG32?2n!St>tx(z15^>n{2G$?k7|~wx5tVw+ zb3M@Vf!tG?FMN6kO}%f8ZHKMWf?~flUIzMz4-(1GN^i!u3I8b4L%Z7&k-O>BlxZGK zX+p+0#)FKJ*ws*w+eN0Kh^F$8JJsSBWR{N|J(o9kTp5|R_YPNU4Usv=E_qdtpR2=Vf1uH3MBJ ziF7PjW75w{k^zc(v0>aPfhYZO&a(l$a-odT8wmhz!6V)=$h2Q#!_f$MswwJU;Faxen6#{?xSEWFEDsI90tkW#p#x78VSK3n^PC-4o zEs&KXZj`+b%{Fn+=;g=2!3L)!G#_urZMOx!*bE zgWw9FM6G##PTbUXbqVV_zo>fifLqKA-@UTkk+mJ=gSb29Fu($M{P{?RPGq~1BIr3X zst*AXsCSJC5wo=)=|+ajr)9@x8Ht4@#H$+{e%;Ei!Iiwq;raG8+}UWZbQ3$LL-YQ{ zXfk+NUR)cjKE}VMe`V=$fpGzPx}=6K8GYJ8>{v(ORZh8&V~4XMmu|Eh>#M8kbuK5$M|xo0>V^Pxs^+pd zOvp3Aif=Z5@VcaB7GIEo-S}{LQD=s$=9B5S#%ER-@JRAsL!M|=$q6t`9~YeqQUpgjY#Vz+Lbw}UXbC3GI^z%41Kc)hgV?TvrNBP!?9^%uYXb@Lkx51glB2W$rn3=f1yc`)DCk%Js%`J3-tFHI5gyEF;; zdl4C2X(8&GcmDoCs^m&VRyHG^po={Jfx?UMLE?>htsD4_#jVTUw@YFM-}9S*8Tq6g z?2XUYOOzI<01xFv=D2Li_jo7d| z$KUS?%|TVRI0u0b9&!$ho9ZMYr{0g|CkO3FA2HcUMh>(eF5-g~pAcVBju@YU-xi?> z|BNZ$yx$QRH$e%3C}bLf0dyOciL$KNOh!%}zDNw^i5lOu#E-0)?r5ktp-Y-qRHsiY zE)J(pJ+A9_)_)NPRO(5uga88KMEvVy{y%Xv6-@N(Os$On_u%iQ0@gALuk&N0C<7Iu zZqI_4fbALT{;IQP3HOeRLb9h$ENy#=&LE_SI5esChb^Orr3dll z;PEJcZNGL{2n*M#4c_Pk38AM@k;(EeT<2?6D$i-M*rBU}EDWUNG-;U+kA9BWLP=1v^ngPXCbDu7Z;J3txT5L0?^gZVd=-exMwaOIi% z24!oIX?O@qZgnHoIGGwYiT*rex|;Z`Y}#G{y?kNmdRL(bQH@iD+L)Y|4>D%&Tu(fK zmKIM7X-j(H=*~Qpux+)`Phn0kD{V}VUnQ@3g_KnbIMcvZ z&reuwrui;SdZ#L{RkL*+ltAUjO=Evv%66Ap+leT-Kd?pRA1Lw@bf(tZBZi8ajR?rk zjh>M+rRU*KBd9{tgrBDJs+6uOoy!%Xaz6ObEYyv4rYW?Bat`eQ zPfnFKr+H#p6Gd`kUE?yjW*@G{K4v!XqV=Nm*Re=O(;A)EFXn6b<75+p^~@3^3Ld1iE&40U*{Le+%?rbKl6n=faZ2 z-m7~X^5A^I_U|cNggl=@Ildlx^XhtNrVr-KBo#>Z_bq-O&D&;6zc?`DWP2tlHZ0T? z!GizwB;MOoXvb-c8*+6c6MW|hHu6}wN~wBe2Lfb*Njx~1d@m;@S-cnF8U9VS*ZOPzx3vW$3aI9X) zBR{bFnbUEB!=JjyB_*Y<9gdhYid<|cf|VuHs~a(iueK8769-xpSSq9>YvSMoi}|(EeMvT! zh5Z3}CvvVwHN9WsQI;;~_$rY`C7hkR(KB@#jAl3r3K?0d@-i>Y;ur|OSY*=>Y2n0txsKwUcd-r~kYSTFqhEncrT!qo z^ZkzXi+F}P~Lem_&;FoGKp3JBHlgA^y9wlF%=A@qfVVw6h zDgv2|_~3<@u~0EXX#ciOft$g4AY}W^-GSKWKod|JAPuR2@*o(ZC?@l&>nX_##c$%z zOc*^HDBXp+Q#qh2Z5D@lFh#2u+!hN#Hi5&R8xc8LOXP4V^CzDxYq_B4nhfQgv5@#R z#Y&Saw^KfTtbH$ZxZy)igJ&^O2J9|awjk!gH7hRl{9^kAMLY~S1AS&RMj5?*e*BFN ztAB}$dX8HC7SN9BHf55ybR$J_$Lccv{wb{YWG_B|H{~TThDVOz&i0;=pmh3-?WHrL zr9ax5|MJ#{DYYI9A2kW>IyJGg-faMU)va5=8q)-P2>IwB78=RVP zyH2O8svBWS{uHnk4@(+$zyh;>uouqnPIU7{T|!;4zLf`mBH;6yypBvc2O+dZJ||+} zQy?EZrnpK%GIQ_LY$`t^#;5ex+F<4bd?E2G{WTEO_`v?!4o0AdV3W`sq@rjIK9qtp zWjXF&Z{=V2e)#nupU=C|!P!5(y`r|$zyCGuRH;3a3knE`1rrEJ|KD#d{O3*9|9fD1 zQFZ;Vv4HW7lRHijfY7(1>Cp=g3>iSzy0#+iL6`(Pz#N67gIOmEO% z7tG_n#`TnY>5sRTx??bx8gb5LP(=I5`8M;N^VeQ*LNomlnL3(sif-iGea(5?p8fZA za{c}Kh6QANWA5AT>dtJQ3}e2S#Tq^&Z^%=w5m;x5S~pia{+1U@jY1h-lt^65WW7C| z1bh0|d0O?mI#DxK8FLkw6>lPryeQD3LO(R^pIx+p;m2>Ss6JiIv!XWIPSs(#lZJr> zZqBaW!f4lBXb=X?E0!8}nEL6#$fm@oyF{M8v^Vfvz@-!4DLYAXI#!U;sJl#Wep2+u zN&Hl6rVx;DU5#2l?&c-5hB|Ms8g-QdTK%hg=mFi(*pnZ>t_Y1X=#R_7EE*WUk#9|5 zbzB13>C~KNZ$e>Sm$ahW*|FrAaT&51@)7C=)f9PG7kPU}iWW=8Yn_!kLynS>F~wjW zj}B8w-Lu-fg~(*aOw2E~I(<%|s-nZj#R}6|VhLI!`=qgOrhA5KQsV2S#6XxM74Lggq+{dCp`3U~aah zkY7=xF*i9~plRGEg`jQRCbBuB(K+HdK37L)uE`2Ekwh^=HFXw(y4lGz*1r#bLPfY4 z8J^bH8;JYDKMiC}@&mTMQ6xvhm9<(+-NJA4YI9V=rof&Ui#12-kLX~+Ckt~3W}$5RiJ_Ile~ zKhady;MJ;r3XLw_?eaToXrC>&mNh3{?lA)6cj?U zPy-@u^T%>fCCEG53~ERmZOI_w=J^Qby)-IIC;1Vv7vd)p*;fSlL!dQ^>`7Rn1q!ky`Ncv}xzTc+_-T zH<09AGl=h0WmwaQOjfg{2!~V1@d<^4v6QBZv%gf}qo8|W z_TdKHZJrS8M8=qfF6IixT9<4SWAzWoCdOvZip~gjA4pfUf(h0){2h%OB#z=nU@~On z4&>131=dAEw#}BI%x`~s>4>t=KV+h;e>#6k||8esEMa`Ir;hJ6$+Jy2Z@d=p^M~$@SNYc(JKBB;ABHLrPRcM`5w*t zbU2s0to=7l3<0DVxP=@NNCAkkU%;K-Bs+(HUV*}10<2Mh3;VaW)>%X~+V6?bOo>F9>_zE!C!S61Ox*ZH)dVkzT!^Tu?jxUP`B9f%2r0*2l0|Ra8@};5+n$uF{EKHdORG&BV;iO8KuVm^Lwg#RGx;+nP4piwDFb z=*8eA!ZY&OSDmB-+{r)#-v}Z3*p{Rj|g~aXVPdIge%gI zT@r?0fOc~bFv-7c`X==>L>0r@=GhJnl#S0+xq-ENk0O~| zqDi!c*8>p(4|?-^Pv8fa02flva7eV}-fo&V^^E>ncWw4mV@Y=zL_?)I!E;Rn%3EI3 zY|2`)B1Z5nWtYGUInUvV9!qA~GSjElrx#(--mG$I-? zjhLi3vL^fZ)qB!=R@{qNqjY$~JtGh1rAPAg#P`1(_m|hBhiZZV0+K`o0y6x6WV`(z zv7XNVi1mDLE|SKT|UsV;LkQtIhjz>66bGu)?er(#qf4?jz zdxP14!TL_dDJ*8B>8WH=&oek-X{1>tpGT=JX-=1(a|S8bV{#T%#;UE`;hH)2KQ>_{ zDKBwr*=GuO8i;C7)@li8*i_WX>8vlF7j-H$G-o0Q__P&YpQjbBbFO7pa_1iu{z7`W zS!eFtONfN)hw?ozoM-852HQ$gHG8*Nw51YgJ|?VSmf_e4WNf9$p%#;Ac3fsWgD+2N zDo&=T0x-%o?Vo0e*~Ol>OUB4O<4!^oJvo-^K|U@yBWSMp?rVBkiP#F{bUDP%z1$Mu39q zCr&;^sBQj6MbMw1or7J%1{z^B``N*CDy7j&fmnsw2Aaa75SbeT?Uf9(LbXflSxDRm!T6Q^rXn z{L`s@FCodITM*ydr&PL2&tiQOU$d;7xGUlu( zIQYFwJ8dW))J7D?8rLR5qK?Mh$tql6!Ikry>$bKbpOa%U6#2cG?m5ko4Gycpx%Np5 zp?@U###jy+FR^Q9oeES40ou?o?4~|La2^i}zysf=OrxE0?at4BGA_Lj=dBmjPT&l| zB|kh(w19e${R6ZdV`C7r`hW2DPSKft-MViotk||IZ)~e#+qP|2Y}-yMwr%r`ZQIWN ze`oEp+gjf~musEY=DZwtqmSP+W}p3e*hkh`&$2Pae*MDTwt((&gBVWfSJ*Q+_?oxH z6^$-^N$|6b?NpBBZdPLNuUKT!zTz=`>wI?|a`iPGNz;hI8p+hjai2dl|1DVDPTx~< z2sWu3Tp3!TJ(U2^L)&|b964ql58M0J<(d9v$+q9)$t>9(D@FI=l3_*udAEETj~RQM zq~YLF&z~4mHm>e1JUQ&mbp?dZm4$qmm`RAp&{SUB61ZAY>xp>nyf9R~gf%9MrDmPMEYG6TQ+y&-C=OW11cigBv(Ifl?+rY?_stD|^&)3rPLD9NU2p!`U)Qlq_&W?LH ztHrVOx;~_IuoP#Wt#jw9da8_J*@xjbNejd4FG2wR@K>6OK6}cp z4VMt>TwOJViEy%rc~_bXb-F0i#HgZ9NSk2AIlq6v$+5}6%XIPA+IxwWqpxQvYxgb7 zP@vLki}Bj9WMR9>!u1%ol;H-|=@J)|W*b7fnUK!8KgHI%=i-j>T)yK+Uf-4B$P&+V z;)EydLbk@e*%^fFK4@Wf2-ib}wRFz;;-luQkdF32TO>2D#30A1!xE_u@kXNe^W7$W zX}b_lj1!c5m$s8{K1O5*jUF|Fx_iuia9Jr9K$?HZ+~A1n&Tr2RLWM6he&-(iGBzK| zV~tzny|8wSHg4k6J(}m09qWyP>NI}uzKD>KqiAOML;%qb8*`N{-70ZJzHsADQlh^| zPFBFG|7d(QE=$(I`-eQw*Zp=qs<;1gYRDe+Jaioon%wK4q=BX95$D#=fY-D;=t0NR zM#5!{qaRVE!HJ`{yuH6dUZ#PgRNZLAi&5tXtcaych0-KXf*52H3E<-ar=5sPW-q=-zfmhSJf!KG?pUSl$cNvGDar(| zJ`!AKV|WA%zJH*NuLR*q{a*GJV;SG~5VCyZR;=45B^@(s^>{7v^i%`bHHhUJ+!j*s zZyz0leW3yriF|SdnL3ERqWOMN{o-LPN+hoO>CobII$)iq1;r4$u6}3Kf$T~559)mr z!#^Ol?|geS(%$gGUlPlD1Ygm@R}#xG>&wfIVulr~K-)dOrBn6j|M=k3%+s9WZZkhHq!EIugELh7Dn{d5MFn$mB`vMA}cCm+(<-9EXM@B0Z5h zm;+yllZ}x9kyMzdbQC&pt!b`|`+EVfQ$sX0NSG6JSMPVrpU32wrm%03HG&k*w?6+WMeR`#caBntLWkpl`5WWQv4{8ECe%4TwAr}N!{ufJ^R&8Sc* zqCv;n4s`~RhMB|&bX{CcFetn9>^|Eq$a*BwzGlIxprG+Dd?d1-4c1zh8M&ugcf*zK zLtHPq8wW%h_}@Cpq?|*qss_hrl#H3c(y- z#FO14ho#>;F2v44`RNyM+*~Mwf>t#+;lZ}5$MlC)ZO#eZ69Ip^c%=7H8!y{N`Z9MW>)T5T4>P`zdLJg=-mq zGA;J>1vwgnSFhSFgM78ST1lq#XK3fJOv~k|kE1)!t_$ut*nl;Gd~=Jg1xLPH%UjwJu>&YZEIhmW1YEp0)}+M%tQ z+N(P8zr#D$wOOZLB>A3^UWe!zx;gH#DKORe1|GIO4Du%Ja>TKXC9EB=CU=P-l-+%! z4#$EG#P|M#3N+|QF0jE2Nm#3_IxlK?L$)oA^GbpjW{B(`!yLu6IgTohy3*K zP(kZR)?j84Xn8P6$@)kBPBsiigumLO?48OzBOyK$yN2Hn3L0^2EgHJkU=$$UVwrX% zm{GZ<9{7TH6xR^~J2Wrv;i3>i@S*l|8Me|jUO{K9U=8`|dM>N~pJ#BptMeOidp$61 z1hm+kS5{;W(sUSjy6yKK0 z2&1tCXzU~tg%X=NeoYV|eQ15mVH&L41jWO+PXCE9MyOOot`(K$3&(QB2=58h1MEAv zGUe`7o!@!l>4yMGl|flKxtV3&OyG;*ySBah@Zv7I~YK)r2 zyX}yw|F&!Sye%u2%5uY)b@B(dt5&&w7qFIEc4uY$x^Y7BUbDNj=(7aQcHA@)cU?KG^bo5*GBabu?iGhRc)l zXEkaUTo(P)b#W_Bu9U zMls_r2F>a*N8T;hO$+V?(sfY!2QI3+y*=BOsVY;3sLEjCsI*#el!lDO&;g7DEcDUK ztwcfo;dg_bu-;HP;5D{-+H3^H=}_Jgz<=$>xtAgilkaIcoUi02}rL%=}-JMX`y8OFW$G5PTR}kHr{)8q80$&oirjKB5f(LTe zJ@%M`S>c!vrUYH{)h(yX#rOs~cU|?U+79EDxLOuj$XIqxLaBIt3&RwStqM#aPkg6;?=a~ zF!BIXJ>r$-2Xnp9Zk~oIe<>K=V||&}{ci3QDdJTQ>vUM8m{SQ={cw;21+t=qq7UMC z3R8Vq#pmjeDZRH_Ip}%pE|huTs^C00!<29%Yf*m{8j>2KN$4*I@1;po$^@}N?7D}2 zGaSR94Ll3MHzbSSeiXJ*!dS|d^C#g&>C+j;wpu96?+r@>^h%+R;Tl&bp=Ey;dGK2@ zO7~Uo6C-F`%0Uz5Jj-<}nV%`_oI87M#sgYT0jZo1o-Lt9OcaGu%#-uIxT!f5&k`V}o(D@tvdwyP#%a}&zbWINqYyv;ImDBq`o zYbby@ch!lBvUf6Ev)vARX(p@Z1?sdS9u&usv)&`t%wCoX2J}Wr(1C2WaUyKnftZAhyh->6Dl&M9LlkqsP>H!Du6~~M zRjc6C#hU@3+D!r$oetql#K!Rfzt5onCqJCcV-n(F$}g}`FFq`4&J4W89E>Smz*?XN zO7sR#_UZ@ABggDcw?Jt-Mz-e$N!|5PdNq1irV#bh_9Q@NX8TAmmE+7l`Z47Ent@M! z)Gt)Sr{pJX#HczuiP2_Q)DZHi%lu4~Y%`%#S}BFi+(ct(?EZuE9ipFqnUQkVRpeON z;cM`R&jING*-!!lq%&mB6&Lf&$%#0^Y1N0!=bvqm*cg-{SM%5v7@Y+}W?j+_xFzjUOJH+?83CM?;yI}X!%QbI2wCwwN}^61lpLjiQ^;8ZUMc! zt$u!k4|Jb!FIYr<8Y_5@ukH~oVkN6xZ%eP7g>kqon(XYc##cQ&*#RsBC1EQ{TXwo* z`9Y@3Sv8_6;D-!~MCHBJj*&7aK+(?W@Qt=J5clD690vuWQ>k|fbZZD8(W%z^{-O{6 zdlzGAiJ|--;t6dv+*nab|0+U@q0W+bm)$MurwYanK1QbtWfBQi6WVL+7uys&z=8jJ zYc~H!@7C=5-zLP-fqP#8P#_?FDF2OivHu5u{|cP?*WZGQCaxC$GM#h!cmC-)p)UW& zRnT}<7aBJTB(M*@*}7raBC({|;)f8e7{wq($%@68rshGDYDa|YVgJL-O_Fb*?0V|- zLp~6SU@bktcs?D0-0l#y?+FB zv0iI=Gvst(6MuruO^dsIS2?3vWsY~-21iB7Zl$XH@Pv%bbtBXh`0xQmt5t*5o$qB^ zp}|I8wab-LmP#|zBf)om)P1NyRwbsFfCRdhQ)hS5ysP~9?D{lWpDQd)RA|l<%FLx z;@~q->i7n@U1y10eITU$`EZHrI)Nsh5wqPWEhn(a+WGF%B4N08ccmu1{xB8M8=SCS zdFEBp17x8YIo~-wZPET#ooL2XE`k`gthNKbc)h!9I{pebTJcnLB#P9=!HIz$q#)l4jc3{8kd1ZmA`4^@ zRg$+)@Ko$*65y;$?xV^|d0+;mn$SXEo!YS$=cPn?cB9Q0^c?Hv- zl5V%=W6*5&%SJwD*D?|P%9yK6pX%lD5icrRZ8;e%Ki%fAx3zUFU*`giu0hsws15mD zh36iCut5_3+81Pur+X!Q#2wFmnoz&)PIePXV4C3>ZTqJ7{8_VNTnVUA=!jyu6DEga z@b{DJZtmzPRD$$#gV1&NDH#oQ`#5UE=U83HsVaaDYTeyxhC@e z{6b;mx5Z|Qc9_lO#*L_CYwU~cz}8ByGs>(SE}vtu6Ib0{$v}88Q_~orUCr1sa&!6A zSzU6(*A&5p$ckIZ!P9ksKpsskU_3PtyIyFFIrxJ< z%V%#H^R7fGD&}B4PS9BS6h)G^@O-GI(k;NhDDG)4VI3oXSdVng!otl25$5A-&BB~n>~S)ugAIWFFO1AsMVq^9dgRQIV>u4+?QUF~ z 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⩔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 literal 0 HcmV?d00001 diff --git a/app/proguard.cfg b/app/proguard.cfg index 738663b299..579ac31ea7 100644 --- a/app/proguard.cfg +++ b/app/proguard.cfg @@ -69,9 +69,6 @@ public static final int define_*; } -#From here CloudRail --keep class com.cloudrail.** { *; } - #From here BouncyCastle -keep class org.bouncycastle.crypto.* {*;} -keep class org.bouncycastle.crypto.agreement.** {*;} diff --git a/app/src/fdroid/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java b/app/src/fdroid/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java deleted file mode 100644 index e176ef4f38..0000000000 --- a/app/src/fdroid/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.asynchronous.asynctasks; - -import java.lang.ref.WeakReference; - -import com.amaze.filemanager.database.CloudHandler; -import com.amaze.filemanager.ui.activities.MainActivity; - -import android.database.Cursor; -import android.os.AsyncTask; - -import androidx.annotation.NonNull; - -public class CloudLoaderAsyncTask extends AsyncTask { - - private final WeakReference mainActivity; - - public CloudLoaderAsyncTask(MainActivity mainActivity, CloudHandler unused1, Cursor unused2) { - this.mainActivity = new WeakReference<>(mainActivity); - } - - @Override - @NonNull - public Boolean doInBackground(Void... voids) { - return false; - } - - @Override - protected void onCancelled() { - super.onCancelled(); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - mainActivity - .getSupportLoaderManager() - .destroyLoader(MainActivity.REQUEST_CODE_CLOUD_LIST_KEY); - mainActivity - .getSupportLoaderManager() - .destroyLoader(MainActivity.REQUEST_CODE_CLOUD_LIST_KEYS); - } - } - - @Override - public void onPostExecute(@NonNull Boolean result) { - if (result) { - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - mainActivity.getDrawer().refreshDrawer(); - mainActivity.invalidateFragmentAndBundle(null, true); - } - } - } -} diff --git a/app/src/fdroid/java/com/cloudrail/si/CloudRail.java b/app/src/fdroid/java/com/cloudrail/si/CloudRail.java deleted file mode 100644 index 4deb9185e8..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/CloudRail.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si; - -import android.content.Intent; - -public class CloudRail { - public static void setAuthenticationResponse(Intent i) {} - - public static void setAppKey(String id) {} -} diff --git a/app/src/fdroid/java/com/cloudrail/si/interfaces/CloudStorage.java b/app/src/fdroid/java/com/cloudrail/si/interfaces/CloudStorage.java deleted file mode 100644 index 853aacb113..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/interfaces/CloudStorage.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si.interfaces; - -import java.io.InputStream; -import java.util.Collections; -import java.util.List; - -import com.cloudrail.si.types.CloudMetaData; -import com.cloudrail.si.types.SpaceAllocation; - -public class CloudStorage { - - public List getChildren(String str) { - return Collections.emptyList(); - } - - public void logout() {} - - public void delete(String path) {} - - public void move(String path1, String path2) {} - - public void copy(String path1, String path2) {} - - public boolean exists(String path) { - return false; - } - - public void loadAsString(String str) {} - - public SpaceAllocation getAllocation() { - return new SpaceAllocation(); - } - - public void login() {} - - public String saveAsString() { - return ""; - } - - public String getUserLogin() { - return ""; - } - - public void useAdvancedAuthentication() {} - - public void createFolder(String extSyncFolder) {} - - public InputStream download(String path) { - return null; - } - - public InputStream getThumbnail(String path) { - return null; - } - - public void upload(String extSyncFile, InputStream outStream, long length, boolean b) {} - - public CloudMetaData getMetadata(String str) { - return null; - } - - public String createShareLink(String str) { - return ""; - } -} diff --git a/app/src/fdroid/java/com/cloudrail/si/services/Box.java b/app/src/fdroid/java/com/cloudrail/si/services/Box.java deleted file mode 100644 index e1031449f8..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/services/Box.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si.services; - -import com.cloudrail.si.interfaces.CloudStorage; - -import android.content.Context; - -public class Box extends CloudStorage { - public Box(Context unused1, String unused2, String unused3) { - super(); - } -} diff --git a/app/src/fdroid/java/com/cloudrail/si/services/Dropbox.java b/app/src/fdroid/java/com/cloudrail/si/services/Dropbox.java deleted file mode 100644 index 76d55c771e..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/services/Dropbox.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si.services; - -import com.cloudrail.si.interfaces.CloudStorage; - -import android.content.Context; - -public class Dropbox extends CloudStorage { - - public Dropbox(Context unused1, String unused2, String unused3, String unused4, String unused5) { - super(); - } -} diff --git a/app/src/fdroid/java/com/cloudrail/si/services/GoogleDrive.java b/app/src/fdroid/java/com/cloudrail/si/services/GoogleDrive.java deleted file mode 100644 index 2af786722c..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/services/GoogleDrive.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si.services; - -import com.cloudrail.si.interfaces.CloudStorage; - -import android.content.Context; - -public class GoogleDrive extends CloudStorage { - public GoogleDrive( - Context unused1, String unused2, String unused3, String unused4, String unused5) { - super(); - } -} diff --git a/app/src/fdroid/java/com/cloudrail/si/services/OneDrive.java b/app/src/fdroid/java/com/cloudrail/si/services/OneDrive.java deleted file mode 100644 index b94d8e8069..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/services/OneDrive.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si.services; - -import com.cloudrail.si.interfaces.CloudStorage; - -import android.content.Context; - -public class OneDrive extends CloudStorage { - public OneDrive(Context unused1, String unused2, String unused3, String unused4, String unused5) { - super(); - } -} diff --git a/app/src/fdroid/java/com/cloudrail/si/types/CloudMetaData.java b/app/src/fdroid/java/com/cloudrail/si/types/CloudMetaData.java deleted file mode 100644 index 4fa5b4e799..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/types/CloudMetaData.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si.types; - -public class CloudMetaData { - public String getPath() { - return ""; - } - - public String getName() { - return ""; - } - - public Long getModifiedAt() { - return 0L; - } - - public long getSize() { - return 0; - } - - public boolean getFolder() { - return false; - } - - public String getImageMetaData() { - return ""; - } -} diff --git a/app/src/fdroid/java/com/cloudrail/si/types/SpaceAllocation.java b/app/src/fdroid/java/com/cloudrail/si/types/SpaceAllocation.java deleted file mode 100644 index 54e3b78c68..0000000000 --- a/app/src/fdroid/java/com/cloudrail/si/types/SpaceAllocation.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.cloudrail.si.types; - -public class SpaceAllocation { - public long getUsed() { - return 0; - } - - public long getTotal() { - return 0; - } -} diff --git a/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.kt b/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.kt index e0dd9db9db..1a1390d4a3 100644 --- a/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.kt +++ b/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.kt @@ -94,7 +94,7 @@ class HiddenAdapter( val task = DeleteTask(context, false) task.execute(filesToDelete) } - DataUtils.getInstance().removeHiddenFile(hiddenFiles[position].path) + DataUtils.removeHiddenFile(hiddenFiles[position].path) hiddenFiles.remove(hiddenFiles[position]) notifyItemRemoved(position) } diff --git a/app/src/main/java/com/amaze/filemanager/adapters/data/LayoutElementParcelable.java b/app/src/main/java/com/amaze/filemanager/adapters/data/LayoutElementParcelable.java index 82539cefb3..f1247a5da0 100644 --- a/app/src/main/java/com/amaze/filemanager/adapters/data/LayoutElementParcelable.java +++ b/app/src/main/java/com/amaze/filemanager/adapters/data/LayoutElementParcelable.java @@ -21,7 +21,6 @@ package com.amaze.filemanager.adapters.data; import java.io.File; -import java.util.Calendar; import com.amaze.filemanager.fileoperations.filesystem.OpenMode; import com.amaze.filemanager.filesystem.HybridFileParcelable; @@ -38,9 +37,7 @@ public class LayoutElementParcelable implements Parcelable, ComparableParcelable { - private static final String CURRENT_YEAR = - String.valueOf(Calendar.getInstance().get(Calendar.YEAR)); - + public final String cloudFileId; public final boolean isBack; public final int filetype; public final IconDataParcelable iconData; @@ -62,6 +59,7 @@ public LayoutElementParcelable( this( c, true, + "", new File("..").getName(), "..", "", @@ -77,6 +75,7 @@ public LayoutElementParcelable( public LayoutElementParcelable( @NonNull Context c, + String cloudFileId, String path, String permissions, String symlink, @@ -89,6 +88,7 @@ public LayoutElementParcelable( OpenMode openMode) { this( c, + cloudFileId, new File(path).getName(), path, permissions, @@ -104,6 +104,7 @@ public LayoutElementParcelable( public LayoutElementParcelable( @NonNull Context c, + String cloudFileId, String title, String path, String permissions, @@ -118,6 +119,7 @@ public LayoutElementParcelable( this( c, false, + cloudFileId, title, path, permissions, @@ -134,6 +136,7 @@ public LayoutElementParcelable( public LayoutElementParcelable( @NonNull Context c, boolean isBack, + String cloudFileId, String title, String path, String permissions, @@ -180,7 +183,7 @@ public LayoutElementParcelable( } else { this.iconData = new IconDataParcelable(IconDataParcelable.IMAGE_RES, fallbackIcon); } - + this.cloudFileId = cloudFileId; this.title = title; this.desc = path; this.permissions = permissions.trim(); @@ -210,6 +213,7 @@ public void setMode(OpenMode mode) { public HybridFileParcelable generateBaseFile() { HybridFileParcelable baseFile = new HybridFileParcelable(desc, permissions, date, longSize, isDirectory); + baseFile.setCloudFileId(cloudFileId); baseFile.setMode(mode); baseFile.setName(title); return baseFile; @@ -228,6 +232,7 @@ public String toString() { public LayoutElementParcelable(Parcel im) { filetype = im.readInt(); iconData = im.readParcelable(IconDataParcelable.class.getClassLoader()); + cloudFileId = im.readString(); title = im.readString(); desc = im.readString(); permissions = im.readString(); @@ -253,6 +258,7 @@ public int describeContents() { public void writeToParcel(Parcel p1, int p2) { p1.writeInt(filetype); p1.writeParcelable(iconData, 0); + p1.writeString(cloudFileId); p1.writeString(title); p1.writeString(desc); p1.writeString(permissions); diff --git a/app/src/main/java/com/amaze/filemanager/adapters/glide/cloudicon/CloudIconModelLoader.java b/app/src/main/java/com/amaze/filemanager/adapters/glide/cloudicon/CloudIconModelLoader.java index 33edfb754d..b168f8b977 100644 --- a/app/src/main/java/com/amaze/filemanager/adapters/glide/cloudicon/CloudIconModelLoader.java +++ b/app/src/main/java/com/amaze/filemanager/adapters/glide/cloudicon/CloudIconModelLoader.java @@ -23,7 +23,7 @@ import static com.amaze.filemanager.filesystem.ftp.NetCopyClientConnectionPool.SSH_URI_PREFIX; import static com.amaze.filemanager.filesystem.smb.CifsContexts.SMB_URI_PREFIX; -import com.amaze.filemanager.database.CloudHandler; +import com.amaze.filemanager.database.CloudContract; import com.bumptech.glide.load.Options; import com.bumptech.glide.load.model.ModelLoader; import com.bumptech.glide.signature.ObjectKey; @@ -55,10 +55,10 @@ public LoadData buildLoadData(String s, int width, int height, Options o @Override public boolean handles(String s) { - return s.startsWith(CloudHandler.CLOUD_PREFIX_BOX) - || s.startsWith(CloudHandler.CLOUD_PREFIX_DROPBOX) - || s.startsWith(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE) - || s.startsWith(CloudHandler.CLOUD_PREFIX_ONE_DRIVE) + return s.startsWith(CloudContract.CLOUD_PREFIX_BOX) + || s.startsWith(CloudContract.CLOUD_PREFIX_DROPBOX) + || s.startsWith(CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE) + || s.startsWith(CloudContract.CLOUD_PREFIX_ONE_DRIVE) || s.startsWith(SMB_URI_PREFIX) || s.startsWith(SSH_URI_PREFIX); } diff --git a/app/src/main/java/com/amaze/filemanager/application/AppConfig.java b/app/src/main/java/com/amaze/filemanager/application/AppConfig.java index 93908a81c3..deb7094771 100644 --- a/app/src/main/java/com/amaze/filemanager/application/AppConfig.java +++ b/app/src/main/java/com/amaze/filemanager/application/AppConfig.java @@ -45,6 +45,7 @@ import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants; import com.amaze.filemanager.ui.provider.UtilitiesProvider; import com.amaze.filemanager.utils.ScreenUtils; +import com.amaze.filemanager.utils.omh.AuthTrigger; import com.amaze.trashbin.TrashBin; import com.amaze.trashbin.TrashBinConfig; @@ -74,6 +75,7 @@ public class AppConfig extends GlideApplication { private UtilitiesProvider utilsProvider; private UtilsHandler utilsHandler; + private AuthTrigger cloudAuthTrigger; private WeakReference mainActivityContext; private static ScreenUtils screenUtils; @@ -81,11 +83,11 @@ public class AppConfig extends GlideApplication { private static AppConfig instance; private UtilitiesDatabase utilitiesDatabase; - private ExplorerDatabase explorerDatabase; private TrashBinConfig trashBinConfig; private TrashBin trashBin; + private static final String TRASH_BIN_BASE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + ".AmazeData"; @@ -214,6 +216,10 @@ public void setMainActivityContext(@NonNull Activity activity) { screenUtils = new ScreenUtils(activity); } + public void setCloudAuthTrigger(@NonNull AuthTrigger cloudAuthTrigger) { + this.cloudAuthTrigger = cloudAuthTrigger; + } + public ScreenUtils getScreenUtils() { return screenUtils; } @@ -223,6 +229,10 @@ public Context getMainActivityContext() { return mainActivityContext.get(); } + public AuthTrigger getCloudAuthTrigger() { + return cloudAuthTrigger; + } + public ExplorerDatabase getExplorerDatabase() { return explorerDatabase; } diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/CountItemsOrAndSizeTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/CountItemsOrAndSizeTask.java index 78d2d58681..c70bd4294c 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/CountItemsOrAndSizeTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/CountItemsOrAndSizeTask.java @@ -33,6 +33,8 @@ import androidx.appcompat.widget.AppCompatTextView; import androidx.core.util.Pair; +import kotlin.Unit; + /** * @author Emmanuel on 12/5/2017, at 19:40. */ @@ -58,7 +60,13 @@ protected String doInBackground(Void[] params) { if (file.isDirectory(context)) { final AtomicInteger x = new AtomicInteger(0); - file.forEachChildrenFile(context, false, file -> x.incrementAndGet()); + file.forEachChildrenFile( + context, + false, + file -> { + x.incrementAndGet(); + return Unit.INSTANCE; + }); final int folderLength = x.intValue(); long folderSize; diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/DeleteTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/DeleteTask.java index 5ce3703e62..aaba2fa8b8 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/DeleteTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/DeleteTask.java @@ -36,7 +36,6 @@ import com.amaze.filemanager.filesystem.HybridFile; import com.amaze.filemanager.filesystem.HybridFileParcelable; import com.amaze.filemanager.filesystem.SafRootHolder; -import com.amaze.filemanager.filesystem.cloud.CloudUtil; import com.amaze.filemanager.filesystem.files.CryptUtil; import com.amaze.filemanager.filesystem.files.FileUtils; import com.amaze.filemanager.filesystem.files.MediaConnectionUtils; @@ -44,9 +43,9 @@ import com.amaze.filemanager.ui.fragments.CompressedExplorerFragment; import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants; import com.amaze.filemanager.ui.notifications.NotificationConstants; -import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.OTGUtil; -import com.cloudrail.si.interfaces.CloudStorage; +import com.amaze.filemanager.utils.omh.OMHClientHelper; +import com.openmobilehub.android.storage.core.OmhStorageClient; import android.app.NotificationManager; import android.content.Context; @@ -59,6 +58,8 @@ import androidx.preference.PreferenceManager; import jcifs.smb.SmbException; +import kotlin.coroutines.EmptyCoroutineContext; +import kotlinx.coroutines.BuildersKt; public class DeleteTask extends AsyncTask, String, AsyncTaskResult> { @@ -71,7 +72,6 @@ public class DeleteTask private CompressedExplorerFragment compressedExplorerFragment; private boolean doDeletePermanently; - private final DataUtils dataUtils = DataUtils.getInstance(); public DeleteTask(@NonNull Context applicationContext, @NonNull boolean doDeletePermanently) { this.applicationContext = applicationContext.getApplicationContext(); @@ -180,14 +180,29 @@ private boolean doDeleteFile(@NonNull HybridFileParcelable file) throws Exceptio case BOX: case GDRIVE: case ONEDRIVE: - CloudStorage cloudStorage = dataUtils.getAccount(file.getMode()); - try { - cloudStorage.delete(CloudUtil.stripPath(file.getMode(), file.getPath())); - return true; - } catch (Exception e) { - LOG.warn("failed to delete cloud files", e); - return false; + OmhStorageClient storageClient = OMHClientHelper.getStorageClient(file.getMode()); + if (storageClient != null) { + BuildersKt.runBlocking( + EmptyCoroutineContext.INSTANCE, + (scope, continuation) -> { + try { + storageClient.deleteFile(file.getCloudFileId(), continuation); + return true; + } catch (Exception e) { + LOG.error("Error delete cloud file", e); + return false; + } + }); } + return true; + // CloudStorage cloudStorage = dataUtils.getAccount(file.getMode()); + // try { + // cloudStorage.delete(CloudUtil.stripPath(file.getMode(), file.getPath())); + // return true; + // } catch (Exception e) { + // LOG.warn("failed to delete cloud files", e); + // return false; + // } default: try { /* SMB and SFTP (or any remote files that may support in the future) should not be diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java index ecc7cd0d65..5e36e35732 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java @@ -51,19 +51,18 @@ import com.amaze.filemanager.filesystem.files.FileListSorter; import com.amaze.filemanager.filesystem.files.sort.SortType; import com.amaze.filemanager.filesystem.root.ListFilesCommand; +import com.amaze.filemanager.ui.activities.MainActivity; import com.amaze.filemanager.ui.activities.MainActivityViewModel; -import com.amaze.filemanager.ui.fragments.CloudSheetFragment; import com.amaze.filemanager.ui.fragments.MainFragment; import com.amaze.filemanager.ui.fragments.data.MainFragmentViewModel; import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.GenericExtKt; import com.amaze.filemanager.utils.OTGUtil; import com.amaze.filemanager.utils.OnAsyncTaskFinished; -import com.amaze.filemanager.utils.OnFileFound; import com.amaze.filemanager.utils.Utils; +import com.amaze.filemanager.utils.cloud.CloudPluginUtil; import com.amaze.trashbin.TrashBin; import com.amaze.trashbin.TrashBinFile; -import com.cloudrail.si.interfaces.CloudStorage; import android.content.ContentResolver; import android.content.Context; @@ -81,11 +80,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.arch.core.util.Function; import androidx.core.util.Pair; import jcifs.smb.SmbAuthException; import jcifs.smb.SmbException; import jcifs.smb.SmbFile; +import kotlin.Unit; import kotlin.collections.CollectionsKt; public class LoadFilesListTask @@ -93,31 +94,55 @@ public class LoadFilesListTask private static final Logger LOG = LoggerFactory.getLogger(LoadFilesListTask.class); + private String cloudFolderId; private String path; private WeakReference mainFragmentReference; private WeakReference context; private OpenMode openmode; private boolean showHiddenFiles, showThumbs; - private DataUtils dataUtils = DataUtils.getInstance(); + private DataUtils dataUtils = DataUtils.INSTANCE; private OnAsyncTaskFinished>> listener; private boolean forceReload; public LoadFilesListTask( - Context context, - String path, - MainFragment mainFragment, - OpenMode openmode, + @NonNull Context context, + @NonNull String path, + @NonNull MainFragment mainFragment, + @NonNull OpenMode openmode, boolean showThumbs, boolean showHiddenFiles, boolean forceReload, - OnAsyncTaskFinished>> l) { + @NonNull OnAsyncTaskFinished>> listener) { + this( + context, + null, + path, + mainFragment, + openmode, + showThumbs, + showHiddenFiles, + forceReload, + listener); + } + + public LoadFilesListTask( + @NonNull Context context, + @Nullable String cloudFolderId, + @NonNull String path, + @NonNull MainFragment mainFragment, + @NonNull OpenMode openmode, + boolean showThumbs, + boolean showHiddenFiles, + boolean forceReload, + OnAsyncTaskFinished>> listener) { + this.cloudFolderId = (cloudFolderId == null) ? "" : cloudFolderId; this.path = path; this.mainFragmentReference = new WeakReference<>(mainFragment); this.openmode = openmode; this.context = new WeakReference<>(context); this.showThumbs = showThumbs; this.showHiddenFiles = showHiddenFiles; - this.listener = l; + this.listener = listener; this.forceReload = forceReload; } @@ -182,8 +207,9 @@ public LoadFilesListTask( case BOX: case GDRIVE: case ONEDRIVE: + final MainActivity mainActivity = mainFragment.requireMainActivity(); try { - list = listCloud(mainActivityViewModel); + list = listCloud(mainActivity, mainActivityViewModel); } catch (CloudPluginException e) { LOG.warn("failed to load cloud files", e); AppConfig.toast(context, context.getResources().getString(R.string.failed_no_connection)); @@ -360,6 +386,7 @@ private void postListCustomPathProcess( LayoutElementParcelable layoutElement = new LayoutElementParcelable( context, + baseFile.getCloudFileId(), baseFile.getName(context), baseFile.getPath(), baseFile.getPermission(), @@ -651,6 +678,7 @@ else if (cursor.getCount() > 0 && cursor.moveToFirst()) { LayoutElementParcelable element = new LayoutElementParcelable( ctx, + "", dir.getAbsolutePath(), "", "", @@ -724,6 +752,7 @@ private List listSftp( list.add(elem); } } + return Unit.INSTANCE; }); mainActivityViewModel.putInCache(path, list); } @@ -736,7 +765,10 @@ private List listOtg() { path, file -> { LayoutElementParcelable elem = createListParcelables(file); - if (elem != null) list.add(elem); + if (elem != null) { + list.add(elem); + } + return Unit.INSTANCE; }); return list; } @@ -752,7 +784,10 @@ private List listDocumentFiles( listDocumentFilesInternal( file -> { LayoutElementParcelable elem = createListParcelables(file); - if (elem != null) list.add(elem); + if (elem != null) { + list.add(elem); + } + return Unit.INSTANCE; }); mainActivityViewModel.putInCache(path, list); } @@ -760,21 +795,24 @@ private List listDocumentFiles( } private List listCloud( - @NonNull MainActivityViewModel mainActivityViewModel) throws CloudPluginException { + @NonNull MainActivity mainActivity, @NonNull MainActivityViewModel mainActivityViewModel) + throws CloudPluginException { List list; List cloudCache = mainActivityViewModel.getFromListCache(path); if (cloudCache != null && !forceReload) { list = cloudCache; } else { - CloudStorage cloudStorage = dataUtils.getAccount(openmode); list = new ArrayList<>(); listCloudInternal( - path, - cloudStorage, + mainActivity, + cloudFolderId, openmode, file -> { LayoutElementParcelable elem = createListParcelables(file); - if (elem != null) list.add(elem); + if (elem != null) { + list.add(elem); + } + return Unit.INSTANCE; }); mainActivityViewModel.putInCache(path, list); } @@ -823,7 +861,7 @@ private List listDefault( * com.amaze.filemanager.utils.OTGUtil#PREFIX_OTG} Independent of URI (or mount point) for the * OTG */ - private void listOtgInternal(String path, OnFileFound fileFound) { + private void listOtgInternal(String path, Function fileFound) { final Context context = this.context.get(); if (context == null) { @@ -834,7 +872,7 @@ private void listOtgInternal(String path, OnFileFound fileFound) { OTGUtil.getDocumentFiles(path, context, fileFound); } - private void listDocumentFilesInternal(OnFileFound fileFound) { + private void listDocumentFilesInternal(Function fileFound) { final Context context = this.context.get(); if (context == null) { @@ -847,7 +885,10 @@ private void listDocumentFilesInternal(OnFileFound fileFound) { } private void listCloudInternal( - String path, CloudStorage cloudStorage, OpenMode openMode, OnFileFound fileFoundCallback) + MainActivity mainActivity, + String cloudFolderId, + OpenMode openMode, + Function fileFoundCallback) throws CloudPluginException { final Context context = this.context.get(); @@ -856,10 +897,18 @@ private void listCloudInternal( return; } - if (!CloudSheetFragment.isCloudProviderAvailable(context)) { + if (!CloudPluginUtil.isCloudProviderAvailable(context)) { throw new CloudPluginException(); } - CloudUtil.getCloudFiles(path, cloudStorage, openMode, fileFoundCallback); + // Use a dedicated thread dispatcher instead of runBlocking - + // dirty hack for using the coroutine inside AsyncTask + try { + CloudUtil.getCloudFilesBlocking( + cloudFolderId, path, openMode, mainActivity, fileFoundCallback); + } catch (Exception e) { + LOG.warn("Cloud listing interrupted", e); + throw new CloudPluginException(); + } } } diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/MoveFiles.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/MoveFiles.java index 394a66bec3..d0721f64f3 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/MoveFiles.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/MoveFiles.java @@ -33,11 +33,8 @@ import com.amaze.filemanager.filesystem.HybridFile; import com.amaze.filemanager.filesystem.HybridFileParcelable; import com.amaze.filemanager.filesystem.Operations; -import com.amaze.filemanager.filesystem.cloud.CloudUtil; import com.amaze.filemanager.filesystem.files.FileUtils; import com.amaze.filemanager.filesystem.root.RenameFileCommand; -import com.amaze.filemanager.utils.DataUtils; -import com.cloudrail.si.interfaces.CloudStorage; import android.content.Context; @@ -133,22 +130,7 @@ private MoveFilesReturn processFile( case BOX: case ONEDRIVE: case GDRIVE: - DataUtils dataUtils = DataUtils.getInstance(); - - CloudStorage cloudStorage = dataUtils.getAccount(mode); - if (baseFile.getMode() == mode) { - // source and target both in same filesystem, use API method - try { - cloudStorage.move( - CloudUtil.stripPath(mode, baseFile.getPath()), CloudUtil.stripPath(mode, destPath)); - } catch (RuntimeException e) { - LOG.warn("failed to move file in cloud filesystem", e); - return new MoveFilesReturn(false, false, destinationSize, totalBytes); - } - } else { - // not in same filesystem, execute service - return new MoveFilesReturn(false, false, destinationSize, totalBytes); - } + // FIXME: OmhStorageClient should support move operation default: return new MoveFilesReturn(false, false, destinationSize, totalBytes); } diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt index 7ee9cb13cb..4cff3679c6 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt @@ -30,7 +30,6 @@ import com.afollestad.materialdialogs.DialogAction import com.afollestad.materialdialogs.MaterialDialog import com.amaze.filemanager.R import com.amaze.filemanager.asynchronous.asynctasks.fromTask -import com.amaze.filemanager.asynchronous.asynctasks.movecopy.PreparePasteTask.CopyNode import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil import com.amaze.filemanager.asynchronous.services.CopyService import com.amaze.filemanager.databinding.CopyDialogBinding @@ -46,7 +45,6 @@ import com.amaze.filemanager.filesystem.MakeDirectoryOperation import com.amaze.filemanager.filesystem.files.FileUtils import com.amaze.filemanager.filesystem.files.MediaConnectionUtils import com.amaze.filemanager.ui.activities.MainActivity -import com.amaze.filemanager.utils.OnFileFound import com.amaze.filemanager.utils.Utils import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope @@ -184,16 +182,13 @@ class PreparePasteTask(strongRefMain: MainActivity) { destination.forEachChildrenFile( context.get(), isRootMode, - object : OnFileFound { - override fun onFileFound(file: HybridFileParcelable) { - for (fileToCopy in filesToCopy) { - if (file.getName(context.get()) == fileToCopy.getName(context.get())) { - conflictingFiles.add(fileToCopy) - } - } + ) { file: HybridFileParcelable -> + for (fileToCopy in filesToCopy) { + if (file.getName(context.get()) == fileToCopy.getName(context.get())) { + conflictingFiles.add(fileToCopy) } - }, - ) + } + } withContext(Dispatchers.Main) { prepareDialog(conflictingFiles, conflictingDirActionMap) @Suppress("DEPRECATION") diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/DeepSearch.kt b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/DeepSearch.kt index 227626b161..19e7f00491 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/DeepSearch.kt +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/DeepSearch.kt @@ -23,6 +23,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.searchfilesystem import android.content.Context import com.amaze.filemanager.fileoperations.filesystem.OpenMode import com.amaze.filemanager.filesystem.HybridFile +import com.amaze.filemanager.filesystem.HybridFileParcelable import kotlinx.coroutines.isActive import org.slf4j.LoggerFactory import kotlin.coroutines.coroutineContext @@ -60,16 +61,7 @@ class DeepSearch( nextFile.forEachChildrenFile( applicationContext, SearchParameter.ROOT in searchParameters, - ) { file -> - if (!file.isHidden || SearchParameter.SHOW_HIDDEN_FILES in searchParameters) { - val resultRange = filter.searchFilter(file.getName(applicationContext)) - if (resultRange != null) { - publishProgress(file, resultRange) - } - if (file.isDirectory(applicationContext)) { - worklist.add(file) - } - } + ) { file: HybridFileParcelable -> } } } else { diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java b/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java index e49e0f26f0..14525210af 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java @@ -71,6 +71,8 @@ import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; +import kotlin.Unit; + public class CopyService extends AbstractProgressiveService { private static final Logger LOG = LoggerFactory.getLogger(CopyService.class); public static final String TAG_IS_ROOT_EXPLORER = "is_root"; @@ -319,6 +321,7 @@ private void findAndReplaceEncryptedEntry(HybridFileParcelable sourceFile) { // iterating each file inside source files which were copied to find instance of // any copied / moved encrypted file findAndReplaceEncryptedEntry(file); + return Unit.INSTANCE; }); } else { @@ -512,6 +515,7 @@ private void copyFiles( } catch (IOException e) { throw new IllegalStateException(e); // throw unchecked exception, no throws needed } + return Unit.INSTANCE; }); } else { if (!Operations.isFileNameValid(sourceFile.getName(c))) { diff --git a/app/src/main/java/com/amaze/filemanager/database/CloudContract.kt b/app/src/main/java/com/amaze/filemanager/database/CloudContract.kt index 533f1b2e74..3d4be9c322 100644 --- a/app/src/main/java/com/amaze/filemanager/database/CloudContract.kt +++ b/app/src/main/java/com/amaze/filemanager/database/CloudContract.kt @@ -17,22 +17,52 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +package com.amaze.filemanager.database -package com.amaze.filemanager.database; +import android.net.Uri +import androidx.core.net.toUri +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.utils.cloud.CloudPluginUtil.resolvePluginIdFrom -/** Created by vishal on 19/4/17. */ -public class CloudContract { +/** Created by vishal on 19/4/17. */ +object CloudContract { + const val CLOUD_PREFIX_BOX = "box:/" + const val CLOUD_PREFIX_DROPBOX = "dropbox:/" + const val CLOUD_PREFIX_GOOGLE_DRIVE = "gdrive:/" + const val CLOUD_PREFIX_ONE_DRIVE = "onedrive:/" - public static final String APP_PACKAGE_NAME = "com.filemanager.amazecloud"; + const val CLOUD_NAME_GOOGLE_DRIVE = "Google Driveâ„¢" + const val CLOUD_NAME_DROPBOX = "Dropbox" + const val CLOUD_NAME_ONE_DRIVE = "One Drive" + const val CLOUD_NAME_BOX = "Box" - public static final String PROVIDER_AUTHORITY = "com.amaze.cloud.provider"; + const val APP_PACKAGE_NAME: String = "com.amaze.cloud" + const val PROVIDER_AUTHORITY: String = "com.amaze.cloud.provider" + const val PERMISSION_PROVIDER: String = "com.amaze.cloud.permission.ACCESS_PROVIDER" - public static final String PERMISSION_PROVIDER = "com.amaze.cloud.permission.ACCESS_PROVIDER"; + const val DATABASE_NAME: String = "keys.db" + const val TABLE_NAME: String = "secret_keys" + const val COLUMN_ID: String = "_id" + const val COLUMN_CLIENT_ID: String = "client_id" + const val COLUMN_CLIENT_SECRET_KEY: String = "client_secret" - public static final String DATABASE_NAME = "keys.db"; - public static final String TABLE_NAME = "secret_keys"; - public static final String COLUMN_ID = "_id"; - public static final String COLUMN_CLIENT_ID = "client_id"; - public static final String COLUMN_CLIENT_SECRET_KEY = "client_secret"; - public static final int DATABASE_VERSION = 1; + val URI: Uri = + Uri.withAppendedPath( + "content://$PROVIDER_AUTHORITY".toUri(), + "keys.db/secret_keys", + ) + + val PROJECTION = arrayOf(COLUMN_ID, COLUMN_CLIENT_ID, COLUMN_CLIENT_SECRET_KEY) + + val ENABLED_PROVIDERS = + arrayOf( + OpenMode.GDRIVE, + OpenMode.DROPBOX, + OpenMode.ONEDRIVE, + ) + + val ENABLED_PROVIDER_IDS: Array = + ENABLED_PROVIDERS.map { + resolvePluginIdFrom(it).toString() + }.toTypedArray() } diff --git a/app/src/main/java/com/amaze/filemanager/database/CloudHandler.java b/app/src/main/java/com/amaze/filemanager/database/CloudHandler.java deleted file mode 100644 index ad826679de..0000000000 --- a/app/src/main/java/com/amaze/filemanager/database/CloudHandler.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.database; - -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.amaze.filemanager.database.models.explorer.CloudEntry; -import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException; -import com.amaze.filemanager.fileoperations.filesystem.OpenMode; -import com.amaze.filemanager.ui.fragments.CloudSheetFragment; - -import android.content.Context; - -import androidx.annotation.NonNull; - -import io.reactivex.schedulers.Schedulers; - -/** Created by vishal on 18/4/17. */ -public class CloudHandler { - - public static final String CLOUD_PREFIX_BOX = "box:/"; - public static final String CLOUD_PREFIX_DROPBOX = "dropbox:/"; - public static final String CLOUD_PREFIX_GOOGLE_DRIVE = "gdrive:/"; - public static final String CLOUD_PREFIX_ONE_DRIVE = "onedrive:/"; - - public static final String CLOUD_NAME_GOOGLE_DRIVE = "Google Driveâ„¢"; - public static final String CLOUD_NAME_DROPBOX = "Dropbox"; - public static final String CLOUD_NAME_ONE_DRIVE = "One Drive"; - public static final String CLOUD_NAME_BOX = "Box"; - private final Logger LOG = LoggerFactory.getLogger(CloudHandler.class); - - private final ExplorerDatabase database; - private final Context context; - - public CloudHandler(@NonNull Context context, @NonNull ExplorerDatabase explorerDatabase) { - this.context = context; - this.database = explorerDatabase; - } - - public void addEntry(CloudEntry cloudEntry) throws CloudPluginException { - - if (!CloudSheetFragment.isCloudProviderAvailable(context)) throw new CloudPluginException(); - - database.cloudEntryDao().insert(cloudEntry).subscribeOn(Schedulers.io()).subscribe(); - } - - public void clear(OpenMode serviceType) { - database - .cloudEntryDao() - .findByServiceType(serviceType.ordinal()) - .subscribeOn(Schedulers.io()) - .subscribe( - cloudEntry -> - database - .cloudEntryDao() - .delete(cloudEntry) - .subscribeOn(Schedulers.io()) - .subscribe(), - throwable -> LOG.warn("failed to delete cloud connection", throwable)); - } - - public void clearAllCloudConnections() { - database.cloudEntryDao().clear().subscribeOn(Schedulers.io()).blockingGet(); - } - - public void updateEntry(OpenMode serviceType, CloudEntry newCloudEntry) - throws CloudPluginException { - - if (!CloudSheetFragment.isCloudProviderAvailable(context)) throw new CloudPluginException(); - - database.cloudEntryDao().update(newCloudEntry).subscribeOn(Schedulers.io()).subscribe(); - } - - public CloudEntry findEntry(OpenMode serviceType) throws CloudPluginException { - - if (!CloudSheetFragment.isCloudProviderAvailable(context)) throw new CloudPluginException(); - - try { - return database - .cloudEntryDao() - .findByServiceType(serviceType.ordinal()) - .subscribeOn(Schedulers.io()) - .blockingGet(); - } catch (Exception e) { - // catch error to handle Single#onError for blockingGet - LOG.error(getClass().getSimpleName(), e); - return null; - } - } - - public List getAllEntries() throws CloudPluginException { - - if (!CloudSheetFragment.isCloudProviderAvailable(context)) throw new CloudPluginException(); - return database.cloudEntryDao().list().subscribeOn(Schedulers.io()).blockingGet(); - } -} diff --git a/app/src/main/java/com/amaze/filemanager/database/ExplorerDatabase.kt b/app/src/main/java/com/amaze/filemanager/database/ExplorerDatabase.kt index 52b6fea189..ad33e0f534 100644 --- a/app/src/main/java/com/amaze/filemanager/database/ExplorerDatabase.kt +++ b/app/src/main/java/com/amaze/filemanager/database/ExplorerDatabase.kt @@ -27,11 +27,9 @@ import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -import com.amaze.filemanager.database.daos.CloudEntryDao import com.amaze.filemanager.database.daos.EncryptedEntryDao import com.amaze.filemanager.database.daos.SortDao import com.amaze.filemanager.database.daos.TabDao -import com.amaze.filemanager.database.models.explorer.CloudEntry import com.amaze.filemanager.database.models.explorer.EncryptedEntry import com.amaze.filemanager.database.models.explorer.Sort import com.amaze.filemanager.database.models.explorer.Tab @@ -43,7 +41,7 @@ import com.amaze.filemanager.database.models.explorer.Tab * @see RoomDatabase */ @Database( - entities = [Tab::class, Sort::class, EncryptedEntry::class, CloudEntry::class], + entities = [Tab::class, Sort::class, EncryptedEntry::class], version = ExplorerDatabase.DATABASE_VERSION, ) @Suppress("StringLiteralDuplication", "ComplexMethod", "LongMethod") @@ -63,14 +61,9 @@ abstract class ExplorerDatabase : RoomDatabase() { */ abstract fun encryptedEntryDao(): EncryptedEntryDao - /** - * Returns DAO for [CloudEntry] objects. - */ - abstract fun cloudEntryDao(): CloudEntryDao - companion object { private const val DATABASE_NAME = "explorer.db" - const val DATABASE_VERSION = 11 + const val DATABASE_VERSION = 12 const val TABLE_TAB = "tab" const val TABLE_CLOUD_PERSIST = "cloud" const val TABLE_ENCRYPTED = "encrypted" @@ -317,7 +310,7 @@ abstract class ExplorerDatabase : RoomDatabase() { } internal val MIGRATION_10_11: Migration = - object : Migration(10, DATABASE_VERSION) { + object : Migration(10, 11) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL( "UPDATE " + @@ -331,6 +324,13 @@ abstract class ExplorerDatabase : RoomDatabase() { } } + internal val MIGRATION_11_12: Migration = + object : Migration(11, DATABASE_VERSION) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("DROP TABLE IF EXISTS $TABLE_CLOUD_PERSIST") + } + } + /** * Initialize the database. Optionally, may provide a custom way to create the database * with supplied [Context]. @@ -354,6 +354,7 @@ abstract class ExplorerDatabase : RoomDatabase() { .addMigrations(MIGRATION_8_9) .addMigrations(MIGRATION_9_10) .addMigrations(MIGRATION_10_11) + .addMigrations(MIGRATION_11_12) .allowMainThreadQueries() .build() } diff --git a/app/src/main/java/com/amaze/filemanager/database/daos/CloudEntryDao.java b/app/src/main/java/com/amaze/filemanager/database/daos/CloudEntryDao.java deleted file mode 100644 index 62a83b211f..0000000000 --- a/app/src/main/java/com/amaze/filemanager/database/daos/CloudEntryDao.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.database.daos; - -import static com.amaze.filemanager.database.ExplorerDatabase.COLUMN_CLOUD_SERVICE; -import static com.amaze.filemanager.database.ExplorerDatabase.TABLE_CLOUD_PERSIST; - -import java.util.List; - -import com.amaze.filemanager.database.models.explorer.CloudEntry; - -import androidx.room.Dao; -import androidx.room.Delete; -import androidx.room.Insert; -import androidx.room.Query; -import androidx.room.Transaction; -import androidx.room.Update; - -import io.reactivex.Completable; -import io.reactivex.Single; - -/** - * {@link Dao} interface definition for {@link CloudEntry}. Concrete class is generated by Room - * during build. - * - * @see Dao - * @see CloudEntry - * @see com.amaze.filemanager.database.ExplorerDatabase - */ -@Dao -public interface CloudEntryDao { - - @Insert - Completable insert(CloudEntry entry); - - @Query( - "SELECT * FROM " + TABLE_CLOUD_PERSIST + " WHERE " + COLUMN_CLOUD_SERVICE + " = :serviceType") - Single findByServiceType(int serviceType); - - @Query("SELECT * FROM " + TABLE_CLOUD_PERSIST) - Single> list(); - - @Update - Completable update(CloudEntry entry); - - @Delete - Completable delete(CloudEntry entry); - - @Transaction - @Query("DELETE FROM " + TABLE_CLOUD_PERSIST) - Completable clear(); -} diff --git a/app/src/main/java/com/amaze/filemanager/database/models/explorer/CloudEntry.java b/app/src/main/java/com/amaze/filemanager/database/models/explorer/CloudEntry.java deleted file mode 100644 index b161593856..0000000000 --- a/app/src/main/java/com/amaze/filemanager/database/models/explorer/CloudEntry.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.database.models.explorer; - -import com.amaze.filemanager.database.ExplorerDatabase; -import com.amaze.filemanager.database.models.StringWrapper; -import com.amaze.filemanager.database.typeconverters.EncryptedStringTypeConverter; -import com.amaze.filemanager.database.typeconverters.OpenModeTypeConverter; -import com.amaze.filemanager.fileoperations.filesystem.OpenMode; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; -import androidx.room.TypeConverters; - -/** Created by vishal on 18/4/17. */ -@Entity(tableName = ExplorerDatabase.TABLE_CLOUD_PERSIST) -public class CloudEntry { - - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = ExplorerDatabase.COLUMN_CLOUD_ID) - private int _id; - - @ColumnInfo(name = ExplorerDatabase.COLUMN_CLOUD_SERVICE) - @TypeConverters(OpenModeTypeConverter.class) - private OpenMode serviceType; - - @ColumnInfo(name = ExplorerDatabase.COLUMN_CLOUD_PERSIST) - @TypeConverters(EncryptedStringTypeConverter.class) - private StringWrapper persistData; - - public CloudEntry() {} - - public CloudEntry(OpenMode serviceType, String persistData) { - this.serviceType = serviceType; - this.persistData = new StringWrapper(persistData); - } - - public void setId(int _id) { - this._id = _id; - } - - public int getId() { - return this._id; - } - - public void setPersistData(StringWrapper persistData) { - this.persistData = persistData; - } - - public StringWrapper getPersistData() { - return this.persistData; - } - - /** Set the service type Support values from {@link OpenMode} */ - public void setServiceType(OpenMode openMode) { - this.serviceType = openMode; - } - - /** Returns ordinal value of service from {@link OpenMode} */ - public OpenMode getServiceType() { - return this.serviceType; - } -} diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/FileProperties.kt b/app/src/main/java/com/amaze/filemanager/filesystem/FileProperties.kt index 2fbab94011..a1727d915f 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/FileProperties.kt +++ b/app/src/main/java/com/amaze/filemanager/filesystem/FileProperties.kt @@ -30,7 +30,7 @@ import android.os.Environment import android.os.storage.StorageManager import android.provider.DocumentsContract import com.amaze.filemanager.application.AppConfig -import com.amaze.filemanager.database.CloudHandler +import com.amaze.filemanager.database.CloudContract import com.amaze.filemanager.filesystem.DeleteOperation.deleteFile import com.amaze.filemanager.filesystem.ExternalSdCardOperation.isOnExtSdCard import com.amaze.filemanager.filesystem.ftp.NetCopyClientConnectionPool @@ -180,10 +180,10 @@ object FileProperties { f.startsWith(NetCopyClientConnectionPool.FTP_URI_PREFIX) || f.startsWith(NetCopyClientConnectionPool.FTPS_URI_PREFIX) || f.startsWith(OTGUtil.PREFIX_OTG) || - f.startsWith(CloudHandler.CLOUD_PREFIX_BOX) || - f.startsWith(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE) || - f.startsWith(CloudHandler.CLOUD_PREFIX_DROPBOX) || - f.startsWith(CloudHandler.CLOUD_PREFIX_ONE_DRIVE) || + f.startsWith(CloudContract.CLOUD_PREFIX_BOX) || + f.startsWith(CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE) || + f.startsWith(CloudContract.CLOUD_PREFIX_DROPBOX) || + f.startsWith(CloudContract.CLOUD_PREFIX_ONE_DRIVE) || f.startsWith("content://") ) { return 1 diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/FileUtil.java b/app/src/main/java/com/amaze/filemanager/filesystem/FileUtil.java index 0c55808a20..2a3427023e 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/FileUtil.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/FileUtil.java @@ -38,13 +38,10 @@ import com.amaze.filemanager.exceptions.NotAllowedException; import com.amaze.filemanager.exceptions.OperationWouldOverwriteException; import com.amaze.filemanager.fileoperations.filesystem.OpenMode; -import com.amaze.filemanager.filesystem.cloud.CloudUtil; import com.amaze.filemanager.filesystem.files.GenericCopyUtil; import com.amaze.filemanager.ui.activities.MainActivity; -import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.OTGUtil; import com.amaze.filemanager.utils.smb.SmbUtil; -import com.cloudrail.si.interfaces.CloudStorage; import android.content.ContentResolver; import android.content.Context; @@ -110,157 +107,149 @@ public static final void writeUriToStorage( @NonNull final String currentPath) { MaybeOnSubscribe> writeUri = - (MaybeOnSubscribe>) - emitter -> { - List retval = new ArrayList<>(); - - for (Uri uri : uris) { - - BufferedInputStream bufferedInputStream = null; - try { - bufferedInputStream = - new BufferedInputStream(contentResolver.openInputStream(uri)); - } catch (FileNotFoundException e) { - emitter.onError(e); - return; - } - - BufferedOutputStream bufferedOutputStream = null; + emitter -> { + List retval = new ArrayList<>(); + + for (Uri uri : uris) { + + BufferedInputStream bufferedInputStream = null; + try { + bufferedInputStream = new BufferedInputStream(contentResolver.openInputStream(uri)); + } catch (FileNotFoundException e) { + emitter.onError(e); + return; + } + + BufferedOutputStream bufferedOutputStream = null; + + try { + DocumentFile documentFile = DocumentFile.fromSingleUri(mainActivity, uri); + String filename = documentFile.getName(); + if (filename == null) { + filename = uri.getLastPathSegment(); + + // For cleaning up slashes. Back in #1217 there is a case of + // Uri.getLastPathSegment() end up with a full file path + if (filename.contains("/")) + filename = filename.substring(filename.lastIndexOf('/') + 1); + } - try { - DocumentFile documentFile = DocumentFile.fromSingleUri(mainActivity, uri); - String filename = documentFile.getName(); - if (filename == null) { - filename = uri.getLastPathSegment(); + String finalFilePath = currentPath + "/" + filename; - // For cleaning up slashes. Back in #1217 there is a case of - // Uri.getLastPathSegment() end up with a full file path - if (filename.contains("/")) - filename = filename.substring(filename.lastIndexOf('/') + 1); - } + HybridFile hFile = new HybridFile(OpenMode.UNKNOWN, currentPath); + hFile.generateMode(mainActivity); - String finalFilePath = currentPath + "/" + filename; - DataUtils dataUtils = DataUtils.getInstance(); - - HybridFile hFile = new HybridFile(OpenMode.UNKNOWN, currentPath); - hFile.generateMode(mainActivity); - - switch (hFile.getMode()) { - case FILE: - case ROOT: - File targetFile = new File(finalFilePath); - if (!FileProperties.isWritableNormalOrSaf( - targetFile.getParentFile(), mainActivity.getApplicationContext())) { - emitter.onError(new NotAllowedException()); - return; - } - - DocumentFile targetDocumentFile = - ExternalSdCardOperation.getDocumentFile( - targetFile, false, mainActivity.getApplicationContext()); - - // Fallback, in case getDocumentFile() didn't properly return a - // DocumentFile - // instance - if (targetDocumentFile == null) { - targetDocumentFile = DocumentFile.fromFile(targetFile); - } - - // Lazy check... and in fact, different apps may pass in URI in different - // formats, so we could only check filename matches - // FIXME?: Prompt overwrite instead of simply blocking - if (targetDocumentFile.exists() && targetDocumentFile.length() > 0) { - emitter.onError(new OperationWouldOverwriteException()); - return; - } - - bufferedOutputStream = - new BufferedOutputStream( - contentResolver.openOutputStream(targetDocumentFile.getUri())); - retval.add(targetFile.getPath()); - break; - case SMB: - SmbFile targetSmbFile = SmbUtil.create(finalFilePath); - if (targetSmbFile.exists()) { - emitter.onError(new OperationWouldOverwriteException()); - return; - } else { - OutputStream outputStream = targetSmbFile.getOutputStream(); - bufferedOutputStream = new BufferedOutputStream(outputStream); - retval.add(HybridFile.parseAndFormatUriForDisplay(targetSmbFile.getPath())); - } - break; - case SFTP: - // FIXME: implement support - AppConfig.toast(mainActivity, mainActivity.getString(R.string.not_allowed)); - emitter.onError(new NotImplementedError()); - return; - case DROPBOX: - case BOX: - case ONEDRIVE: - case GDRIVE: - OpenMode mode = hFile.getMode(); - - CloudStorage cloudStorage = dataUtils.getAccount(mode); - String path = CloudUtil.stripPath(mode, finalFilePath); - cloudStorage.upload(path, bufferedInputStream, documentFile.length(), true); - retval.add(path); - break; - case OTG: - DocumentFile documentTargetFile = - OTGUtil.getDocumentFile(finalFilePath, mainActivity, true); - - if (documentTargetFile.exists()) { - emitter.onError(new OperationWouldOverwriteException()); - return; - } - - bufferedOutputStream = - new BufferedOutputStream( - contentResolver.openOutputStream(documentTargetFile.getUri()), - GenericCopyUtil.DEFAULT_BUFFER_SIZE); - - retval.add(documentTargetFile.getUri().getPath()); - break; - default: - return; + switch (hFile.getMode()) { + case FILE: + case ROOT: + File targetFile = new File(finalFilePath); + if (!FileProperties.isWritableNormalOrSaf( + targetFile.getParentFile(), mainActivity.getApplicationContext())) { + emitter.onError(new NotAllowedException()); + return; } - int count = 0; - byte[] buffer = new byte[GenericCopyUtil.DEFAULT_BUFFER_SIZE]; + DocumentFile targetDocumentFile = + ExternalSdCardOperation.getDocumentFile( + targetFile, false, mainActivity.getApplicationContext()); - while (count != -1) { - count = bufferedInputStream.read(buffer); - if (count != -1) { + // Fallback, in case getDocumentFile() didn't properly return a + // DocumentFile + // instance + if (targetDocumentFile == null) { + targetDocumentFile = DocumentFile.fromFile(targetFile); + } - bufferedOutputStream.write(buffer, 0, count); - } + // Lazy check... and in fact, different apps may pass in URI in different + // formats, so we could only check filename matches + // FIXME?: Prompt overwrite instead of simply blocking + if (targetDocumentFile.exists() && targetDocumentFile.length() > 0) { + emitter.onError(new OperationWouldOverwriteException()); + return; } - bufferedOutputStream.flush(); - } catch (IOException e) { - emitter.onError(e); + bufferedOutputStream = + new BufferedOutputStream( + contentResolver.openOutputStream(targetDocumentFile.getUri())); + retval.add(targetFile.getPath()); + break; + case SMB: + SmbFile targetSmbFile = SmbUtil.create(finalFilePath); + if (targetSmbFile.exists()) { + emitter.onError(new OperationWouldOverwriteException()); + return; + } else { + OutputStream outputStream = targetSmbFile.getOutputStream(); + bufferedOutputStream = new BufferedOutputStream(outputStream); + retval.add(HybridFile.parseAndFormatUriForDisplay(targetSmbFile.getPath())); + } + break; + case SFTP: + // FIXME: implement support + AppConfig.toast(mainActivity, mainActivity.getString(R.string.not_allowed)); + emitter.onError(new NotImplementedError()); return; - } finally { - try { - if (bufferedInputStream != null) { - bufferedInputStream.close(); - } - if (bufferedOutputStream != null) { - bufferedOutputStream.close(); - } - } catch (IOException e) { - emitter.onError(e); + case DROPBOX: + case BOX: + case ONEDRIVE: + case GDRIVE: + LOG.warn("Cloud write Uri not supported yet"); + break; + case OTG: + DocumentFile documentTargetFile = + OTGUtil.getDocumentFile(finalFilePath, mainActivity, true); + + if (documentTargetFile.exists()) { + emitter.onError(new OperationWouldOverwriteException()); + return; } - } + + bufferedOutputStream = + new BufferedOutputStream( + contentResolver.openOutputStream(documentTargetFile.getUri()), + GenericCopyUtil.DEFAULT_BUFFER_SIZE); + + retval.add(documentTargetFile.getUri().getPath()); + break; + default: + return; } - if (retval.size() > 0) { - emitter.onSuccess(retval); - } else { - emitter.onError(new Exception()); + int count = 0; + byte[] buffer = new byte[GenericCopyUtil.DEFAULT_BUFFER_SIZE]; + + while (count != -1) { + count = bufferedInputStream.read(buffer); + if (count != -1) { + + bufferedOutputStream.write(buffer, 0, count); + } + } + bufferedOutputStream.flush(); + + } catch (IOException e) { + emitter.onError(e); + return; + } finally { + try { + if (bufferedInputStream != null) { + bufferedInputStream.close(); + } + if (bufferedOutputStream != null) { + bufferedOutputStream.close(); + } + } catch (IOException e) { + emitter.onError(e); } - }; + } + } + + if (retval.size() > 0) { + emitter.onSuccess(retval); + } else { + emitter.onError(new Exception()); + } + }; Maybe.create(writeUri) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/HybridFile.java b/app/src/main/java/com/amaze/filemanager/filesystem/HybridFile.java index 37b01b01df..45d7ff443f 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/HybridFile.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/HybridFile.java @@ -28,6 +28,7 @@ import static com.amaze.filemanager.filesystem.smb.CifsContexts.SMB_URI_PREFIX; import static com.amaze.filemanager.filesystem.ssh.SFTPClientExtKt.READ_AHEAD_MAX_UNCONFIRMED_READS; import static com.amaze.filemanager.filesystem.ssh.SshClientUtils.sftpGetSize; +import static com.amaze.filemanager.utils.omh.OMHClientHelper.MULTI_SLASH_FOR_CLOUD; import java.io.File; import java.io.FileInputStream; @@ -48,7 +49,6 @@ import java.util.EnumSet; import java.util.List; import java.util.Locale; -import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; @@ -63,7 +63,7 @@ import com.amaze.filemanager.R; import com.amaze.filemanager.adapters.data.LayoutElementParcelable; import com.amaze.filemanager.application.AppConfig; -import com.amaze.filemanager.database.CloudHandler; +import com.amaze.filemanager.database.CloudContract; import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException; import com.amaze.filemanager.fileoperations.exceptions.ShellNotRunningException; import com.amaze.filemanager.fileoperations.filesystem.OpenMode; @@ -87,15 +87,14 @@ import com.amaze.filemanager.ui.activities.MainActivity; import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation; import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants; -import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.OTGUtil; -import com.amaze.filemanager.utils.OnFileFound; import com.amaze.filemanager.utils.Utils; +import com.amaze.filemanager.utils.omh.AuthTrigger; import com.amaze.filemanager.utils.smb.SmbUtil; import com.amaze.trashbin.TrashBin; import com.amaze.trashbin.TrashBinFile; -import com.cloudrail.si.interfaces.CloudStorage; -import com.cloudrail.si.types.SpaceAllocation; +import com.openmobilehub.android.storage.core.model.OmhStorageEntity; +import com.openmobilehub.android.storage.core.model.OmhStorageMetadata; import android.content.ContentResolver; import android.content.Context; @@ -118,6 +117,7 @@ import io.reactivex.schedulers.Schedulers; import jcifs.smb.SmbException; import jcifs.smb.SmbFile; +import kotlin.Unit; import kotlin.collections.ArraysKt; import kotlin.io.ByteStreamsKt; import kotlin.text.Charsets; @@ -134,17 +134,16 @@ /** Hybrid file for handeling all types of files */ public class HybridFile { - private static final Logger LOG = LoggerFactory.getLogger(HybridFile.class); + protected static final Logger LOG = LoggerFactory.getLogger(HybridFile.class); public static final String DOCUMENT_FILE_PREFIX = "content://com.android.externalstorage.documents"; + protected String cloudFileId; protected String path; protected OpenMode mode; protected String name; - private final DataUtils dataUtils = DataUtils.getInstance(); - public HybridFile(OpenMode mode, String path) { this.path = path; this.mode = mode; @@ -186,13 +185,13 @@ public void generateMode(Context context) { mode = OpenMode.DOCUMENT_FILE; } else if (isCustomPath()) { mode = OpenMode.CUSTOM; - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_BOX)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_BOX)) { mode = OpenMode.BOX; - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_ONE_DRIVE)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_ONE_DRIVE)) { mode = OpenMode.ONEDRIVE; - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE)) { mode = OpenMode.GDRIVE; - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_DROPBOX)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_DROPBOX)) { mode = OpenMode.DROPBOX; } else if (path.equals("7") || isTrashBin()) { mode = OpenMode.TRASH_BIN; @@ -353,6 +352,11 @@ public Long execute(@NonNull SFTPClient client) throws IOException { return getFile().lastModified(); case DOCUMENT_FILE: return getDocumentFile(false).lastModified(); + case GDRIVE: + case DROPBOX: + case BOX: + case ONEDRIVE: + return HybridFileOmhStorageExtKt.getCloudLastModified(this); case ROOT: HybridFileParcelable baseFile = generateBaseFileFromParent(); if (baseFile != null) return baseFile.getDate(); @@ -412,16 +416,7 @@ public long length(Context context) { case BOX: case ONEDRIVE: case GDRIVE: - s = - Single.fromCallable( - () -> - dataUtils - .getAccount(mode) - .getMetadata(CloudUtil.stripPath(mode, path)) - .getSize()) - .subscribeOn(Schedulers.io()) - .blockingGet(); - return s; + return HybridFileOmhStorageExtKt.getCloudFileSize(this); default: break; } @@ -609,6 +604,7 @@ public String getParent(Context context) { * * @deprecated use {@link #isDirectory(Context)} to handle content resolvers */ + @Deprecated public boolean isDirectory() { boolean isDirectory; switch (mode) { @@ -685,14 +681,13 @@ public Boolean execute(@NonNull SFTPClient client) { case BOX: case GDRIVE: case ONEDRIVE: - return Single.fromCallable( - () -> - dataUtils - .getAccount(mode) - .getMetadata(CloudUtil.stripPath(mode, path)) - .getFolder()) - .subscribeOn(Schedulers.io()) - .blockingGet(); + try { + OmhStorageMetadata metadata = HybridFileOmhStorageExtKt.getCloudFileMetadata(this); + return metadata != null && metadata.getEntity() instanceof OmhStorageEntity.OmhFolder; + } catch (CloudPluginException e) { + LOG.error("Error obtaining metadata for cloud file", e); + return false; + } case TRASH_BIN: default: // also handles the case `FILE` File file = getFile(); @@ -703,6 +698,7 @@ public Boolean execute(@NonNull SFTPClient client) { /** * @deprecated use {@link #folderSize(Context)} */ + @Deprecated public long folderSize() { long size = 0L; @@ -722,6 +718,11 @@ public long folderSize() { HybridFileParcelable baseFile = generateBaseFileFromParent(); if (baseFile != null) size = baseFile.getSize(); break; + case GDRIVE: + case DROPBOX: + case ONEDRIVE: + case BOX: + return HybridFileOmhStorageExtKt.getCloudFolderSize(this); default: return 0L; } @@ -775,19 +776,19 @@ public long folderSize(Context context) { path, context, OpenMode.DOCUMENT_FILE, - file -> totalBytes.addAndGet(FileUtils.getBaseFileSize(file, context))); + file -> { + totalBytes.addAndGet(FileUtils.getBaseFileSize(file, context)); + return Unit.INSTANCE; + }); break; case DROPBOX: case BOX: case GDRIVE: case ONEDRIVE: - size = - FileUtils.folderSizeCloud( - mode, dataUtils.getAccount(mode).getMetadata(CloudUtil.stripPath(mode, path))); - break; + return HybridFileOmhStorageExtKt.getCloudFolderSize(this); case FTP: default: - return 0l; + return 0L; } return size; } @@ -799,16 +800,15 @@ public long getUsableSpace() { case SMB: size = Single.fromCallable( - (Callable) - () -> { - try { - SmbFile smbFile = getSmbFile(); - return smbFile != null ? smbFile.getDiskFreeSpace() : 0L; - } catch (SmbException e) { - LOG.warn("failed to get usage space for smb file", e); - return 0L; - } - }) + () -> { + try { + SmbFile smbFile = getSmbFile(); + return smbFile != null ? smbFile.getDiskFreeSpace() : 0L; + } catch (SmbException e) { + LOG.warn("failed to get usage space for smb file", e); + return 0L; + } + }) .subscribeOn(Schedulers.io()) .blockingGet(); break; @@ -821,8 +821,7 @@ public long getUsableSpace() { case BOX: case GDRIVE: case ONEDRIVE: - SpaceAllocation spaceAllocation = dataUtils.getAccount(mode).getAllocation(); - size = spaceAllocation.getTotal() - spaceAllocation.getUsed(); + size = HybridFileOmhStorageExtKt.getCloudUsableSpace(this); break; case SFTP: final Long returnValue = @@ -887,7 +886,7 @@ public Long execute(@NonNull SFTPClient client) throws IOException { /** Gets total size of the disk */ public long getTotal(Context context) { - long size = 0l; + long size = 0L; switch (mode) { case SMB: // TODO: Find total storage space of SMB when JCIFS adds support @@ -907,13 +906,12 @@ public long getTotal(Context context) { case BOX: case ONEDRIVE: case GDRIVE: - SpaceAllocation spaceAllocation = dataUtils.getAccount(mode).getAllocation(); - size = spaceAllocation.getTotal(); + size = HybridFileOmhStorageExtKt.getCloudTotalSpace(this); break; case SFTP: final Long returnValue = SshClientUtils.execute( - new SFtpClientTemplate(path, true) { + new SFtpClientTemplate<>(path, true) { @Override public Long execute(@NonNull SFTPClient client) throws IOException { try { @@ -958,7 +956,8 @@ public Long execute(@NonNull SFTPClient client) throws IOException { } /** Helper method to list children of this file */ - public void forEachChildrenFile(Context context, boolean isRoot, OnFileFound onFileFound) { + public void forEachChildrenFile( + Context context, boolean isRoot, Function onFileFound) { switch (mode) { case SFTP: SshClientUtils.execute( @@ -976,7 +975,7 @@ public Boolean execute(@NonNull SFTPClient client) { continue; } HybridFileParcelable f = new HybridFileParcelable(getPath(), isDirectory, info); - onFileFound.onFileFound(f); + onFileFound.apply(f); } } catch (IOException e) { LOG.warn("IOException", e); @@ -1004,7 +1003,7 @@ public Boolean execute(@NonNull SFTPClient client) { LOG.warn("failed to get children file for smb", shouldNeverHappen); baseFile = new HybridFileParcelable(smbFile1); } - onFileFound.onFileFound(baseFile); + onFileFound.apply(baseFile); } } } catch (SmbException e) { @@ -1023,7 +1022,7 @@ public FTPFile[] executeWithFtpClient(@NonNull FTPClient ftpClient) } }); for (FTPFile ftpFile : ftpFiles) { - onFileFound.onFileFound(new HybridFileParcelable(getPath(), ftpFile)); + onFileFound.apply(new HybridFileParcelable(getPath(), ftpFile)); } break; case OTG: @@ -1037,11 +1036,8 @@ public FTPFile[] executeWithFtpClient(@NonNull FTPClient ftpClient) case BOX: case GDRIVE: case ONEDRIVE: - try { - CloudUtil.getCloudFiles(path, dataUtils.getAccount(mode), mode, onFileFound); - } catch (CloudPluginException e) { - LOG.warn("failed to get children file for cloud file", e); - } + AuthTrigger authTrigger = AppConfig.getInstance().getCloudAuthTrigger(); + CloudUtil.getCloudFilesBlocking(cloudFileId, path, mode, authTrigger, onFileFound); break; case TRASH_BIN: default: @@ -1051,7 +1047,7 @@ public FTPFile[] executeWithFtpClient(@NonNull FTPClient ftpClient) true, openMode -> null, hybridFileParcelable -> { - onFileFound.onFileFound(hybridFileParcelable); + onFileFound.apply(hybridFileParcelable); return null; }); } @@ -1064,7 +1060,13 @@ public FTPFile[] executeWithFtpClient(@NonNull FTPClient ftpClient) */ public ArrayList listFiles(Context context, boolean isRoot) { ArrayList arrayList = new ArrayList<>(); - forEachChildrenFile(context, isRoot, arrayList::add); + forEachChildrenFile( + context, + isRoot, + file -> { + arrayList.add(file); + return Unit.INSTANCE; + }); return arrayList; } @@ -1104,7 +1106,7 @@ public InputStream getInputStream(Context context) { case SFTP: inputStream = SshClientUtils.execute( - new SFtpClientTemplate(getPath(), false) { + new SFtpClientTemplate<>(getPath(), false) { @Override public InputStream execute(@NonNull final SFTPClient client) throws IOException { final RemoteFile rf = @@ -1114,12 +1116,12 @@ public InputStream execute(@NonNull final SFTPClient client) throws IOException @Override public void close() throws IOException { try { - LOG.debug("Closing input stream for {}", getPath()); + LOG.trace("Closing input stream for {}", getPath()); super.close(); } catch (Throwable e) { - e.printStackTrace(); + LOG.warn("Error closing stream", e); } finally { - LOG.debug("Closing client for {}", getPath()); + LOG.trace("Closing client for {}", getPath()); rf.close(); client.close(); } @@ -1191,9 +1193,8 @@ public InputStream executeWithFtpClient(@NonNull FTPClient ftpClient) case BOX: case GDRIVE: case ONEDRIVE: - CloudStorage cloudStorageOneDrive = dataUtils.getAccount(mode); - LOG.debug(CloudUtil.stripPath(mode, path)); - inputStream = cloudStorageOneDrive.download(CloudUtil.stripPath(mode, path)); + LOG.trace(CloudUtil.stripCloudPath(mode, path)); + inputStream = HybridFileOmhStorageExtKt.downloadCloudFile(this); break; case TRASH_BIN: default: @@ -1214,7 +1215,7 @@ public OutputStream getOutputStream(Context context) { switch (mode) { case SFTP: return SshClientUtils.execute( - new SFtpClientTemplate(getPath(), false) { + new SFtpClientTemplate<>(getPath(), false) { @Nullable @Override public OutputStream execute(@NonNull SFTPClient client) throws IOException { @@ -1244,7 +1245,7 @@ public void close() throws IOException { case FTP: outputStream = NetCopyClientUtils.INSTANCE.execute( - new FtpClientTemplate(path, false) { + new FtpClientTemplate<>(path, false) { public OutputStream executeWithFtpClient(@NonNull FTPClient ftpClient) throws IOException { ftpClient.setFileType(FTP.BINARY_FILE_TYPE); @@ -1331,18 +1332,16 @@ public Boolean execute(SFTPClient client) throws IOException { else { exists = getFtpFile() != null; } - } else if (isDropBoxFile()) { - CloudStorage cloudStorageDropbox = dataUtils.getAccount(OpenMode.DROPBOX); - exists = cloudStorageDropbox.exists(CloudUtil.stripPath(OpenMode.DROPBOX, path)); - } else if (isBoxFile()) { - CloudStorage cloudStorageBox = dataUtils.getAccount(OpenMode.BOX); - exists = cloudStorageBox.exists(CloudUtil.stripPath(OpenMode.BOX, path)); - } else if (isGoogleDriveFile()) { - CloudStorage cloudStorageGoogleDrive = dataUtils.getAccount(OpenMode.GDRIVE); - exists = cloudStorageGoogleDrive.exists(CloudUtil.stripPath(OpenMode.GDRIVE, path)); - } else if (isOneDriveFile()) { - CloudStorage cloudStorageOneDrive = dataUtils.getAccount(OpenMode.ONEDRIVE); - exists = cloudStorageOneDrive.exists(CloudUtil.stripPath(OpenMode.ONEDRIVE, path)); + } else if (isCloudDriveFile()) { + if (cloudFileId == null) { + return false; + } + try { + OmhStorageMetadata metadata = HybridFileOmhStorageExtKt.getCloudFileMetadata(this); + exists = metadata != null; + } catch (CloudPluginException e) { + LOG.error("Error fetching metadata", e); + } } else if (isLocal()) { exists = getFile().exists(); } else if (isRoot()) { @@ -1438,6 +1437,9 @@ public Boolean execute(@NonNull Session session) throws IOException { return 0 == cmd.getExitStatus(); } })); + } else if (isCloudDriveFile()) { + // do nothing + return true; } else if (isTrashBin()) { // do nothing return true; @@ -1507,12 +1509,7 @@ public Boolean executeWithFtpClient(@NonNull FTPClient ftpClient) throws IOExcep } } } else if (isCloudDriveFile()) { - CloudStorage cloudStorageDropbox = dataUtils.getAccount(mode); - try { - cloudStorageDropbox.createFolder(CloudUtil.stripPath(mode, path)); - } catch (Exception e) { - LOG.warn("failed to create folder for cloud file", e); - } + HybridFileOmhStorageExtKt.createCloudFolder(this); } else if (isTrashBin()) { // do nothing } else MakeDirectoryOperation.mkdirs(context, this); } @@ -1550,6 +1547,8 @@ public Boolean executeWithFtpClient(@NonNull FTPClient ftpClient) LOG.error("Error delete SMB file", e); throw e; } + } else if (isCloudDriveFile()) { + HybridFileOmhStorageExtKt.deleteCloudFile(this); } else if (isTrashBin()) { try { deletePermanentlyFromBin(context); @@ -1649,6 +1648,7 @@ public LayoutElementParcelable generateLayoutElement(@NonNull Context c, boolean layoutElement = new LayoutElementParcelable( c, + "", path, RootHelper.parseFilePermission(file), "", @@ -1663,6 +1663,7 @@ public LayoutElementParcelable generateLayoutElement(@NonNull Context c, boolean layoutElement = new LayoutElementParcelable( c, + "", file.getPath(), RootHelper.parseFilePermission(file), file.getPath(), @@ -1950,6 +1951,6 @@ private void openFileInternal(MainActivity activity) { } private void sanitizePathAsNecessary() { - this.path = this.path.replaceAll(MULTI_SLASH, "/"); + this.path = this.path.replaceAll(isCloudDriveFile() ? MULTI_SLASH_FOR_CLOUD : MULTI_SLASH, "/"); } } diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/HybridFileOmhStorageExt.kt b/app/src/main/java/com/amaze/filemanager/filesystem/HybridFileOmhStorageExt.kt new file mode 100644 index 0000000000..4453b25a7d --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/filesystem/HybridFileOmhStorageExt.kt @@ -0,0 +1,145 @@ +package com.amaze.filemanager.filesystem + +import android.content.Context +import com.amaze.filemanager.application.AppConfig +import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException +import com.amaze.filemanager.filesystem.HybridFile.LOG +import com.amaze.filemanager.filesystem.cloud.CloudUtil +import com.amaze.filemanager.utils.omh.OMHClientHelper +import com.amaze.filemanager.utils.omh.createFolderBlocking +import com.amaze.filemanager.utils.omh.deleteFileBlocking +import com.amaze.filemanager.utils.omh.downloadFileBlocking +import com.amaze.filemanager.utils.omh.folderSizeBlocking +import com.amaze.filemanager.utils.omh.getFileMetadataBlocking +import com.amaze.filemanager.utils.omh.getStorageQuotaBlocking +import com.amaze.filemanager.utils.omh.getStorageUsageBlocking +import com.amaze.filemanager.utils.omh.retryOnUnauthorizedBlocking +import com.openmobilehub.android.storage.core.OmhStorageClient +import com.openmobilehub.android.storage.core.model.OmhStorageEntity +import com.openmobilehub.android.storage.core.model.OmhStorageMetadata +import java.io.InputStream + +private fun HybridFile.withStorageClient( + onFailure: (Throwable) -> Unit = { + LOG.error("Error in OmhStorageClient action", it) + throw CloudPluginException(it) + }, + action: (storageClient: OmhStorageClient) -> T, +): T? { + val storageClient = OMHClientHelper.getStorageClient(mode) + if (storageClient == null) { + LOG.error("Storage client is null for mode: $mode") + return null + } + return runCatching { + retryOnUnauthorizedBlocking(mode, AppConfig.getInstance().cloudAuthTrigger) { + action(storageClient) + } + }.onFailure(onFailure).getOrNull() +} + +/** + * Extension function to download a cloud file for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.downloadCloudFile(): InputStream? = + withStorageClient { storageClient -> + val tmpFilename = "$name.amaze_tmp" + storageClient.downloadFileBlocking(cloudFileId).writeTo( + AppConfig.getInstance().openFileOutput(tmpFilename, Context.MODE_PRIVATE), + ) + AppConfig.getInstance().openFileInput(tmpFilename) + } + +/** + * Extension function to delete a cloud file for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.deleteCloudFile() { + withStorageClient { storageClient -> + storageClient.deleteFileBlocking(cloudFileId) + } +} + +/** + * Extension function to fetch the last modified time of a cloud file for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.getCloudLastModified(): Long = getCloudFileMetadata()?.entity?.modifiedTime?.time ?: 0L + +/** + * Extension function to fetch the size of a cloud file for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.getCloudFileSize(): Long = + when (val entity = getCloudFileMetadata()?.entity) { + is OmhStorageEntity.OmhFile -> entity.size?.toLong() ?: 0L + else -> 0L + } + +/** + * Extension function to fetch the size of a cloud folder for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.getCloudFolderSize(): Long = + when (getCloudFileMetadata()?.entity) { + is OmhStorageEntity.OmhFolder -> { + withStorageClient { storageClient -> + storageClient.folderSizeBlocking(cloudFileId) + } ?: 0L + } + else -> 0L + } + +/** + * Extension function to fetch the total space of the cloud storage for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.getCloudTotalSpace(): Long = + withStorageClient { storageClient -> + storageClient.getStorageQuotaBlocking() + } ?: 0L + +/** + * Extension function to fetch the usable space of the cloud storage for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.getCloudUsableSpace(): Long = + withStorageClient { storageClient -> + val quota = storageClient.getStorageQuotaBlocking() + val used = storageClient.getStorageUsageBlocking() + quota - used + } ?: 0L + +/** + * Extension function to fetch cloud file metadata for a [HybridFile] instance. + * + * Method runs blockingly. + */ +@Throws(CloudPluginException::class) +fun HybridFile.getCloudFileMetadata(): OmhStorageMetadata? { + return withStorageClient { storageClient -> + storageClient.getFileMetadataBlocking(cloudFileId) + } +} + +/** + * Extension function to create a cloud folder for a [HybridFile] instance. + * + * Method runs blockingly. + */ +fun HybridFile.createCloudFolder() { + withStorageClient { storageClient -> + storageClient.createFolderBlocking( + CloudUtil.stripCloudPath(mode, path), + cloudFileId, + ) + } +} diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/HybridFileParcelable.java b/app/src/main/java/com/amaze/filemanager/filesystem/HybridFileParcelable.java index 46381a08a8..38c06a84a5 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/HybridFileParcelable.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/HybridFileParcelable.java @@ -30,6 +30,7 @@ import com.amaze.filemanager.filesystem.files.sort.ComparableParcelable; import com.amaze.filemanager.filesystem.ftp.ExtensionsKt; import com.amaze.filemanager.utils.Utils; +import com.openmobilehub.android.storage.core.model.OmhStorageEntity; import android.content.ContentResolver; import android.content.Context; @@ -77,6 +78,7 @@ public HybridFileParcelable(SmbFile smbFile) throws SmbException { setSize(smbFile.isDirectory() ? 0 : smbFile.length()); } + /** Constructor for {@link FTPFile}. */ public HybridFileParcelable(String path, FTPFile ftpFile) { super( OpenMode.FTP, @@ -95,16 +97,41 @@ public HybridFileParcelable(String path, boolean isDirectory, RemoteResourceInfo setName(sshFile.getName()); setDirectory(isDirectory); setDate(sshFile.getAttributes().getMtime() * 1000); + setLastModified(sshFile.getAttributes().getMtime() * 1000); setSize(isDirectory ? 0 : sshFile.getAttributes().getSize()); setPermission( Integer.toString(FilePermission.toMask(sshFile.getAttributes().getPermissions()), 8)); } + /** Constructor for omh-storage {@link OmhStorageEntity}. */ + public HybridFileParcelable(String path, OpenMode openMode, OmhStorageEntity cloudFile) { + super(openMode, String.format("%s/%s", path, cloudFile.getName())); + cloudFileId = cloudFile.getId(); + setName(cloudFile.getName()); + setDirectory(cloudFile instanceof OmhStorageEntity.OmhFolder); + setDate(cloudFile.getModifiedTime() != null ? cloudFile.getModifiedTime().getTime() : 0L); + if (isDirectory) { + setSize(0L); + } else { + OmhStorageEntity.OmhFile file = OmhStorageEntity.OmhFile.class.cast(cloudFile); + setSize(file.getSize() != null ? file.getSize().longValue() : 0L); + } + setPermission(""); + } + @Override public long lastModified() { return date; } + public String getCloudFileId() { + return cloudFileId; + } + + public void setCloudFileId(String cloudFileId) { + this.cloudFileId = cloudFileId; + } + public String getName() { if (!Utils.isNullOrEmpty(name)) return name; else return super.getSimpleName(); @@ -144,13 +171,22 @@ public void setSize(long size) { this.size = size; } + @Override + public long length(Context context) { + if (isCloudDriveFile()) { + return size; + } else { + return super.length(context); + } + } + public boolean isDirectory() { return isDirectory; } @Override public boolean isDirectory(Context context) { - if (isSmb() || isSftp()) return isDirectory; + if (isSmb() || isSftp() || isCloudDriveFile()) return isDirectory; else return super.isDirectory(context); } diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/Operations.java b/app/src/main/java/com/amaze/filemanager/filesystem/Operations.java index 306eaaf3c7..84d50b074b 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/Operations.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/Operations.java @@ -20,23 +20,24 @@ package com.amaze.filemanager.filesystem; +import static android.os.Build.VERSION_CODES.KITKAT; import static com.amaze.filemanager.ui.activities.MainActivity.TAG_INTENT_FILTER_FAILED_OPS; import static com.amaze.filemanager.ui.activities.MainActivity.TAG_INTENT_FILTER_GENERAL; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; -import java.util.concurrent.Executor; +import java.util.concurrent.Callable; import org.apache.commons.net.ftp.FTPClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.amaze.filemanager.R; +import com.amaze.filemanager.application.AppConfig; import com.amaze.filemanager.fileoperations.exceptions.ShellNotRunningException; import com.amaze.filemanager.fileoperations.filesystem.OpenMode; import com.amaze.filemanager.filesystem.cloud.CloudUtil; @@ -49,13 +50,17 @@ import com.amaze.filemanager.filesystem.root.RenameFileCommand; import com.amaze.filemanager.filesystem.ssh.SFtpClientTemplate; import com.amaze.filemanager.filesystem.ssh.SshClientUtils; +import com.amaze.filemanager.ui.icons.MimeTypes; import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.OTGUtil; -import com.cloudrail.si.interfaces.CloudStorage; +import com.amaze.filemanager.utils.omh.OMHClientHelper; +import com.amaze.filemanager.utils.omh.OmhAuthClientExtKt; +import com.amaze.filemanager.utils.omh.OmhStorageClientExtKt; +import com.openmobilehub.android.storage.core.OmhStorageClient; +import com.openmobilehub.android.storage.core.model.OmhStorageEntity; import android.content.Context; import android.content.Intent; -import android.os.AsyncTask; import android.os.Build; import android.text.TextUtils; @@ -63,14 +68,18 @@ import androidx.arch.core.util.Function; import androidx.documentfile.provider.DocumentFile; +import io.reactivex.Flowable; +import io.reactivex.schedulers.Schedulers; import jcifs.smb.SmbException; import jcifs.smb.SmbFile; +import kotlin.Unit; +import kotlin.coroutines.EmptyCoroutineContext; +import kotlin.text.StringsKt; +import kotlinx.coroutines.BuildersKt; import net.schmizz.sshj.sftp.SFTPClient; public class Operations { - private static final Executor executor = AsyncTask.THREAD_POOL_EXECUTOR; - private static final Logger LOG = LoggerFactory.getLogger(Operations.class); // reserved characters by OS, shall not be allowed in file names @@ -120,150 +129,131 @@ public static void mkdir( final boolean rootMode, @NonNull final ErrorCallBack errorCallBack) { - new AsyncTask() { - - private DataUtils dataUtils = DataUtils.getInstance(); - - private Function safCreateDirectory = - input -> { - if (input != null && input.isDirectory()) { - boolean result = false; - try { - result = input.createDirectory(file.getName(context)) != null; - } catch (Exception e) { - LOG.warn("Failed to make directory", e); - } - errorCallBack.done(file, result); - } else errorCallBack.done(file, false); - return null; - }; - - @Override - protected Void doInBackground(Void... params) { - // checking whether filename is valid or a recursive call possible - if (!Operations.isFileNameValid(file.getName(context))) { - errorCallBack.invalidName(file); + Function safCreateDirectory = + input -> { + if (input != null && input.isDirectory()) { + boolean result = false; + try { + result = input.createDirectory(file.getName(context)) != null; + } catch (Exception e) { + LOG.warn("Failed to make directory", e); + } + errorCallBack.done(file, result); + } else errorCallBack.done(file, false); return null; - } + }; - if (file.exists()) { - errorCallBack.exists(file); - return null; - } + Flowable.fromCallable( + () -> { + // checking whether filename is valid or a recursive call possible + if (!Operations.isFileNameValid(file.getName(context))) { + errorCallBack.invalidName(file); + return Unit.INSTANCE; + } - // Android data directory, prohibit create directory - if (file.isAndroidDataDir()) { - errorCallBack.done(file, false); - return null; - } + if (file.exists()) { + errorCallBack.exists(file); + return Unit.INSTANCE; + } - if (file.isSftp() || file.isFtp()) { - file.mkdir(context); - /* - FIXME: throw Exceptions from HybridFile.mkdir() so errorCallback can throw Exceptions - here - */ - errorCallBack.done(file, true); - return null; - } - if (file.isSmb()) { - try { - file.getSmbFile(2000).mkdirs(); - } catch (SmbException e) { - LOG.warn("failed to make smb directories", e); - errorCallBack.done(file, false); - return null; - } - errorCallBack.done(file, file.exists()); - return null; - } - if (file.isOtgFile()) { - if (checkOtgNewFileExists(file, context)) { - errorCallBack.exists(file); - return null; - } - safCreateDirectory.apply(OTGUtil.getDocumentFile(parentFile.getPath(), context, false)); - return null; - } - if (file.isDocumentFile()) { - if (checkDocumentFileNewFileExists(file, context)) { - errorCallBack.exists(file); - return null; - } - safCreateDirectory.apply( - OTGUtil.getDocumentFile( - parentFile.getPath(), - SafRootHolder.getUriRoot(), - context, - OpenMode.DOCUMENT_FILE, - false)); - return null; - } else if (file.isDropBoxFile()) { - CloudStorage cloudStorageDropbox = dataUtils.getAccount(OpenMode.DROPBOX); - try { - cloudStorageDropbox.createFolder(CloudUtil.stripPath(OpenMode.DROPBOX, file.getPath())); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make directory in cloud connection", e); - errorCallBack.done(file, false); - } - } else if (file.isBoxFile()) { - CloudStorage cloudStorageBox = dataUtils.getAccount(OpenMode.BOX); - try { - cloudStorageBox.createFolder(CloudUtil.stripPath(OpenMode.BOX, file.getPath())); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make directory in cloud connection", e); - errorCallBack.done(file, false); - } - } else if (file.isOneDriveFile()) { - CloudStorage cloudStorageOneDrive = dataUtils.getAccount(OpenMode.ONEDRIVE); - try { - cloudStorageOneDrive.createFolder( - CloudUtil.stripPath(OpenMode.ONEDRIVE, file.getPath())); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make directory in cloud connection", e); - errorCallBack.done(file, false); - } - } else if (file.isGoogleDriveFile()) { - CloudStorage cloudStorageGdrive = dataUtils.getAccount(OpenMode.GDRIVE); - try { - cloudStorageGdrive.createFolder(CloudUtil.stripPath(OpenMode.GDRIVE, file.getPath())); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make directory in cloud connection", e); - errorCallBack.done(file, false); - } - } else { - if (file.isLocal() || file.isRoot()) { - int mode = checkFolder(new File(file.getParent(context)), context); - if (mode == 2) { - errorCallBack.launchSAF(file); - return null; - } - if (mode == 1 || mode == 0) MakeDirectoryOperation.mkdir(file.getFile(), context); - if (!file.exists() && rootMode) { - file.setMode(OpenMode.ROOT); - if (file.exists()) errorCallBack.exists(file); - try { - MakeDirectoryCommand.INSTANCE.makeDirectory( - file.getParent(context), file.getName(context)); - } catch (ShellNotRunningException e) { - LOG.warn("failed to make directory in local filesystem", e); + // Android data directory, prohibit create directory + if (file.isAndroidDataDir()) { + errorCallBack.done(file, false); + return Unit.INSTANCE; } - errorCallBack.done(file, file.exists()); - return null; - } - errorCallBack.done(file, file.exists()); - return null; - } - errorCallBack.done(file, file.exists()); - } - return null; - } - }.executeOnExecutor(executor); + if (file.isSftp() || file.isFtp()) { + file.mkdir(context); + /* + FIXME: throw Exceptions from HybridFile.mkdir() so errorCallback can throw Exceptions + here + */ + errorCallBack.done(file, true); + return Unit.INSTANCE; + } + if (file.isSmb()) { + try { + file.getSmbFile(2000).mkdirs(); + } catch (SmbException e) { + LOG.warn("failed to make smb directories", e); + errorCallBack.done(file, false); + return Unit.INSTANCE; + } + errorCallBack.done(file, file.exists()); + return Unit.INSTANCE; + } + if (file.isOtgFile()) { + if (checkOtgNewFileExists(file, context)) { + errorCallBack.exists(file); + return Unit.INSTANCE; + } + safCreateDirectory.apply( + OTGUtil.getDocumentFile(parentFile.getPath(), context, false)); + return Unit.INSTANCE; + } + if (file.isDocumentFile()) { + if (checkDocumentFileNewFileExists(file, context)) { + errorCallBack.exists(file); + return Unit.INSTANCE; + } + safCreateDirectory.apply( + OTGUtil.getDocumentFile( + parentFile.getPath(), + SafRootHolder.getUriRoot(), + context, + OpenMode.DOCUMENT_FILE, + false)); + return Unit.INSTANCE; + } else if (file.isCloudDriveFile()) { + OmhStorageClient storageClient = OMHClientHelper.getStorageClient(file.getMode()); + if (storageClient != null) { + OmhStorageEntity result = + OmhAuthClientExtKt.retryOnUnauthorizedBlocking( + file.getMode(), + AppConfig.getInstance().getCloudAuthTrigger(), + () -> { + OmhStorageEntity parentFolder = + OmhStorageClientExtKt.resolvePathBlocking( + storageClient, + CloudUtil.stripCloudPath(file.getMode(), parentFile.path)); + return OmhStorageClientExtKt.createFolderBlocking( + storageClient, + file.getSimpleName(), + parentFolder == null || parentFolder.getId() == null + ? storageClient.getRootFolder() + : parentFolder.getId()); + }); + errorCallBack.done(file, result != null); + } + } else { + if (file.isLocal() || file.isRoot()) { + int mode = checkFolder(new File(file.getParent(context)), context); + if (mode == 2) { + errorCallBack.launchSAF(file); + return Unit.INSTANCE; + } + if (mode == 1 || mode == 0) MakeDirectoryOperation.mkdir(file.getFile(), context); + if (!file.exists() && rootMode) { + file.setMode(OpenMode.ROOT); + if (file.exists()) errorCallBack.exists(file); + try { + MakeDirectoryCommand.INSTANCE.makeDirectory( + file.getParent(context), file.getName(context)); + } catch (ShellNotRunningException e) { + LOG.warn("failed to make directory in local filesystem", e); + } + errorCallBack.done(file, file.exists()); + return Unit.INSTANCE; + } + errorCallBack.done(file, file.exists()); + return Unit.INSTANCE; + } + errorCallBack.done(file, file.exists()); + } + return Unit.INSTANCE; + }) + .subscribeOn(Schedulers.io()) + .subscribe(); } public static void mkfile( @@ -273,187 +263,144 @@ public static void mkfile( final boolean rootMode, @NonNull final ErrorCallBack errorCallBack) { - new AsyncTask() { - - private DataUtils dataUtils = DataUtils.getInstance(); - - private Function safCreateFile = - input -> { - if (input != null && input.isDirectory()) { - boolean result = false; - try { - result = - input.createFile( - file.getName(context).substring(file.getName(context).lastIndexOf(".")), - file.getName(context)) - != null; - } catch (Exception e) { - LOG.warn(getClass().getSimpleName(), "Failed to make file", e); - } - errorCallBack.done(file, result); - } else errorCallBack.done(file, false); - return null; - }; - - @Override - protected Void doInBackground(Void... params) { - // check whether filename is valid or not - if (!Operations.isFileNameValid(file.getName(context))) { - errorCallBack.invalidName(file); - return null; - } - - if (file.exists()) { - errorCallBack.exists(file); - return null; - } - - // Android data directory, prohibit create file - if (file.isAndroidDataDir()) { - errorCallBack.done(file, false); + Function safCreateFile = + input -> { + if (input != null && input.isDirectory()) { + boolean result = false; + try { + result = + input.createFile( + file.getName(context).substring(file.getName(context).lastIndexOf(".")), + file.getName(context)) + != null; + } catch (Exception e) { + LOG.warn("Failed to make file", e); + } + errorCallBack.done(file, result); + } else errorCallBack.done(file, false); return null; - } + }; - if (file.isSftp() || file.isFtp()) { - OutputStream out = file.getOutputStream(context); - if (out == null) { - errorCallBack.done(file, false); - return null; - } - try { - out.close(); - errorCallBack.done(file, true); - return null; - } catch (IOException e) { - errorCallBack.done(file, false); - return null; - } - } - if (file.isSmb()) { - try { - file.getSmbFile(2000).createNewFile(); - } catch (SmbException e) { - LOG.warn("failed to make file in smb connection", e); - errorCallBack.done(file, false); - return null; - } - errorCallBack.done(file, file.exists()); - return null; - } else if (file.isDropBoxFile()) { - CloudStorage cloudStorageDropbox = dataUtils.getAccount(OpenMode.DROPBOX); - try { - byte[] tempBytes = new byte[0]; - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(tempBytes); - cloudStorageDropbox.upload( - CloudUtil.stripPath(OpenMode.DROPBOX, file.getPath()), - byteArrayInputStream, - 0l, - true); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make file in cloud connection", e); - errorCallBack.done(file, false); - } - } else if (file.isBoxFile()) { - CloudStorage cloudStorageBox = dataUtils.getAccount(OpenMode.BOX); - try { - byte[] tempBytes = new byte[0]; - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(tempBytes); - cloudStorageBox.upload( - CloudUtil.stripPath(OpenMode.BOX, file.getPath()), byteArrayInputStream, 0l, true); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make file in cloud connection", e); - errorCallBack.done(file, false); - } - } else if (file.isOneDriveFile()) { - CloudStorage cloudStorageOneDrive = dataUtils.getAccount(OpenMode.ONEDRIVE); - try { - byte[] tempBytes = new byte[0]; - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(tempBytes); - cloudStorageOneDrive.upload( - CloudUtil.stripPath(OpenMode.ONEDRIVE, file.getPath()), - byteArrayInputStream, - 0l, - true); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make file in cloud connection", e); - errorCallBack.done(file, false); - } - } else if (file.isGoogleDriveFile()) { - CloudStorage cloudStorageGdrive = dataUtils.getAccount(OpenMode.GDRIVE); - try { - byte[] tempBytes = new byte[0]; - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(tempBytes); - cloudStorageGdrive.upload( - CloudUtil.stripPath(OpenMode.GDRIVE, file.getPath()), - byteArrayInputStream, - 0l, - true); - errorCallBack.done(file, true); - } catch (Exception e) { - LOG.warn("failed to make file in cloud connection", e); - errorCallBack.done(file, false); - } - } else if (file.isOtgFile()) { - if (checkOtgNewFileExists(file, context)) { - errorCallBack.exists(file); - return null; - } - safCreateFile.apply(OTGUtil.getDocumentFile(parentFile.getPath(), context, false)); - return null; - } else if (file.isDocumentFile()) { - if (checkDocumentFileNewFileExists(file, context)) { - errorCallBack.exists(file); - return null; - } - safCreateFile.apply( - OTGUtil.getDocumentFile( - parentFile.getPath(), - SafRootHolder.getUriRoot(), - context, - OpenMode.DOCUMENT_FILE, - false)); - return null; - } else { - if (file.isLocal() || file.isRoot()) { - int mode = checkFolder(new File(file.getParent(context)), context); - if (mode == 2) { - errorCallBack.launchSAF(file); - return null; - } - if (mode == 1 || mode == 0) MakeFileOperation.mkfile(file.getFile(), context); - if (!file.exists() && rootMode) { - file.setMode(OpenMode.ROOT); - if (file.exists()) errorCallBack.exists(file); - try { - MakeFileCommand.INSTANCE.makeFile(file.getPath()); - } catch (ShellNotRunningException e) { - LOG.warn("failed to make file in local filesystem", e); + Flowable.fromCallable( + () -> { + // check whether filename is valid or not + if (!Operations.isFileNameValid(file.getName(context))) { + errorCallBack.invalidName(file); + return Unit.INSTANCE; } - errorCallBack.done(file, file.exists()); - return null; - } - errorCallBack.done(file, file.exists()); - return null; - } - errorCallBack.done(file, file.exists()); - } - return null; - } - @Override - protected void onPostExecute(Void unused) { - super.onPostExecute(unused); + if (file.exists()) { + errorCallBack.exists(file); + return Unit.INSTANCE; + } - // TODO: run this only when the operation gets completed successfully - MediaConnectionUtils.scanFile(context, file.path); + // Android data directory, prohibit create file + if (file.isAndroidDataDir()) { + errorCallBack.done(file, false); + return Unit.INSTANCE; + } - if (file.name.equals(FileUtils.NOMEDIA_FILE)) - MediaConnectionUtils.scanFile(context, file.getParent(context)); - } - }.executeOnExecutor(executor); + if (file.isSftp() || file.isFtp()) { + OutputStream out = file.getOutputStream(context); + if (out == null) { + errorCallBack.done(file, false); + return Unit.INSTANCE; + } + try { + out.close(); + errorCallBack.done(file, true); + return Unit.INSTANCE; + } catch (IOException e) { + errorCallBack.done(file, false); + return Unit.INSTANCE; + } + } + if (file.isSmb()) { + try { + file.getSmbFile(2000).createNewFile(); + } catch (SmbException e) { + LOG.warn("failed to make file in smb connection", e); + errorCallBack.done(file, false); + return Unit.INSTANCE; + } + errorCallBack.done(file, file.exists()); + return Unit.INSTANCE; + } else if (file.isCloudDriveFile()) { + OmhStorageClient storageClient = OMHClientHelper.getStorageClient(file.mode); + if (storageClient != null) { + String filename = file.getSimpleName(); + String extension = MimeTypes.getExtension(filename); + String filenameWithoutExtension = + StringsKt.substringBeforeLast(filename, ".", filename); + OmhAuthClientExtKt.retryOnUnauthorizedBlocking( + file.mode, + AppConfig.getInstance().getCloudAuthTrigger(), + () -> + OmhStorageClientExtKt.createFileWithExtensionBlocking( + storageClient, + filenameWithoutExtension, + extension, + parentFile.cloudFileId == null + ? storageClient.getRootFolder() + : parentFile.cloudFileId)); + return Unit.INSTANCE; + } + } else if (file.isOtgFile()) { + if (checkOtgNewFileExists(file, context)) { + errorCallBack.exists(file); + return Unit.INSTANCE; + } + safCreateFile.apply(OTGUtil.getDocumentFile(parentFile.getPath(), context, false)); + return Unit.INSTANCE; + } else if (file.isDocumentFile()) { + if (checkDocumentFileNewFileExists(file, context)) { + errorCallBack.exists(file); + return Unit.INSTANCE; + } + safCreateFile.apply( + OTGUtil.getDocumentFile( + parentFile.getPath(), + SafRootHolder.getUriRoot(), + context, + OpenMode.DOCUMENT_FILE, + false)); + return Unit.INSTANCE; + } else { + if (file.isLocal() || file.isRoot()) { + int mode = checkFolder(new File(file.getParent(context)), context); + if (mode == 2) { + errorCallBack.launchSAF(file); + return Unit.INSTANCE; + } + if (mode == 1 || mode == 0) MakeFileOperation.mkfile(file.getFile(), context); + if (!file.exists() && rootMode) { + file.setMode(OpenMode.ROOT); + if (file.exists()) errorCallBack.exists(file); + try { + MakeFileCommand.INSTANCE.makeFile(file.getPath()); + } catch (ShellNotRunningException e) { + LOG.warn("failed to make file in local filesystem", e); + } + errorCallBack.done(file, file.exists()); + return Unit.INSTANCE; + } + errorCallBack.done(file, file.exists()); + return Unit.INSTANCE; + } + errorCallBack.done(file, file.exists()); + } + return Unit.INSTANCE; + }) + .subscribeOn(Schedulers.io()) + .doOnComplete( + () -> { + // TODO: run this only when the operation gets completed successfully + MediaConnectionUtils.scanFile(context, file.path); + + if (file.name.equals(FileUtils.NOMEDIA_FILE)) + MediaConnectionUtils.scanFile(context, file.getParent(context)); + }) + .subscribe(); } public static void rename( @@ -463,275 +410,263 @@ public static void rename( @NonNull final Context context, @NonNull final ErrorCallBack errorCallBack) { - new AsyncTask() { - - private final DataUtils dataUtils = DataUtils.getInstance(); - - /** - * Determines whether double rename is required based on original and new file name regardless - * of the case-sensitivity of the filesystem - */ - private final boolean isCaseSensitiveRename = - oldFile.getSimpleName().equalsIgnoreCase(newFile.getSimpleName()) - && !oldFile.getSimpleName().equals(newFile.getSimpleName()); - - /** - * random string that is appended to file to prevent name collision, max file name is 255 - * bytes - */ - private static final String TEMP_FILE_EXT = "u0CtHRqWUnvxIaeBQ@nY2umVm9MDyR1P"; - - private boolean localRename(@NonNull HybridFile oldFile, @NonNull HybridFile newFile) { - File file = new File(oldFile.getPath()); - File file1 = new File(newFile.getPath()); - boolean result = false; - - switch (oldFile.getMode()) { - case FILE: - int mode = checkFolder(file.getParentFile(), context); - if (mode == 1 || mode == 0) { - try { - RenameOperation.renameFolder(file, file1, context); - } catch (ShellNotRunningException e) { - LOG.warn("failed to rename file in local filesystem", e); - } - result = !file.exists() && file1.exists(); - if (!result && rootMode) { - try { - RenameFileCommand.INSTANCE.renameFile(file.getPath(), file1.getPath()); - } catch (ShellNotRunningException e) { - LOG.warn("failed to rename file in local filesystem", e); + Flowable.fromCallable( + new Callable() { + + private final DataUtils dataUtils = DataUtils.INSTANCE; + + /** + * Determines whether double rename is required based on original and new file name + * regardless of the case-sensitivity of the filesystem + */ + private final boolean isCaseSensitiveRename = + oldFile.getSimpleName().equalsIgnoreCase(newFile.getSimpleName()) + && !oldFile.getSimpleName().equals(newFile.getSimpleName()); + + /** + * random string that is appended to file to prevent name collision, max file name is + * 255 bytes + */ + private static final String TEMP_FILE_EXT = "u0CtHRqWUnvxIaeBQ@nY2umVm9MDyR1P"; + + private boolean localRename( + @NonNull HybridFile oldFile, @NonNull HybridFile newFile) { + File file = new File(oldFile.getPath()); + File file1 = new File(newFile.getPath()); + boolean result = false; + + switch (oldFile.getMode()) { + case FILE: + int mode = checkFolder(file.getParentFile(), context); + if (mode == 1 || mode == 0) { + try { + RenameOperation.renameFolder(file, file1, context); + } catch (ShellNotRunningException e) { + LOG.warn("failed to rename file in local filesystem", e); + } + result = !file.exists() && file1.exists(); + if (!result && rootMode) { + try { + RenameFileCommand.INSTANCE.renameFile(file.getPath(), file1.getPath()); + } catch (ShellNotRunningException e) { + LOG.warn("failed to rename file in local filesystem", e); + } + oldFile.setMode(OpenMode.ROOT); + newFile.setMode(OpenMode.ROOT); + result = !file.exists() && file1.exists(); + } + } + break; + case ROOT: + try { + result = + RenameFileCommand.INSTANCE.renameFile(file.getPath(), file1.getPath()); + } catch (ShellNotRunningException e) { + LOG.warn("failed to rename file in root", e); + } + newFile.setMode(OpenMode.ROOT); + break; } - oldFile.setMode(OpenMode.ROOT); - newFile.setMode(OpenMode.ROOT); - result = !file.exists() && file1.exists(); + return result; } - } - break; - case ROOT: - try { - result = RenameFileCommand.INSTANCE.renameFile(file.getPath(), file1.getPath()); - } catch (ShellNotRunningException e) { - LOG.warn("failed to rename file in root", e); - } - newFile.setMode(OpenMode.ROOT); - break; - } - return result; - } - private boolean localDoubleRename(@NonNull HybridFile oldFile, @NonNull HybridFile newFile) { - HybridFile tempFile = new HybridFile(oldFile.mode, oldFile.getPath().concat(TEMP_FILE_EXT)); - if (localRename(oldFile, tempFile)) { - if (localRename(tempFile, newFile)) { - return true; - } else { - // attempts to rollback - // changes the temporary file name back to original file name - LOG.warn("reverting temporary file rename"); - return localRename(tempFile, oldFile); - } - } - return false; - } + private boolean localDoubleRename( + @NonNull HybridFile oldFile, @NonNull HybridFile newFile) { + HybridFile tempFile = + new HybridFile(oldFile.mode, oldFile.getPath().concat(TEMP_FILE_EXT)); + if (localRename(oldFile, tempFile)) { + if (localRename(tempFile, newFile)) { + return true; + } else { + // attempts to rollback + // changes the temporary file name back to original file name + LOG.warn("reverting temporary file rename"); + return localRename(tempFile, oldFile); + } + } + return false; + } - private Function safRenameFile = - input -> { - boolean result = false; - try { - result = input.renameTo(newFile.getName(context)); - } catch (Exception e) { - LOG.warn(getClass().getSimpleName(), "Failed to rename", e); - } - errorCallBack.done(newFile, result); - return null; - }; - - @Override - protected Void doInBackground(Void... params) { - // check whether file names for new file are valid or recursion occurs. - // If rename is on OTG, we are skipping - if (!Operations.isFileNameValid(newFile.getName(context))) { - errorCallBack.invalidName(newFile); - return null; - } + private Function safRenameFile = + input -> { + boolean result = false; + try { + result = input.renameTo(newFile.getName(context)); + } catch (Exception e) { + LOG.warn(getClass().getSimpleName(), "Failed to rename", e); + } + errorCallBack.done(newFile, result); + return null; + }; + + @Override + public Unit call() throws Exception { + // check whether file names for new file are valid or recursion occurs. + // If rename is on OTG, we are skipping + if (!Operations.isFileNameValid(newFile.getName(context))) { + errorCallBack.invalidName(newFile); + return Unit.INSTANCE; + } - if (newFile.exists() && !isCaseSensitiveRename) { - errorCallBack.exists(newFile); - return null; - } + if (newFile.exists() && !isCaseSensitiveRename) { + errorCallBack.exists(newFile); + return Unit.INSTANCE; + } - if (oldFile.isSmb()) { - try { - SmbFile smbFile = oldFile.getSmbFile(); - // FIXME: smbFile1 should be created from SmbUtil too so it can be mocked - SmbFile smbFile1 = new SmbFile(new URL(newFile.getPath()), smbFile.getContext()); - if (newFile.exists()) { - errorCallBack.exists(newFile); - return null; - } - smbFile.renameTo(smbFile1); - if (!smbFile.exists() && smbFile1.exists()) errorCallBack.done(newFile, true); - } catch (SmbException | MalformedURLException e) { - String errmsg = - context.getString( - R.string.cannot_rename_file, - HybridFile.parseAndFormatUriForDisplay(oldFile.getPath()), - e.getMessage()); - try { - ArrayList failedOps = new ArrayList<>(); - failedOps.add(new HybridFileParcelable(oldFile.getSmbFile())); - context.sendBroadcast( - new Intent(TAG_INTENT_FILTER_GENERAL) - .putParcelableArrayListExtra(TAG_INTENT_FILTER_FAILED_OPS, failedOps)); - } catch (SmbException exceptionThrownDuringBuildParcelable) { - LOG.error( - "Error creating HybridFileParcelable", exceptionThrownDuringBuildParcelable); - } - LOG.error(errmsg, e); - } - return null; - } else if (oldFile.isSftp()) { - SshClientUtils.execute( - new SFtpClientTemplate(oldFile.getPath(), true) { - @Override - public Void execute(@NonNull SFTPClient client) { + if (oldFile.isSmb()) { try { - client.rename( - NetCopyClientUtils.extractRemotePathFrom(oldFile.getPath()), - NetCopyClientUtils.extractRemotePathFrom(newFile.getPath())); - errorCallBack.done(newFile, true); - } catch (IOException e) { + SmbFile smbFile = oldFile.getSmbFile(); + // FIXME: smbFile1 should be created from SmbUtil too so it can be mocked + SmbFile smbFile1 = + new SmbFile(new URL(newFile.getPath()), smbFile.getContext()); + if (newFile.exists()) { + errorCallBack.exists(newFile); + return Unit.INSTANCE; + } + smbFile.renameTo(smbFile1); + if (!smbFile.exists() && smbFile1.exists()) errorCallBack.done(newFile, true); + } catch (SmbException | MalformedURLException e) { String errmsg = context.getString( R.string.cannot_rename_file, HybridFile.parseAndFormatUriForDisplay(oldFile.getPath()), e.getMessage()); - LOG.error(errmsg); - ArrayList failedOps = new ArrayList<>(); - // Nobody care the size or actual permission here. Put a simple "r" and zero - // here - failedOps.add( - new HybridFileParcelable( - oldFile.getPath(), - "r", - oldFile.lastModified(), - 0, - oldFile.isDirectory(context))); - context.sendBroadcast( - new Intent(TAG_INTENT_FILTER_GENERAL) - .putParcelableArrayListExtra(TAG_INTENT_FILTER_FAILED_OPS, failedOps)); - errorCallBack.done(newFile, false); + try { + ArrayList failedOps = new ArrayList<>(); + failedOps.add(new HybridFileParcelable(oldFile.getSmbFile())); + context.sendBroadcast( + new Intent(TAG_INTENT_FILTER_GENERAL) + .putParcelableArrayListExtra( + TAG_INTENT_FILTER_FAILED_OPS, failedOps)); + } catch (SmbException exceptionThrownDuringBuildParcelable) { + LOG.error( + "Error creating HybridFileParcelable", + exceptionThrownDuringBuildParcelable); + } + LOG.error(errmsg, e); + } + return Unit.INSTANCE; + } else if (oldFile.isSftp()) { + SshClientUtils.execute( + new SFtpClientTemplate(oldFile.getPath(), true) { + @Override + public Unit execute(@NonNull SFTPClient client) { + try { + client.rename( + NetCopyClientUtils.extractRemotePathFrom(oldFile.getPath()), + NetCopyClientUtils.extractRemotePathFrom(newFile.getPath())); + errorCallBack.done(newFile, true); + } catch (IOException e) { + String errmsg = + context.getString( + R.string.cannot_rename_file, + HybridFile.parseAndFormatUriForDisplay(oldFile.getPath()), + e.getMessage()); + LOG.error(errmsg); + ArrayList failedOps = new ArrayList<>(); + // Nobody care the size or actual permission here. Put a simple "r" and + // zero + // here + failedOps.add( + new HybridFileParcelable( + oldFile.getPath(), + "r", + oldFile.lastModified(), + 0, + oldFile.isDirectory(context))); + context.sendBroadcast( + new Intent(TAG_INTENT_FILTER_GENERAL) + .putParcelableArrayListExtra( + TAG_INTENT_FILTER_FAILED_OPS, failedOps)); + errorCallBack.done(newFile, false); + } + return Unit.INSTANCE; + } + }); + } else if (oldFile.isFtp()) { + NetCopyClientUtils.INSTANCE.execute( + new FtpClientTemplate(oldFile.getPath(), false) { + public Boolean executeWithFtpClient(@NonNull FTPClient ftpClient) + throws IOException { + boolean result = + ftpClient.rename( + NetCopyClientUtils.extractRemotePathFrom(oldFile.getPath()), + NetCopyClientUtils.extractRemotePathFrom(newFile.getPath())); + errorCallBack.done(newFile, result); + return result; + } + }); + } else if (oldFile.isCloudDriveFile()) { + OmhStorageClient storageClient = + OMHClientHelper.getStorageClient(oldFile.getMode()); + if (storageClient != null) { + OmhStorageEntity oldCloudFile = + BuildersKt.runBlocking( + EmptyCoroutineContext.INSTANCE, + (scope, continuation) -> + storageClient.resolvePath( + CloudUtil.stripCloudPath(oldFile.getMode(), oldFile.path), + continuation)); + if (oldCloudFile != null) { + BuildersKt.runBlocking( + EmptyCoroutineContext.INSTANCE, + (scope, continuation) -> { + // storageClient.rename(oldCloudFile.getId(), + // newFile.name, continuation); + return Unit.INSTANCE; + }); + } + return Unit.INSTANCE; + } + } else if (oldFile.isOtgFile()) { + if (checkOtgNewFileExists(newFile, context)) { + errorCallBack.exists(newFile); + return Unit.INSTANCE; + } + safRenameFile.apply(OTGUtil.getDocumentFile(oldFile.getPath(), context, false)); + return Unit.INSTANCE; + } else if (oldFile.isDocumentFile()) { + if (checkDocumentFileNewFileExists(newFile, context)) { + errorCallBack.exists(newFile); + return Unit.INSTANCE; + } + safRenameFile.apply( + OTGUtil.getDocumentFile( + oldFile.getPath(), + SafRootHolder.getUriRoot(), + context, + OpenMode.DOCUMENT_FILE, + false)); + return Unit.INSTANCE; + } else { + File file = new File(oldFile.getPath()); + if (oldFile.getMode() == OpenMode.FILE) { + int mode = checkFolder(file.getParentFile(), context); + if (mode == 2) { + errorCallBack.launchSAF(oldFile, newFile); + } + } + + boolean result; + if (isCaseSensitiveRename) { + result = localDoubleRename(oldFile, newFile); + } else { + result = localRename(oldFile, newFile); } - return null; - } - }); - } else if (oldFile.isFtp()) { - NetCopyClientUtils.INSTANCE.execute( - new FtpClientTemplate(oldFile.getPath(), false) { - public Boolean executeWithFtpClient(@NonNull FTPClient ftpClient) - throws IOException { - boolean result = - ftpClient.rename( - NetCopyClientUtils.extractRemotePathFrom(oldFile.getPath()), - NetCopyClientUtils.extractRemotePathFrom(newFile.getPath())); errorCallBack.done(newFile, result); - return result; } - }); - } else if (oldFile.isDropBoxFile()) { - CloudStorage cloudStorageDropbox = dataUtils.getAccount(OpenMode.DROPBOX); - try { - cloudStorageDropbox.move( - CloudUtil.stripPath(OpenMode.DROPBOX, oldFile.getPath()), - CloudUtil.stripPath(OpenMode.DROPBOX, newFile.getPath())); - errorCallBack.done(newFile, true); - } catch (Exception e) { - LOG.warn("failed to rename file in cloud connection", e); - errorCallBack.done(newFile, false); - } - } else if (oldFile.isBoxFile()) { - CloudStorage cloudStorageBox = dataUtils.getAccount(OpenMode.BOX); - try { - cloudStorageBox.move( - CloudUtil.stripPath(OpenMode.BOX, oldFile.getPath()), - CloudUtil.stripPath(OpenMode.BOX, newFile.getPath())); - errorCallBack.done(newFile, true); - } catch (Exception e) { - LOG.warn("failed to rename file in cloud connection", e); - errorCallBack.done(newFile, false); - } - } else if (oldFile.isOneDriveFile()) { - CloudStorage cloudStorageOneDrive = dataUtils.getAccount(OpenMode.ONEDRIVE); - try { - cloudStorageOneDrive.move( - CloudUtil.stripPath(OpenMode.ONEDRIVE, oldFile.getPath()), - CloudUtil.stripPath(OpenMode.ONEDRIVE, newFile.getPath())); - errorCallBack.done(newFile, true); - } catch (Exception e) { - LOG.warn("failed to rename file in cloud connection", e); - errorCallBack.done(newFile, false); - } - } else if (oldFile.isGoogleDriveFile()) { - CloudStorage cloudStorageGdrive = dataUtils.getAccount(OpenMode.GDRIVE); - try { - cloudStorageGdrive.move( - CloudUtil.stripPath(OpenMode.GDRIVE, oldFile.getPath()), - CloudUtil.stripPath(OpenMode.GDRIVE, newFile.getPath())); - errorCallBack.done(newFile, true); - } catch (Exception e) { - LOG.warn("failed to rename file in cloud connection", e); - errorCallBack.done(newFile, false); - } - } else if (oldFile.isOtgFile()) { - if (checkOtgNewFileExists(newFile, context)) { - errorCallBack.exists(newFile); - return null; - } - safRenameFile.apply(OTGUtil.getDocumentFile(oldFile.getPath(), context, false)); - return null; - } else if (oldFile.isDocumentFile()) { - if (checkDocumentFileNewFileExists(newFile, context)) { - errorCallBack.exists(newFile); - return null; - } - safRenameFile.apply( - OTGUtil.getDocumentFile( - oldFile.getPath(), - SafRootHolder.getUriRoot(), - context, - OpenMode.DOCUMENT_FILE, - false)); - return null; - } else { - File file = new File(oldFile.getPath()); - if (oldFile.getMode() == OpenMode.FILE) { - int mode = checkFolder(file.getParentFile(), context); - if (mode == 2) { - errorCallBack.launchSAF(oldFile, newFile); - } - } - - boolean result; - if (isCaseSensitiveRename) { - result = localDoubleRename(oldFile, newFile); - } else { - result = localRename(oldFile, newFile); - } - errorCallBack.done(newFile, result); - } - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - if (newFile != null && oldFile != null) { - HybridFile[] hybridFiles = {newFile, oldFile}; - MediaConnectionUtils.scanFile(context, hybridFiles); - } - } - }.executeOnExecutor(executor); + return Unit.INSTANCE; + } + }) + .subscribeOn(Schedulers.io()) + .doOnComplete( + () -> { + if (newFile.isLocal() || oldFile.isLocal()) { + HybridFile[] hybridFiles = {newFile, oldFile}; + MediaConnectionUtils.scanFile(context, hybridFiles); + } + }) + .subscribe(); } private static boolean checkOtgNewFileExists(HybridFile newFile, Context context) { @@ -778,7 +713,7 @@ private static int checkFolder(final File folder, Context context) { } return 1; } - } else if (Build.VERSION.SDK_INT == 19) { + } else if (Build.VERSION.SDK_INT == KITKAT) { // Assume that Kitkat workaround works if (ExternalSdCardOperation.isOnExtSdCard(folder, context)) return 1; } diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.kt b/app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.kt index bc7bb48d8e..a72a538e3c 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.kt +++ b/app/src/main/java/com/amaze/filemanager/filesystem/cloud/CloudUtil.kt @@ -17,295 +17,277 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +package com.amaze.filemanager.filesystem.cloud -package com.amaze.filemanager.filesystem.cloud; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.amaze.filemanager.R; -import com.amaze.filemanager.adapters.data.IconDataParcelable; -import com.amaze.filemanager.database.CloudHandler; -import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException; -import com.amaze.filemanager.fileoperations.filesystem.OpenMode; -import com.amaze.filemanager.fileoperations.filesystem.cloud.CloudStreamer; -import com.amaze.filemanager.filesystem.HybridFile; -import com.amaze.filemanager.filesystem.HybridFileParcelable; -import com.amaze.filemanager.ui.activities.MainActivity; -import com.amaze.filemanager.ui.icons.MimeTypes; -import com.amaze.filemanager.utils.DataUtils; -import com.amaze.filemanager.utils.OTGUtil; -import com.amaze.filemanager.utils.OnFileFound; -import com.cloudrail.si.interfaces.CloudStorage; -import com.cloudrail.si.types.CloudMetaData; - -import android.app.Activity; -import android.content.ActivityNotFoundException; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.net.Uri; -import android.os.AsyncTask; -import android.widget.Toast; - -import androidx.annotation.Nullable; -import androidx.documentfile.provider.DocumentFile; +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.widget.Toast +import androidx.arch.core.util.Function +import androidx.core.net.toUri +import com.amaze.filemanager.R +import com.amaze.filemanager.database.CloudContract +import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.fileoperations.filesystem.cloud.CloudStreamer +import com.amaze.filemanager.filesystem.HybridFile +import com.amaze.filemanager.filesystem.HybridFileParcelable +import com.amaze.filemanager.filesystem.cloud.CloudUtil.getCloudFiles +import com.amaze.filemanager.ui.icons.MimeTypes +import com.amaze.filemanager.utils.OTGUtil.getDocumentFile +import com.amaze.filemanager.utils.omh.AuthTrigger +import com.amaze.filemanager.utils.omh.OMHClientHelper.getStorageClient +import com.amaze.filemanager.utils.omh.retryOnUnauthorized +import com.openmobilehub.android.storage.core.ThumbnailSize +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.ByteArrayInputStream +import java.io.File +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.io.IOException +import java.io.InputStream +import java.net.ProtocolException +import java.util.concurrent.CopyOnWriteArrayList /** * Created by vishal on 19/4/17. * - *

Class provides helper methods for cloud utilities + * + * Class provides helper methods for cloud utilities */ -public class CloudUtil { +object CloudUtil { + @JvmStatic + private val LOG: Logger = LoggerFactory.getLogger(CloudUtil::class.java) - private static final Logger LOG = LoggerFactory.getLogger(CloudUtil.class); + /** + * Blocking version of [getCloudFiles]. + * Collects all files first, then passes them to the callback to avoid + * ConcurrentModificationException. + */ + @JvmStatic + @Suppress("TooGenericExceptionCaught") + fun getCloudFilesBlocking( + folderId: String, + path: String, + openMode: OpenMode, + authTrigger: AuthTrigger, + fileFoundCallback: Function, + ) { + val collectedFiles = CopyOnWriteArrayList() - /** - * @deprecated use getCloudFiles() - */ - public static ArrayList listFiles( - String path, CloudStorage cloudStorage, OpenMode openMode) throws CloudPluginException { - final ArrayList baseFiles = new ArrayList<>(); - getCloudFiles(path, cloudStorage, openMode, baseFiles::add); - return baseFiles; - } + runBlocking(Dispatchers.IO.limitedParallelism(5)) { + try { + getCloudFiles(folderId, path, openMode, authTrigger) { file -> + collectedFiles.add(file) + } + } catch (e: Exception) { + throw CloudPluginException(e) + } + } - public static void getCloudFiles( - String path, CloudStorage cloudStorage, OpenMode openMode, OnFileFound fileFoundCallback) - throws CloudPluginException { - String strippedPath = stripPath(openMode, path); - try { - for (CloudMetaData cloudMetaData : cloudStorage.getChildren(strippedPath)) { - HybridFileParcelable baseFile = - new HybridFileParcelable( - path + "/" + cloudMetaData.getName(), - "", - (cloudMetaData.getModifiedAt() == null) ? 0l : cloudMetaData.getModifiedAt(), - cloudMetaData.getSize(), - cloudMetaData.getFolder()); - baseFile.setName(cloudMetaData.getName()); - baseFile.setMode(openMode); - fileFoundCallback.onFileFound(baseFile); - } - } catch (Exception e) { - LOG.warn("failed to get cloud files", e); - throw new CloudPluginException(); + // Now safely pass all collected files to the callback on the calling thread + for (file in collectedFiles) { + fileFoundCallback.apply(file) + } } - } - - /** Strips down the cloud path to remove any prefix */ - public static String stripPath(OpenMode openMode, String path) { - final String prefix; - switch (openMode) { - case DROPBOX: - prefix = CloudHandler.CLOUD_PREFIX_DROPBOX; - break; - case BOX: - prefix = CloudHandler.CLOUD_PREFIX_BOX; - break; - case ONEDRIVE: - prefix = CloudHandler.CLOUD_PREFIX_ONE_DRIVE; - break; - case GDRIVE: - prefix = CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE; - break; - default: - return path; + /** + * Helper method to get list of files from cloud storage. + */ + @JvmStatic + @Suppress("TooGenericExceptionCaught") + suspend fun getCloudFiles( + folderId: String, + path: String, + openMode: OpenMode, + authTrigger: AuthTrigger, + fileFoundCallback: Function, + ) { + retryOnUnauthorized( + openMode = openMode, + trigger = authTrigger, + ) { + try { + getStorageClient(openMode)?.let { storageClient -> + for (omhStorageEntity in storageClient.listFiles(folderId.ifEmpty { storageClient.rootFolder })) { + val baseFile = HybridFileParcelable(path, openMode, omhStorageEntity) + baseFile.cloudFileId = omhStorageEntity.id + fileFoundCallback.apply(baseFile) + } + } + } catch (e: ProtocolException) { + LOG.warn("Protocol exception while getting cloud files: ", e) + throw CloudPluginException(e) + } catch (e: Exception) { + LOG.warn("failed to get cloud files", e) + throw CloudPluginException(e) + } + } } - if (path.equals(prefix + "/")) { - // we're at root, just replace the prefix - return path.replace(prefix, ""); - } else { - // we're not at root, replace prefix + / - // handle when paths are in format gdrive:/Documents // TODO: normalize drive paths - String pathReplaced = path.replace(prefix + "/", ""); - if (pathReplaced.equals(path)) { - // we convert gdrive:/Documents to /Documents - return path.replace(prefix.substring(0, prefix.length() - 1), ""); - } - return pathReplaced; + /** Strips down the cloud path to remove any prefix */ + @JvmStatic + fun stripCloudPath( + openMode: OpenMode, + path: String, + ): String { + val prefix = + when (openMode) { + OpenMode.DROPBOX -> CloudContract.CLOUD_PREFIX_DROPBOX + OpenMode.BOX -> CloudContract.CLOUD_PREFIX_BOX + OpenMode.ONEDRIVE -> CloudContract.CLOUD_PREFIX_ONE_DRIVE + OpenMode.GDRIVE -> CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE + else -> return path + } + if (path == "$prefix/") { + // we're at root, just replace the prefix + return "" + } else { + // we're not at root, replace prefix + / + // handle when paths are in format gdrive:/Documents // TODO: normalize drive paths + val pathReplaced = path.replace("$prefix/", "") + if (pathReplaced == path) { + // we convert gdrive:/Documents to /Documents + return path.replace(prefix.substring(0, prefix.length - 1), "") + } + return pathReplaced + } } - } - public static void launchCloud( - final HybridFile baseFile, final OpenMode serviceType, final Activity activity) { - final CloudStreamer streamer = CloudStreamer.getInstance(); + /** + * Attempt to launch a cloud file using [CloudStreamer] and an implicit intent + */ + @JvmStatic + @Suppress("TooGenericExceptionCaught") + fun launchCloud( + baseFile: HybridFile, + serviceType: OpenMode, + activity: Activity, + ) { + val streamer = CloudStreamer.getInstance() - new Thread( - () -> { - try { + Thread { + try { streamer.setStreamSrc( baseFile.getInputStream(activity), baseFile.getName(activity), - baseFile.length(activity)); - activity.runOnUiThread( - () -> { - try { - File file = - new File( - Uri.parse(CloudUtil.stripPath(serviceType, baseFile.getPath())) - .getPath()); - Uri uri = - Uri.parse(CloudStreamer.URL + Uri.fromFile(file).getEncodedPath()); - Intent i = new Intent(Intent.ACTION_VIEW); + baseFile.length(activity), + ) + activity.runOnUiThread { + try { + val file = + File( + stripCloudPath(serviceType, baseFile.path).toUri() + .path, + ) + val uri = + (CloudStreamer.URL + Uri.fromFile(file).encodedPath).toUri() + val i = Intent(Intent.ACTION_VIEW) i.setDataAndType( uri, MimeTypes.getMimeType( - baseFile.getPath(), baseFile.isDirectory(activity))); - PackageManager packageManager = activity.getPackageManager(); - List resInfos = packageManager.queryIntentActivities(i, 0); - if (resInfos != null && resInfos.size() > 0) activity.startActivity(i); - else - Toast.makeText( - activity, - activity.getString(R.string.smb_launch_error), - Toast.LENGTH_SHORT) - .show(); - } catch (ActivityNotFoundException e) { - LOG.warn("failed to launch cloud file in activity", e); - } - }); - } catch (Exception e) { - LOG.warn("failed to launch cloud file", e); - } - }) - .start(); - } - - /** - * Asynctask checks if the item pressed on is a cloud account, and if the token that is saved for - * it is invalid or not, in which case, we'll clear off the saved token and authenticate the user - * again - * - * @param path the path of item in drawer - * @param mainActivity reference to main activity to fire callbacks to delete/add connection - */ - public static void checkToken(String path, final MainActivity mainActivity) { - - new AsyncTask() { - OpenMode serviceType; - - @Override - protected Boolean doInBackground(String... params) { - final DataUtils dataUtils = DataUtils.getInstance(); - boolean isTokenValid = true; - String path = params[0]; - final CloudStorage cloudStorage; - - if (path.startsWith(CloudHandler.CLOUD_PREFIX_DROPBOX)) { - // dropbox account - serviceType = OpenMode.DROPBOX; - cloudStorage = dataUtils.getAccount(OpenMode.DROPBOX); - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_ONE_DRIVE)) { - - serviceType = OpenMode.ONEDRIVE; - cloudStorage = dataUtils.getAccount(OpenMode.ONEDRIVE); - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_BOX)) { - - serviceType = OpenMode.BOX; - cloudStorage = dataUtils.getAccount(OpenMode.BOX); - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE)) { - serviceType = OpenMode.GDRIVE; - cloudStorage = dataUtils.getAccount(OpenMode.GDRIVE); - } else { - throw new IllegalStateException(); + baseFile.path, + baseFile.isDirectory(activity), + ), + ) + val packageManager = activity.packageManager + val resInfos = packageManager.queryIntentActivities(i, 0) + if (resInfos.isNotEmpty()) { + activity.startActivity(i) + } else { + Toast.makeText( + activity, + activity.getString(R.string.smb_launch_error), + Toast.LENGTH_SHORT, + ) + .show() + } + } catch (e: ActivityNotFoundException) { + LOG.warn("failed to launch cloud file in activity", e) + } + } + } catch (e: Exception) { + LOG.warn("failed to launch cloud file", e) + } } + .start() + } - try { - cloudStorage.getUserLogin(); - } catch (RuntimeException e) { - LOG.warn("Failed to validate user token for cloud connection", e); - isTokenValid = false; - } - return isTokenValid; - } + /** + * Get an input stream for thumbnail for a given path. + */ + @Suppress("LabeledExpression") + fun getThumbnailInputStreamForCloud( + context: Context, + path: String?, + ): InputStream? { + var inputStream: InputStream? + val hybridFile = HybridFile(OpenMode.UNKNOWN, path) + hybridFile.generateMode(context) - @Override - protected void onPostExecute(Boolean aBoolean) { - super.onPostExecute(aBoolean); + when (hybridFile.mode) { + OpenMode.SFTP -> inputStream = hybridFile.getInputStream(context) + OpenMode.FTP -> // Until we find a way to properly handle threading issues with thread unsafe FTPClient, + // we refrain from loading any files via FTP as file thumbnail. - TranceLove + inputStream = null - if (!aBoolean) { - // delete account and create a new one - Toast.makeText( - mainActivity, - mainActivity.getResources().getString(R.string.cloud_token_lost), - Toast.LENGTH_LONG) - .show(); - mainActivity.deleteConnection(serviceType); - mainActivity.addConnection(serviceType); - } - } - }.execute(path); - } + OpenMode.SMB -> + try { + inputStream = hybridFile.smbFile.inputStream + } catch (e: IOException) { + inputStream = null + LOG.warn("failed to get inputstream for smb file for thumbnail", e) + } - /** Get an input stream for thumbnail for a given {@link IconDataParcelable} */ - @Nullable - public static InputStream getThumbnailInputStreamForCloud(Context context, String path) { - InputStream inputStream; - HybridFile hybridFile = new HybridFile(OpenMode.UNKNOWN, path); - hybridFile.generateMode(context); - DataUtils dataUtils = DataUtils.getInstance(); + OpenMode.OTG -> { + val contentResolver = context.contentResolver + val documentSourceFile = + getDocumentFile(hybridFile.path, context, false) + try { + inputStream = contentResolver.openInputStream(documentSourceFile!!.uri) + } catch (e: FileNotFoundException) { + LOG.warn("failed to get input stream for otg for thumbnail", e) + inputStream = null + } + } - switch (hybridFile.getMode()) { - case SFTP: - inputStream = hybridFile.getInputStream(context); - break; - case FTP: - // Until we find a way to properly handle threading issues with thread unsafe FTPClient, - // we refrain from loading any files via FTP as file thumbnail. - TranceLove - inputStream = null; - break; - case SMB: - try { - inputStream = hybridFile.getSmbFile().getInputStream(); - } catch (IOException e) { - inputStream = null; - LOG.warn("failed to get inputstream for smb file for thumbnail", e); - } - break; - case OTG: - ContentResolver contentResolver = context.getContentResolver(); - DocumentFile documentSourceFile = - OTGUtil.getDocumentFile(hybridFile.getPath(), context, false); - try { - inputStream = contentResolver.openInputStream(documentSourceFile.getUri()); - } catch (FileNotFoundException e) { - LOG.warn("failed to get inputstream for otg for thumbnail", e); - inputStream = null; - } - break; - case DROPBOX: - case BOX: - case GDRIVE: - case ONEDRIVE: - OpenMode mode = hybridFile.getMode(); + OpenMode.DROPBOX, OpenMode.BOX, OpenMode.GDRIVE, OpenMode.ONEDRIVE -> { + val storageClient = getStorageClient(openMode = hybridFile.mode) + if (storageClient == null) { + LOG.warn("failed to get input stream for cloud files for thumbnail - no storage client") + inputStream = null + } else { + inputStream = + ByteArrayInputStream( + runBlocking { + val path = stripCloudPath(hybridFile.mode, path!!) + val storageEntity = + storageClient.resolvePath( + if (path.startsWith("/")) path else "/$path", + ) ?: return@runBlocking ByteArray(0) + val cloudFileId = storageEntity.id + storageClient.getFileThumbnail( + cloudFileId, + ThumbnailSize.MEDIUM, + ).toByteArray() + }, + ) + } + } - CloudStorage cloudStorageDropbox = dataUtils.getAccount(mode); - String stripped = CloudUtil.stripPath(mode, hybridFile.getPath()); - inputStream = cloudStorageDropbox.getThumbnail(stripped); - break; - default: - try { - inputStream = new FileInputStream(hybridFile.getPath()); - } catch (FileNotFoundException e) { - inputStream = null; - LOG.warn("failed to get inputstream for cloud files for thumbnail", e); + else -> + try { + inputStream = FileInputStream(hybridFile.path) + } catch (e: FileNotFoundException) { + inputStream = null + LOG.warn("failed to get inputstream for cloud files for thumbnail", e) + } } - break; + return inputStream } - - return inputStream; - } } diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/files/CryptUtil.java b/app/src/main/java/com/amaze/filemanager/filesystem/files/CryptUtil.java index b6ea1a7bbe..8c03462b17 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/files/CryptUtil.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/files/CryptUtil.java @@ -57,6 +57,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import kotlin.Unit; import kotlin.io.ByteStreamsKt; import kotlin.io.ConstantsKt; @@ -205,6 +206,7 @@ private void decrypt( } catch (IOException | GeneralSecurityException e) { throw new IllegalStateException(e); // throw unchecked exception, no throws needed } + return Unit.INSTANCE; }); } else { @@ -284,6 +286,7 @@ private void encrypt( } catch (IOException | GeneralSecurityException e) { throw new IllegalStateException(e); // throw unchecked exception, no throws needed } + return Unit.INSTANCE; }); } else { diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java b/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java index 6b6a6bec65..5bbc83b1db 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java @@ -46,7 +46,6 @@ import com.amaze.filemanager.filesystem.HybridFileParcelable; import com.amaze.filemanager.filesystem.Operations; import com.amaze.filemanager.filesystem.RootHelper; -import com.amaze.filemanager.filesystem.cloud.CloudUtil; import com.amaze.filemanager.filesystem.compressed.CompressedHelper; import com.amaze.filemanager.ui.activities.DatabaseViewerActivity; import com.amaze.filemanager.ui.activities.MainActivity; @@ -62,10 +61,11 @@ import com.amaze.filemanager.utils.OTGUtil; import com.amaze.filemanager.utils.OnProgressUpdate; import com.amaze.filemanager.utils.PackageInstallValidation; -import com.cloudrail.si.interfaces.CloudStorage; -import com.cloudrail.si.types.CloudMetaData; +import com.amaze.filemanager.utils.omh.OMHClientHelper; import com.googlecode.concurrenttrees.radix.ConcurrentRadixTree; import com.googlecode.concurrenttrees.radix.node.concrete.voidvalue.VoidValue; +import com.openmobilehub.android.storage.core.OmhStorageClient; +import com.openmobilehub.android.storage.core.model.OmhStorageMetadata; import android.Manifest; import android.animation.Animator; @@ -78,7 +78,6 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; -import android.os.AsyncTask; import android.os.Build; import android.view.View; import android.widget.Toast; @@ -89,8 +88,16 @@ import androidx.core.util.Pair; import androidx.documentfile.provider.DocumentFile; +import io.reactivex.Flowable; +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import jcifs.smb.SmbFile; +import kotlin.Unit; import kotlin.collections.ArraysKt; +import kotlin.collections.CollectionsKt; +import kotlin.coroutines.EmptyCoroutineContext; +import kotlinx.coroutines.rx2.RxSingleKt; import net.schmizz.sshj.sftp.RemoteResourceInfo; import net.schmizz.sshj.sftp.SFTPClient; import net.schmizz.sshj.sftp.SFTPException; @@ -169,20 +176,20 @@ public static Long folderSizeSftp(SFTPClient client, String remotePath) { } } - public static long folderSizeCloud(OpenMode openMode, CloudMetaData sourceFileMeta) { + public static long folderSizeCloud(OpenMode openMode, OmhStorageMetadata sourceFileMeta) { - DataUtils dataUtils = DataUtils.getInstance(); + // DataUtils dataUtils = DataUtils.INSTANCE; long length = 0; - CloudStorage cloudStorage = dataUtils.getAccount(openMode); - for (CloudMetaData metaData : - cloudStorage.getChildren(CloudUtil.stripPath(openMode, sourceFileMeta.getPath()))) { - - if (metaData.getFolder()) { - length += folderSizeCloud(openMode, metaData); - } else { - length += metaData.getSize(); - } - } + // CloudStorage cloudStorage = dataUtils.getAccount(openMode); + // for (CloudMetaData metaData : + // cloudStorage.getChildren(CloudUtil.stripPath(openMode, sourceFileMeta.getPath()))) { + // + // if (metaData.getFolder()) { + // length += folderSizeCloud(openMode, metaData); + // } else { + // length += metaData.getSize(); + // } + // } return length; } @@ -191,7 +198,12 @@ public static long folderSizeCloud(OpenMode openMode, CloudMetaData sourceFileMe public static long otgFolderSize(String path, final Context context) { final AtomicLong totalBytes = new AtomicLong(0); OTGUtil.getDocumentFiles( - path, context, file -> totalBytes.addAndGet(getBaseFileSize(file, context))); + path, + context, + file -> { + totalBytes.addAndGet(getBaseFileSize(file, context)); + return Unit.INSTANCE; + }); return totalBytes.longValue(); } @@ -263,55 +275,55 @@ public void onAnimationEnd(Animator animation) { // participate in layout passes, etc.) } - public static void shareCloudFile(String path, final OpenMode openMode, final Context context) { - new AsyncTask() { - - @Override - protected String doInBackground(String... params) { - String shareFilePath = params[0]; - CloudStorage cloudStorage = DataUtils.getInstance().getAccount(openMode); - return cloudStorage.createShareLink(CloudUtil.stripPath(openMode, shareFilePath)); - } - - @Override - protected void onPostExecute(String s) { - super.onPostExecute(s); - - FileUtils.copyToClipboard(context, s); - Toast.makeText(context, context.getString(R.string.cloud_share_copied), Toast.LENGTH_LONG) - .show(); - } - }.execute(path); + public static void shareCloudFile( + String cloudFileId, final OpenMode openMode, final Context context) { + OmhStorageClient storageClient = OMHClientHelper.getStorageClient(openMode); + if (storageClient != null) { + RxSingleKt.rxSingle( + EmptyCoroutineContext.INSTANCE, + (scope, continuation) -> storageClient.getWebUrl(cloudFileId, continuation)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + result -> { + FileUtils.copyToClipboard(context, result); + AppConfig.toast(context, R.string.cloud_share_copied); + }); + } else { + // FIXME: Toast + } } public static void shareCloudFiles( ArrayList files, final OpenMode openMode, final Context context) { - String[] paths = new String[files.size()]; - for (int i = 0; i < files.size(); i++) { - paths[i] = files.get(i).desc; + final OmhStorageClient storageClient = OMHClientHelper.getStorageClient(openMode); + if (storageClient != null) { + List> tasks = + CollectionsKt.map( + files, + layoutElementParcelable -> + RxSingleKt.rxSingle( + EmptyCoroutineContext.INSTANCE, + (scope, continuation) -> + storageClient.getWebUrl( + layoutElementParcelable.cloudFileId, continuation))); + Flowable.fromIterable(tasks) + .flatMap(Single::toFlowable) + .toList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + result -> { + StringBuilder sb = new StringBuilder(); + for (String line : result) { + sb.append(line).append('\n'); + } + FileUtils.copyToClipboard(context, sb.toString()); + AppConfig.toast(context, R.string.cloud_share_copied); + }); + } else { + // FIXME: Toast } - new AsyncTask() { - @Override - protected String doInBackground(String... params) { - CloudStorage cloudStorage = DataUtils.getInstance().getAccount(openMode); - StringBuilder links = new StringBuilder(); - links.append(cloudStorage.createShareLink(CloudUtil.stripPath(openMode, params[0]))); - for (int i = 1; i < params.length; i++) { - links.append('\n'); - links.append(cloudStorage.createShareLink(CloudUtil.stripPath(openMode, params[i]))); - } - return links.toString(); - } - - @Override - protected void onPostExecute(String s) { - super.onPostExecute(s); - - FileUtils.copyToClipboard(context, s); - Toast.makeText(context, context.getString(R.string.cloud_share_copied), Toast.LENGTH_LONG) - .show(); - } - }.execute(paths); } public static void shareFiles( @@ -941,7 +953,7 @@ public static ArrayList parse(String permLine) { } public static boolean isStorage(String path) { - for (String s : DataUtils.getInstance().getStorages()) if (s.equals(path)) return true; + for (String s : DataUtils.INSTANCE.getStorages()) if (s.equals(path)) return true; return false; } diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/files/GenericCopyUtil.java b/app/src/main/java/com/amaze/filemanager/filesystem/files/GenericCopyUtil.java index 75dc8ab34f..fecfb8a607 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/files/GenericCopyUtil.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/files/GenericCopyUtil.java @@ -39,6 +39,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.amaze.filemanager.application.AppConfig; import com.amaze.filemanager.fileoperations.filesystem.OpenMode; import com.amaze.filemanager.fileoperations.utils.OnLowMemory; import com.amaze.filemanager.fileoperations.utils.UpdatePosition; @@ -49,10 +50,11 @@ import com.amaze.filemanager.filesystem.MediaStoreHack; import com.amaze.filemanager.filesystem.SafRootHolder; import com.amaze.filemanager.filesystem.cloud.CloudUtil; -import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.OTGUtil; import com.amaze.filemanager.utils.ProgressHandler; -import com.cloudrail.si.interfaces.CloudStorage; +import com.amaze.filemanager.utils.omh.OMHClientHelper; +import com.openmobilehub.android.storage.core.OmhStorageClient; +import com.openmobilehub.android.storage.core.model.OmhStorageEntity; import android.content.ContentResolver; import android.content.Context; @@ -62,14 +64,19 @@ import androidx.annotation.VisibleForTesting; import androidx.documentfile.provider.DocumentFile; +import kotlin.Unit; +import kotlin.coroutines.EmptyCoroutineContext; +import kotlin.io.ByteStreamsKt; +import kotlin.text.StringsKt; +import kotlinx.coroutines.BuildersKt; + /** Base class to handle file copy. */ public class GenericCopyUtil { - private final Logger LOG = LoggerFactory.getLogger(GenericCopyUtil.class); + private static final Logger LOG = LoggerFactory.getLogger(GenericCopyUtil.class); private HybridFileParcelable mSourceFile; private HybridFile mTargetFile; private final Context mContext; // context needed to find the DocumentFile in otg/sd card - private final DataUtils dataUtils = DataUtils.getInstance(); private final ProgressHandler progressHandler; public static final int DEFAULT_BUFFER_SIZE = 8192; @@ -123,21 +130,13 @@ private void startCopy( bufferedInputStream = new BufferedInputStream( contentResolver.openInputStream(documentSourceFile.getUri()), DEFAULT_BUFFER_SIZE); - } else if (mSourceFile.isSmb() || mSourceFile.isSftp() || mSourceFile.isFtp()) { + } else if (mSourceFile.isSmb() + || mSourceFile.isSftp() + || mSourceFile.isFtp() + || mSourceFile.isCloudDriveFile()) { bufferedInputStream = new BufferedInputStream(mSourceFile.getInputStream(mContext), DEFAULT_TRANSFER_QUANTUM); - } else if (mSourceFile.isDropBoxFile() - || mSourceFile.isBoxFile() - || mSourceFile.isGoogleDriveFile() - || mSourceFile.isOneDriveFile()) { - OpenMode openMode = mSourceFile.getMode(); - - CloudStorage cloudStorage = dataUtils.getAccount(openMode); - bufferedInputStream = - new BufferedInputStream( - cloudStorage.download(CloudUtil.stripPath(openMode, mSourceFile.getPath()))); } else { - // source file is neither smb nor otg; getting a channel from direct file instead of stream File file = new File(mSourceFile.getPath()); if (FileProperties.isReadable(file)) { @@ -192,10 +191,7 @@ private void startCopy( bufferedOutputStream = new BufferedOutputStream( mTargetFile.getOutputStream(mContext), DEFAULT_TRANSFER_QUANTUM); - } else if (mTargetFile.isDropBoxFile() - || mTargetFile.isBoxFile() - || mTargetFile.isGoogleDriveFile() - || mTargetFile.isOneDriveFile()) { + } else if (mTargetFile.isCloudDriveFile()) { cloudCopy(mTargetFile.getMode(), bufferedInputStream); return; } else { @@ -277,22 +273,32 @@ private void startCopy( private void cloudCopy( @NonNull OpenMode openMode, @NonNull BufferedInputStream bufferedInputStream) throws IOException { - DataUtils dataUtils = DataUtils.getInstance(); - // API doesn't support output stream, we'll upload the file directly - CloudStorage cloudStorage = dataUtils.getAccount(openMode); - - if (mSourceFile.getMode() == openMode) { - // we're in the same provider, use api method - cloudStorage.copy( - CloudUtil.stripPath(openMode, mSourceFile.getPath()), - CloudUtil.stripPath(openMode, mTargetFile.getPath())); - } else { - cloudStorage.upload( - CloudUtil.stripPath(openMode, mTargetFile.getPath()), - bufferedInputStream, - mSourceFile.getSize(), - true); - bufferedInputStream.close(); + OmhStorageClient storageClient = OMHClientHelper.getStorageClient(openMode); + if (storageClient != null) { + String fullFilename = mTargetFile.getSimpleName(); + String filename = StringsKt.substringBeforeLast(fullFilename, '.', fullFilename); + String extension = StringsKt.substringAfterLast(fullFilename, '.', ""); + File tmpFile = + File.createTempFile(filename, "." + extension, AppConfig.getInstance().getCacheDir()); + tmpFile.deleteOnExit(); + ByteStreamsKt.copyTo(bufferedInputStream, new FileOutputStream(tmpFile), DEFAULT_BUFFER_SIZE); + + final String parent = mTargetFile.getParent(mContext); + try { + BuildersKt.runBlocking( + EmptyCoroutineContext.INSTANCE, + (scope, continuation) -> { + OmhStorageEntity parentFolder = + (OmhStorageEntity) + storageClient.resolvePath( + CloudUtil.stripCloudPath(openMode, parent), continuation); + storageClient.uploadFile(tmpFile, parentFolder.getId(), continuation); + tmpFile.delete(); + return Unit.INSTANCE; + }); + } catch (InterruptedException e) { + + } } } diff --git a/app/src/main/java/com/amaze/filemanager/ui/ItemPopupMenu.java b/app/src/main/java/com/amaze/filemanager/ui/ItemPopupMenu.java index d3b0ea387f..70113f0ac7 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/ItemPopupMenu.java +++ b/app/src/main/java/com/amaze/filemanager/ui/ItemPopupMenu.java @@ -109,7 +109,7 @@ public boolean onMenuItemClick(MenuItem item) { case BOX: case GDRIVE: case ONEDRIVE: - FileUtils.shareCloudFile(rowItem.desc, rowItem.getMode(), context); + FileUtils.shareCloudFile(rowItem.cloudFileId, rowItem.getMode(), context); break; default: ArrayList arrayList = new ArrayList<>(); @@ -134,7 +134,7 @@ public boolean onMenuItemClick(MenuItem item) { mainActivity.mainActivityHelper.extractFile(new File(rowItem.desc)); return true; } else if (item.getItemId() == R.id.book) { - DataUtils dataUtils = DataUtils.getInstance(); + DataUtils dataUtils = DataUtils.INSTANCE; if (dataUtils.addBook(new String[] {rowItem.title, rowItem.desc}, true)) { mainActivity.getDrawer().refreshDrawer(); Toast.makeText( diff --git a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java index 2e835df77c..4a33cadb39 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java +++ b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java @@ -65,6 +65,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import org.slf4j.Logger; @@ -80,20 +83,15 @@ import com.amaze.filemanager.adapters.data.StorageDirectoryParcelable; import com.amaze.filemanager.application.AppConfig; import com.amaze.filemanager.asynchronous.SaveOnDataUtilsChange; -import com.amaze.filemanager.asynchronous.asynctasks.CloudLoaderAsyncTask; import com.amaze.filemanager.asynchronous.asynctasks.DeleteTask; import com.amaze.filemanager.asynchronous.asynctasks.TaskKt; import com.amaze.filemanager.asynchronous.asynctasks.movecopy.MoveFilesTask; import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil; import com.amaze.filemanager.asynchronous.services.CopyService; -import com.amaze.filemanager.database.CloudContract; -import com.amaze.filemanager.database.CloudHandler; import com.amaze.filemanager.database.SortHandler; import com.amaze.filemanager.database.TabHandler; import com.amaze.filemanager.database.UtilsHandler; import com.amaze.filemanager.database.models.OperationData; -import com.amaze.filemanager.database.models.explorer.CloudEntry; -import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException; import com.amaze.filemanager.fileoperations.filesystem.OpenMode; import com.amaze.filemanager.fileoperations.filesystem.StorageNaming; import com.amaze.filemanager.fileoperations.filesystem.usb.SingletonUsbOtg; @@ -146,8 +144,12 @@ import com.amaze.filemanager.utils.OTGUtil; import com.amaze.filemanager.utils.PackageUtils; import com.amaze.filemanager.utils.PreferenceUtils; +import com.amaze.filemanager.utils.StartActivityForResultWithSourceIntent; import com.amaze.filemanager.utils.Utils; -import com.cloudrail.si.CloudRail; +import com.amaze.filemanager.utils.cloud.CloudPluginUtil; +import com.amaze.filemanager.utils.omh.AuthTrigger; +import com.amaze.filemanager.utils.omh.OMHClientHelper; +import com.amaze.filemanager.utils.omh.OmhCredentialsWrapper; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.snackbar.BaseTransientBottomBar; import com.google.android.material.snackbar.Snackbar; @@ -155,6 +157,9 @@ import com.leinardi.android.speeddial.SpeedDialActionItem; import com.leinardi.android.speeddial.SpeedDialOverlayLayout; import com.leinardi.android.speeddial.SpeedDialView; +import com.openmobilehub.android.auth.core.OmhAuthClient; +import com.openmobilehub.android.auth.core.OmhCredentials; +import com.openmobilehub.android.auth.core.utils.EncryptedSharedPreferences; import com.readystatesoftware.systembartint.SystemBarTintManager; import com.topjohnwu.superuser.Shell; @@ -163,18 +168,15 @@ import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ContentResolver; -import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; -import android.database.Cursor; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.hardware.usb.UsbManager; import android.media.RingtoneManager; import android.net.Uri; -import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Environment; @@ -191,6 +193,7 @@ import android.view.animation.DecelerateInterpolator; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.DrawableRes; import androidx.annotation.IdRes; import androidx.annotation.NonNull; @@ -202,13 +205,11 @@ import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.CursorLoader; -import androidx.loader.content.Loader; import io.reactivex.Completable; import io.reactivex.CompletableObserver; import io.reactivex.Flowable; +import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; @@ -220,9 +221,9 @@ public class MainActivity extends PermissionsActivity implements SmbConnectionListener, BookmarkCallback, CloudConnectionCallbacks, - LoaderManager.LoaderCallbacks, FolderChooserDialog.FolderCallback, - PermissionsActivity.OnPermissionGranted { + PermissionsActivity.OnPermissionGranted, + AuthTrigger { private static final Logger LOG = LoggerFactory.getLogger(MainActivity.class); @@ -266,6 +267,9 @@ public class MainActivity extends PermissionsActivity private static final String KEY_OPERATION = "operation"; private static final String KEY_SELECTED_LIST_ITEM = "select_list_item"; + private static final String KEY_OPEN_MODE = "OPEN_MODE"; + private static final String KEY_CLOUD_REAUTHENTICATING = "CLOUD_REAUTHENTICATING"; + private AppBar appbar; private Drawer drawer; // private HistoryManager history, grid; @@ -282,15 +286,6 @@ public class MainActivity extends PermissionsActivity private SpeedDialOverlayLayout fabBgView; private UtilsHandler utilsHandler; - private CloudHandler cloudHandler; - private CloudLoaderAsyncTask cloudLoaderAsyncTask; - - /** - * This is for a hack. - * - * @see MainActivity#onLoadFinished(Loader, Cursor) - */ - private Cursor cloudCursorData = null; public static final int REQUEST_CODE_SAF = 223; @@ -322,6 +317,7 @@ public class MainActivity extends PermissionsActivity public static final String CLOUD_AUTHENTICATOR_GDRIVE = "android.intent.category.BROWSABLE"; public static final String CLOUD_AUTHENTICATOR_REDIRECT_URI = "com.amaze.filemanager:/auth"; + private AuthCallback pendingAuthCallback; // the current visible tab, either 0 or 1 public static int currentTab; @@ -329,9 +325,6 @@ public class MainActivity extends PermissionsActivity private String scrollToFileName = null; - public static final int REQUEST_CODE_CLOUD_LIST_KEYS = 5463; - public static final int REQUEST_CODE_CLOUD_LIST_KEY = 5472; - private PasteHelper pasteHelper; public MainActivityActionMode mainActivityActionMode; @@ -344,6 +337,60 @@ public class MainActivity extends PermissionsActivity private static final String INTENT_ACTION_OPEN_APP_MANAGER = "com.amaze.filemanager.openAppManager"; + @SuppressLint("CheckResult") + private final ActivityResultLauncher loginLauncher = + registerForActivityResult( + new StartActivityForResultWithSourceIntent(), + result -> { + if (result.getResultCode() == RESULT_CANCELED) { + String errorMessage = result.getData().getStringExtra("errorMessage"); + LOG.error("auth failed: {}", errorMessage); + if (pendingAuthCallback != null) { + pendingAuthCallback.onAuthFailure(errorMessage); + pendingAuthCallback = null; + } + } else { + // cuz #getCredentials cannot be called from the main thread + Single.fromCallable( + () -> { + OpenMode openMode = + (OpenMode) result.getData().getSerializableExtra(KEY_OPEN_MODE); + Objects.requireNonNull(openMode); + OmhAuthClient authClient = OMHClientHelper.getAuthClient(openMode); + OmhCredentials credentials = authClient.getCredentials(); + if (!result.getData().getBooleanExtra(KEY_CLOUD_REAUTHENTICATING, false)) { + dataUtils.addAccount(new OmhCredentialsWrapper(openMode, credentials)); + } + return true; + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + actionResult -> { + getDrawer().refreshDrawer(); + if (pendingAuthCallback != null) { + pendingAuthCallback.onAuthSuccess(); + pendingAuthCallback = null; + } + }, + throwable -> { + throwable.printStackTrace(); + AppConfig.toast(MainActivity.this, R.string.failed_cloud_new_connection); + if (pendingAuthCallback != null) { + pendingAuthCallback.onAuthFailure(throwable.getMessage()); + pendingAuthCallback = null; + } + }); + } + }); + + /** Interface for callbacks when authentication is completed or fails */ + public interface AuthCallback { + void onAuthSuccess(); + + void onAuthFailure(String errorMessage); + } + /** Called when the activity is first created. */ @Override public void onCreate(final Bundle savedInstanceState) { @@ -352,7 +399,7 @@ public void onCreate(final Bundle savedInstanceState) { intent = getIntent(); - dataUtils = DataUtils.getInstance(); + dataUtils = DataUtils.INSTANCE; if (savedInstanceState != null) { listItemSelected = savedInstanceState.getBoolean(KEY_SELECTED_LIST_ITEM, false); } @@ -363,21 +410,27 @@ public void onCreate(final Bundle savedInstanceState) { dataUtils.registerOnDataChangedListener(new SaveOnDataUtilsChange(drawer)); AppConfig.getInstance().setMainActivityContext(this); + AppConfig.getInstance().setCloudAuthTrigger(this); initialiseViews(); utilsHandler = AppConfig.getInstance().getUtilsHandler(); - cloudHandler = new CloudHandler(this, AppConfig.getInstance().getExplorerDatabase()); initialiseFab(); // TODO: 7/12/2017 not init when actionIntent != null mainActivityHelper = new MainActivityHelper(this); mainActivityActionMode = new MainActivityActionMode(new WeakReference<>(MainActivity.this)); - if (CloudSheetFragment.isCloudProviderAvailable(this)) { + if (CloudPluginUtil.isCloudProviderAvailable(this)) { + try { + OMHClientHelper.initializeClients(); + } catch (Exception errorRaised) { + LOG.error("Error initializing OMH clients", errorRaised); + AppConfig.toast(this, R.string.cloud_error_failed_restart); + } try { - LoaderManager.getInstance(this).initLoader(REQUEST_CODE_CLOUD_LIST_KEYS, null, this); + CloudPluginUtil.initializeDataUtils(this); + drawer.refreshDrawer(); } catch (Exception errorRaised) { LOG.error("Error initializing cloud connections", errorRaised); - cloudHandler.clearAllCloudConnections(); AlertDialog.show( this, R.string.cloud_connection_credentials_cleared_msg, @@ -385,7 +438,6 @@ public void onCreate(final Bundle savedInstanceState) { android.R.string.ok, null, false); - LoaderManager.getInstance(this).initLoader(REQUEST_CODE_CLOUD_LIST_KEYS, null, this); } } @@ -2024,14 +2076,6 @@ public void onNewIntent(Intent i) { if (failedOps != null) { mainActivityHelper.showFailedOperationDialog(failedOps, this); } - } else if (i.getCategories() != null - && i.getCategories().contains(CLOUD_AUTHENTICATOR_GDRIVE)) { - // we used an external authenticator instead of APIs. Probably for Google Drive - CloudRail.setAuthenticationResponse(intent); - if (intent.getAction() != null) { - checkForExternalIntent(intent); - invalidateFragmentAndBundle(null, false); - } } else if ((openProcesses = i.getBooleanExtra(KEY_INTENT_PROCESS_VIEWER, false))) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace( @@ -2260,9 +2304,49 @@ public void modify(String oldpath, String oldname, String newPath, String newnam } @Override - public void addConnection(OpenMode service) { + public boolean triggerAuthBlocking(@NonNull OpenMode openMode) { + final CountDownLatch latch = new CountDownLatch(1); + final AtomicBoolean result = new AtomicBoolean(false); + + runOnUiThread( + () -> { + OmhAuthClient authClient = OMHClientHelper.getAuthClient(openMode); + if (authClient == null) { + result.set(false); + latch.countDown(); + return; + } + + try { + Intent loginIntent = authClient.getLoginIntent(); + loginIntent.putExtra("OPEN_MODE", openMode); + loginLauncher.launch(loginIntent); + } catch (Exception e) { + LOG.warn("Failed to launch auth intent", e); + latch.countDown(); + } + }); + try { - if (cloudHandler.findEntry(service) != null) { + boolean completed = latch.await(120, java.util.concurrent.TimeUnit.SECONDS); + if (!completed) { + LOG.warn("Auth blocking timed out for {}", openMode); + runOnUiThread(() -> pendingAuthCallback = null); + } + return completed && result.get(); + } catch (InterruptedException e) { + LOG.warn("Auth blocking interrupted", e); + return false; + } + } + + @Override + public void addCloudConnection(OpenMode service) { + if (CloudPluginUtil.isCloudProviderAvailable(this)) { + if (EncryptedSharedPreferences.INSTANCE + .getEncryptedSharedPrefs(this, CloudPluginUtil.resolveOmhProviderNameFrom(service)) + .getString("email", null) + != null) { // cloud entry already exists Toast.makeText( this, getResources().getString(R.string.connection_exists), Toast.LENGTH_LONG) @@ -2281,141 +2365,30 @@ this, getResources().getString(R.string.cloud_error_fdroid), Toast.LENGTH_LONG) args.putInt(ARGS_KEY_LOADER, service.ordinal()); // check if we already had done some work on the loader - Loader loader = getSupportLoaderManager().getLoader(REQUEST_CODE_CLOUD_LIST_KEY); - if (loader != null && loader.isStarted()) { - - // making sure that loader is not started - getSupportLoaderManager().destroyLoader(REQUEST_CODE_CLOUD_LIST_KEY); - } - - getSupportLoaderManager().initLoader(REQUEST_CODE_CLOUD_LIST_KEY, args, this); + OmhAuthClient authClient = OMHClientHelper.getAuthClient(service); + loginLauncher.launch( + authClient + .getLoginIntent() + .putExtra(KEY_CLOUD_REAUTHENTICATING, true) + .putExtra(KEY_OPEN_MODE, service)); } - } catch (CloudPluginException e) { - LOG.warn("failure when adding cloud plugin connections", e); + } else { Toast.makeText(this, getResources().getString(R.string.cloud_error_plugin), Toast.LENGTH_LONG) .show(); } } @Override - public void deleteConnection(OpenMode service) { - cloudHandler.clear(service); + public void deleteCloudConnection(OpenMode service) { + EncryptedSharedPreferences.INSTANCE + .getEncryptedSharedPrefs(this, CloudPluginUtil.resolveOmhProviderNameFrom(service)) + .edit() + .clear() + .apply(); dataUtils.removeAccount(service); - runOnUiThread(drawer::refreshDrawer); } - @NonNull - @Override - public Loader onCreateLoader(int id, Bundle args) { - Uri uri = - Uri.withAppendedPath( - Uri.parse("content://" + CloudContract.PROVIDER_AUTHORITY), "/keys.db/secret_keys"); - - String[] projection = - new String[] { - CloudContract.COLUMN_ID, - CloudContract.COLUMN_CLIENT_ID, - CloudContract.COLUMN_CLIENT_SECRET_KEY - }; - - switch (id) { - case REQUEST_CODE_CLOUD_LIST_KEY: - Uri uriAppendedPath = uri; - switch (OpenMode.getOpenMode(args.getInt(ARGS_KEY_LOADER, 2))) { - case GDRIVE: - uriAppendedPath = ContentUris.withAppendedId(uri, 2); - break; - case DROPBOX: - uriAppendedPath = ContentUris.withAppendedId(uri, 3); - break; - case BOX: - uriAppendedPath = ContentUris.withAppendedId(uri, 4); - break; - case ONEDRIVE: - uriAppendedPath = ContentUris.withAppendedId(uri, 5); - break; - } - return new CursorLoader(this, uriAppendedPath, projection, null, null, null); - case REQUEST_CODE_CLOUD_LIST_KEYS: - // we need a list of all secret keys - - try { - List cloudEntries = cloudHandler.getAllEntries(); - - // we want keys for services saved in database, and the cloudrail app key which - // is at index 1 - String ids[] = new String[cloudEntries.size() + 1]; - - ids[0] = 1 + ""; - for (int i = 1; i <= cloudEntries.size(); i++) { - - // we need to get only those cloud details which user wants - switch (cloudEntries.get(i - 1).getServiceType()) { - case GDRIVE: - ids[i] = 2 + ""; - break; - case DROPBOX: - ids[i] = 3 + ""; - break; - case BOX: - ids[i] = 4 + ""; - break; - case ONEDRIVE: - ids[i] = 5 + ""; - break; - } - } - return new CursorLoader(this, uri, projection, CloudContract.COLUMN_ID, ids, null); - } catch (CloudPluginException e) { - LOG.warn("failure when fetching cloud connections", e); - Toast.makeText( - this, getResources().getString(R.string.cloud_error_plugin), Toast.LENGTH_LONG) - .show(); - } - default: - Uri undefinedUriAppendedPath = ContentUris.withAppendedId(uri, 7); - return new CursorLoader(this, undefinedUriAppendedPath, projection, null, null, null); - } - } - - @Override - public void onLoadFinished(Loader loader, final Cursor data) { - if (data == null) { - Toast.makeText( - this, - getResources().getString(R.string.cloud_error_failed_restart), - Toast.LENGTH_LONG) - .show(); - return; - } - - /* - * This is hack for repeated calls to onLoadFinished(), - * we take the Cursor provided to check if the function - * has already been called on it. - * - * TODO: find a fix for repeated callbacks to onLoadFinished() - */ - if (cloudCursorData == null - || cloudCursorData == data - || data.isClosed() - || cloudCursorData.isClosed()) return; - cloudCursorData = data; - - if (cloudLoaderAsyncTask != null - && cloudLoaderAsyncTask.getStatus() == AsyncTask.Status.RUNNING) { - return; - } - cloudLoaderAsyncTask = new CloudLoaderAsyncTask(this, cloudHandler, cloudCursorData); - cloudLoaderAsyncTask.execute(); - } - - @Override - public void onLoaderReset(Loader loader) { - // For passing code check - } - public void initCornersDragListener(boolean destroy, boolean shouldInvokeLeftAndRight) { initBottomDragListener(destroy); initLeftRightAndTopDragListeners(destroy, shouldInvokeLeftAndRight); diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt b/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt index f532ca4a7d..9592d91a24 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt @@ -146,7 +146,7 @@ class DragAndDropDialog : DialogFragment() { .title(getString(R.string.choose_operation)) .customView(R.layout.dialog_drag_drop, true) .theme(dialogTheme) - .negativeText(getString(R.string.cancel).toUpperCase()) + .negativeText(getString(R.string.cancel).uppercase()) .negativeColor(accent) .cancelable(false) .onNeutral { _: MaterialDialog?, _: DialogAction? -> diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java b/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java index 4e7f0e0565..81c2b406aa 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java @@ -970,7 +970,7 @@ public static void showCloudDialog( builder.negativeText(mainActivity.getString(R.string.no)); builder.negativeColor(accentColor); - builder.onPositive((dialog, which) -> mainActivity.deleteConnection(openMode)); + builder.onPositive((dialog, which) -> mainActivity.deleteCloudConnection(openMode)); builder.onNegative((dialog, which) -> dialog.cancel()); @@ -1409,7 +1409,7 @@ public static void showSignInWithGoogleDialog(@NonNull MainActivity mainActivity .findViewById(R.id.signin_with_google) .setOnClickListener( v -> { - mainActivity.addConnection(OpenMode.GDRIVE); + mainActivity.addCloudConnection(OpenMode.GDRIVE); dialog.dismiss(); }); diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/HiddenFilesDialog.kt b/app/src/main/java/com/amaze/filemanager/ui/dialogs/HiddenFilesDialog.kt index 269bd437e9..97b45bbe85 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/HiddenFilesDialog.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/HiddenFilesDialog.kt @@ -47,7 +47,7 @@ object HiddenFilesDialog { mainActivity, mainFragment, sharedPrefs, - FileUtils.toHybridFileConcurrentRadixTree(DataUtils.getInstance().hiddenFiles), + FileUtils.toHybridFileConcurrentRadixTree(DataUtils.hiddenFiles), null, false, ) diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/HistoryDialog.kt b/app/src/main/java/com/amaze/filemanager/ui/dialogs/HistoryDialog.kt index cb1e6f793a..03b489083f 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/HistoryDialog.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/HistoryDialog.kt @@ -46,7 +46,7 @@ object HistoryDialog { mainActivity, mainFragment, sharedPrefs, - FileUtils.toHybridFileArrayList(DataUtils.getInstance().history), + FileUtils.toHybridFileArrayList(DataUtils.getHistory()), null, true, ) @@ -59,7 +59,7 @@ object HistoryDialog { builder.negativeColor(mainActivity.accent) builder.title(R.string.history) builder.onNegative { _: MaterialDialog?, _: DialogAction? -> - DataUtils.getInstance().clearHistory() + DataUtils.clearHistory() } builder.theme(appTheme.getMaterialDialogTheme()) builder.adapter(adapter, null) diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/RenameBookmark.java b/app/src/main/java/com/amaze/filemanager/ui/dialogs/RenameBookmark.java index 850e119f1a..9ea17b7fb1 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/RenameBookmark.java +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/RenameBookmark.java @@ -44,7 +44,7 @@ public class RenameBookmark extends DialogFragment { private String title; private String path; private BookmarkCallback bookmarkCallback; - private final DataUtils dataUtils = DataUtils.getInstance(); + private final DataUtils dataUtils = DataUtils.INSTANCE; public static RenameBookmark getInstance(String name, String path, int accentColor) { RenameBookmark renameBookmark = new RenameBookmark(); diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialog.kt b/app/src/main/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialog.kt index eeb9c7ad01..a570caa4d1 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialog.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialog.kt @@ -315,11 +315,11 @@ class SftpConnectDialog : DialogFragment() { edit = true, ) val i = - DataUtils.getInstance().containsServer( + DataUtils.containsServer( arrayOf(connectionName, path), ) if (i > -1) { - DataUtils.getInstance().removeServer(i) + DataUtils.removeServer(i) AppConfig.getInstance() .runInBackground { AppConfig.getInstance().utilsHandler.removeFromDatabase( @@ -721,8 +721,8 @@ class SftpConnectDialog : DialogFragment() { selectedParsedKeyPair, explicitTls, )?.run { - if (DataUtils.getInstance().containsServer(encryptedPath) == -1) { - DataUtils.getInstance().addServer(arrayOf(connectionName, encryptedPath)) + if (DataUtils.containsServer(encryptedPath) == -1) { + DataUtils.addServer(arrayOf(connectionName, encryptedPath)) (activity as MainActivity).drawer.refreshDrawer() AppConfig.getInstance().utilsHandler.saveToDatabase( OperationData( @@ -768,14 +768,14 @@ class SftpConnectDialog : DialogFragment() { hostKeyFingerprint: String?, encryptedPath: String, ): Boolean { - val i = DataUtils.getInstance().containsServer(oldPath) + val i = DataUtils.containsServer(oldPath!!) if (i != -1) { - DataUtils.getInstance().removeServer(i) + DataUtils.removeServer(i) } - DataUtils.getInstance().addServer(arrayOf(connectionName, encryptedPath)) - DataUtils.getInstance().servers.sortWith(BookSorter()) + DataUtils.addServer(arrayOf(connectionName, encryptedPath)) + DataUtils.getServers().sortWith(BookSorter()) (activity as MainActivity).drawer.refreshDrawer() AppConfig.getInstance().runInBackground { AppConfig.getInstance().utilsHandler.updateSsh( diff --git a/app/src/main/java/com/amaze/filemanager/ui/drag/RecyclerAdapterDragListener.kt b/app/src/main/java/com/amaze/filemanager/ui/drag/RecyclerAdapterDragListener.kt index f2f509478d..8ecb8f70c1 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/drag/RecyclerAdapterDragListener.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/drag/RecyclerAdapterDragListener.kt @@ -58,8 +58,7 @@ class RecyclerAdapterDragListener( if (dragAndDropPref != PreferencesConstants.PREFERENCE_DRAG_TO_SELECT ) { - val dataUtils = DataUtils.getInstance() - dataUtils.checkedItemsList = null + DataUtils.checkedItemsList = null mainFragment.requireMainActivity() .tabFragment.dragPlaceholder?.visibility = View.INVISIBLE } @@ -188,14 +187,13 @@ class RecyclerAdapterDragListener( if (checkedItems?.size == 0) { // probably because we switched tabs and // this adapter doesn't have any checked items, get from data utils - val dataUtils = DataUtils.getInstance() Log.d( TAG, "Didn't find checked items in adapter, " + "checking dataUtils size ${ - dataUtils.checkedItemsList?.size ?: "null"}", + DataUtils.checkedItemsList?.size ?: "null"}", ) - checkedItems = dataUtils.checkedItemsList + checkedItems = DataUtils.checkedItemsList } val arrayList = ArrayList() checkedItems?.forEach { diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.kt b/app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.kt index 45d4e544b1..9078218169 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/CloudSheetFragment.kt @@ -17,180 +17,159 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - -package com.amaze.filemanager.ui.fragments; - -import com.amaze.filemanager.BuildConfig; -import com.amaze.filemanager.R; -import com.amaze.filemanager.database.CloudContract; -import com.amaze.filemanager.databinding.FragmentSheetCloudBinding; -import com.amaze.filemanager.fileoperations.filesystem.OpenMode; -import com.amaze.filemanager.ui.activities.MainActivity; -import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation; -import com.amaze.filemanager.ui.dialogs.SftpConnectDialog; -import com.amaze.filemanager.ui.dialogs.SmbSearchDialog; -import com.amaze.filemanager.ui.theme.AppTheme; -import com.amaze.filemanager.utils.Utils; -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import android.app.Dialog; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.LinearLayout; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +package com.amaze.filemanager.ui.fragments + +import android.app.Dialog +import android.content.ActivityNotFoundException +import android.content.DialogInterface +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.LinearLayout +import com.amaze.filemanager.BuildConfig +import com.amaze.filemanager.R +import com.amaze.filemanager.databinding.FragmentSheetCloudBinding +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.ui.activities.MainActivity +import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation +import com.amaze.filemanager.ui.dialogs.SftpConnectDialog +import com.amaze.filemanager.ui.dialogs.SmbSearchDialog +import com.amaze.filemanager.ui.theme.AppTheme +import com.amaze.filemanager.utils.Utils +import com.amaze.filemanager.utils.cloud.CloudPluginUtil +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.bottomsheet.BottomSheetDialogFragment /** * Created by vishal on 18/2/17. * - *

Class represents implementation of a new cloud connection sheet dialog + * + * Class represents implementation of a new cloud connection sheet dialog */ -public class CloudSheetFragment extends BottomSheetDialogFragment implements View.OnClickListener { - - private View rootView; - private LinearLayout mSmbLayout, - mScpLayout, - mDropboxLayout, - mBoxLayout, - mGoogleDriveLayout, - mOnedriveLayout, - mGetCloudLayout; - - public static final String TAG_FRAGMENT = "cloud_fragment"; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState); - - dialog.setOnShowListener( - dialog1 -> { - BottomSheetDialog d = (BottomSheetDialog) dialog1; - - FrameLayout bottomSheet = - (FrameLayout) d.findViewById(com.google.android.material.R.id.design_bottom_sheet); - BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED); - }); - return dialog; - } - - @Override - public void setupDialog(Dialog dialog, int style) { - super.setupDialog(dialog, style); - - rootView = FragmentSheetCloudBinding.inflate(LayoutInflater.from(requireActivity())).getRoot(); - - MainActivity activity = (MainActivity) getActivity(); - - if (activity.getAppTheme().equals(AppTheme.DARK)) { - rootView.setBackgroundColor(Utils.getColor(getContext(), R.color.holo_dark_background)); - } else if (activity.getAppTheme().equals(AppTheme.BLACK)) { - rootView.setBackgroundColor(Utils.getColor(getContext(), android.R.color.black)); - } else { - rootView.setBackgroundColor(Utils.getColor(getContext(), android.R.color.white)); +class CloudSheetFragment : BottomSheetDialogFragment(), View.OnClickListener { + private lateinit var rootView: View + private lateinit var mSmbLayout: LinearLayout + private lateinit var mScpLayout: LinearLayout + private lateinit var mDropboxLayout: LinearLayout + private lateinit var mBoxLayout: LinearLayout + private lateinit var mGoogleDriveLayout: LinearLayout + private lateinit var mOnedriveLayout: LinearLayout + private lateinit var mGetCloudLayout: LinearLayout + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + val binding = FragmentSheetCloudBinding.inflate(LayoutInflater.from(requireActivity())) + rootView = binding.root + + val activity = activity as MainActivity? + + when (activity?.appTheme) { + AppTheme.DARK -> rootView.setBackgroundColor(Utils.getColor(context, R.color.holo_dark_background)) + AppTheme.BLACK -> rootView.setBackgroundColor(Utils.getColor(context, android.R.color.black)) + else -> rootView.setBackgroundColor(Utils.getColor(context, android.R.color.white)) + } + + mSmbLayout = binding.linearLayoutSmb + mScpLayout = binding.linearLayoutScp + mBoxLayout = binding.linearLayoutBox + mDropboxLayout = binding.linearLayoutDropbox + mGoogleDriveLayout = binding.linearLayoutGoogleDrive + mOnedriveLayout = binding.linearLayoutOnedrive + mGetCloudLayout = binding.linearLayoutGetCloud + + if (CloudPluginUtil.isCloudProviderAvailable(requireContext())) { + mBoxLayout.visibility = View.VISIBLE + mDropboxLayout.visibility = View.VISIBLE + mGoogleDriveLayout.visibility = View.VISIBLE + mOnedriveLayout.visibility = View.VISIBLE + mGetCloudLayout.visibility = View.GONE + } + + if (BuildConfig.IS_VERSION_FDROID) { + mBoxLayout.visibility = View.GONE + mDropboxLayout.visibility = View.GONE + mGoogleDriveLayout.visibility = View.GONE + mOnedriveLayout.visibility = View.GONE + mGetCloudLayout.visibility = View.GONE + } + + mSmbLayout.setOnClickListener(this) + mScpLayout.setOnClickListener(this) + mBoxLayout.setOnClickListener(this) + mDropboxLayout.setOnClickListener(this) + mGoogleDriveLayout.setOnClickListener(this) + mOnedriveLayout.setOnClickListener(this) + mGetCloudLayout.setOnClickListener(this) + + dialog.setContentView(binding.root) + dialog.setOnShowListener { dialog1: DialogInterface -> + val d = dialog1 as BottomSheetDialog + val bottomSheet = + d.findViewById(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout? + BottomSheetBehavior.from(bottomSheet!!).setState(BottomSheetBehavior.STATE_EXPANDED) + } + return dialog } - mSmbLayout = rootView.findViewById(R.id.linear_layout_smb); - mScpLayout = rootView.findViewById(R.id.linear_layout_scp); - mBoxLayout = rootView.findViewById(R.id.linear_layout_box); - mDropboxLayout = rootView.findViewById(R.id.linear_layout_dropbox); - mGoogleDriveLayout = rootView.findViewById(R.id.linear_layout_google_drive); - mOnedriveLayout = rootView.findViewById(R.id.linear_layout_onedrive); - mGetCloudLayout = rootView.findViewById(R.id.linear_layout_get_cloud); - - if (isCloudProviderAvailable(getContext())) { - - mBoxLayout.setVisibility(View.VISIBLE); - mDropboxLayout.setVisibility(View.VISIBLE); - mGoogleDriveLayout.setVisibility(View.VISIBLE); - mOnedriveLayout.setVisibility(View.VISIBLE); - mGetCloudLayout.setVisibility(View.GONE); + override fun onClick(v: View) { + when (v.id) { + R.id.linear_layout_smb -> { + dismiss() + val smbDialog = SmbSearchDialog() + smbDialog.show(requireActivity().supportFragmentManager, "tab") + return + } + + R.id.linear_layout_scp -> { + dismiss() + val sftpConnectDialog = SftpConnectDialog() + val args = Bundle() + args.putBoolean("edit", false) + sftpConnectDialog.arguments = args + sftpConnectDialog.show(parentFragmentManager, "tab") + return + } + + R.id.linear_layout_box -> requireMainActivity().addCloudConnection(OpenMode.BOX) + R.id.linear_layout_dropbox -> requireMainActivity().addCloudConnection(OpenMode.DROPBOX) + R.id.linear_layout_google_drive -> GeneralDialogCreation.showSignInWithGoogleDialog((activity as MainActivity?)!!) + R.id.linear_layout_onedrive -> requireMainActivity().addCloudConnection(OpenMode.ONEDRIVE) + R.id.linear_layout_get_cloud -> { + val cloudPluginIntent = Intent(Intent.ACTION_VIEW) + cloudPluginIntent.setData(Uri.parse(getString(R.string.cloud_plugin_google_play_uri))) + try { + startActivity(cloudPluginIntent) + } catch (ifGooglePlayIsNotInstalled: ActivityNotFoundException) { + cloudPluginIntent.setData( + Uri.parse(getString(R.string.cloud_plugin_google_play_web_uri)), + ) + startActivity(cloudPluginIntent) + } + } + } + // dismiss this sheet dialog + dismiss() } - if (BuildConfig.IS_VERSION_FDROID) { - mBoxLayout.setVisibility(View.GONE); - mDropboxLayout.setVisibility(View.GONE); - mGoogleDriveLayout.setVisibility(View.GONE); - mOnedriveLayout.setVisibility(View.GONE); - mGetCloudLayout.setVisibility(View.GONE); - } + private fun requireMainActivity(): MainActivity = requireActivity() as MainActivity - mSmbLayout.setOnClickListener(this); - mScpLayout.setOnClickListener(this); - mBoxLayout.setOnClickListener(this); - mDropboxLayout.setOnClickListener(this); - mGoogleDriveLayout.setOnClickListener(this); - mOnedriveLayout.setOnClickListener(this); - mGetCloudLayout.setOnClickListener(this); - - dialog.setContentView(rootView); - } - - /** Determines whether cloud provider is installed or not */ - public static final boolean isCloudProviderAvailable(Context context) { - - PackageManager pm = context.getPackageManager(); - try { - pm.getPackageInfo(CloudContract.APP_PACKAGE_NAME, PackageManager.GET_ACTIVITIES); - return true; - } catch (PackageManager.NameNotFoundException e) { - return false; - } - } - - @Override - public void onClick(View v) { - if (v.getId() == R.id.linear_layout_smb) { - dismiss(); - SmbSearchDialog smbDialog = new SmbSearchDialog(); - smbDialog.show(requireActivity().getSupportFragmentManager(), "tab"); - } else if (v.getId() == R.id.linear_layout_scp) { - dismiss(); - SftpConnectDialog sftpConnectDialog = new SftpConnectDialog(); - Bundle args = new Bundle(); - args.putBoolean("edit", false); - sftpConnectDialog.setArguments(args); - sftpConnectDialog.show(getFragmentManager(), "tab"); - } else if (v.getId() == R.id.linear_layout_box) { - ((MainActivity) requireActivity()).addConnection(OpenMode.BOX); - } else if (v.getId() == R.id.linear_layout_dropbox) { - ((MainActivity) requireActivity()).addConnection(OpenMode.DROPBOX); - } else if (v.getId() == R.id.linear_layout_google_drive) { - GeneralDialogCreation.showSignInWithGoogleDialog((MainActivity) requireActivity()); - } else if (v.getId() == R.id.linear_layout_onedrive) { - ((MainActivity) getActivity()).addConnection(OpenMode.ONEDRIVE); - } else if (v.getId() == R.id.linear_layout_get_cloud) { - Intent cloudPluginIntent = new Intent(Intent.ACTION_VIEW); - cloudPluginIntent.setData(Uri.parse(getString(R.string.cloud_plugin_google_play_uri))); - try { - startActivity(cloudPluginIntent); - } catch (ActivityNotFoundException ifGooglePlayIsNotInstalled) { - cloudPluginIntent.setData(Uri.parse(getString(R.string.cloud_plugin_google_play_web_uri))); - startActivity(cloudPluginIntent); - } - } - // dismiss this sheet dialog - dismiss(); - } + interface CloudConnectionCallbacks { + /** + * Callback to add a new cloud connection of type [service] + */ + fun addCloudConnection(service: OpenMode?) - public interface CloudConnectionCallbacks { - void addConnection(OpenMode service); + /** + * Callback to delete an existing cloud connection of type [service] + */ + fun deleteCloudConnection(service: OpenMode?) + } - void deleteConnection(OpenMode service); - } + companion object { + const val TAG_FRAGMENT: String = "cloud_fragment" + } } diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java b/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java index 8dddfa8579..f0e0068646 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java @@ -378,8 +378,8 @@ void switchToList() { public void switchView() { boolean isPathLayoutGrid = - DataUtils.getInstance() - .getListOrGridForPath(mainFragmentViewModel.getCurrentPath(), DataUtils.LIST) + DataUtils.INSTANCE.getListOrGridForPath( + mainFragmentViewModel.getCurrentPath(), DataUtils.LIST) == DataUtils.GRID; reloadListElements(false, isPathLayoutGrid); } @@ -482,7 +482,16 @@ public void onListItemClicked( adapter.toggleChecked(position, imageView); } else { computeScroll(); - loadlist(path, false, mainFragmentViewModel.getOpenMode(), false); + if (mainFragmentViewModel.getIsCloudOpenMode()) { + loadlist( + layoutElementParcelable.cloudFileId, + path, + false, + mainFragmentViewModel.getOpenMode(), + false); + } else { + loadlist(path, false, mainFragmentViewModel.getOpenMode(), false); + } } } else if (layoutElementParcelable.desc.endsWith(CryptUtil.CRYPT_EXTENSION) || layoutElementParcelable.desc.endsWith(CryptUtil.AESCRYPT_EXTENSION)) { @@ -513,7 +522,7 @@ public void onListItemClicked( new HybridFileParcelable[] {layoutElementParcelable.generateBaseFile()}); } else { layoutElementParcelable.generateBaseFile().openFile(getMainActivity(), false); - DataUtils.getInstance().addHistoryFile(layoutElementParcelable.desc); + DataUtils.INSTANCE.addHistoryFile(layoutElementParcelable.desc); } } } @@ -621,15 +630,30 @@ public void returnIntentResults(HybridFileParcelable[] baseFiles) { LoadFilesListTask loadFilesListTask; + public void loadlist( + final String providedPath, + final boolean back, + final OpenMode providedOpenMode, + boolean forceReload) { + loadlist( + mainFragmentViewModel.getCloudFolderId(), + providedPath, + back, + providedOpenMode, + forceReload); + } + /** * This loads a path into the MainFragment. * + * @param cloudFolderId cloud folder ID. Leave it blank if not used. * @param providedPath the path to be loaded * @param back if we're coming back from any directory and want the scroll to be restored * @param providedOpenMode the mode in which the directory should be opened * @param forceReload whether use cached list or force reload the list items */ public void loadlist( + @NonNull final String cloudFolderId, final String providedPath, final boolean back, final OpenMode providedOpenMode, @@ -653,7 +677,10 @@ && getMainActivity().getActionModeHelper().getActionMode() != null) { } OpenMode openMode = providedOpenMode; - String actualPath = FileProperties.remapPathForApi30OrAbove(providedPath, false); + String actualPath; + if ((OpenMode.FILE.equals(openMode)) && SDK_INT > Q) + actualPath = FileProperties.remapPathForApi30OrAbove(providedPath, false); + else actualPath = providedPath; if (SDK_INT >= Q && ArraysKt.any(ANDROID_DATA_DIRS, providedPath::contains)) { openMode = loadPathInQ(actualPath, providedPath, providedOpenMode); @@ -667,7 +694,8 @@ else if (actualPath.startsWith("/") loadFilesListTask = new LoadFilesListTask( - getActivity(), + requireMainActivity(), + cloudFolderId, actualPath, this, openMode, @@ -678,9 +706,10 @@ else if (actualPath.startsWith("/") mSwipeRefreshLayout.setRefreshing(false); if (data != null && data.second != null) { boolean isPathLayoutGrid = - DataUtils.getInstance().getListOrGridForPath(providedPath, DataUtils.LIST) + DataUtils.INSTANCE.getListOrGridForPath(providedPath, DataUtils.LIST) == DataUtils.GRID; - setListElements(data.second, back, providedPath, data.first, isPathLayoutGrid); + setListElements( + data.second, back, cloudFolderId, providedPath, data.first, isPathLayoutGrid); } else { LOG.warn("Load list operation cancelled"); } @@ -799,11 +828,13 @@ void initNoFileLayout() { public void setListElements( List bitmap, boolean back, - String path, + @Nullable String cloudFolderId, + @NonNull String path, final OpenMode openMode, boolean grid) { if (bitmap != null) { mainFragmentViewModel.setListElements(bitmap); + mainFragmentViewModel.setCloudFolderId(cloudFolderId); mainFragmentViewModel.setCurrentPath(path); mainFragmentViewModel.setOpenMode(openMode); reloadListElements(back, grid); @@ -885,7 +916,7 @@ public void reloadListElements(boolean back, boolean grid) { if (mainFragmentViewModel.getOpenMode() != OpenMode.CUSTOM && mainFragmentViewModel.getOpenMode() != OpenMode.TRASH_BIN) { - DataUtils.getInstance().addHistoryFile(mainFragmentViewModel.getCurrentPath()); + DataUtils.INSTANCE.addHistoryFile(mainFragmentViewModel.getCurrentPath()); } listView.setAdapter(adapter); @@ -1187,13 +1218,11 @@ public void reauthenticateSmb() { () -> { int i; AppConfig.toast(requireContext(), getString(R.string.unknown_error)); - if ((i = - DataUtils.getInstance() - .containsServer(mainFragmentViewModel.getSmbPath())) + if ((i = DataUtils.INSTANCE.containsServer(mainFragmentViewModel.getSmbPath())) != -1) { requireMainActivity() .showSMBDialog( - DataUtils.getInstance().getServers().get(i)[0], + DataUtils.INSTANCE.getServers().get(i)[0], mainFragmentViewModel.getSmbPath(), true); } @@ -1289,7 +1318,7 @@ public ArrayList addToSmb( mainFragmentViewModel.getSearchHelper().clear(); } for (SmbFile aMFile : mFile) { - if ((DataUtils.getInstance().isFileHidden(aMFile.getPath()) || aMFile.isHidden()) + if ((DataUtils.INSTANCE.isFileHidden(aMFile.getPath()) || aMFile.isHidden()) && !showHiddenFiles) { continue; } @@ -1358,7 +1387,7 @@ public void onDestroy() { } public void hide(String path) { - DataUtils.getInstance().addHiddenFile(path); + DataUtils.INSTANCE.addHiddenFile(path); File file = new File(path); if (file.isDirectory()) { File f1 = new File(path + "/" + ".nomedia"); diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/TabFragment.java b/app/src/main/java/com/amaze/filemanager/ui/fragments/TabFragment.java index 1ac810562d..833cec0c63 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/TabFragment.java +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/TabFragment.java @@ -525,7 +525,7 @@ private void initLeftAndRightDragListeners(boolean destroy) { View leftPlaceholder = rootView.findViewById(R.id.placeholder_drag_left); View rightPlaceholder = rootView.findViewById(R.id.placeholder_drag_right); AppCompatImageView dragToTrash = rootView.findViewById(R.id.placeholder_trash_bottom); - DataUtils dataUtils = DataUtils.getInstance(); + DataUtils dataUtils = DataUtils.INSTANCE; if (destroy) { leftPlaceholder.setOnDragListener(null); rightPlaceholder.setOnDragListener(null); diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/data/MainFragmentViewModel.kt b/app/src/main/java/com/amaze/filemanager/ui/fragments/data/MainFragmentViewModel.kt index 69b61e42cb..02f7b8bb49 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/data/MainFragmentViewModel.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/data/MainFragmentViewModel.kt @@ -28,7 +28,7 @@ import androidx.lifecycle.viewModelScope import com.amaze.filemanager.adapters.RecyclerAdapter import com.amaze.filemanager.adapters.data.IconDataParcelable import com.amaze.filemanager.adapters.data.LayoutElementParcelable -import com.amaze.filemanager.database.CloudHandler +import com.amaze.filemanager.database.CloudContract import com.amaze.filemanager.fileoperations.filesystem.OpenMode import com.amaze.filemanager.filesystem.HybridFileParcelable import com.amaze.filemanager.filesystem.files.sort.DirSortBy @@ -45,6 +45,7 @@ import java.util.Objects class MainFragmentViewModel : ViewModel() { var currentPath: String? = null + var cloudFolderId: String? = null /** This is not an exact copy of the elements in the adapter */ var listElements: List = ArrayList() @@ -139,7 +140,7 @@ class MainFragmentViewModel : ViewModel() { * Initialize isList from dataUtils */ fun initIsList() { - isList = DataUtils.getInstance().getListOrGridForPath( + isList = DataUtils.getListOrGridForPath( currentPath, DataUtils.LIST, ) == DataUtils.LIST @@ -193,10 +194,10 @@ class MainFragmentViewModel : ViewModel() { * Check if current path is cloud root path */ fun getIsOnCloudRoot(): Boolean { - return CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE + "/" == currentPath || - CloudHandler.CLOUD_PREFIX_ONE_DRIVE + "/" == currentPath || - CloudHandler.CLOUD_PREFIX_BOX + "/" == currentPath || - CloudHandler.CLOUD_PREFIX_DROPBOX + "/" == currentPath + return CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE + "/" == currentPath || + CloudContract.CLOUD_PREFIX_ONE_DRIVE + "/" == currentPath || + CloudContract.CLOUD_PREFIX_BOX + "/" == currentPath || + CloudContract.CLOUD_PREFIX_DROPBOX + "/" == currentPath } /** diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt b/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt index 3ce9e62e85..049f2e2d51 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/preferencefragments/BookmarksPrefsFragment.kt @@ -42,10 +42,6 @@ import com.amaze.filemanager.utils.SimpleTextWatcher class BookmarksPrefsFragment : BasePrefsFragment() { override val title = R.string.show_bookmarks_pref - companion object { - private val dataUtils = DataUtils.getInstance()!! - } - private val position: MutableMap = HashMap() private var bookmarksList: PreferenceCategory? = null @@ -80,10 +76,10 @@ class BookmarksPrefsFragment : BasePrefsFragment() { } position.clear() - for (i in dataUtils.books.indices) { + for (i in DataUtils.getBooks().indices) { val p = PathSwitchPreference(activity, itemOnEditListener, itemOnDeleteListener) - p.title = dataUtils.books[i][0] - p.summary = dataUtils.books[i][1] + p.title = DataUtils.getBooks()[i][0] + p.summary = DataUtils.getBooks()[i][1] position[p] = i bookmarksList?.addPreference(p) } @@ -126,14 +122,14 @@ class BookmarksPrefsFragment : BasePrefsFragment() { val p = PathSwitchPreference(activity, itemOnEditListener, itemOnDeleteListener) p.title = txtShortcutName.text p.summary = txtShortcutPath.text - position[p] = dataUtils.books.size + position[p] = DataUtils.getBooks().size bookmarksList?.addPreference(p) val values = arrayOf( txtShortcutName.text.toString(), txtShortcutPath.text.toString(), ) - dataUtils.addBook(values) + DataUtils.addBook(values) utilsHandler.saveToDatabase( OperationData( UtilsHandler.Operation.BOOKMARKS, @@ -153,7 +149,7 @@ class BookmarksPrefsFragment : BasePrefsFragment() { ): Pair { return when { name.isEmpty() -> Pair(false, R.string.invalid_name) - dataUtils.containsBooks(arrayOf(name, path)) != -1 -> Pair(false, R.string.bookmark_exists) + DataUtils.containsBooks(arrayOf(name, path)) != -1 -> Pair(false, R.string.bookmark_exists) !FileUtils.isPathAccessible(path, activity.prefs) -> Pair(false, R.string.ftp_path_change_error_invalid) else -> Pair(true, 0) } @@ -190,7 +186,7 @@ class BookmarksPrefsFragment : BasePrefsFragment() { .setOnClickListener { val oldName = p.title.toString() val oldPath = p.summary.toString() - dataUtils.removeBook(position[p]!!) + DataUtils.removeBook(position[p]!!) position.remove(p) bookmarksList?.removePreference(p) p.title = editText1.text @@ -198,7 +194,7 @@ class BookmarksPrefsFragment : BasePrefsFragment() { position[p] = position.size bookmarksList?.addPreference(p) val values = arrayOf(editText1.text.toString(), editText2.text.toString()) - dataUtils.addBook(values) + DataUtils.addBook(values) AppConfig.getInstance() .runInBackground { utilsHandler.renameBookmark( @@ -228,7 +224,7 @@ class BookmarksPrefsFragment : BasePrefsFragment() { .build() dialog.getActionButton(DialogAction.POSITIVE) .setOnClickListener { - dataUtils.removeBook(position[p]!!) + DataUtils.removeBook(position[p]!!) utilsHandler.removeFromDatabase( OperationData( UtilsHandler.Operation.BOOKMARKS, diff --git a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java index 358bfeb869..1e7bdb1a78 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java +++ b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java @@ -39,12 +39,11 @@ import com.amaze.filemanager.R; import com.amaze.filemanager.adapters.data.StorageDirectoryParcelable; import com.amaze.filemanager.application.AppConfig; -import com.amaze.filemanager.database.CloudHandler; +import com.amaze.filemanager.database.CloudContract; import com.amaze.filemanager.fileoperations.filesystem.OpenMode; import com.amaze.filemanager.fileoperations.filesystem.usb.SingletonUsbOtg; import com.amaze.filemanager.filesystem.HybridFile; import com.amaze.filemanager.filesystem.RootHelper; -import com.amaze.filemanager.filesystem.cloud.CloudUtil; import com.amaze.filemanager.filesystem.files.FileUtils; import com.amaze.filemanager.ui.ExtensionsKt; import com.amaze.filemanager.ui.activities.AboutActivity; @@ -53,7 +52,6 @@ import com.amaze.filemanager.ui.activities.UtilitiesAliasActivity; import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation; import com.amaze.filemanager.ui.fragments.AppsListFragment; -import com.amaze.filemanager.ui.fragments.CloudSheetFragment; import com.amaze.filemanager.ui.fragments.FtpServerFragment; import com.amaze.filemanager.ui.fragments.MainFragment; import com.amaze.filemanager.ui.fragments.preferencefragments.QuickAccessesPrefsFragment; @@ -66,11 +64,8 @@ import com.amaze.filemanager.utils.ScreenUtils; import com.amaze.filemanager.utils.TinyDB; import com.amaze.filemanager.utils.Utils; -import com.cloudrail.si.interfaces.CloudStorage; -import com.cloudrail.si.services.Box; -import com.cloudrail.si.services.Dropbox; -import com.cloudrail.si.services.GoogleDrive; -import com.cloudrail.si.services.OneDrive; +import com.amaze.filemanager.utils.cloud.CloudPluginUtil; +import com.amaze.filemanager.utils.omh.OmhCredentialsWrapper; import com.google.android.material.navigation.NavigationView; import android.content.ActivityNotFoundException; @@ -98,12 +93,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.widget.AppCompatImageButton; import androidx.appcompat.widget.AppCompatImageView; import androidx.appcompat.widget.AppCompatTextView; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.FragmentTransaction; -import androidx.legacy.app.ActionBarDrawerToggle; import androidx.lifecycle.ViewModelProvider; public class Drawer implements NavigationView.OnNavigationItemSelectedListener { @@ -148,7 +143,7 @@ public class Drawer implements NavigationView.OnNavigationItemSelectedListener { public Drawer(MainActivity mainActivity) { this.mainActivity = mainActivity; - dataUtils = DataUtils.getInstance(); + dataUtils = DataUtils.INSTANCE; drawerHeaderLayout = mainActivity.getLayoutInflater().inflate(R.layout.drawerheader, null); drawerHeaderParent = drawerHeaderLayout.findViewById(R.id.drawer_header_parent); @@ -164,28 +159,8 @@ public Drawer(MainActivity mainActivity) { telegramImageView.setOnClickListener(v -> Utils.openTelegramURL(mainActivity)); instagramImageView.setOnClickListener(v -> Utils.openInstagramURL(mainActivity)); initDrawerFocusItems(); - /*drawerHeaderView.setOnLongClickListener( - v -> { - Intent intent1; - if (SDK_INT < Build.VERSION_CODES.KITKAT) { - intent1 = new Intent(); - intent1.setAction(Intent.ACTION_GET_CONTENT); - } else { - intent1 = new Intent(Intent.ACTION_OPEN_DOCUMENT); - } - intent1.addCategory(Intent.CATEGORY_OPENABLE); - intent1.setType("image/*"); - mainActivity.startActivityForResult(intent1, image_selector_request_code); - return false; - });*/ navView = mainActivity.findViewById(R.id.navigation); - - // set width of drawer in portrait to follow material guidelines - /*if(!Utils.isDeviceInLandScape(mainActivity)){ - setNavViewDimension(navView); - }*/ - navView.setNavigationItemSelectedListener(this); int accentColor = mainActivity.getAccent(), idleColor; @@ -236,7 +211,6 @@ public Drawer(MainActivity mainActivity) { new ActionBarDrawerToggle( mainActivity, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ - R.drawable.ic_drawer_l, /* nav drawer image to replace 'Up' caret */ R.string.drawer_open, /* "open drawer" description for accessibility */ R.string.drawer_close /* "close drawer" description for accessibility */) { public void onDrawerClosed(View view) { @@ -248,7 +222,9 @@ public void onDrawerOpened(View drawerView) { // creates call to onPrepareOptionsMenu() } }; - mDrawerLayout.setDrawerListener(mDrawerToggle); + mDrawerToggle.setHomeAsUpIndicator( + R.drawable.ic_drawer_l); /* nav drawer image to replace 'Up' caret */ + mDrawerLayout.addDrawerListener(mDrawerToggle); mainActivity.getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer_l); mainActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); mainActivity.getSupportActionBar().setHomeButtonEnabled(true); @@ -353,65 +329,66 @@ public void refreshDrawer() { ArrayList accountAuthenticationList = new ArrayList<>(); - if (CloudSheetFragment.isCloudProviderAvailable(mainActivity)) { - for (CloudStorage cloudStorage : dataUtils.getAccounts()) { + if (CloudPluginUtil.isCloudProviderAvailable(mainActivity)) { + for (OmhCredentialsWrapper cloudStorage : dataUtils.getAccounts()) { @DrawableRes int deleteIcon = R.drawable.ic_delete_grey_24dp; - if (cloudStorage instanceof Dropbox) { + if (OpenMode.DROPBOX.equals(cloudStorage.getOpenMode())) { addNewItem( menu, CLOUDS_GROUP, order++, - CloudHandler.CLOUD_NAME_DROPBOX, - new MenuMetadata(CloudHandler.CLOUD_PREFIX_DROPBOX + "/", false), + CloudContract.CLOUD_NAME_DROPBOX, + new MenuMetadata(CloudContract.CLOUD_PREFIX_DROPBOX + "/", false), R.drawable.ic_dropbox_white_24dp, deleteIcon); accountAuthenticationList.add( new String[] { - CloudHandler.CLOUD_NAME_DROPBOX, CloudHandler.CLOUD_PREFIX_DROPBOX + "/", + CloudContract.CLOUD_NAME_DROPBOX, CloudContract.CLOUD_PREFIX_DROPBOX + "/", }); - } else if (cloudStorage instanceof Box) { + } else if (OpenMode.BOX.equals(cloudStorage.getOpenMode())) { addNewItem( menu, CLOUDS_GROUP, order++, - CloudHandler.CLOUD_NAME_BOX, - new MenuMetadata(CloudHandler.CLOUD_PREFIX_BOX + "/", false), + CloudContract.CLOUD_NAME_BOX, + new MenuMetadata(CloudContract.CLOUD_PREFIX_BOX + "/", false), R.drawable.ic_box_white_24dp, deleteIcon); accountAuthenticationList.add( new String[] { - CloudHandler.CLOUD_NAME_BOX, CloudHandler.CLOUD_PREFIX_BOX + "/", + CloudContract.CLOUD_NAME_BOX, CloudContract.CLOUD_PREFIX_BOX + "/", }); - } else if (cloudStorage instanceof OneDrive) { + } else if (OpenMode.ONEDRIVE.equals(cloudStorage.getOpenMode())) { addNewItem( menu, CLOUDS_GROUP, order++, - CloudHandler.CLOUD_NAME_ONE_DRIVE, - new MenuMetadata(CloudHandler.CLOUD_PREFIX_ONE_DRIVE + "/", false), + CloudContract.CLOUD_NAME_ONE_DRIVE, + new MenuMetadata(CloudContract.CLOUD_PREFIX_ONE_DRIVE + "/", false), R.drawable.ic_onedrive_white_24dp, deleteIcon); accountAuthenticationList.add( new String[] { - CloudHandler.CLOUD_NAME_ONE_DRIVE, CloudHandler.CLOUD_PREFIX_ONE_DRIVE + "/", + CloudContract.CLOUD_NAME_ONE_DRIVE, CloudContract.CLOUD_PREFIX_ONE_DRIVE + "/", }); - } else if (cloudStorage instanceof GoogleDrive) { + } else if (OpenMode.GDRIVE.equals(cloudStorage.getOpenMode())) { addNewItem( menu, CLOUDS_GROUP, order++, - CloudHandler.CLOUD_NAME_GOOGLE_DRIVE, - new MenuMetadata(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE + "/", false), + CloudContract.CLOUD_NAME_GOOGLE_DRIVE, + new MenuMetadata(CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE + "/", false), R.drawable.ic_google_drive_white_24dp, deleteIcon); accountAuthenticationList.add( new String[] { - CloudHandler.CLOUD_NAME_GOOGLE_DRIVE, CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE + "/", + CloudContract.CLOUD_NAME_GOOGLE_DRIVE, + CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE + "/", }); } } @@ -817,12 +794,11 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { } if (dataUtils.getAccounts().size() > 0 - && (meta.path.startsWith(CloudHandler.CLOUD_PREFIX_BOX) - || meta.path.startsWith(CloudHandler.CLOUD_PREFIX_DROPBOX) - || meta.path.startsWith(CloudHandler.CLOUD_PREFIX_ONE_DRIVE) - || meta.path.startsWith(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE))) { + && (meta.path.startsWith(CloudContract.CLOUD_PREFIX_BOX) + || meta.path.startsWith(CloudContract.CLOUD_PREFIX_DROPBOX) + || meta.path.startsWith(CloudContract.CLOUD_PREFIX_ONE_DRIVE) + || meta.path.startsWith(CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE))) { // we have cloud accounts, try see if token is expired or not - CloudUtil.checkToken(meta.path, mainActivity); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP @@ -890,16 +866,16 @@ public void onNavigationItemActionClick(MenuItem item) { || path.startsWith(FTP_URI_PREFIX) || path.startsWith(FTPS_URI_PREFIX)) { mainActivity.showSftpDialog(title, path, true); - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_DROPBOX)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_DROPBOX)) { GeneralDialogCreation.showCloudDialog( mainActivity, mainActivity.getAppTheme(), OpenMode.DROPBOX); - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE)) { GeneralDialogCreation.showCloudDialog( mainActivity, mainActivity.getAppTheme(), OpenMode.GDRIVE); - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_BOX)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_BOX)) { GeneralDialogCreation.showCloudDialog( mainActivity, mainActivity.getAppTheme(), OpenMode.BOX); - } else if (path.startsWith(CloudHandler.CLOUD_PREFIX_ONE_DRIVE)) { + } else if (path.startsWith(CloudContract.CLOUD_PREFIX_ONE_DRIVE)) { GeneralDialogCreation.showCloudDialog( mainActivity, mainActivity.getAppTheme(), OpenMode.ONEDRIVE); } diff --git a/app/src/main/java/com/amaze/filemanager/utils/DataUtils.kt b/app/src/main/java/com/amaze/filemanager/utils/DataUtils.kt index 74b83d8f1a..02088e9357 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/DataUtils.kt +++ b/app/src/main/java/com/amaze/filemanager/utils/DataUtils.kt @@ -17,562 +17,553 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +package com.amaze.filemanager.utils + +import android.content.Context +import android.text.TextUtils +import android.view.MenuItem +import com.amaze.filemanager.R +import com.amaze.filemanager.adapters.data.LayoutElementParcelable +import com.amaze.filemanager.application.AppConfig +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.models.LanguageModel +import com.amaze.filemanager.utils.omh.OmhCredentialsWrapper +import com.googlecode.concurrenttrees.radix.ConcurrentRadixTree +import com.googlecode.concurrenttrees.radix.node.concrete.DefaultCharArrayNodeFactory +import com.googlecode.concurrenttrees.radix.node.concrete.voidvalue.VoidValue +import com.googlecode.concurrenttrees.radixinverted.ConcurrentInvertedRadixTree +import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.util.Collections +import java.util.LinkedList + +/** Singleton class to handle data for various services */ +// Central data being used across activity,fragments and classes +object DataUtils { + @JvmStatic + private val LOG: Logger = LoggerFactory.getLogger(DataUtils::class.java) + + const val LIST: Int = 0 + const val GRID: Int = 1 + + private var hiddenfiles = ConcurrentRadixTree(DefaultCharArrayNodeFactory()) + + private var filesGridOrList: InvertedRadixTree = + ConcurrentInvertedRadixTree(DefaultCharArrayNodeFactory()) + + private val history = LinkedList() + + private var tree: InvertedRadixTree = + ConcurrentInvertedRadixTree(DefaultCharArrayNodeFactory()) + + private var servers: ArrayList> = ArrayList() + private var books = ArrayList>() + + private var _accounts: MutableList = mutableListOf() + val accounts: List + @Synchronized get() = _accounts + + /** List of checked items to persist when drag and drop from one tab to another */ + var checkedItemsList: ArrayList? = null + + private var dataChangeListener: DataChangeListener? = null + + /** + * Returns list of available languages. + */ + @JvmStatic + @Suppress("LongMethod") + fun getLanguages(context: Context): List = + arrayListOf( + LanguageModel( + context.getString(R.string.german_translation_title), + context.getString(R.string.german_translation_summary), + ), + LanguageModel( + context.getString(R.string.spanish_translation_title), + context.getString(R.string.spanish_translation_summary), + ), + LanguageModel( + context.getString(R.string.basque_translation_title), + context.getString(R.string.basque_translation_summary), + ), + LanguageModel( + context.getString(R.string.chinese_translation_title), + context.getString(R.string.chinese_translation_summary), + ), + LanguageModel( + context.getString(R.string.serbian_translation_title), + context.getString(R.string.serbian_translation_summary), + ), + LanguageModel( + context.getString(R.string.turkish_translation_title), + context.getString(R.string.turkish_translation_summary), + ), + LanguageModel( + context.getString(R.string.ukrainian_translation_title), + context.getString(R.string.ukrainian_translation_summary), + ), + LanguageModel( + context.getString(R.string.portuguese_translation_title), + context.getString(R.string.portuguese_translation_summary), + ), + LanguageModel( + context.getString(R.string.polish_translation_title), + context.getString(R.string.polish_translation_summary), + ), + LanguageModel( + context.getString(R.string.korean_translation_title), + context.getString(R.string.korean_translation_summary), + ), + LanguageModel( + context.getString(R.string.greek_translation_title), + context.getString(R.string.greek_translation_summary), + ), + LanguageModel( + context.getString(R.string.dutch_translation_title), + context.getString(R.string.dutch_translation_summary), + ), + LanguageModel( + context.getString(R.string.romanian_translation_title), + context.getString(R.string.romanian_translation_summary), + ), + LanguageModel( + context.getString(R.string.vietnamese_translation_title), + context.getString(R.string.vietnamese_translation_summary), + ), + LanguageModel( + context.getString(R.string.japanese_translation_title), + context.getString(R.string.japanese_translation_summary), + ), + LanguageModel( + context.getString(R.string.tamil_translation_title), + context.getString(R.string.tamil_translation_summary), + ), + ) + + /** + * Returns list of contributors. + */ + @JvmStatic + fun getContributors(context: Context): List = + arrayListOf( + LanguageModel( + context.getString(R.string.contributor_1_title), + context.getString(R.string.contributors_1_summary), + ), + LanguageModel( + context.getString(R.string.contributor_2_title), + context.getString(R.string.contributors_2_summary), + ), + LanguageModel( + context.getString(R.string.contributor_3_title), + context.getString(R.string.contributors_3_summary), + ), + LanguageModel( + context.getString(R.string.contributor_4_title), + context.getString(R.string.contributors_4_summary), + ), + LanguageModel( + context.getString(R.string.contributor_5_title), + context.getString(R.string.contributors_5_summary), + ), + LanguageModel( + context.getString(R.string.contributor_6_title), + context.getString(R.string.contributors_6_summary), + ), + LanguageModel( + context.getString(R.string.contributor_7_title), + context.getString(R.string.contributors_7_summary), + ), + ) + + /** + * Check if server path(s) exists + */ + fun containsServer(a: Array): Int { + return contains(a, servers) + } -package com.amaze.filemanager.utils; + /** + * Check if server path exists + */ + fun containsServer(path: String): Int { + synchronized(servers) { + return servers.indexOfFirst { + it[1] == path + } + } + } -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; + /** + * Check if bookmark exists + */ + fun containsBooks(a: Array): Int { + return contains(a, books) + } -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + /** + * Clear all data. + */ + fun clear() { + hiddenfiles = ConcurrentRadixTree(DefaultCharArrayNodeFactory()) + filesGridOrList = ConcurrentInvertedRadixTree(DefaultCharArrayNodeFactory()) + history.clear() + storages = ArrayList() + tree = ConcurrentInvertedRadixTree(DefaultCharArrayNodeFactory()) + servers = ArrayList() + books = ArrayList() + _accounts = mutableListOf() + } -import com.amaze.filemanager.R; -import com.amaze.filemanager.adapters.data.LayoutElementParcelable; -import com.amaze.filemanager.application.AppConfig; -import com.amaze.filemanager.fileoperations.filesystem.OpenMode; -import com.amaze.filemanager.models.LanguageModel; -import com.cloudrail.si.interfaces.CloudStorage; -import com.cloudrail.si.services.Box; -import com.cloudrail.si.services.Dropbox; -import com.cloudrail.si.services.GoogleDrive; -import com.cloudrail.si.services.OneDrive; -import com.googlecode.concurrenttrees.radix.ConcurrentRadixTree; -import com.googlecode.concurrenttrees.radix.node.concrete.DefaultCharArrayNodeFactory; -import com.googlecode.concurrenttrees.radix.node.concrete.voidvalue.VoidValue; -import com.googlecode.concurrenttrees.radixinverted.ConcurrentInvertedRadixTree; -import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree; + /** + * Register a DataChangeListener, then clear all data. + */ + fun registerOnDataChangedListener(l: DataChangeListener?) { + dataChangeListener = l + clear() + } -import android.content.Context; -import android.text.TextUtils; -import android.view.MenuItem; + private fun contains( + a: String, + b: ArrayList>, + ): Int { + for ((i, x) in b.withIndex()) { + if (x[1] == a) return i + } + return -1 + } -import androidx.annotation.Nullable; + private fun contains( + a: Array, + b: ArrayList>?, + ): Int { + if (b == null) return -1 + for ((i, x) in b.withIndex()) { + if (x[0] == a[0] && x[1] == a[1]) return i + } + return -1 + } -/** Singleton class to handle data for various services */ + /** + * Remove bookmark at given index. + */ + fun removeBook(i: Int) { + synchronized(books) { + if (books.size > i) books.removeAt(i) + } + } -// Central data being used across activity,fragments and classes -public class DataUtils { - - private static final Logger LOG = LoggerFactory.getLogger(DataUtils.class); - - private ConcurrentRadixTree hiddenfiles = - new ConcurrentRadixTree<>(new DefaultCharArrayNodeFactory()); - - public static final int LIST = 0, GRID = 1; - - private InvertedRadixTree filesGridOrList = - new ConcurrentInvertedRadixTree<>(new DefaultCharArrayNodeFactory()); - - private LinkedList history = new LinkedList<>(); - private ArrayList storages = new ArrayList<>(); - - private InvertedRadixTree tree = - new ConcurrentInvertedRadixTree<>(new DefaultCharArrayNodeFactory()); - - private ArrayList servers = new ArrayList<>(); - private ArrayList books = new ArrayList<>(); - - private ArrayList accounts = new ArrayList<>(4); - - /** List of checked items to persist when drag and drop from one tab to another */ - private ArrayList checkedItemsList; - - private DataChangeListener dataChangeListener; - - private DataUtils() {} - - private static class DataUtilsHolder { - private static final DataUtils INSTANCE = new DataUtils(); - } - - public static List getLanguages(Context context) { - - var data = new ArrayList(); - - data.add( - new LanguageModel( - context.getString(R.string.german_translation_title), - context.getString(R.string.german_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.italian_translation_title), - context.getString(R.string.italian_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.french_translation_title), - context.getString(R.string.french_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.russian_translation_title), - context.getString(R.string.russian_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.spanish_translation_title), - context.getString(R.string.spanish_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.basque_translation_title), - context.getString(R.string.basque_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.chinese_translation_title), - context.getString(R.string.chinese_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.serbian_translation_title), - context.getString(R.string.serbian_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.turkish_translation_title), - context.getString(R.string.turkish_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.ukrainian_translation_title), - context.getString(R.string.ukrainian_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.portuguese_translation_title), - context.getString(R.string.portuguese_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.polish_translation_title), - context.getString(R.string.polish_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.korean_translation_title), - context.getString(R.string.korean_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.greek_translation_title), - context.getString(R.string.greek_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.dutch_translation_title), - context.getString(R.string.dutch_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.romanian_translation_title), - context.getString(R.string.romanian_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.vietnamese_translation_title), - context.getString(R.string.vietnamese_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.japanese_translation_title), - context.getString(R.string.japanese_translation_summary))); - data.add( - new LanguageModel( - context.getString(R.string.tamil_translation_title), - context.getString(R.string.tamil_translation_summary))); - - return data; - } - - public static List getContributors(Context context) { - - var data = new ArrayList(); - - data.add( - new LanguageModel( - context.getString(R.string.contributor_1_title), - context.getString(R.string.contributors_1_summary))); - data.add( - new LanguageModel( - context.getString(R.string.contributor_2_title), - context.getString(R.string.contributors_2_summary))); - data.add( - new LanguageModel( - context.getString(R.string.contributor_3_title), - context.getString(R.string.contributors_3_summary))); - data.add( - new LanguageModel( - context.getString(R.string.contributor_4_title), - context.getString(R.string.contributors_4_summary))); - data.add( - new LanguageModel( - context.getString(R.string.contributor_5_title), - context.getString(R.string.contributors_5_summary))); - data.add( - new LanguageModel( - context.getString(R.string.contributor_6_title), - context.getString(R.string.contributors_6_summary))); - data.add( - new LanguageModel( - context.getString(R.string.contributor_7_title), - context.getString(R.string.contributors_7_summary))); - - return data; - } - - public static DataUtils getInstance() { - return DataUtilsHolder.INSTANCE; - } - - public int containsServer(String[] a) { - return contains(a, servers); - } - - public int containsServer(String path) { - - synchronized (servers) { - if (servers == null) return -1; - int i = 0; - for (String[] x : servers) { - if (x[1].equals(path)) return i; - i++; - } - } - return -1; - } - - public int containsBooks(String[] a) { - return contains(a, books); - } - - /*public int containsAccounts(CloudEntry cloudEntry) { - return contains(a, accounts); - }*/ - - /** - * Checks whether cloud account of certain type is present or not - * - * @param serviceType the {@link OpenMode} of account to check - * @return the index of account, -1 if not found - */ - public synchronized int containsAccounts(OpenMode serviceType) { - int i = 0; - for (CloudStorage storage : accounts) { - - switch (serviceType) { - case BOX: - if (storage instanceof Box) return i; - break; - case DROPBOX: - if (storage instanceof Dropbox) return i; - break; - case GDRIVE: - if (storage instanceof GoogleDrive) return i; - break; - case ONEDRIVE: - if (storage instanceof OneDrive) return i; - break; - default: - return -1; - } - i++; - } - return -1; - } - - public void clear() { - hiddenfiles = new ConcurrentRadixTree<>(new DefaultCharArrayNodeFactory()); - filesGridOrList = new ConcurrentInvertedRadixTree<>(new DefaultCharArrayNodeFactory()); - history.clear(); - storages = new ArrayList<>(); - tree = new ConcurrentInvertedRadixTree<>(new DefaultCharArrayNodeFactory()); - servers = new ArrayList<>(); - books = new ArrayList<>(); - accounts = new ArrayList<>(); - } - - public void registerOnDataChangedListener(DataChangeListener l) { - - dataChangeListener = l; - clear(); - } - - int contains(String a, ArrayList b) { - int i = 0; - for (String[] x : b) { - if (x[1].equals(a)) return i; - i++; - } - return -1; - } - - int contains(String[] a, ArrayList b) { - if (b == null) return -1; - int i = 0; - for (String[] x : b) { - if (x[0].equals(a[0]) && x[1].equals(a[1])) return i; - i++; - } - return -1; - } - - public void removeBook(int i) { - synchronized (books) { - if (books.size() > i) books.remove(i); - } - } - - public synchronized void removeAccount(OpenMode serviceType) { - for (CloudStorage storage : accounts) { - switch (serviceType) { - case BOX: - if (storage instanceof Box) { - accounts.remove(storage); - return; - } - break; - case DROPBOX: - if (storage instanceof Dropbox) { - accounts.remove(storage); - return; - } - break; - case GDRIVE: - if (storage instanceof GoogleDrive) { - accounts.remove(storage); - return; - } - break; - case ONEDRIVE: - if (storage instanceof OneDrive) { - accounts.remove(storage); - return; - } - break; - default: - return; - } - } - } - - public void removeServer(int i) { - synchronized (servers) { - if (servers.size() > i) servers.remove(i); - } - } - - public void addBook(String[] i) { - if (containsBooks(i) != -1) { - return; - } - synchronized (books) { - books.add(i); - } - } - - /** - * @param i The bookmark name and path. - * @param refreshdrawer boolean flag to indicate if drawer refresh is desired. - * @return True if operation successful, false if failure. - */ - public boolean addBook(final String[] i, boolean refreshdrawer) { - if (containsBooks(i) != -1) { - // book exists - return false; - } else { - synchronized (books) { - books.add(i); - } - - if (dataChangeListener != null) { - dataChangeListener.onBookAdded(i, refreshdrawer); - } - - return true; - } - } - - public void addAccount(CloudStorage storage) { - accounts.add(storage); - } - - public void addServer(String[] i) { - servers.add(i); - } - - public void addHiddenFile(final String i) { - - synchronized (hiddenfiles) { - hiddenfiles.put(i, VoidValue.SINGLETON); - } - if (dataChangeListener != null) { - dataChangeListener.onHiddenFileAdded(i); - } - } - - public void removeHiddenFile(final String i) { - - synchronized (hiddenfiles) { - hiddenfiles.remove(i); - } - if (dataChangeListener != null) { - dataChangeListener.onHiddenFileRemoved(i); - } - } - - public void setHistory(LinkedList s) { - history.clear(); - history.addAll(s); - } - - public LinkedList getHistory() { - return history; - } - - public void addHistoryFile(final String i) { - history.push(i); - if (dataChangeListener != null) { - dataChangeListener.onHistoryAdded(i); - } - } - - public void sortBook() { - Collections.sort(books, new BookSorter()); - } - - public synchronized void setServers(ArrayList servers) { - if (servers != null) this.servers = servers; - } - - public synchronized void setBooks(ArrayList books) { - if (books != null) this.books = books; - } - - public synchronized void setAccounts(ArrayList accounts) { - if (accounts != null) this.accounts = accounts; - } - - public synchronized ArrayList getServers() { - return servers; - } - - public synchronized ArrayList getBooks() { - return books; - } - - public synchronized ArrayList getAccounts() { - return accounts; - } - - public synchronized CloudStorage getAccount(OpenMode serviceType) { - for (CloudStorage storage : accounts) { - switch (serviceType) { - case BOX: - if (storage instanceof Box) return storage; - break; - case DROPBOX: - if (storage instanceof Dropbox) return storage; - break; - case GDRIVE: - if (storage instanceof GoogleDrive) return storage; - break; - case ONEDRIVE: - if (storage instanceof OneDrive) return storage; - break; - default: - LOG.error("Unable to determine service type of storage {}", storage); - return null; - } - } - return null; - } - - public boolean isFileHidden(String path) { - try { - return getHiddenFiles().getValueForExactKey(path) != null; - } catch (IllegalStateException e) { - LOG.warn("failed to get hidden file", e); - return false; - } - } - - public ConcurrentRadixTree getHiddenFiles() { - return hiddenfiles; - } - - public synchronized void setHiddenFiles(ConcurrentRadixTree hiddenfiles) { - if (hiddenfiles != null) this.hiddenfiles = hiddenfiles; - } - - public synchronized void setGridfiles(ArrayList gridfiles) { - if (gridfiles != null) { - for (String gridfile : gridfiles) { - setPathAsGridOrList(gridfile, GRID); - } - } - } - - public synchronized void setListfiles(ArrayList listfiles) { - if (listfiles != null) { - for (String gridfile : listfiles) { - setPathAsGridOrList(gridfile, LIST); - } - } - } - - public void setPathAsGridOrList(String path, int value) { - filesGridOrList.put(path, value); - } - - public int getListOrGridForPath(String path, int defaultValue) { - Integer value = filesGridOrList.getValueForLongestKeyPrefixing(path); - return value != null ? value : defaultValue; - } - - public void clearHistory() { - history.clear(); - if (dataChangeListener != null) { - AppConfig.getInstance().runInBackground(() -> dataChangeListener.onHistoryCleared()); - } - } - - public synchronized List getStorages() { - return storages; - } - - public synchronized void setStorages(ArrayList storages) { - this.storages = storages; - } - - public boolean putDrawerPath(MenuItem item, String path) { - if (!TextUtils.isEmpty(path)) { - try { - tree.put(path, item.getItemId()); - return true; - } catch (IllegalStateException e) { - LOG.warn("failed to put drawer path", e); - return false; - } - } - return false; - } - - /** - * @param path the path to find - * @return the id of the longest containing MenuMetadata.path in getDrawerMetadata() or null - */ - public @Nullable Integer findLongestContainingDrawerItem(CharSequence path) { - return tree.getValueForLongestKeyPrefixing(path); - } - - public ArrayList getCheckedItemsList() { - return this.checkedItemsList; - } - - public void setCheckedItemsList(ArrayList layoutElementParcelables) { - this.checkedItemsList = layoutElementParcelables; - } - - /** - * Callbacks to do original changes in database (and ui if required) The callbacks are called in a - * main thread - */ - public interface DataChangeListener { - void onHiddenFileAdded(String path); - - void onHiddenFileRemoved(String path); - - void onHistoryAdded(String path); - - void onBookAdded(String path[], boolean refreshdrawer); - - void onHistoryCleared(); - } + /** + * Remove account for given service type. + */ + fun removeAccount(serviceType: OpenMode) { + accounts.let { + val newValue = it.toMutableList() + newValue.removeAll { entry: OmhCredentialsWrapper -> + entry.openMode == serviceType + } + } + } + + /** + * Remove server path at given index. + */ + fun removeServer(i: Int) { + synchronized(servers) { + if (servers.size > i) servers.removeAt(i) + } + } + + /** + * Add bookmark if not exist. + */ + fun addBook(i: Array) { + if (containsBooks(i) != -1) { + return + } + synchronized(books) { + books.add(i) + } + } + + /** + * @param i The bookmark name and path. + * @param refreshdrawer boolean flag to indicate if drawer refresh is desired. + * @return True if operation successful, false if failure. + */ + fun addBook( + i: Array, + refreshdrawer: Boolean, + ): Boolean { + if (containsBooks(i) != -1) { + // book exists + return false + } else { + synchronized(books) { + books.add(i) + } + + if (dataChangeListener != null) { + dataChangeListener!!.onBookAdded(i, refreshdrawer) + } + + return true + } + } + + /** + * Add account if not exist. + */ + fun addAccount(account: OmhCredentialsWrapper) { + _accounts.let { + if (!it.contains(account)) { + it.add(account) + } + } + } + + /** + * Add server path. + */ + fun addServer(i: Array) { + synchronized(servers) { + servers.add(i) + } + } + + /** + * Add hidden file path. + */ + fun addHiddenFile(i: String) { + synchronized(hiddenfiles) { + hiddenfiles.put(i, VoidValue.SINGLETON) + } + if (dataChangeListener != null) { + dataChangeListener!!.onHiddenFileAdded(i) + } + } + + /** + * Remove hidden file path. + */ + fun removeHiddenFile(i: String) { + synchronized(hiddenfiles) { + hiddenfiles.remove(i) + } + if (dataChangeListener != null) { + dataChangeListener!!.onHiddenFileRemoved(i) + } + } + + /** + * Set history collection. + */ + fun setHistory(s: LinkedList?) { + history.clear() + history.addAll(s!!) + } + + /** + * Get history collection. + */ + fun getHistory(): LinkedList { + return history + } + + /** + * Add path to history. + */ + fun addHistoryFile(i: String) { + history.push(i) + if (dataChangeListener != null) { + dataChangeListener!!.onHistoryAdded(i) + } + } + + /** + * Sort bookmarks alphabetically. + */ + fun sortBook() { + Collections.sort(books, BookSorter()) + } + + /** + * Set servers collection. + */ + @Synchronized + fun setServers(servers: ArrayList>?) { + if (servers != null) this.servers = servers + } + + /** + * Set bookmarks collection. + */ + @Synchronized + fun setBooks(books: ArrayList>?) { + if (books != null) this.books = books + } + + /** + * Get servers collection. + */ + @Synchronized + fun getServers(): ArrayList> { + return servers + } + + /** + * Get bookmarks collection. + */ + @Synchronized + fun getBooks(): ArrayList> { + return books + } + + /** + * Get account for given service type. + */ + @Synchronized + fun getAccount(serviceType: OpenMode): OmhCredentialsWrapper? { + val retval = accounts.find { it.openMode == serviceType } + if (retval == null) { + LOG.error("Unable to determine service type of cloudEntry {}", serviceType) + } + return retval + } + + /** + * Check if file is hidden. + */ + fun isFileHidden(path: String): Boolean { + try { + return hiddenFiles?.getValueForExactKey(path) != null + } catch (e: IllegalStateException) { + LOG.warn("failed to get hidden file", e) + return false + } + } + + @set:Synchronized + var hiddenFiles: ConcurrentRadixTree? + get() = hiddenfiles + set(hiddenfiles) { + if (hiddenfiles != null) this.hiddenfiles = hiddenfiles + } + + @set:Synchronized + var gridfiles: ArrayList? + get() = gridfiles + set(gridfiles) { + if (gridfiles != null) { + for (gridfile in gridfiles) { + setPathAsGridOrList(gridfile, GRID) + } + } + } + + /** + * Set list of paths that should be displayed in list mode. + */ + @Synchronized + fun setListfiles(listfiles: ArrayList?) { + if (listfiles != null) { + for (gridfile in listfiles) { + setPathAsGridOrList(gridfile, LIST) + } + } + } + + /** + * Set path to be displayed in grid or list mode. + */ + fun setPathAsGridOrList( + path: String?, + value: Int, + ) { + filesGridOrList.put(path, value) + } + + /** + * Get if path should be displayed in grid or list mode. + * + * @param path the path to find + * @param defaultValue the default value to return if no value found + * @return the value for the longest prefix matching path or defaultValue if none found + */ + fun getListOrGridForPath( + path: String?, + defaultValue: Int, + ): Int { + val value = filesGridOrList.getValueForLongestKeyPrefixing(path) + return value ?: defaultValue + } + + /** + * Clear history collection. Also notifies listener in background thread. + */ + fun clearHistory() { + history.clear() + AppConfig.getInstance().runInBackground { dataChangeListener?.onHistoryCleared() } + } + + @set:Synchronized + var storages: ArrayList = ArrayList() + + /** + * Put drawer path with its menu id. + */ + fun putDrawerPath( + item: MenuItem, + path: String?, + ): Boolean { + if (!TextUtils.isEmpty(path)) { + try { + tree.put(path, item.itemId) + return true + } catch (e: IllegalStateException) { + LOG.warn("failed to put drawer path", e) + return false + } + } + return false + } + + /** + * @param path the path to find + * @return the id of the longest containing MenuMetadata.path in getDrawerMetadata() or null + */ + fun findLongestContainingDrawerItem(path: CharSequence?): Int? { + return tree.getValueForLongestKeyPrefixing(path) + } + + /** + * Callbacks to do original changes in database (and ui if required) The callbacks are called in a + * main thread + */ + interface DataChangeListener { + /** Called when a hidden file is added */ + fun onHiddenFileAdded(path: String) + + /** Called when a hidden file is removed */ + fun onHiddenFileRemoved(path: String) + + /** Called when a history entry is added */ + fun onHistoryAdded(path: String) + + /** + * Called when a bookmark is added + * + * @param path The bookmark name and path. + * @param refreshDrawer boolean flag to indicate if drawer refresh is desired. + */ + fun onBookAdded( + path: Array, + refreshDrawer: Boolean, + ) + + /** Called when history is cleared */ + fun onHistoryCleared() + } } diff --git a/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java b/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java index a6010b06ad..e6347bf0a9 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java +++ b/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java @@ -42,7 +42,7 @@ import com.amaze.filemanager.asynchronous.asynctasks.DeleteTask; import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil; import com.amaze.filemanager.asynchronous.services.ZipService; -import com.amaze.filemanager.database.CloudHandler; +import com.amaze.filemanager.database.CloudContract; import com.amaze.filemanager.database.CryptHandler; import com.amaze.filemanager.database.models.explorer.EncryptedEntry; import com.amaze.filemanager.fileoperations.filesystem.FolderState; @@ -91,7 +91,7 @@ public class MainActivityHelper { private static final Logger LOG = LoggerFactory.getLogger(MainActivityHelper.class); private MainActivity mainActivity; - private DataUtils dataUtils = DataUtils.getInstance(); + private DataUtils dataUtils = DataUtils.INSTANCE; private int accentColor; private SpeedDialView.OnActionSelectedListener fabActionListener; @@ -670,7 +670,7 @@ public void invalidName(final HybridFile file) { public void deleteFiles(ArrayList files, boolean doDeletePermanently) { if (files == null || files.size() == 0) return; - if (files.get(0).isSmb() || files.get(0).isFtp()) { + if (files.get(0).isSmb() || files.get(0).isFtp() || files.get(0).isCloudDriveFile()) { new DeleteTask(mainActivity, doDeletePermanently).execute(files); return; } @@ -723,17 +723,17 @@ public String parseOTGPath(String path) { public String parseCloudPath(OpenMode serviceType, String path) { switch (serviceType) { case DROPBOX: - if (path.contains(CloudHandler.CLOUD_PREFIX_DROPBOX)) return path; - else return CloudHandler.CLOUD_PREFIX_DROPBOX + path.substring(path.indexOf(":") + 1); + if (path.contains(CloudContract.CLOUD_PREFIX_DROPBOX)) return path; + else return CloudContract.CLOUD_PREFIX_DROPBOX + path.substring(path.indexOf(":") + 1); case BOX: - if (path.contains(CloudHandler.CLOUD_PREFIX_BOX)) return path; - else return CloudHandler.CLOUD_PREFIX_BOX + path.substring(path.indexOf(":") + 1); + if (path.contains(CloudContract.CLOUD_PREFIX_BOX)) return path; + else return CloudContract.CLOUD_PREFIX_BOX + path.substring(path.indexOf(":") + 1); case GDRIVE: - if (path.contains(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE)) return path; - else return CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE + path.substring(path.indexOf(":") + 1); + if (path.contains(CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE)) return path; + else return CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE + path.substring(path.indexOf(":") + 1); case ONEDRIVE: - if (path.contains(CloudHandler.CLOUD_PREFIX_ONE_DRIVE)) return path; - else return CloudHandler.CLOUD_PREFIX_ONE_DRIVE + path.substring(path.indexOf(":") + 1); + if (path.contains(CloudContract.CLOUD_PREFIX_ONE_DRIVE)) return path; + else return CloudContract.CLOUD_PREFIX_ONE_DRIVE + path.substring(path.indexOf(":") + 1); default: return path; } diff --git a/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt b/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt index cad7ae00d1..2e0c595e59 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt +++ b/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt @@ -30,6 +30,7 @@ import android.os.Build.VERSION_CODES.LOLLIPOP import android.provider.DocumentsContract import android.util.Log import androidx.annotation.RequiresApi +import androidx.arch.core.util.Function import androidx.documentfile.provider.DocumentFile import com.amaze.filemanager.exceptions.DocumentFileNotFoundException import com.amaze.filemanager.fileoperations.filesystem.OpenMode @@ -70,12 +71,9 @@ object OTGUtil { getDocumentFiles( path, context, - object : OnFileFound { - override fun onFileFound(file: HybridFileParcelable) { - files.add(file) - } - }, - ) + ) { file: HybridFileParcelable -> + files.add(file) + } return files } @@ -90,7 +88,7 @@ object OTGUtil { fun getDocumentFiles( path: String, context: Context, - fileFound: OnFileFound, + fileFound: Function, ) { val rootUriString = SingletonUsbOtg.getInstance().usbOtgRoot @@ -104,7 +102,7 @@ object OTGUtil { path: String, context: Context, openMode: OpenMode, - fileFound: OnFileFound, + fileFound: Function, ) { var rootUri = DocumentFile.fromTreeUri(context, rootUriString) @@ -145,7 +143,7 @@ object OTGUtil { baseFile.name = file.name baseFile.mode = openMode baseFile.fullUri = file.uri - fileFound.onFileFound(baseFile) + fileFound.apply(baseFile) } } } diff --git a/app/src/main/java/com/amaze/filemanager/utils/OnFileFound.kt b/app/src/main/java/com/amaze/filemanager/utils/OnFileFound.kt deleted file mode 100644 index 4c4b68fabf..0000000000 --- a/app/src/main/java/com/amaze/filemanager/utils/OnFileFound.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2014-2021 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.utils - -import com.amaze.filemanager.filesystem.HybridFileParcelable - -/** - * This allows the caller of a function to know when a file has ben found and deal with it ASAP - * - * @author Emmanuel on 21/9/2017, at 15:23. - */ -fun interface OnFileFound { - @Suppress("UndocumentedPublicFunction") - fun onFileFound(file: HybridFileParcelable) -} diff --git a/app/src/main/java/com/amaze/filemanager/utils/StartActivityForResultWithSourceIntent.kt b/app/src/main/java/com/amaze/filemanager/utils/StartActivityForResultWithSourceIntent.kt new file mode 100644 index 0000000000..432ccddb41 --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/utils/StartActivityForResultWithSourceIntent.kt @@ -0,0 +1,40 @@ +package com.amaze.filemanager.utils + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContract + +/** + * Custom [ActivityResultContract] with specifically input = [Intent] and output = [ActivityResult] + * to allow arguments that is added to the intent to be accessible at the activity result. + */ +class StartActivityForResultWithSourceIntent : ActivityResultContract() { + private var sourceArguments: Bundle? = null + + override fun createIntent( + context: Context, + input: Intent, + ): Intent { + sourceArguments = Bundle(input.extras) + return input + } + + override fun parseResult( + resultCode: Int, + intent: Intent?, + ): ActivityResult = + ActivityResult( + resultCode, + // If source argument is not null, return them to the requestor. + // If activity result is null, we create an empty intent to store the arguments + if (sourceArguments != null) { + intent.also { + it?.putExtras(sourceArguments!!) + } ?: Intent().putExtras(sourceArguments!!) + } else { + intent + }, + ) +} diff --git a/app/src/main/java/com/amaze/filemanager/utils/cloud/CloudPluginUtil.kt b/app/src/main/java/com/amaze/filemanager/utils/cloud/CloudPluginUtil.kt new file mode 100644 index 0000000000..df884e4e93 --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/utils/cloud/CloudPluginUtil.kt @@ -0,0 +1,75 @@ +package com.amaze.filemanager.utils.cloud + +import android.content.Context +import android.content.pm.PackageManager +import com.amaze.filemanager.database.CloudContract.APP_PACKAGE_NAME +import com.amaze.filemanager.database.CloudContract.ENABLED_PROVIDERS +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.utils.DataUtils +import com.amaze.filemanager.utils.omh.OMHClientHelper +import com.amaze.filemanager.utils.omh.OmhCredentialsWrapper +import com.openmobilehub.android.auth.core.utils.EncryptedSharedPreferences + +/** + * Utility object for cloud plugin related operations. + */ +object CloudPluginUtil { + /** + * Initializes DataUtils with accounts from enabled cloud providers, if exist. + */ + @JvmStatic + fun initializeDataUtils(context: Context) { + ENABLED_PROVIDERS.forEach { + val prefs = EncryptedSharedPreferences.getEncryptedSharedPrefs(context, resolveOmhProviderNameFrom(it)) + if (prefs.getString("email", null) != null) { + DataUtils.addAccount( + OmhCredentialsWrapper( + openMode = it, + credentials = OMHClientHelper.getAuthClient(it).getCredentials(), + ), + ) + } + } + } + + /** + * Resolves the plugin ID from the given [OpenMode]. + * + */ + @JvmStatic + fun resolvePluginIdFrom(openMode: OpenMode): Int { + return when (openMode) { + OpenMode.GDRIVE -> 1 + OpenMode.BOX -> 3 + OpenMode.DROPBOX -> 2 + OpenMode.ONEDRIVE -> 4 + else -> throw IllegalArgumentException("Invalid open mode: $openMode") + } + } + + /** + * Resolves the Open Mobile Hub provider name from the given [OpenMode]. + */ + @JvmStatic + fun resolveOmhProviderNameFrom(openMode: OpenMode): String { + return when (openMode) { + OpenMode.GDRIVE -> "google" + OpenMode.BOX -> "box" + OpenMode.DROPBOX -> "dropbox" + OpenMode.ONEDRIVE -> "microsoft" + else -> throw IllegalArgumentException("Invalid open mode: $openMode") + } + } + + /** Determines whether cloud provider is installed or not */ + @JvmStatic + fun isCloudProviderAvailable(context: Context): Boolean { + val pm = context.packageManager + try { + pm.getPackageInfo(APP_PACKAGE_NAME, PackageManager.GET_ACTIVITIES) + return true + } catch (_: PackageManager.NameNotFoundException) { + return false + } + } +} diff --git a/app/src/main/java/com/amaze/filemanager/utils/omh/OMHClientHelper.kt b/app/src/main/java/com/amaze/filemanager/utils/omh/OMHClientHelper.kt new file mode 100644 index 0000000000..6d3b116466 --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/utils/omh/OMHClientHelper.kt @@ -0,0 +1,248 @@ +package com.amaze.filemanager.utils.omh + +import android.content.Context +import android.database.Cursor +import android.os.CancellationSignal +import androidx.core.content.ContentResolverCompat +import com.amaze.filemanager.application.AppConfig +import com.amaze.filemanager.database.CloudContract +import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.utils.cloud.CloudPluginUtil +import com.openmobilehub.android.auth.core.OmhAuthClient +import com.openmobilehub.android.auth.plugin.dropbox.mobileweb.presentation.DropboxMobileWebAuthClient +import com.openmobilehub.android.auth.plugin.google.nongms.presentation.OmhAuthFactoryImpl +import com.openmobilehub.android.auth.plugin.microsoft.mobileweb.presentation.MicrosoftMobileWebAuthClient +import com.openmobilehub.android.storage.core.OmhStorageClient +import com.openmobilehub.android.storage.core.OmhStorageProvider +import com.openmobilehub.android.storage.plugin.dropbox.restful.DropboxRestfulOmhStorageClientFactory +import com.openmobilehub.android.storage.plugin.googledrive.nongms.GoogleDriveNonGmsConstants +import com.openmobilehub.android.storage.plugin.onedrive.restful.OneDriveRestfulOmhStorageClientFactory +import java.util.EnumMap + +/** + * Helper object to manage Open Mobile Hub auth and storage clients for different cloud providers. + * + */ +object OMHClientHelper { + const val MULTI_SLASH_FOR_CLOUD = "(?<=[^:])(///+)" + + private val authClients: MutableMap = + EnumMap(OpenMode::class.java) + + private val storageClients: MutableMap = + EnumMap(OpenMode::class.java) + + /** + * Initializes all available cloud clients at once. This should be called when the app starts. + */ + @JvmStatic + fun initializeClients() { + AppConfig.getInstance().let { context: Context -> + val cursor = + ContentResolverCompat.query( + context.contentResolver, + CloudContract.URI, + CloudContract.PROJECTION, + CloudContract.COLUMN_ID, + CloudContract.ENABLED_PROVIDER_IDS, + null, + null as CancellationSignal?, + ) + if (cursor == null || !cursor.moveToFirst()) { + throw CloudPluginException() + } else { + do { + when (cursor.getInt(0)) { + 1 -> getAuthClient(OpenMode.GDRIVE, cursor.getString(1)) + 2 -> getAuthClient(OpenMode.DROPBOX, cursor.getString(1)) + 3 -> getAuthClient(OpenMode.BOX, cursor.getString(1)) + 4 -> getAuthClient(OpenMode.ONEDRIVE, cursor.getString(1)) + } + } while (cursor.moveToNext()) + cursor.close() + } + } + } + + /** + * Retrieves the auth client for the specified [openMode]. + */ + @JvmStatic + fun getAuthClient(openMode: OpenMode): OmhAuthClient { + return if (authClients.containsKey(openMode)) { + authClients[openMode]!! + } else { + val cursor = getCloudPluginCredentialsOf(openMode) + if (cursor == null || !cursor.moveToFirst()) { + throw CloudPluginException() + } else { + getAuthClient(openMode, cursor.getString(1)) + } + } + } + + /** + * Retrieves the auth client for the specified [openMode] using the provided [apiKey]. + */ + @JvmStatic + fun getAuthClient( + openMode: OpenMode, + apiKey: String, + ): OmhAuthClient { + val context = AppConfig.getInstance() + if (authClients.containsKey(openMode)) { + return authClients[openMode]!! + } else { + synchronized(authClients) { + val authClient = + when (openMode) { + OpenMode.GDRIVE -> { + getGoogleAuthClient(context, apiKey) + } + OpenMode.DROPBOX -> { + getDropboxAuthClient(context, apiKey) + } + OpenMode.ONEDRIVE -> { + getOnedriveAuthClient(context, apiKey) + } + else -> throw IllegalArgumentException("Unsupported OpenMode $openMode") + } + authClients.put(openMode, authClient) + } + return authClients[openMode]!! + } + } + + /** + * Retrieves the storage client for the specified [openMode]. + */ + @JvmStatic + fun getStorageClient(openMode: OpenMode): OmhStorageClient? { + if (storageClients.containsKey(openMode)) { + return storageClients[openMode]!! + } else { + synchronized(storageClients) { + val context = AppConfig.getInstance() + val credentials = getCloudPluginCredentialsOf(openMode) + if (credentials != null && credentials.moveToFirst()) { + val storageClient = + when (openMode) { + OpenMode.GDRIVE -> { + getGoogleStorageClient(context, credentials) + } + OpenMode.DROPBOX -> { + getDropboxStorageClient(context, credentials) + } + OpenMode.ONEDRIVE -> { + getOnedriveStorageClient(context, credentials) + } + else -> throw IllegalArgumentException("Unsupported OpenMode $openMode") + } + credentials.close() + storageClients.put(openMode, storageClient) + } else { + throw CloudPluginException("Unable to obtain API secrets from Cloud plugin for $openMode") + } + } + return storageClients[openMode] + } + } + + /** + * Utility method to fetch cloud plugin credentials from the cloud plugin. + */ + fun getCloudPluginCredentialsOf(openMode: OpenMode): Cursor? { + val context = AppConfig.getInstance() + return ContentResolverCompat.query( + context.contentResolver, + CloudContract.URI, + CloudContract.PROJECTION, + CloudContract.COLUMN_ID, + arrayOf(CloudPluginUtil.resolvePluginIdFrom(openMode).toString()), + null, + null as CancellationSignal?, + ) + } + + private fun getDropboxAuthClient( + context: Context, + apiKey: String, + ): OmhAuthClient { + return DropboxMobileWebAuthClient.Builder(apiKey).also { builder -> + arrayOf( + "account_info.read", + "files.metadata.read", + "files.content.write", + "files.content.read", + "sharing.write", + "sharing.read", + ).forEach { scope -> + builder.addScope(scope) + } + }.build(context) + } + + private fun getDropboxStorageClient( + context: Context, + cursor: Cursor, + ): OmhStorageClient { + val apiKey = cursor.getString(1) + return DropboxRestfulOmhStorageClientFactory() + .getStorageClient(getDropboxAuthClient(context, apiKey)) + } + + private fun getOnedriveAuthClient( + context: Context, + apiKey: String, + ): OmhAuthClient { + return MicrosoftMobileWebAuthClient.Builder(apiKey).also { builder -> + arrayListOf("User.Read", "openid", "profile", "email").forEach { scope -> + builder.addScope(scope) + } + }.build(context) + } + + private fun getOnedriveStorageClient( + context: Context, + cursor: Cursor, + ): OmhStorageClient { + val apiKey = cursor.getString(1) + return OneDriveRestfulOmhStorageClientFactory() + .getStorageClient(getOnedriveAuthClient(context, apiKey)) + } + + private fun getGoogleAuthClient( + context: Context, + apiKey: String, + ): OmhAuthClient { + val authClientInstance = + OmhAuthFactoryImpl.getAuthClient( + context, + listOf( + "openid", + "email", + "profile", + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + ), + apiKey, + null, + ) + authClientInstance.initialize() + return authClientInstance + } + + private fun getGoogleStorageClient( + context: Context, + cursor: Cursor, + ): OmhStorageClient { + val authClient = getAuthClient(OpenMode.GDRIVE, cursor.getString(1)) + val storageClientInstance = + OmhStorageProvider.Builder() + .addNonGmsPath(GoogleDriveNonGmsConstants.IMPLEMENTATION_PATH) + .build() + .provideStorageClient(authClient, context) + return storageClientInstance + } +} diff --git a/app/src/main/java/com/amaze/filemanager/utils/omh/OmhAuthClientExt.kt b/app/src/main/java/com/amaze/filemanager/utils/omh/OmhAuthClientExt.kt new file mode 100644 index 0000000000..9f29dc84d8 --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/utils/omh/OmhAuthClientExt.kt @@ -0,0 +1,205 @@ +package com.amaze.filemanager.utils.omh + +import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.openmobilehub.android.auth.core.OmhAuthClient +import com.openmobilehub.android.auth.core.OmhCredentials +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.net.ProtocolException +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit + +/** + * Callback interface for triggering authentication when needed. + */ +interface AuthTrigger { + /** + * Triggers authentication for the specified OpenMode. + * @param openMode The cloud service to authenticate with + * @return true if authentication was successful, false otherwise + */ + fun triggerAuthBlocking(openMode: OpenMode): Boolean +} + +private val LOG: Logger = LoggerFactory.getLogger(OmhAuthClient::class.java) + +private val authExecutor = + Executors.newSingleThreadExecutor { + Thread(it, "OmhAuth").apply { + isDaemon = true + } + } + +/** + * Check if the exception has a [ProtocolException] anywhere in its cause chain. + */ +private fun hasProtocolExceptionCause(e: Throwable): Boolean { + var cause: Throwable? = e.cause + while (cause != null) { + if (cause is ProtocolException) return true + cause = cause.cause + } + return false +} + +private fun defaultRefreshAction(openMode: OpenMode): () -> Unit = + { + val omhAuthClient = OMHClientHelper.getAuthClient(openMode) + omhAuthClient.getCredentials().blockingRefreshAccessToken() + } + +/** + * Blocking version of [retryOnUnauthorized], for better interoperability with Java. + * + * This calls [retryOnUnauthorizedBlocking()] with default maxRetries of 2 + * and default refreshAction. + */ +fun retryOnUnauthorizedBlocking( + openMode: OpenMode, + trigger: AuthTrigger, + action: () -> T, +): T = + runBlocking { + retryOnUnauthorized( + openMode, + 2, + trigger, + defaultRefreshAction(openMode), + ) { action() } + } + +/** + * Blocking version of [retryOnUnauthorized], for better interoperability with Java. + */ +fun retryOnUnauthorizedBlocking( + openMode: OpenMode, + maxRetries: Int = 2, + trigger: AuthTrigger, + refreshAction: () -> Unit = defaultRefreshAction(openMode), + action: () -> T, +): T = + runBlocking { + retryOnUnauthorized( + openMode, + maxRetries, + trigger, + refreshAction, + ) { action() } + } + +/** + * Retries the given [action] up to [maxRetries] times if it throws a [CloudPluginException] + * caused by an unauthorized access (e.g., expired token). It attempts to refresh the access token + * using the provided [refreshAction] and triggers re-authentication via [trigger] if necessary. + * + * @param openMode The cloud service to authenticate with + * @param maxRetries The maximum number of retry attempts (default is 2) + * @param trigger The [AuthTrigger] to invoke for re-authentication + * @param refreshAction The action to refresh the access token (default implementation provided) + * @param action The suspend function to execute that may throw [CloudPluginException] + * @return The result of the successful [action] + * @throws CloudPluginException if all retry attempts fail + */ +@Suppress("LongMethod", "TooGenericExceptionCaught") +suspend fun retryOnUnauthorized( + openMode: OpenMode, + maxRetries: Int = 2, + trigger: AuthTrigger, + refreshAction: () -> Unit = defaultRefreshAction(openMode), + action: suspend () -> T, +): T { + var attempt = 1 + var lastException: Exception? = null + + while (attempt <= maxRetries) { + try { + return action() + } catch (e: CancellationException) { + throw e + } catch (e: CloudPluginException) { + lastException = e + if (hasProtocolExceptionCause(e)) { + if (attempt == maxRetries) { + LOG.debug("Max attempts reached, attempting re-authentication") + + // Run auth on a completely separate thread, no coroutines involved + val authFuture = CompletableFuture() + authExecutor.execute { + try { + val result = trigger.triggerAuthBlocking(openMode) + authFuture.complete(result) + } catch (ex: Exception) { + authFuture.completeExceptionally(ex) + } + } + + val authSuccess = + try { + authFuture.get(120, TimeUnit.SECONDS) // 2 min timeout for browser auth + } catch (ex: Exception) { + LOG.warn("Auth trigger failed", ex) + false + } + + if (!authSuccess) { + throw e + } + return action() + } + + LOG.debug("Token unauthorized, attempting to refresh token (attempt $attempt/$maxRetries)") + // Run refresh on separate thread + val refreshFuture = CompletableFuture() + authExecutor.execute { + try { + refreshAction() + refreshFuture.complete(Unit) + } catch (ex: Exception) { + refreshFuture.completeExceptionally(ex) + } + } + refreshFuture.get(30, TimeUnit.SECONDS) + attempt++ + } else { + if (attempt == maxRetries) { + throw e // Don't wrap again, throw original exception + } + + LOG.debug("Network error, retrying operation (attempt $attempt/$maxRetries)") + delay(500L * attempt) // Exponential backoff + + attempt++ + } + } catch (e: Exception) { + LOG.warn("Unexpected exception in retryOnUnauthorized", e) + throw e + } + } + throw lastException ?: error("Unreachable code reached in retryOnUnauthorized") +} + +/** + * Borrowed from omh-storage, to resume an ongoing coroutine after access token is refreshed. + */ +@Suppress("TooGenericExceptionCaught") +fun OmhCredentials.blockingRefreshAccessToken(): String? { + val future = CompletableFuture() + + val cancellable = + refreshAccessToken() + .addOnSuccess { result -> future.complete(result) } + .addOnFailure { e -> future.completeExceptionally(e) } + .execute() + + return try { + future.get(30, TimeUnit.SECONDS) + } catch (e: Exception) { + cancellable.cancel() + throw e + } +} diff --git a/app/src/main/java/com/amaze/filemanager/utils/omh/OmhCredentialsWrapper.kt b/app/src/main/java/com/amaze/filemanager/utils/omh/OmhCredentialsWrapper.kt new file mode 100644 index 0000000000..e5709f87ef --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/utils/omh/OmhCredentialsWrapper.kt @@ -0,0 +1,9 @@ +package com.amaze.filemanager.utils.omh + +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.openmobilehub.android.auth.core.OmhCredentials + +data class OmhCredentialsWrapper( + val openMode: OpenMode, + val credentials: OmhCredentials, +) diff --git a/app/src/main/java/com/amaze/filemanager/utils/omh/OmhStorageClientExt.kt b/app/src/main/java/com/amaze/filemanager/utils/omh/OmhStorageClientExt.kt new file mode 100644 index 0000000000..7f8e4b0c3c --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/utils/omh/OmhStorageClientExt.kt @@ -0,0 +1,111 @@ +package com.amaze.filemanager.utils.omh + +import com.openmobilehub.android.storage.core.OmhStorageClient +import com.openmobilehub.android.storage.core.model.OmhStorageEntity +import com.openmobilehub.android.storage.core.model.OmhStorageMetadata +import com.openmobilehub.android.storage.core.utils.folderSize +import kotlinx.coroutines.runBlocking +import java.io.ByteArrayOutputStream + +/** + * Blocking version of [OmhStorageClient.search]. + */ +fun OmhStorageClient.searchBlocking(query: String): List = runBlocking { search(query) } + +/** + * Blocking version of [OmhStorageClient.createFileWithExtension]. + */ +fun OmhStorageClient.createFileWithExtensionBlocking( + name: String, + extension: String, + parentId: String, +): OmhStorageEntity? = + runBlocking { + createFileWithExtension(name, extension, parentId) + } + +/** + * Blocking version of [OmhStorageClient.createFolder]. + */ +fun OmhStorageClient.createFolderBlocking( + name: String, + parentId: String, +): OmhStorageEntity? = + runBlocking { + createFolder(name, parentId) + } + +/** + * Blocking version of [OmhStorageClient.deleteFile]. + */ +fun OmhStorageClient.deleteFileBlocking(fileId: String) = + runBlocking { + deleteFile(fileId) + } + +/** + * Blocking version of [OmhStorageClient.permanentlyDeleteFile]. + */ +fun OmhStorageClient.permanentlyDeleteFileBlocking(id: String) = + runBlocking { + permanentlyDeleteFile(id) + } + +/** + * Blocking version of [OmhStorageClient.downloadFile]. + */ +fun OmhStorageClient.downloadFileBlocking(fileId: String): ByteArrayOutputStream = + runBlocking { + downloadFile(fileId) + } + +/** + * Blocking version of [OmhStorageClient.downloadFileVersion]. + */ +fun OmhStorageClient.downloadFileVersionBlocking( + fileId: String, + versionId: String, +): ByteArrayOutputStream = + runBlocking { + downloadFileVersion(fileId, versionId) + } + +/** + * Blocking version of [OmhStorageClient.getFileMetadata]. + */ +fun OmhStorageClient.getFileMetadataBlocking(fileId: String): OmhStorageMetadata? = + runBlocking { + getFileMetadata(fileId) + } + +/** + * Blocking version of [OmhStorageClient.resolvePath]. + */ +fun OmhStorageClient.resolvePathBlocking(path: String): OmhStorageEntity? = + runBlocking { + resolvePath(path) + } + +/** + * Blocking version of [OmhStorageClient.folderSize]. + */ +fun OmhStorageClient.folderSizeBlocking(folderId: String): Long = + runBlocking { + folderSize(folderId) + } + +/** + * Blocking version of [OmhStorageClient.getStorageUsage]. + */ +fun OmhStorageClient.getStorageUsageBlocking(): Long = + runBlocking { + getStorageUsage() + } + +/** + * Blocking version of [OmhStorageClient.getStorageQuota]. + */ +fun OmhStorageClient.getStorageQuotaBlocking(): Long = + runBlocking { + getStorageQuota() + } diff --git a/app/src/main/res/layout/drawerheader.xml b/app/src/main/res/layout/drawerheader.xml index e91fd51be6..85600c9f32 100644 --- a/app/src/main/res/layout/drawerheader.xml +++ b/app/src/main/res/layout/drawerheader.xml @@ -18,7 +18,7 @@ android:minHeight="@dimen/drawer_header_height" android:layout_alignParentStart="true" android:layout_alignParentLeft="true"/> - Cleanup interval Trigger auto-cleanup interval (hours) File Deletion + https + auth.teamamaze.xyz + /filemanager/microsoft/oauth2/callback + https + auth.teamamaze.xyz + /filemanager/dropbox/oauth2/callback + https + auth.teamamaze.xyz + /filemanager/google/oauth2/callback diff --git a/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java b/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java deleted file mode 100644 index 83adc97e31..0000000000 --- a/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/CloudLoaderAsyncTask.java +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.asynchronous.asynctasks; - -import java.lang.ref.WeakReference; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.amaze.filemanager.R; -import com.amaze.filemanager.application.AppConfig; -import com.amaze.filemanager.database.CloudHandler; -import com.amaze.filemanager.database.models.explorer.CloudEntry; -import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException; -import com.amaze.filemanager.fileoperations.filesystem.OpenMode; -import com.amaze.filemanager.ui.activities.MainActivity; -import com.amaze.filemanager.utils.DataUtils; -import com.cloudrail.si.CloudRail; -import com.cloudrail.si.exceptions.AuthenticationException; -import com.cloudrail.si.exceptions.ParseException; -import com.cloudrail.si.interfaces.CloudStorage; -import com.cloudrail.si.services.Box; -import com.cloudrail.si.services.Dropbox; -import com.cloudrail.si.services.GoogleDrive; -import com.cloudrail.si.services.OneDrive; - -import android.database.Cursor; -import android.os.AsyncTask; -import android.widget.Toast; - -import androidx.annotation.NonNull; - -public class CloudLoaderAsyncTask extends AsyncTask { - - private static final Logger LOG = LoggerFactory.getLogger(CloudLoaderAsyncTask.class); - - private final Cursor data; - private final WeakReference mainActivity; - private final CloudHandler cloudHandler; - private final DataUtils dataUtils; - - public CloudLoaderAsyncTask(MainActivity mainActivity, CloudHandler cloudHandler, Cursor data) { - this.data = data; - this.mainActivity = new WeakReference<>(mainActivity); - this.cloudHandler = cloudHandler; - this.dataUtils = DataUtils.getInstance(); - } - - @Override - @NonNull - public Boolean doInBackground(Void... voids) { - boolean hasUpdatedDrawer = false; - - if (data == null) return false; - if (data.getCount() > 0 && data.moveToFirst()) { - do { - if (mainActivity.get() == null || isCancelled()) { - cancel(true); - return false; - } - - switch (data.getInt(0)) { - case 1: - try { - CloudRail.setAppKey(data.getString(1)); - } catch (Exception e) { - // any other exception due to network conditions or other error - LOG.warn("failed to set app key", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.failed_cloud_api_key); - } else { - cancel(true); - } - return false; - } - break; - case 2: - // DRIVE - try { - CloudEntry cloudEntryGdrive = null; - CloudEntry savedCloudEntryGdrive; - GoogleDrive cloudStorageDrive; - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - cloudStorageDrive = - new GoogleDrive( - mainActivity.getApplicationContext(), - data.getString(1), - "", - MainActivity.CLOUD_AUTHENTICATOR_REDIRECT_URI, - data.getString(2)); - } else { - cancel(true); - return false; - } - cloudStorageDrive.useAdvancedAuthentication(); - - if ((savedCloudEntryGdrive = cloudHandler.findEntry(OpenMode.GDRIVE)) != null) { - // we already have the entry and saved state, get it - - try { - cloudStorageDrive.loadAsString(savedCloudEntryGdrive.getPersistData().value); - } catch (ParseException e) { - LOG.warn("failed to load cloud storage connection", e); - // we need to update the persist string as existing one is been compromised - - cloudStorageDrive.login(); - cloudEntryGdrive = - new CloudEntry(OpenMode.GDRIVE, cloudStorageDrive.saveAsString()); - cloudHandler.updateEntry(OpenMode.GDRIVE, cloudEntryGdrive); - } - } else { - cloudStorageDrive.login(); - cloudEntryGdrive = - new CloudEntry(OpenMode.GDRIVE, cloudStorageDrive.saveAsString()); - cloudHandler.addEntry(cloudEntryGdrive); - } - - dataUtils.addAccount(cloudStorageDrive); - hasUpdatedDrawer = true; - } catch (CloudPluginException e) { - LOG.warn("failed to find cloud entry", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_error_plugin); - mainActivity.deleteConnection(OpenMode.GDRIVE); - } else { - cancel(true); - } - return false; - } catch (AuthenticationException e) { - LOG.warn("failed to authenticate cloud connection", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_fail_authenticate); - mainActivity.deleteConnection(OpenMode.GDRIVE); - } else { - cancel(true); - } - return false; - } catch (Exception e) { - // any other exception due to network conditions or other error - LOG.warn("Failed to load cloud conn due to network conditions or other error", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.failed_cloud_new_connection); - mainActivity.deleteConnection(OpenMode.GDRIVE); - } else { - cancel(true); - } - return false; - } - break; - case 3: - // DROPBOX - try { - CloudEntry cloudEntryDropbox = null; - CloudEntry savedCloudEntryDropbox; - CloudStorage cloudStorageDropbox; - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - cloudStorageDropbox = - new Dropbox( - mainActivity.getApplicationContext(), data.getString(1), data.getString(2)); - } else { - cancel(true); - return false; - } - - if ((savedCloudEntryDropbox = cloudHandler.findEntry(OpenMode.DROPBOX)) != null) { - // we already have the entry and saved state, get it - try { - cloudStorageDropbox.loadAsString(savedCloudEntryDropbox.getPersistData().value); - } catch (ParseException e) { - LOG.warn("failed to load cloud storage connection", e); - // we need to persist data again - - cloudStorageDropbox.login(); - cloudEntryDropbox = - new CloudEntry(OpenMode.DROPBOX, cloudStorageDropbox.saveAsString()); - cloudHandler.updateEntry(OpenMode.DROPBOX, cloudEntryDropbox); - } - } else { - cloudStorageDropbox.login(); - cloudEntryDropbox = - new CloudEntry(OpenMode.DROPBOX, cloudStorageDropbox.saveAsString()); - cloudHandler.addEntry(cloudEntryDropbox); - } - - dataUtils.addAccount(cloudStorageDropbox); - hasUpdatedDrawer = true; - } catch (CloudPluginException e) { - LOG.warn("failed to find cloud entry", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_error_plugin); - mainActivity.deleteConnection(OpenMode.DROPBOX); - } else { - cancel(true); - } - return false; - } catch (AuthenticationException e) { - LOG.warn("failed to authenticate cloud connection", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_fail_authenticate); - mainActivity.deleteConnection(OpenMode.DROPBOX); - } else cancel(true); - return false; - } catch (Exception e) { - // any other exception due to network conditions or other error - LOG.warn("Failed to load cloud conn due to network conditions or other error", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.failed_cloud_new_connection); - mainActivity.deleteConnection(OpenMode.DROPBOX); - } else cancel(true); - return false; - } - break; - case 4: - // BOX - try { - CloudEntry cloudEntryBox = null; - CloudEntry savedCloudEntryBox; - CloudStorage cloudStorageBox; - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - cloudStorageBox = - new Box( - mainActivity.getApplicationContext(), data.getString(1), data.getString(2)); - } else { - cancel(true); - return false; - } - - if ((savedCloudEntryBox = cloudHandler.findEntry(OpenMode.BOX)) != null) { - // we already have the entry and saved state, get it - try { - cloudStorageBox.loadAsString(savedCloudEntryBox.getPersistData().value); - } catch (ParseException e) { - LOG.warn("failed to load cloud storage connection", e); - // we need to persist data again - cloudStorageBox.login(); - cloudEntryBox = new CloudEntry(OpenMode.BOX, cloudStorageBox.saveAsString()); - cloudHandler.updateEntry(OpenMode.BOX, cloudEntryBox); - } - } else { - cloudStorageBox.login(); - cloudEntryBox = new CloudEntry(OpenMode.BOX, cloudStorageBox.saveAsString()); - cloudHandler.addEntry(cloudEntryBox); - } - - dataUtils.addAccount(cloudStorageBox); - hasUpdatedDrawer = true; - } catch (CloudPluginException e) { - LOG.warn("failed to find cloud entry", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_error_plugin); - mainActivity.deleteConnection(OpenMode.BOX); - } else cancel(true); - return false; - } catch (AuthenticationException e) { - LOG.warn("failed to authenticate cloud connection", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_fail_authenticate); - mainActivity.deleteConnection(OpenMode.BOX); - } else cancel(true); - return false; - } catch (Exception e) { - // any other exception due to network conditions or other error - LOG.warn("Failed to load cloud conn due to network conditions or other error", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.failed_cloud_new_connection); - mainActivity.deleteConnection(OpenMode.BOX); - } else cancel(true); - return false; - } - break; - case 5: - // ONEDRIVE - try { - CloudEntry cloudEntryOnedrive = null; - CloudEntry savedCloudEntryOnedrive; - CloudStorage cloudStorageOnedrive; - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - cloudStorageOnedrive = - new OneDrive( - mainActivity.getApplicationContext(), data.getString(1), data.getString(2)); - } else { - cancel(true); - return false; - } - - if ((savedCloudEntryOnedrive = cloudHandler.findEntry(OpenMode.ONEDRIVE)) != null) { - // we already have the entry and saved state, get it - try { - cloudStorageOnedrive.loadAsString(savedCloudEntryOnedrive.getPersistData().value); - } catch (ParseException e) { - LOG.warn("failed to load cloud storage connection", e); - // we need to persist data again - - cloudStorageOnedrive.login(); - cloudEntryOnedrive = - new CloudEntry(OpenMode.ONEDRIVE, cloudStorageOnedrive.saveAsString()); - cloudHandler.updateEntry(OpenMode.ONEDRIVE, cloudEntryOnedrive); - } - } else { - cloudStorageOnedrive.login(); - cloudEntryOnedrive = - new CloudEntry(OpenMode.ONEDRIVE, cloudStorageOnedrive.saveAsString()); - cloudHandler.addEntry(cloudEntryOnedrive); - } - - dataUtils.addAccount(cloudStorageOnedrive); - hasUpdatedDrawer = true; - } catch (CloudPluginException e) { - LOG.warn("failed to find cloud entry", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_error_plugin); - mainActivity.deleteConnection(OpenMode.ONEDRIVE); - } else cancel(true); - return false; - } catch (AuthenticationException e) { - LOG.warn("failed to authenticate cloud connection", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.cloud_fail_authenticate); - mainActivity.deleteConnection(OpenMode.ONEDRIVE); - } else cancel(true); - return false; - } catch (Exception e) { - // any other exception due to network conditions or other error - LOG.warn("Failed to load cloud conn due to network conditions or other error", e); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - AppConfig.toast(mainActivity, R.string.failed_cloud_new_connection); - mainActivity.deleteConnection(OpenMode.ONEDRIVE); - } else cancel(true); - return false; - } - break; - default: - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - Toast.makeText(mainActivity, R.string.cloud_error_failed_restart, Toast.LENGTH_LONG) - .show(); - } else cancel(true); - return false; - } - } while (data.moveToNext()); - } - return hasUpdatedDrawer; - } - - @Override - protected void onCancelled() { - super.onCancelled(); - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - mainActivity - .getSupportLoaderManager() - .destroyLoader(MainActivity.REQUEST_CODE_CLOUD_LIST_KEY); - mainActivity - .getSupportLoaderManager() - .destroyLoader(MainActivity.REQUEST_CODE_CLOUD_LIST_KEYS); - } - } - - @Override - public void onPostExecute(@NonNull Boolean result) { - if (result) { - final MainActivity mainActivity = this.mainActivity.get(); - if (mainActivity != null) { - mainActivity.getDrawer().refreshDrawer(); - mainActivity.invalidateFragmentAndBundle(null, true); - } - } - } -} diff --git a/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/cloud/CloudLoaderCallable.kt b/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/cloud/CloudLoaderCallable.kt new file mode 100644 index 0000000000..7718eb2303 --- /dev/null +++ b/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/cloud/CloudLoaderCallable.kt @@ -0,0 +1,70 @@ +package com.amaze.filemanager.asynchronous.asynctasks.cloud + +import android.database.Cursor +import com.amaze.filemanager.R +import com.amaze.filemanager.application.AppConfig +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.ui.activities.MainActivity +import com.amaze.filemanager.utils.DataUtils +import com.amaze.filemanager.utils.omh.OMHClientHelper +import com.amaze.filemanager.utils.omh.OmhCredentialsWrapper +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.lang.ref.WeakReference +import java.util.concurrent.Callable + +class CloudLoaderCallable( + mainActivity: MainActivity, + private val data: Cursor?, +) : Callable { + private val mainActivity: WeakReference = WeakReference(mainActivity) + + companion object { + @JvmStatic + private val LOG: Logger = LoggerFactory.getLogger(CloudLoaderCallable::class.java) + } + + override fun call(): Boolean { + var hasUpdatedDrawer = false + if (data == null) { + return false + } else if (data.count > 0 && data.moveToFirst()) { + do { + val v = data.getInt(0) + when (v) { + 1 -> Unit + 2, 3, 4 -> { + val openMode = + when (v) { + 2 -> OpenMode.GDRIVE + 3 -> OpenMode.DROPBOX + else -> OpenMode.ONEDRIVE + } + val authClient = + OMHClientHelper.getAuthClient( + openMode, + data.getString(1), + ) + val credentials = authClient.getCredentials() + if (credentials.accessToken != null) { + DataUtils.addAccount( + OmhCredentialsWrapper( + openMode, + credentials, + ), + ) + hasUpdatedDrawer = true + } else { + mainActivity.get()?.deleteCloudConnection(openMode) + } + } + else -> { + AppConfig.toast(mainActivity.get(), R.string.cloud_error_failed_restart) + return false + } + } + } while (data.moveToNext()) + } + return hasUpdatedDrawer + } +} diff --git a/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java b/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java index de57e3ea1b..0e714f6f2b 100644 --- a/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java +++ b/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.application; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static android.os.Looper.getMainLooper; import static org.awaitility.Awaitility.await; @@ -51,7 +51,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {O, P, Build.VERSION_CODES.R}) public class AppConfigTest { @After diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt index c77388920d..46fcec0402 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.asynchronous.asynctasks import android.Manifest import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Looper import android.os.storage.StorageManager @@ -70,7 +70,7 @@ import org.robolectric.shadows.ShadowToast ShadowFileUtils::class, ShadowPasswordUtil::class, ], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) abstract class AbstractDeleteTaskTestBase { private var ctx: Context? = null diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java index 343e16b743..03fb707084 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.asynchronous.asynctasks; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static android.os.Looper.getMainLooper; import static android.view.View.VISIBLE; @@ -58,7 +58,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class DbViewerTaskTest { private WebView webView; diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt index ca6c8959f5..93092f94f0 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.compress import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -37,7 +37,7 @@ import java.io.FileOutputStream import java.util.TimeZone @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P, Build.VERSION_CODES.R]) abstract class AbstractCompressedHelperCallableTest { private lateinit var systemTz: TimeZone diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt index 335f975c18..9cff971fe2 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt @@ -20,7 +20,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.compress -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.core.app.ApplicationProvider @@ -42,7 +42,7 @@ import java.io.FileOutputStream * Test behaviour of CompressedHelpers in handling corrupt archives. */ @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P]) class CompressedHelperForBadArchiveTest { /** * Test handling of corrupt archive with random junk. diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt index 097eeb34fd..e53ce37689 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt @@ -41,7 +41,7 @@ import java.util.regex.Pattern @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.O, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication", "ComplexMethod", "LongMethod", "LargeClass") class SearchResultListSorterTest { @@ -338,6 +338,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abc-efg", "user", @@ -353,6 +354,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\ABCD-FG", "user", @@ -401,6 +403,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abcdefg", "user", @@ -416,6 +419,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\ABC_EFG", "user", @@ -465,6 +469,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abcdefg", "user", @@ -480,6 +485,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\ABC EFG", "user", @@ -529,6 +535,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abcdefg", "user", @@ -544,6 +551,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\ABC.EFG", "user", @@ -594,6 +602,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abc.efg", "user", @@ -609,6 +618,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\ABC_EFG", "user", @@ -659,6 +669,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abc.efg", "user", @@ -674,6 +685,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\ABC_EFG", "user", @@ -723,6 +735,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abc.efg", "user", @@ -738,6 +751,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\ABC_EFG", "user", @@ -793,6 +807,7 @@ class SearchResultListSorterTest { val file1 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title1, "C:\\AmazeFileManager\\abc.efghij", "user", @@ -812,6 +827,7 @@ class SearchResultListSorterTest { val file2 = LayoutElementParcelable( ApplicationProvider.getApplicationContext(), + "", title2, "C:\\AmazeFileManager\\EFGABC", "user", diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt index 1cfc834af1..5ac86e666f 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.ssh import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowFileUtils @@ -45,7 +45,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [O, P, VERSION_CODES.R], ) class PemToKeyPairObservableEd25519Test { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt index 3590c52573..3c82e82d69 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt @@ -22,8 +22,8 @@ package com.amaze.filemanager.asynchronous.asynctasks.ssh import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.N +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.appcompat.widget.AppCompatEditText import androidx.lifecycle.Lifecycle @@ -65,7 +65,7 @@ import java.util.concurrent.TimeUnit @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [O, P, VERSION_CODES.R], ) class PemToKeyPairObservableRsaTest { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt index a176c0fdd6..730e81b306 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.ssh import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -66,7 +66,7 @@ import java.util.concurrent.CountDownLatch @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication") class SshAuthenticationTaskTest { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt index f120e7f542..cd31738d99 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.texteditor.read import android.content.Context import android.net.Uri import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -46,7 +46,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class ReadTextFileCallableTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java index 8fcc850e5d..ddddf94063 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.texteditor.write; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -65,7 +65,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class, ShadowContentResolver.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class WriteTextFileCallableTest { private static final String contents = "This is modified data"; diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt index eca0bf4fd4..025c0cd287 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt @@ -25,8 +25,8 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.M +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import android.util.Log @@ -64,7 +64,7 @@ import java.util.concurrent.TimeUnit import kotlin.random.Random @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P, Build.VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class DecryptServiceTest { private lateinit var source: ByteArray diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt index 7443d72e6d..55072aa148 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt @@ -25,8 +25,8 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.M +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import android.util.Log @@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit import kotlin.random.Random @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P, Build.VERSION_CODES.R]) class EncryptServiceTest { private lateinit var service: EncryptService private lateinit var notificationManager: ShadowNotificationManager @@ -128,7 +128,9 @@ class EncryptServiceTest { assertTrue(notificationManager.activeNotifications.isNotEmpty()) notificationManager.activeNotifications.first().let { assertEquals(NotificationConstants.ENCRYPT_ID, it.id) - assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + if (SDK_INT >= O) { + assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + } } await().atMost(10, TimeUnit.SECONDS).until { targetFile.length() > 0 && notificationManager.activeNotifications.isEmpty() @@ -171,7 +173,9 @@ class EncryptServiceTest { assertTrue(notificationManager.activeNotifications.isNotEmpty()) notificationManager.activeNotifications.first().let { assertEquals(NotificationConstants.ENCRYPT_ID, it.id) - assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + if (SDK_INT >= O) { + assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + } } await().atMost(10, TimeUnit.SECONDS).until { targetFile.length() > 0 && notificationManager.activeNotifications.isEmpty() diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt index 3dbfc48c0d..a12a1ef40f 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt @@ -26,7 +26,7 @@ import android.net.NetworkInfo import android.net.Uri import android.net.wifi.WifiInfo import android.net.wifi.WifiManager -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Environment import androidx.preference.PreferenceManager import androidx.test.core.app.ApplicationProvider @@ -62,9 +62,9 @@ import java.io.FileOutputStream import java.net.InetAddress import kotlin.random.Random -@Ignore("Pending fix for testing against newer Androids") +@Ignore("FIXME - compatibility with higher Androids") @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP], shadows = [ShadowMultiDex::class]) +@Config(sdk = [O], shadows = [ShadowMultiDex::class]) @LooperMode(LooperMode.Mode.PAUSED) @Suppress("StringLiteralDuplication") class FtpServiceAndroidFileSystemIntegrationTest { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt index 9faa8029cf..a5a45372fc 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.asynchronous.services import android.content.Context import android.content.Intent import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Looper.getMainLooper import androidx.test.core.app.ApplicationProvider @@ -59,7 +59,7 @@ import kotlin.random.Random @RunWith(RobolectricTestRunner::class) @LooperMode(LooperMode.Mode.PAUSED) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P, Build.VERSION_CODES.R]) class ZipServiceTest { val dt = DateTimeFormatter.ofPattern("yyyyMMddkkmm") val dates = diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt index b08a421056..f08b096e10 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt @@ -22,7 +22,6 @@ package com.amaze.filemanager.asynchronous.services.ftp import android.content.Intent import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.N import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P @@ -44,7 +43,7 @@ import org.junit.runner.RunWith import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P, Build.VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class FtpReceiverTest { private lateinit var receiver: FtpReceiver @@ -81,7 +80,7 @@ class FtpReceiverTest { * Test [Context.startService()] called for pre-Oreo Androids. */ @Test - @Config(sdk = [N]) + @Config(maxSdk = N) fun testStartServiceCalled() { val ctx = AppConfig.getInstance() val spy = spyk(ctx) diff --git a/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt b/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt index 69c1e48289..9abebee84f 100644 --- a/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.room.Room import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory @@ -30,8 +30,6 @@ import androidx.test.platform.app.InstrumentationRegistry import com.amaze.filemanager.fileoperations.filesystem.OpenMode import com.amaze.filemanager.shadows.ShadowMultiDex import com.amaze.filemanager.test.ShadowPasswordUtil -import io.reactivex.schedulers.Schedulers -import org.junit.Assert import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -44,7 +42,7 @@ import java.io.IOException @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication", "ComplexMethod", "LongMethod") class ExplorerDatabaseMigrationTest { @@ -82,6 +80,7 @@ class ExplorerDatabaseMigrationTest { ExplorerDatabase.MIGRATION_8_9, ExplorerDatabase.MIGRATION_9_10, ExplorerDatabase.MIGRATION_10_11, + ExplorerDatabase.MIGRATION_11_12, ) .build() explorerDatabase.openHelper.writableDatabase @@ -109,6 +108,7 @@ class ExplorerDatabaseMigrationTest { ExplorerDatabase.MIGRATION_8_9, ExplorerDatabase.MIGRATION_9_10, ExplorerDatabase.MIGRATION_10_11, + ExplorerDatabase.MIGRATION_11_12, ) .build() explorerDatabase.openHelper.writableDatabase @@ -135,6 +135,7 @@ class ExplorerDatabaseMigrationTest { ExplorerDatabase.MIGRATION_8_9, ExplorerDatabase.MIGRATION_9_10, ExplorerDatabase.MIGRATION_10_11, + ExplorerDatabase.MIGRATION_11_12, ) .build() explorerDatabase.openHelper.writableDatabase @@ -212,41 +213,9 @@ class ExplorerDatabaseMigrationTest { ExplorerDatabase.MIGRATION_8_9, ExplorerDatabase.MIGRATION_9_10, ExplorerDatabase.MIGRATION_10_11, + ExplorerDatabase.MIGRATION_11_12, ).allowMainThreadQueries() .build() - explorerDatabase.openHelper.writableDatabase - var verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.GDRIVE.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(1, verify.id.toLong()) - Assert.assertEquals("abcd", verify.persistData.toString()) - verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.BOX.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(3, verify.id.toLong()) - Assert.assertEquals("ijkl", verify.persistData.toString()) - verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.DROPBOX.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(2, verify.id.toLong()) - Assert.assertEquals("efgh", verify.persistData.toString()) - verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.ONEDRIVE.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(4, verify.id.toLong()) - Assert.assertEquals("mnop", verify.persistData.toString()) explorerDatabase.close() } @@ -320,42 +289,10 @@ class ExplorerDatabaseMigrationTest { ExplorerDatabase.MIGRATION_8_9, ExplorerDatabase.MIGRATION_9_10, ExplorerDatabase.MIGRATION_10_11, + ExplorerDatabase.MIGRATION_11_12, ) .allowMainThreadQueries() .build() - explorerDatabase.openHelper.writableDatabase - var verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.GDRIVE.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(1, verify.id.toLong()) - Assert.assertEquals("abcd", verify.persistData.toString()) - verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.BOX.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(3, verify.id.toLong()) - Assert.assertEquals("ijkl", verify.persistData.toString()) - verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.DROPBOX.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(2, verify.id.toLong()) - Assert.assertEquals("efgh", verify.persistData.toString()) - verify = - explorerDatabase - .cloudEntryDao() - .findByServiceType(OpenMode.ONEDRIVE.ordinal) - .subscribeOn(Schedulers.trampoline()) - .blockingGet() - Assert.assertEquals(4, verify.id.toLong()) - Assert.assertEquals("mnop", verify.persistData.toString()) explorerDatabase.close() } diff --git a/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt b/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt index f3167fcaf0..af54ea69be 100644 --- a/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.util.Base64 import androidx.room.Room @@ -52,7 +52,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class UtilitiesDatabaseMigrationTest { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt b/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt index 7b8a5e433c..7cc602211a 100644 --- a/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import android.os.Environment.DIRECTORY_DCIM @@ -53,7 +53,7 @@ import java.io.File @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class UtilsHandlerTest { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt b/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt index f5adf4c7bd..4389e2d402 100644 --- a/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database.typeconverters import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.database.models.StringWrapper @@ -38,7 +38,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class EncryptedStringTypeConverterTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt index f306e23d7a..c6ec359712 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -42,7 +42,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication") abstract class AbstractFilenameHelperIncrementNameTests { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt index 1aafbc6a79..edf4c38677 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.filesystem import android.Manifest import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Looper import android.os.storage.StorageManager @@ -68,7 +68,7 @@ import org.robolectric.shadows.ShadowSQLiteConnection ShadowFileUtils::class, ShadowPasswordUtil::class, ], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) abstract class AbstractOperationsTestBase { private var ctx: Context? = null diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java index 32897ee00e..968438478d 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static com.amaze.filemanager.filesystem.EditableFileAbstraction.Scheme.CONTENT; import static com.amaze.filemanager.filesystem.EditableFileAbstraction.Scheme.FILE; @@ -49,7 +49,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class EditableFileAbstractionTest { @Test(expected = IllegalArgumentException.class) diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt index 7d1f6267b0..6e4f220737 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.filesystem import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.core.app.ApplicationProvider @@ -40,7 +40,7 @@ import java.net.URLDecoder import kotlin.random.Random @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P, Build.VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class HybridFileTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java index 329e3107e3..ac8fe59fa4 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -45,7 +45,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class OperationsTest { private File storageRoot = Environment.getExternalStorageDirectory(); diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java index f3004396db..54bb5a310a 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.fail; @@ -51,7 +51,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) @Ignore("FIXME: should not ignore - please implement a shadow") public class RootHelperTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/cloud/CloudUtilTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/cloud/CloudUtilTest.kt index 83078a553a..d6c5d1810b 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/cloud/CloudUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/cloud/CloudUtilTest.kt @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem.cloud -import com.amaze.filemanager.database.CloudHandler +import com.amaze.filemanager.database.CloudContract import com.amaze.filemanager.fileoperations.filesystem.OpenMode import com.amaze.filemanager.fileoperations.filesystem.OpenMode.BOX import com.amaze.filemanager.fileoperations.filesystem.OpenMode.DROPBOX @@ -33,21 +33,21 @@ import kotlin.random.Random class CloudUtilTest { /** - * Tests [CloudUtil.stripPath] + * Tests [CloudUtil.stripCloudPath] */ @Test fun stripPathTest() { val assertForTest = { mode: OpenMode, path: String, completePath: String -> - Assert.assertEquals(path, CloudUtil.stripPath(mode, completePath)) + Assert.assertEquals(path, CloudUtil.stripCloudPath(mode, completePath)) } val generatePathForMode = { mode: OpenMode, path: String -> val prefix = when (mode) { - DROPBOX -> CloudHandler.CLOUD_PREFIX_DROPBOX - BOX -> CloudHandler.CLOUD_PREFIX_BOX - GDRIVE -> CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE - ONEDRIVE -> CloudHandler.CLOUD_PREFIX_ONE_DRIVE + DROPBOX -> CloudContract.CLOUD_PREFIX_DROPBOX + BOX -> CloudContract.CLOUD_PREFIX_BOX + GDRIVE -> CloudContract.CLOUD_PREFIX_GOOGLE_DRIVE + ONEDRIVE -> CloudContract.CLOUD_PREFIX_ONE_DRIVE else -> null } requireNotNull(prefix) @@ -60,7 +60,7 @@ class CloudUtilTest { val path = RandomPathGenerator.generateRandomPath(r, 50) val genAndStrip = { mode: OpenMode -> - CloudUtil.stripPath(mode, generatePathForMode(mode, path)) + CloudUtil.stripCloudPath(mode, generatePathForMode(mode, path)) } assertForTest(DROPBOX, path, genAndStrip(DROPBOX)) diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java index 1047900c01..e5069e3a94 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem.compressed; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static kotlin.io.ConstantsKt.DEFAULT_BUFFER_SIZE; import static org.junit.Assert.assertEquals; @@ -56,7 +56,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class B0rkenZipTest { private File zipfile1 = new File(Environment.getExternalStorageDirectory(), "zip-slip.zip"); diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java index 8208508b35..58047cd394 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem.compressed; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -66,7 +66,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class CompressedHelperTest { private Context context; diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt index 8e2e8e1c45..999bd40bed 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.compressed.extractcontents import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.core.app.ApplicationProvider @@ -50,7 +50,7 @@ import java.nio.file.Paths import java.util.TimeZone @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [O, P, Build.VERSION_CODES.R]) abstract class AbstractExtractorTest { protected abstract fun extractorClass(): Class diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt index e2890ed677..6c1c11fbf6 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt @@ -43,7 +43,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.O, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication", "ComplexMethod", "LongMethod", "LargeClass") class FileListSorterTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt index a75c54e152..d07506c496 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.files import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.filesystem.files.FileUtils.getPathsInPath @@ -38,7 +38,7 @@ import java.util.TimeZone @RunWith(AndroidJUnit4::class) @LooperMode(LooperMode.Mode.PAUSED) -@Config(sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(sdk = [O, P, Build.VERSION_CODES.R]) @Suppress("TooManyFunctions", "StringLiteralDuplication") class FileUtilsTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt index fb00c32fdb..a2f0e615ab 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt @@ -32,7 +32,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.O, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) class DirSortByTest { /** Tests if [DirSortBy.getDirSortBy] returns the correct [DirSortBy] corresponding to the given index */ diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt index a851d96afb..784dcced93 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt @@ -32,7 +32,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.O, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) class SortByTest { /** Tests if [SortBy.getSortBy] returns the correct [SortBy] corresponding to the given index */ diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt index ee9bae2172..6cd1469556 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt @@ -31,7 +31,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.O, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) class SortTypeTest { /** Tests if the Int returned from [SortType.toDirectorySortInt] is as expected */ diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt index 35d51316ac..fddb848773 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ftp import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -64,7 +64,7 @@ import kotlin.text.Charsets.UTF_8 @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class NetCopyClientConnectionPoolFtpTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt index 6aed30ecb4..32cc3394aa 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ftpserver.commands import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowMultiDex @@ -38,7 +38,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) abstract class AbstractFtpserverCommandTest { protected lateinit var logger: LogMessageFilter diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt index b00c868784..1db6514e0d 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.root import android.content.SharedPreferences import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.preference.PreferenceManager import androidx.test.core.app.ApplicationProvider @@ -54,7 +54,7 @@ import java.io.InputStreamReader @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowNativeOperations::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class ListFilesCommandTest { private val sharedPreferences: SharedPreferences = diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt index 6b828df226..1f99babc8d 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.root import android.content.SharedPreferences import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.preference.PreferenceManager import androidx.test.core.app.ApplicationProvider @@ -54,7 +54,7 @@ import java.io.InputStreamReader @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowNativeOperations::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class ListFilesCommandTest2 { private val sharedPreferences: SharedPreferences = diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java index bb83e42eb4..8f8f3875c8 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem.smb; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -44,7 +44,7 @@ import jcifs.ResolverType; import jcifs.context.BaseContext; -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {O, P, Build.VERSION_CODES.R}) @RunWith(AndroidJUnit4.class) public class CifsContextsTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt index e6995e4ef4..e6464d90d6 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.smb import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -45,7 +45,7 @@ import org.robolectric.shadows.ShadowSQLiteConnection @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowSmbUtil::class, ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) @LooperMode(LooperMode.Mode.PAUSED) class SmbHybridFileTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt index a7cce7c3f1..9398b99ad4 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ssh import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -65,7 +65,7 @@ import kotlin.text.Charsets.UTF_8 @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [O, P, VERSION_CODES.R], ) abstract class AbstractSftpServerTest { protected var encryptedPassword: String? = diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/FilesOnSshdTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/FilesOnSshdTest.kt index 076e7149ee..bccde8a639 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/FilesOnSshdTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/FilesOnSshdTest.kt @@ -25,9 +25,7 @@ import androidx.test.core.app.ApplicationProvider import com.amaze.filemanager.application.AppConfig import com.amaze.filemanager.fileoperations.filesystem.OpenMode import com.amaze.filemanager.filesystem.HybridFile -import com.amaze.filemanager.filesystem.HybridFileParcelable import com.amaze.filemanager.test.randomBytes -import com.amaze.filemanager.utils.OnFileFound import org.awaitility.Awaitility.await import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers @@ -125,13 +123,10 @@ class FilesOnSshdTest : AbstractSftpServerTest() { file.forEachChildrenFile( ApplicationProvider.getApplicationContext(), false, - object : OnFileFound { - override fun onFileFound(fileFound: HybridFileParcelable) { - assertTrue("${fileFound.path} not seen as directory", fileFound.isDirectory) - result.add(fileFound.name) - } - }, - ) + ) { fileFound -> + assertTrue("${fileFound.path} not seen as directory", fileFound.isDirectory) + result.add(fileFound.name) + } await().until { result.size == 8 } assertThat>( result, @@ -150,12 +145,9 @@ class FilesOnSshdTest : AbstractSftpServerTest() { file.forEachChildrenFile( ApplicationProvider.getApplicationContext(), false, - object : OnFileFound { - override fun onFileFound(fileFound: HybridFileParcelable) { - result.add(fileFound.name) - } - }, - ) + ) { fileFound -> + result.add(fileFound.name) + } await().atMost(90, TimeUnit.SECONDS).until { result.size == 2 } assertThat>( result, @@ -170,12 +162,9 @@ class FilesOnSshdTest : AbstractSftpServerTest() { file.forEachChildrenFile( ApplicationProvider.getApplicationContext(), false, - object : OnFileFound { - override fun onFileFound(fileFound: HybridFileParcelable) { - result.add(fileFound.name) - } - }, - ) + ) { fileFound -> + result.add(fileFound.name) + } await().until { result.size == 1 } assertThat>( result, @@ -190,12 +179,9 @@ class FilesOnSshdTest : AbstractSftpServerTest() { file.forEachChildrenFile( ApplicationProvider.getApplicationContext(), false, - object : OnFileFound { - override fun onFileFound(fileFound: HybridFileParcelable) { - result.add(fileFound.name) - } - }, - ) + ) { fileFound -> + result.add(fileFound.name) + } await().until { result.size == 1 } assertThat>( result, @@ -234,24 +220,21 @@ class FilesOnSshdTest : AbstractSftpServerTest() { file.forEachChildrenFile( ApplicationProvider.getApplicationContext(), false, - object : OnFileFound { - override fun onFileFound(fileFound: HybridFileParcelable) { - if (!fileFound.name.endsWith(".txt")) { - assertTrue( - fileFound.path + " not seen as directory", - fileFound.isDirectory, - ) - dirs.add(fileFound.name) - } else { - assertFalse( - fileFound.path + " not seen as file", - fileFound.isDirectory, - ) - files.add(fileFound.name) - } - } - }, - ) + ) { fileFound -> + if (!fileFound.name.endsWith(".txt")) { + assertTrue( + fileFound.path + " not seen as directory", + fileFound.isDirectory, + ) + dirs.add(fileFound.name) + } else { + assertFalse( + fileFound.path + " not seen as file", + fileFound.isDirectory, + ) + files.add(fileFound.name) + } + } await().until { dirs.size == 8 } assertThat>( dirs, @@ -311,13 +294,10 @@ class FilesOnSshdTest : AbstractSftpServerTest() { file.forEachChildrenFile( ApplicationProvider.getApplicationContext(), false, - object : OnFileFound { - override fun onFileFound(fileFound: HybridFileParcelable) { - assertFalse("${fileFound.path} not seen as directory", fileFound.isDirectory) - result.add(fileFound.name) - } - }, - ) + ) { fileFound -> + assertFalse("${fileFound.path} not seen as directory", fileFound.isDirectory) + result.add(fileFound.name) + } await().until { result.size == 4 } assertThat>( result, @@ -329,13 +309,10 @@ class FilesOnSshdTest : AbstractSftpServerTest() { file.forEachChildrenFile( ApplicationProvider.getApplicationContext(), false, - object : OnFileFound { - override fun onFileFound(fileFound: HybridFileParcelable) { - assertTrue("${fileFound.path} not seen as directory", fileFound.isDirectory) - result2.add(fileFound.name) - } - }, - ) + ) { fileFound -> + assertTrue("${fileFound.path} not seen as directory", fileFound.isDirectory) + result2.add(fileFound.name) + } await().until { result2.size == 8 } assertThat>( result2, diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt index 27b8e5c406..01f4a94546 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ssh import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -75,7 +75,7 @@ import kotlin.text.Charsets.UTF_8 @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class NetCopyClientConnectionPoolSshTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt index 5c10d396a8..b55950cfa4 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.ssh import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -46,7 +46,7 @@ import org.robolectric.annotation.LooperMode @LooperMode(LooperMode.Mode.PAUSED) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class SshHybridFileTest { private var ctx: Context? = null diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/usb/ReflectionHelpers.java b/app/src/test/java/com/amaze/filemanager/filesystem/usb/ReflectionHelpers.java index f6d8a958b5..a44f3257b2 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/usb/ReflectionHelpers.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/usb/ReflectionHelpers.java @@ -107,7 +107,7 @@ static void configureUsbConfiguration(UsbConfiguration usbConfiguration) configureMethod.invoke(usbConfiguration, (Object) new Parcelable[] {usbInterface}); } - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M) static Parcelable[] configureUsbDevice() throws ClassNotFoundException, NoSuchMethodException, @@ -207,7 +207,7 @@ static UsbDevice callUsbDeviceConstructor( serialNumber); } - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M) static UsbDevice callUsbDeviceConstructor( @NonNull String name, int vendorId, @@ -271,7 +271,7 @@ static UsbInterface callUsbInterfaceConstructor( return constructor.newInstance(id, alternateSetting, name, usbClass, subClass, protocol); } - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) + @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M) static UsbInterface callUsbInterfaceConstructor( int id, int usbClass, int subClass, int protocol, @Nullable Parcelable[] endpoints) throws ClassNotFoundException, diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt b/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt index 307828c771..5d2677ae11 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt @@ -24,7 +24,7 @@ import android.Manifest import android.content.Context import android.os.Build import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.storage.StorageManager import androidx.annotation.NonNull @@ -54,7 +54,7 @@ import org.robolectric.shadows.ShadowStorageManager */ @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [O, P, VERSION_CODES.R], shadows = [ ShadowMultiDex::class, ShadowStorageManager::class, diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt b/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt index 55a7909931..d0000e59fc 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt @@ -2,7 +2,7 @@ package com.amaze.filemanager.ui.activities import android.content.Intent import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowMultiDex @@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit */ @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], shadows = [ShadowMultiDex::class, ShadowStorageManager::class], ) class DatabaseViewerActivityTest { diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/MainActivityAuthTriggerTest.kt b/app/src/test/java/com/amaze/filemanager/ui/activities/MainActivityAuthTriggerTest.kt new file mode 100644 index 0000000000..4c2c84fe60 --- /dev/null +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/MainActivityAuthTriggerTest.kt @@ -0,0 +1,423 @@ +/* + * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.amaze.filemanager.ui.activities + +import androidx.lifecycle.Lifecycle +import androidx.test.core.app.ActivityScenario +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import com.amaze.filemanager.utils.omh.AuthTrigger +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertTrue +import org.junit.Test +import org.robolectric.shadows.ShadowLooper +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicReference + +/** + * Unit tests for MainActivity's AuthTrigger implementation and AuthCallback behavior. + */ +class MainActivityAuthTriggerTest : AbstractMainActivityTestBase() { + /** + * Test that MainActivity implements AuthTrigger interface. + */ + @Test + fun testMainActivityImplementsAuthTrigger() { + val scenario = ActivityScenario.launch(MainActivity::class.java) + ShadowLooper.idleMainLooper() + scenario.moveToState(Lifecycle.State.STARTED) + + scenario.onActivity { activity -> + assertTrue("MainActivity should implement AuthTrigger", activity is AuthTrigger) + } + + scenario.moveToState(Lifecycle.State.DESTROYED) + scenario.close() + } + + /** + * Test AuthCallback interface contract - success case. + */ + @Test + fun testAuthCallbackSuccess() { + val successCalled = AtomicBoolean(false) + val failureCalled = AtomicBoolean(false) + + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() { + successCalled.set(true) + } + + override fun onAuthFailure(errorMessage: String?) { + failureCalled.set(true) + } + } + + callback.onAuthSuccess() + + assertTrue("onAuthSuccess should be called", successCalled.get()) + assertFalse("onAuthFailure should not be called", failureCalled.get()) + } + + /** + * Test AuthCallback interface contract - failure case. + */ + @Test + fun testAuthCallbackFailure() { + val successCalled = AtomicBoolean(false) + val failureCalled = AtomicBoolean(false) + val errorReceived = AtomicReference() + + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() { + successCalled.set(true) + } + + override fun onAuthFailure(errorMessage: String?) { + failureCalled.set(true) + errorReceived.set(errorMessage) + } + } + + callback.onAuthFailure("Test error message") + + assertFalse("onAuthSuccess should not be called", successCalled.get()) + assertTrue("onAuthFailure should be called", failureCalled.get()) + assertEquals("Test error message", errorReceived.get()) + } + + /** + * Test AuthCallback with null error message. + */ + @Test + fun testAuthCallbackFailureNullMessage() { + val errorReceived = AtomicReference("not-null") + + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() = Unit + + override fun onAuthFailure(errorMessage: String?) { + errorReceived.set(errorMessage) + } + } + + callback.onAuthFailure(null) + + assertEquals(null, errorReceived.get()) + } + + /** + * Test that OpenMode values used for cloud services are valid. + */ + @Test + fun testCloudOpenModeValues() { + // Verify cloud-related OpenMode values exist + assertNotNull(OpenMode.DROPBOX) + assertNotNull(OpenMode.GDRIVE) + assertNotNull(OpenMode.ONEDRIVE) + assertNotNull(OpenMode.BOX) + + // Verify they are distinct + val modes = setOf(OpenMode.DROPBOX, OpenMode.GDRIVE, OpenMode.ONEDRIVE, OpenMode.BOX) + assertEquals(4, modes.size) + } + + /** + * Test CountDownLatch behavior used in triggerAuthBlocking. + * This validates the threading mechanism used for blocking auth. + */ + @Test + fun testCountDownLatchMechanism() { + val latch = CountDownLatch(1) + val result = AtomicBoolean(false) + + // Simulate async operation completing + Thread { + Thread.sleep(50) + result.set(true) + latch.countDown() + }.start() + + val completed = latch.await(5, TimeUnit.SECONDS) + + assertTrue("Latch should complete", completed) + assertTrue("Result should be set", result.get()) + } + + /** + * Test CountDownLatch timeout behavior. + */ + @Test + fun testCountDownLatchTimeout() { + val latch = CountDownLatch(1) + val result = AtomicBoolean(false) + + // Don't countdown, simulating auth never completing + val completed = latch.await(100, TimeUnit.MILLISECONDS) + + assertFalse("Latch should timeout", completed) + assertFalse("Result should not be set", result.get()) + } + + /** + * Test that multiple AuthCallback calls are handled. + */ + @Test + fun testMultipleAuthCallbackCalls() { + val callCount = AtomicInteger(0) + + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() { + callCount.incrementAndGet() + } + + override fun onAuthFailure(errorMessage: String?) { + callCount.incrementAndGet() + } + } + + callback.onAuthSuccess() + callback.onAuthSuccess() + callback.onAuthFailure("error") + + assertEquals(3, callCount.get()) + } + + /** + * Test concurrent AuthCallback access pattern. + * Simulates multiple threads trying to call callbacks. + */ + @Test + fun testConcurrentAuthCallbackAccess() { + val callCount = AtomicInteger(0) + val latch = CountDownLatch(10) + + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() { + callCount.incrementAndGet() + latch.countDown() + } + + override fun onAuthFailure(errorMessage: String?) { + callCount.incrementAndGet() + latch.countDown() + } + } + + // Launch multiple threads calling the callback + repeat(10) { index -> + Thread { + if (index % 2 == 0) { + callback.onAuthSuccess() + } else { + callback.onAuthFailure("error-$index") + } + }.start() + } + + val completed = latch.await(5, TimeUnit.SECONDS) + + assertTrue("All callbacks should complete", completed) + assertEquals(10, callCount.get()) + } + + /** + * Test the blocking pattern used in triggerAuthBlocking without actual Activity. + * This validates the core synchronization logic. + */ + @Test + fun testBlockingAuthPattern() { + val latch = CountDownLatch(1) + val result = AtomicBoolean(false) + val callbackExecuted = AtomicBoolean(false) + + // Simulate the pattern used in triggerAuthBlocking + val simulateUiThread = + Thread { + // This represents runOnUiThread content + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() { + result.set(true) + latch.countDown() + } + + override fun onAuthFailure(errorMessage: String?) { + result.set(false) + latch.countDown() + } + } + + // Simulate auth completing after some delay + Thread.sleep(50) + callbackExecuted.set(true) + callback.onAuthSuccess() + } + simulateUiThread.start() + + // This represents the blocking wait + val completed = latch.await(5, TimeUnit.SECONDS) + + assertTrue("Should complete", completed) + assertTrue("Callback should have executed", callbackExecuted.get()) + assertTrue("Result should be true (success)", result.get()) + } + + /** + * Test the blocking pattern with failure. + */ + @Test + fun testBlockingAuthPatternFailure() { + val latch = CountDownLatch(1) + val result = AtomicBoolean(true) // Start with true to verify it changes + + val simulateUiThread = + Thread { + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() { + result.set(true) + latch.countDown() + } + + override fun onAuthFailure(errorMessage: String?) { + result.set(false) + latch.countDown() + } + } + + Thread.sleep(50) + callback.onAuthFailure("Auth denied") + } + simulateUiThread.start() + + val completed = latch.await(5, TimeUnit.SECONDS) + + assertTrue("Should complete", completed) + assertFalse("Result should be false (failure)", result.get()) + } + + /** + * Test interruption handling in blocking auth. + */ + @Test + fun testBlockingAuthInterruption() { + val latch = CountDownLatch(1) + val wasInterrupted = AtomicBoolean(false) + + val blockingThread = + Thread { + try { + latch.await(10, TimeUnit.SECONDS) + } catch (e: InterruptedException) { + wasInterrupted.set(true) + Thread.currentThread().interrupt() + } + } + blockingThread.start() + + // Give it a moment to start waiting + Thread.sleep(50) + + // Interrupt the thread + blockingThread.interrupt() + blockingThread.join(1000) + + assertTrue("Thread should have been interrupted", wasInterrupted.get()) + } + + /** + * Test that result is correctly returned based on callback. + */ + @Test + fun testBlockingAuthResultMapping() { + // Test success -> true + assertEquals(true, simulateBlockingAuth { it.onAuthSuccess() }) + + // Test failure -> false + assertEquals(false, simulateBlockingAuth { it.onAuthFailure("error") }) + } + + /** + * Helper to simulate the blocking auth pattern. + */ + private fun simulateBlockingAuth(authAction: (MainActivity.AuthCallback) -> Unit): Boolean { + val latch = CountDownLatch(1) + val result = AtomicBoolean(false) + + Thread { + val callback = + object : MainActivity.AuthCallback { + override fun onAuthSuccess() { + result.set(true) + latch.countDown() + } + + override fun onAuthFailure(errorMessage: String?) { + result.set(false) + latch.countDown() + } + } + authAction(callback) + }.start() + + latch.await(5, TimeUnit.SECONDS) + return result.get() + } + + /** + * Test OpenMode enum ordinal values for cloud services. + * This ensures serialization consistency. + */ + @Test + fun testOpenModeOrdinalStability() { + // These ordinal values are used in Intent extras + // Changes would break serialization + val dropboxOrdinal = OpenMode.DROPBOX.ordinal + val gdriveOrdinal = OpenMode.GDRIVE.ordinal + val onedriveOrdinal = OpenMode.ONEDRIVE.ordinal + val boxOrdinal = OpenMode.BOX.ordinal + + // Verify ordinals are distinct + val ordinals = setOf(dropboxOrdinal, gdriveOrdinal, onedriveOrdinal, boxOrdinal) + assertEquals("All cloud mode ordinals should be distinct", 4, ordinals.size) + } + + /** + * Test that all cloud OpenModes can be converted to/from ordinal. + */ + @Test + fun testOpenModeOrdinalRoundTrip() { + for (mode in listOf(OpenMode.DROPBOX, OpenMode.GDRIVE, OpenMode.ONEDRIVE, OpenMode.BOX)) { + val ordinal = mode.ordinal + val restored = OpenMode.values()[ordinal] + assertEquals("Round-trip should preserve OpenMode", mode, restored) + } + } +} diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt b/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt index c4f178d511..068f44d920 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt @@ -24,7 +24,7 @@ import android.app.AppOpsManager import android.content.Context import android.net.Uri import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Build.VERSION_CODES.R import android.os.storage.StorageManager @@ -64,7 +64,7 @@ import org.robolectric.shadows.ShadowStorageManager */ @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], shadows = [ShadowMultiDex::class, ShadowStorageManager::class], ) class PermissionsActivityTest { diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java b/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java index c65a67166c..69e042237f 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.ui.activities; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -58,7 +58,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class TextEditorActivityTest { private final String fileContents = "fsdfsdfs"; diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt index 7c4b684f95..4be6d2437d 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt @@ -23,8 +23,8 @@ package com.amaze.filemanager.ui.dialogs import android.Manifest import android.os.Build import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.N +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.annotation.RequiresApi import androidx.lifecycle.Lifecycle @@ -48,7 +48,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) abstract class AbstractEncryptDialogTests { protected lateinit var scenario: ActivityScenario diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt index da53a03bee..528629a967 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.ui.dialogs import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -42,7 +42,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [O, P, VERSION_CODES.R], ) class ColorPickerDialogTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java b/app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java deleted file mode 100644 index 28ca6edcb3..0000000000 --- a/app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.ui.fragments; - -import static android.os.Build.VERSION_CODES.LOLLIPOP; -import static android.os.Build.VERSION_CODES.P; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.robolectric.Shadows.shadowOf; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; - -import com.amaze.filemanager.database.CloudContract; - -import android.content.pm.PackageInfo; -import android.os.Build; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -@RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) -public class CloudSheetFragmentTest { - - @Test - public void testIsCloudProviderAvailable() { - assertFalse( - CloudSheetFragment.isCloudProviderAvailable(ApplicationProvider.getApplicationContext())); - - PackageInfo pi = new PackageInfo(); - pi.packageName = CloudContract.APP_PACKAGE_NAME; - shadowOf(ApplicationProvider.getApplicationContext().getPackageManager()).installPackage(pi); - - assertTrue( - CloudSheetFragment.isCloudProviderAvailable(ApplicationProvider.getApplicationContext())); - } -} diff --git a/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt b/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt index 277aaccb33..2563525b77 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt @@ -52,8 +52,7 @@ import kotlin.random.Random */ @Config( sdk = [ - Build.VERSION_CODES.LOLLIPOP, - Build.VERSION_CODES.N, + Build.VERSION_CODES.O, Build.VERSION_CODES.P, Build.VERSION_CODES.R, ], diff --git a/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java b/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java index 117e3da274..f90252b826 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.ui.icons; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; @@ -41,7 +41,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class IconsTest { @Before diff --git a/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java b/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java index 78468e5358..00c8f38cbc 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java @@ -22,7 +22,10 @@ import static android.app.NotificationManager.IMPORTANCE_HIGH; import static android.app.NotificationManager.IMPORTANCE_MIN; +import static android.os.Build.VERSION_CODES.JELLY_BEAN; import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.N; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static com.amaze.filemanager.ui.notifications.NotificationConstants.CHANNEL_FTP_ID; import static com.amaze.filemanager.ui.notifications.NotificationConstants.CHANNEL_NORMAL_ID; @@ -54,7 +57,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {O, P, Build.VERSION_CODES.R}) public class NotificationConstantsTest { private Context context; @@ -89,7 +92,7 @@ public void testSetMetadataIllegalType() { } @Test - @Config(sdk = {LOLLIPOP}) // max sdk is N + @Config(maxSdk = N) // test only runs up to Android N public void testNormalNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_NORMAL_ID) @@ -104,7 +107,7 @@ public void testNormalNotification() { if (Build.VERSION.SDK_INT >= LOLLIPOP) { assertEquals(Notification.CATEGORY_SERVICE, result.category); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + if (Build.VERSION.SDK_INT >= JELLY_BEAN) { assertEquals(Notification.PRIORITY_MIN, result.priority); } else { assertEquals(Notification.PRIORITY_DEFAULT, result.priority); @@ -112,7 +115,7 @@ public void testNormalNotification() { } @Test - @Config(sdk = {LOLLIPOP}) // max sdk is N + @Config(maxSdk = N) // test only runs up to Android N public void testFtpNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_FTP_ID) @@ -128,7 +131,7 @@ public void testFtpNotification() { assertEquals(Notification.CATEGORY_SERVICE, result.category); assertEquals(Notification.VISIBILITY_PUBLIC, result.visibility); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + if (Build.VERSION.SDK_INT >= JELLY_BEAN) { assertEquals(Notification.PRIORITY_MAX, result.priority); } else { assertEquals(Notification.PRIORITY_DEFAULT, result.priority); diff --git a/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt b/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt index 7d614b8431..a37f248a79 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.ui.theme import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.PowerManager import androidx.preference.PreferenceManager @@ -41,7 +41,7 @@ import java.util.Calendar @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], shadows = [ShadowMultiDex::class], ) class AppThemeTest { @@ -180,7 +180,7 @@ class AppThemeTest { @Config( shadows = [ShadowPowerManager::class, ShadowMultiDex::class], qualifiers = "notnight", - minSdk = Build.VERSION_CODES.LOLLIPOP, + minSdk = O, ) fun testSimpleAppThemeWithFollowBatterySaverAndBatterySaverOn() { val context = ApplicationProvider.getApplicationContext() @@ -215,7 +215,7 @@ class AppThemeTest { @Config( shadows = [ShadowPowerManager::class, ShadowMultiDex::class], qualifiers = "notnight", - minSdk = Build.VERSION_CODES.LOLLIPOP, + minSdk = O, ) fun testSimpleAppThemeWithFollowBatterySaverAndBatterySaverOff() { val context = ApplicationProvider.getApplicationContext() @@ -233,7 +233,7 @@ class AppThemeTest { @Config( shadows = [ShadowPowerManager::class, ShadowMultiDex::class], qualifiers = "notnight", - minSdk = Build.VERSION_CODES.LOLLIPOP, + minSdk = O, ) fun testMaterialDialogThemeWithFollowBatterySaverAndBatterySaverOn() { val context = ApplicationProvider.getApplicationContext() @@ -268,7 +268,7 @@ class AppThemeTest { @Config( shadows = [ShadowPowerManager::class, ShadowMultiDex::class], qualifiers = "notnight", - minSdk = Build.VERSION_CODES.LOLLIPOP, + minSdk = O, ) fun testMaterialDialogThemeWithFollowBatterySaverAndBatterySaverOff() { val context = ApplicationProvider.getApplicationContext() diff --git a/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java b/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java index 37070cd432..d8a5887a93 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.ui.views; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -44,7 +44,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {O, P, Build.VERSION_CODES.R}) public class WarnableTextInputValidatorTest { private Context context; diff --git a/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt b/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt index 7559fa97d4..e8fd28d982 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.Assert.assertArrayEquals @@ -36,7 +36,7 @@ import kotlin.random.Random * Unit test for [AESCrypt] */ @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(sdk = [O, P, Build.VERSION_CODES.R]) class AESCryptTest { /** * Simple sanity test on [AESCrypt]. diff --git a/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java b/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java index 92b65fdc29..ad492d647a 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java +++ b/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.utils; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -45,7 +45,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {O, P, Build.VERSION_CODES.R}) public class AnimUtilsTest { @Test diff --git a/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt index d7e116593f..b01829a969 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -48,7 +48,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class CryptUtilTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt b/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt index 0e882b12c8..d3ae4e76b4 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.text.SpannedString import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -32,7 +32,7 @@ import org.junit.runner.RunWith import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(sdk = [O, P, Build.VERSION_CODES.R]) class MinMaxInputFilterTest { /** * Test MinMaxInputFilter functioning diff --git a/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt index 5f2a071a64..3751215857 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt @@ -10,7 +10,7 @@ import android.net.wifi.WifiInfo import android.net.wifi.WifiManager import android.os.Build import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import io.mockk.every @@ -33,7 +33,7 @@ import java.util.Collections * Tests for [NetworkUtil]. */ @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, VERSION_CODES.R]) +@Config(sdk = [O, P, VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class NetworkUtilTest { private lateinit var context: Context diff --git a/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt index ccc65a0110..2dc96449ea 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -46,7 +46,7 @@ import org.robolectric.annotation.Config @Suppress("StringLiteralDuplication") @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], shadows = [ShadowPasswordUtil::class, ShadowSmbUtil::class], ) class SmbUtilTest { diff --git a/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java b/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java index 12e9f3cd13..dbf9f09ffa 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java +++ b/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.utils; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertNull; @@ -38,7 +38,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {O, P, Build.VERSION_CODES.R}) public class TinyDBTest { private SharedPreferences prefs; diff --git a/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java b/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java index fa90467fca..eaf422d67b 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java +++ b/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java @@ -20,8 +20,8 @@ package com.amaze.filemanager.utils; -import static android.os.Build.VERSION_CODES.LOLLIPOP; import static android.os.Build.VERSION_CODES.N; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static com.amaze.filemanager.utils.Utils.formatTimer; import static com.amaze.filemanager.utils.Utils.sanitizeInput; @@ -56,7 +56,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {O, P, Build.VERSION_CODES.R}) public class UtilsTest { @Test diff --git a/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt index fd74085121..93b7fff0f8 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowMultiDex @@ -41,7 +41,7 @@ import java.security.cert.X509Certificate @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [O, P, Build.VERSION_CODES.R], ) class X509CertificateUtilTest { private lateinit var cert: X509Certificate diff --git a/app/src/test/java/com/amaze/filemanager/utils/cloud/CloudPluginUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/cloud/CloudPluginUtilTest.kt new file mode 100644 index 0000000000..f1c7791639 --- /dev/null +++ b/app/src/test/java/com/amaze/filemanager/utils/cloud/CloudPluginUtilTest.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.amaze.filemanager.utils.cloud + +import android.content.Context +import android.content.pm.PackageInfo +import android.os.Build.VERSION_CODES +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.amaze.filemanager.database.CloudContract +import com.amaze.filemanager.utils.cloud.CloudPluginUtil.isCloudProviderAvailable +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.Shadows +import org.robolectric.annotation.Config + +/** + * Test class for [CloudPluginUtil]. + */ +@RunWith(AndroidJUnit4::class) +@Config(sdk = [VERSION_CODES.O, VERSION_CODES.P, VERSION_CODES.R]) +class CloudPluginUtilTest { + /** + * Test for [isCloudProviderAvailable] for app not installed and installed. + */ + @Test + fun testIsCloudProviderAvailable() { + assertFalse( + isCloudProviderAvailable(ApplicationProvider.getApplicationContext()), + ) + + val pi = PackageInfo() + pi.packageName = CloudContract.APP_PACKAGE_NAME + Shadows.shadowOf(ApplicationProvider.getApplicationContext().packageManager) + .installPackage(pi) + + assertTrue( + isCloudProviderAvailable(ApplicationProvider.getApplicationContext()), + ) + } +} diff --git a/app/src/test/java/com/amaze/filemanager/utils/omh/OmhAuthClientExtTest.kt b/app/src/test/java/com/amaze/filemanager/utils/omh/OmhAuthClientExtTest.kt new file mode 100644 index 0000000000..2f828bd5fe --- /dev/null +++ b/app/src/test/java/com/amaze/filemanager/utils/omh/OmhAuthClientExtTest.kt @@ -0,0 +1,1293 @@ +/* + * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.amaze.filemanager.utils.omh + +import com.amaze.filemanager.fileoperations.exceptions.CloudPluginException +import com.amaze.filemanager.fileoperations.filesystem.OpenMode +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.withContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Assert.fail +import org.junit.Test +import java.net.ProtocolException +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicInteger + +/** + * Unit tests for [retryOnUnauthorized] function. + */ +@OptIn(ExperimentalCoroutinesApi::class) +@Suppress( + "StringLiteralDuplication", + "ComplexMethod", + "LongMethod", + "LargeClass", + "TooGenericExceptionCaught", + "TooGenericExceptionThrown", +) +class OmhAuthClientExtTest { + private val testOpenMode = OpenMode.DROPBOX + + /** + * Test that action succeeds on first try without any retries. + */ + @Test + fun testSuccessOnFirstTry() = + runTest { + val actionCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { fail("refreshAction should not be called") }, + action = { + actionCallCount.incrementAndGet() + "success" + }, + ) + + assertEquals("success", result) + assertEquals(1, actionCallCount.get()) + } + + /** + * Test that action is retried when CloudPluginException with ProtocolException cause is thrown. + */ + @Test + fun testRetryOnProtocolException() = + runTest { + val actionCallCount = AtomicInteger(0) + val refreshCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 3, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { refreshCallCount.incrementAndGet() }, + action = { + val count = actionCallCount.incrementAndGet() + if (count < 3) { + throw createProtocolException() + } + "success after retry" + }, + ) + + assertEquals("success after retry", result) + assertEquals(3, actionCallCount.get()) + assertEquals(2, refreshCallCount.get()) // Refresh called on first 2 failures + } + + /** + * Test that auth trigger is called when max retries are exhausted with ProtocolException. + */ + @Test + fun testAuthTriggerCalledOnMaxRetries() = + runTest { + val actionCallCount = AtomicInteger(0) + val refreshCallCount = AtomicInteger(0) + val authTriggerCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authTriggerCallCount.incrementAndGet() + assertEquals(testOpenMode, openMode) + return true + } + }, + refreshAction = { refreshCallCount.incrementAndGet() }, + action = { + val count = actionCallCount.incrementAndGet() + if (count <= 2) { + throw createProtocolException() + } + "success after auth" + }, + ) + + assertEquals("success after auth", result) + assertEquals(3, actionCallCount.get()) // 2 initial attempts + 1 after auth + assertEquals(1, refreshCallCount.get()) // Refresh called once before maxRetries + assertEquals(1, authTriggerCallCount.get()) // Auth triggered once at maxRetries + } + + /** + * Test that exception is thrown when auth trigger fails. + */ + @Test + fun testExceptionThrownWhenAuthTriggerFails() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(shouldSucceed = false), + refreshAction = { /* do nothing */ }, + action = { + actionCallCount.incrementAndGet() + throw createProtocolException() + }, + ) + fail("Expected CloudPluginException to be thrown") + } catch (e: CloudPluginException) { + // Expected + assertTrue(e.cause is ProtocolException) + } + + assertEquals(2, actionCallCount.get()) + } + + /** + * Test that non-ProtocolException CloudPluginException triggers retry with backoff. + */ + @Test + fun testRetryWithBackoffOnNetworkError() = + runTest { + val actionCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 3, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { fail("refreshAction should not be called for network error") }, + action = { + val count = actionCallCount.incrementAndGet() + if (count < 3) { + // CloudPluginException without ProtocolException cause + throw CloudPluginException(RuntimeException("Network error")) + } + "success" + }, + ) + + assertEquals("success", result) + assertEquals(3, actionCallCount.get()) + } + + /** + * Test that non-ProtocolException CloudPluginException is thrown after max retries. + */ + @Test + fun testNetworkErrorThrownAfterMaxRetries() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { fail("refreshAction should not be called for network error") }, + action = { + actionCallCount.incrementAndGet() + throw CloudPluginException(RuntimeException("Network error")) + }, + ) + fail("Expected CloudPluginException to be thrown") + } catch (e: CloudPluginException) { + // Expected + assertTrue(e.cause is RuntimeException) + assertEquals("Network error", e.cause?.message) + } + + assertEquals(2, actionCallCount.get()) + } + + /** + * Test that CancellationException is propagated immediately without retry. + */ + @Test + fun testCancellationExceptionPropagated() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 3, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { fail("refreshAction should not be called") }, + action = { + actionCallCount.incrementAndGet() + throw CancellationException("Cancelled") + }, + ) + fail("Expected CancellationException to be thrown") + } catch (e: CancellationException) { + // Expected + assertEquals("Cancelled", e.message) + } + + assertEquals(1, actionCallCount.get()) + } + + /** + * Test that unexpected exceptions are propagated immediately. + */ + @Test + fun testUnexpectedExceptionPropagated() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 3, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { fail("refreshAction should not be called") }, + action = { + actionCallCount.incrementAndGet() + throw IllegalStateException("Unexpected error") + }, + ) + fail("Expected IllegalStateException to be thrown") + } catch (e: IllegalStateException) { + // Expected + assertEquals("Unexpected error", e.message) + } + + assertEquals(1, actionCallCount.get()) + } + + /** + * Test that refresh action exception is propagated. + */ + @Test + fun testRefreshActionExceptionPropagated() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { throw RuntimeException("Refresh failed") }, + action = { + actionCallCount.incrementAndGet() + throw createProtocolException() + }, + ) + fail("Expected exception from refresh action") + } catch (e: Exception) { + // The exception from CompletableFuture.get() wraps the original exception + assertTrue( + e.message?.contains("Refresh failed") == true || + e.cause?.message?.contains("Refresh failed") == true, + ) + } + + assertEquals(1, actionCallCount.get()) + } + + /** + * Test with maxRetries = 1, should trigger auth on first failure with ProtocolException. + */ + @Test + fun testSingleRetryTriggersAuth() = + runTest { + val actionCallCount = AtomicInteger(0) + val authTriggerCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authTriggerCallCount.incrementAndGet() + return true + } + }, + refreshAction = { fail("refreshAction should not be called with maxRetries=1") }, + action = { + val count = actionCallCount.incrementAndGet() + if (count == 1) { + throw createProtocolException() + } + "success" + }, + ) + + assertEquals("success", result) + assertEquals(2, actionCallCount.get()) + assertEquals(1, authTriggerCallCount.get()) + } + + /** + * Test calling retryOnUnauthorized from runBlocking context (simulating Java interop). + * This simulates the actual usage in CloudUtil.getCloudFilesBlocking. + */ + @Test + fun testFromRunBlockingContext() { + val actionCallCount = AtomicInteger(0) + val authTriggerCallCount = AtomicInteger(0) + + val result = + runBlocking(Dispatchers.IO.limitedParallelism(1)) { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authTriggerCallCount.incrementAndGet() + return true + } + }, + refreshAction = { /* do nothing */ }, + action = { + val count = actionCallCount.incrementAndGet() + if (count <= 2) { + throw createProtocolException() + } + "success after auth" + }, + ) + } + + assertEquals("success after auth", result) + assertEquals(3, actionCallCount.get()) + assertEquals(1, authTriggerCallCount.get()) + } + + /** + * Test concurrent calls to retryOnUnauthorized. + * This tests thread-safety of the retry mechanism. + */ + @Test + fun testConcurrentCalls() = + runTest { + val totalCalls = 5 + val successCount = AtomicInteger(0) + + val results = + (1..totalCalls).map { callIndex -> + async(Dispatchers.IO) { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(shouldSucceed = true), + refreshAction = { /* do nothing */ }, + action = { + successCount.incrementAndGet() + "result-$callIndex" + }, + ) + } + }.awaitAll() + + assertEquals(totalCalls, results.size) + assertEquals(totalCalls, successCount.get()) + } + + /** + * Test that auth trigger blocks correctly and completes. + * Simulates a slow auth process. + */ + @Test + fun testAuthTriggerBlocksAndCompletes() = + runTest { + val authStarted = CountDownLatch(1) + val authCompleted = CountDownLatch(1) + val actionCallCount = AtomicInteger(0) + + val result = + withContext(Dispatchers.IO) { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authStarted.countDown() + // Simulate slow auth (100ms) + Thread.sleep(100) + authCompleted.countDown() + return true + } + }, + refreshAction = { fail("Should not refresh with maxRetries=1") }, + action = { + val count = actionCallCount.incrementAndGet() + if (count == 1) { + throw createProtocolException() + } + "success" + }, + ) + } + + assertTrue("Auth should have started", authStarted.await(5, TimeUnit.SECONDS)) + assertTrue("Auth should have completed", authCompleted.await(5, TimeUnit.SECONDS)) + assertEquals("success", result) + assertEquals(2, actionCallCount.get()) + } + + /** + * Test nested ProtocolException causes are detected correctly. + */ + @Test + fun testNestedProtocolExceptionDetection() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 1, + trigger = createMockAuthTrigger(shouldSucceed = false), + refreshAction = { fail("Should not be called") }, + action = { + actionCallCount.incrementAndGet() + // Nested ProtocolException: RuntimeException -> ProtocolException + val protocolEx = ProtocolException("401 Unauthorized") + val wrapperEx = RuntimeException("Wrapper", protocolEx) + throw CloudPluginException(wrapperEx) + }, + ) + fail("Expected exception") + } catch (e: CloudPluginException) { + // Expected - should detect nested ProtocolException and trigger auth + } + + assertEquals(1, actionCallCount.get()) + } + + // ========== Additional Tests for Different OpenMode Types ========== + + /** + * Test with OpenMode.GDRIVE + */ + @Test + fun testWithGDriveOpenMode() = + runTest { + val openModeUsed = AtomicInteger(-1) + + val result = + retryOnUnauthorized( + openMode = OpenMode.GDRIVE, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + openModeUsed.set(openMode.ordinal) + return true + } + }, + refreshAction = { }, + action = { + if (openModeUsed.get() == -1) { + throw createProtocolException() + } + "gdrive-success" + }, + ) + + assertEquals("gdrive-success", result) + assertEquals(OpenMode.GDRIVE.ordinal, openModeUsed.get()) + } + + /** + * Test with OpenMode.ONEDRIVE + */ + @Test + fun testWithOneDriveOpenMode() = + runTest { + val openModeUsed = AtomicInteger(-1) + + val result = + retryOnUnauthorized( + openMode = OpenMode.ONEDRIVE, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + openModeUsed.set(openMode.ordinal) + return true + } + }, + refreshAction = { }, + action = { + if (openModeUsed.get() == -1) { + throw createProtocolException() + } + "onedrive-success" + }, + ) + + assertEquals("onedrive-success", result) + assertEquals(OpenMode.ONEDRIVE.ordinal, openModeUsed.get()) + } + + /** + * Test with OpenMode.BOX + */ + @Test + fun testWithBoxOpenMode() = + runTest { + val openModeUsed = AtomicInteger(-1) + + val result = + retryOnUnauthorized( + openMode = OpenMode.BOX, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + openModeUsed.set(openMode.ordinal) + return true + } + }, + refreshAction = { }, + action = { + if (openModeUsed.get() == -1) { + throw createProtocolException() + } + "box-success" + }, + ) + + assertEquals("box-success", result) + assertEquals(OpenMode.BOX.ordinal, openModeUsed.get()) + } + + // ========== Tests for Auth Trigger Exception Scenarios ========== + + /** + * Test when auth trigger throws an exception. + */ + @Test + fun testAuthTriggerThrowsException() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + throw RuntimeException("Auth system error") + } + }, + refreshAction = { }, + action = { + actionCallCount.incrementAndGet() + throw createProtocolException() + }, + ) + fail("Expected CloudPluginException") + } catch (e: CloudPluginException) { + // Auth trigger exception is caught, authSuccess becomes false, original exception thrown + assertTrue(e.cause is ProtocolException) + } + + assertEquals(1, actionCallCount.get()) + } + + /** + * Test when auth trigger throws RuntimeException after successful refresh attempts. + */ + @Test + fun testAuthTriggerExceptionAfterRefreshAttempts() = + runTest { + val actionCallCount = AtomicInteger(0) + val refreshCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 3, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + throw IllegalStateException("Auth unavailable") + } + }, + refreshAction = { refreshCallCount.incrementAndGet() }, + action = { + actionCallCount.incrementAndGet() + throw createProtocolException() + }, + ) + fail("Expected CloudPluginException") + } catch (e: CloudPluginException) { + assertTrue(e.cause is ProtocolException) + } + + assertEquals(3, actionCallCount.get()) + assertEquals(2, refreshCallCount.get()) // Called for attempts 1 and 2 + } + + // ========== Tests for Multiple Failures and Recovery ========== + + /** + * Test multiple protocol exceptions followed by success on final action after auth. + */ + @Test + fun testMultipleFailuresThenSuccessAfterAuth() = + runTest { + val actionCallCount = AtomicInteger(0) + val refreshCallCount = AtomicInteger(0) + val authCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 5, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authCallCount.incrementAndGet() + return true + } + }, + refreshAction = { refreshCallCount.incrementAndGet() }, + action = { + val count = actionCallCount.incrementAndGet() + if (count <= 5) { + throw createProtocolException() + } + "finally success" + }, + ) + + assertEquals("finally success", result) + assertEquals(6, actionCallCount.get()) // 5 failures + 1 success after auth + assertEquals(4, refreshCallCount.get()) // Refresh for attempts 1-4 + assertEquals(1, authCallCount.get()) // Auth triggered at attempt 5 + } + + /** + * Test that refresh is called correct number of times before auth trigger. + */ + @Test + fun testRefreshCalledCorrectTimes() = + runTest { + val refreshCallCount = AtomicInteger(0) + val authCallCount = AtomicInteger(0) + val actionCallCount = AtomicInteger(0) + + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 4, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authCallCount.incrementAndGet() + return true + } + }, + refreshAction = { refreshCallCount.incrementAndGet() }, + action = { + val count = actionCallCount.incrementAndGet() + if (count <= 4) { + throw createProtocolException() + } + "done" + }, + ) + + assertEquals(5, actionCallCount.get()) + assertEquals(3, refreshCallCount.get()) // Refresh for attempts 1, 2, 3 (not 4, which triggers auth) + assertEquals(1, authCallCount.get()) + } + + // ========== Tests for Deeply Nested Exception Chains ========== + + /** + * Test detection of ProtocolException deeply nested in exception chain. + */ + @Test + fun testDeeplyNestedProtocolException() = + runTest { + val authTriggerCalled = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authTriggerCalled.incrementAndGet() + return true + } + }, + refreshAction = { }, + action = { + if (authTriggerCalled.get() == 0) { + // Create deeply nested exception: CloudPluginException -> RuntimeException -> IOException -> ProtocolException + val protocolEx = ProtocolException("401") + val ioEx = java.io.IOException("IO error", protocolEx) + val runtimeEx = RuntimeException("Runtime wrapper", ioEx) + throw CloudPluginException(runtimeEx) + } + "success" + }, + ) + + assertEquals("success", result) + assertEquals(1, authTriggerCalled.get()) + } + + /** + * Test that non-ProtocolException nested chain does not trigger auth. + */ + @Test + fun testDeeplyNestedNonProtocolException() = + runTest { + val authTriggerCalled = AtomicInteger(0) + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authTriggerCalled.incrementAndGet() + return true + } + }, + refreshAction = { fail("Should not refresh for non-protocol exception") }, + action = { + actionCallCount.incrementAndGet() + // Deeply nested but no ProtocolException + val innerEx = IllegalArgumentException("Invalid arg") + val ioEx = java.io.IOException("IO error", innerEx) + val runtimeEx = RuntimeException("Runtime wrapper", ioEx) + throw CloudPluginException(runtimeEx) + }, + ) + fail("Expected exception") + } catch (e: CloudPluginException) { + // Expected - network error path, no auth trigger + } + + assertEquals(2, actionCallCount.get()) + assertEquals(0, authTriggerCalled.get()) // Auth should NOT be called + } + + // ========== Tests for Different Return Types ========== + + /** + * Test returning Int type. + */ + @Test + fun testReturnTypeInt() = + runTest { + val result: Int = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { 42 }, + ) + + assertEquals(42, result) + } + + /** + * Test returning List type. + */ + @Test + fun testReturnTypeList() = + runTest { + val result: List = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { listOf("a", "b", "c") }, + ) + + assertEquals(listOf("a", "b", "c"), result) + } + + /** + * Test returning nullable type with null value. + */ + @Test + fun testReturnTypeNullable() = + runTest { + val result: String? = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { null }, + ) + + assertEquals(null, result) + } + + /** + * Test returning Unit type. + */ + @Test + fun testReturnTypeUnit() = + runTest { + var sideEffect = false + + val result: Unit = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { + sideEffect = true + }, + ) + + assertEquals(Unit, result) + assertTrue(sideEffect) + } + + /** + * Test returning data class. + */ + @Test + fun testReturnTypeDataClass() = + runTest { + data class TestData(val id: Int, val name: String) + + val result: TestData = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { TestData(1, "test") }, + ) + + assertEquals(TestData(1, "test"), result) + } + + // ========== Tests for Sequential Calls ========== + + /** + * Test sequential calls where first fails and second succeeds. + */ + @Test + fun testSequentialCalls() = + runTest { + val globalCallCount = AtomicInteger(0) + + // First call - fails on first attempt, succeeds after retry + val result1 = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { + val count = globalCallCount.incrementAndGet() + if (count == 1) { + throw createProtocolException() + } + "result1" + }, + ) + + // Second call - immediate success + val result2 = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { + globalCallCount.incrementAndGet() + "result2" + }, + ) + + assertEquals("result1", result1) + assertEquals("result2", result2) + assertEquals(3, globalCallCount.get()) // 2 for first call, 1 for second + } + + /** + * Test sequential calls with different open modes. + */ + @Test + fun testSequentialCallsDifferentModes() = + runTest { + val modesUsed = mutableListOf() + + for (mode in listOf(OpenMode.DROPBOX, OpenMode.GDRIVE, OpenMode.ONEDRIVE)) { + retryOnUnauthorized( + openMode = mode, + maxRetries = 1, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + modesUsed.add(openMode) + return true + } + }, + refreshAction = { }, + action = { + if (modesUsed.lastOrNull() != mode) { + throw createProtocolException() + } + "success-$mode" + }, + ) + } + + assertEquals(listOf(OpenMode.DROPBOX, OpenMode.GDRIVE, OpenMode.ONEDRIVE), modesUsed) + } + + // ========== Tests for Mixed Exception Types ========== + + /** + * Test mixed exception sequence: network error then protocol error. + */ + @Test + fun testMixedExceptionSequence() = + runTest { + val actionCallCount = AtomicInteger(0) + val refreshCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 4, + trigger = createMockAuthTrigger(true), + refreshAction = { refreshCallCount.incrementAndGet() }, + action = { + val count = actionCallCount.incrementAndGet() + when (count) { + 1 -> throw CloudPluginException(RuntimeException("Network error")) // Network error + 2 -> throw createProtocolException() // Protocol error - triggers refresh + 3 -> throw CloudPluginException(java.io.IOException("Timeout")) // Network error + 4 -> throw createProtocolException() // Protocol error at maxRetries - triggers auth + else -> "success" + } + }, + ) + + assertEquals("success", result) + assertEquals(5, actionCallCount.get()) + // Refresh called for attempt 2 (protocol exception before max retries) + assertEquals(1, refreshCallCount.get()) + } + + // ========== Tests for Action Success After Failures ========== + + /** + * Test that action succeeds immediately after token refresh (not at maxRetries). + */ + @Test + fun testSuccessAfterRefresh() = + runTest { + val actionCallCount = AtomicInteger(0) + val refreshCallCount = AtomicInteger(0) + val authCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 5, + trigger = + object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + authCallCount.incrementAndGet() + return true + } + }, + refreshAction = { refreshCallCount.incrementAndGet() }, + action = { + val count = actionCallCount.incrementAndGet() + // Fail on first attempt, succeed on second (after refresh) + if (count == 1) { + throw createProtocolException() + } + "success after refresh" + }, + ) + + assertEquals("success after refresh", result) + assertEquals(2, actionCallCount.get()) + assertEquals(1, refreshCallCount.get()) + assertEquals(0, authCallCount.get()) // Auth never called since we succeeded before maxRetries + } + + // ========== Tests for Concurrent Failures ========== + + /** + * Test concurrent calls all experiencing failures then success. + */ + @Test + fun testConcurrentCallsWithFailures() = + runTest { + val totalCalls = 3 + val successCount = AtomicInteger(0) + val callAttempts = (1..totalCalls).map { AtomicInteger(0) } + + val results = + (0 until totalCalls).map { index -> + async(Dispatchers.IO) { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { + val attempt = callAttempts[index].incrementAndGet() + if (attempt == 1) { + throw createProtocolException() + } + successCount.incrementAndGet() + "result-$index" + }, + ) + } + }.awaitAll() + + assertEquals(totalCalls, results.size) + assertEquals(totalCalls, successCount.get()) + callAttempts.forEach { assertEquals(2, it.get()) } + } + + // ========== Tests for runBlocking Scenarios ========== + + /** + * Test nested runBlocking calls (simulating complex Java interop). + */ + @Test + fun testNestedRunBlocking() { + val outerResult = + runBlocking { + val innerResult = + withContext(Dispatchers.IO) { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { "inner" }, + ) + } + "outer-$innerResult" + } + + assertEquals("outer-inner", outerResult) + } + + /** + * Test from different dispatcher contexts. + */ + @Test + fun testDifferentDispatcherContexts() = + runTest { + // Default dispatcher + val result1 = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { "default" }, + ) + + // IO dispatcher + val result2 = + withContext(Dispatchers.IO) { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { "io" }, + ) + } + + // Limited parallelism + val result3 = + withContext(Dispatchers.IO.limitedParallelism(1)) { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { "limited" }, + ) + } + + assertEquals("default", result1) + assertEquals("io", result2) + assertEquals("limited", result3) + } + + // ========== Tests for Edge Cases ========== + + /** + * Test with very high maxRetries value. + */ + @Test + fun testHighMaxRetries() = + runTest { + val actionCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 100, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { + val count = actionCallCount.incrementAndGet() + if (count < 50) { + throw createProtocolException() + } + "success at 50" + }, + ) + + assertEquals("success at 50", result) + assertEquals(50, actionCallCount.get()) + } + + /** + * Test action that returns after some computation. + */ + @Test + fun testActionWithComputation() = + runTest { + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { + // Simulate some computation + var sum = 0 + for (i in 1..100) { + sum += i + } + sum + }, + ) + + assertEquals(5050, result) // Sum of 1 to 100 + } + + /** + * Test action that suspends. + */ + @Test + fun testActionWithSuspension() = + runTest { + val actionCallCount = AtomicInteger(0) + + val result = + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 2, + trigger = createMockAuthTrigger(true), + refreshAction = { }, + action = { + actionCallCount.incrementAndGet() + kotlinx.coroutines.delay(10) // Suspend + "suspended result" + }, + ) + + assertEquals("suspended result", result) + assertEquals(1, actionCallCount.get()) + } + + /** + * Test rapid sequential retries with exponential backoff. + * Note: runTest uses virtual time, so we just verify the action count. + */ + @Test + fun testNetworkErrorRetriesWithBackoff() = + runTest { + val actionCallCount = AtomicInteger(0) + + try { + retryOnUnauthorized( + openMode = testOpenMode, + maxRetries = 3, + trigger = createMockAuthTrigger(true), + refreshAction = { fail("Should not refresh for network error") }, + action = { + actionCallCount.incrementAndGet() + throw CloudPluginException(RuntimeException("Quick failure")) + }, + ) + fail("Expected exception") + } catch (e: CloudPluginException) { + // Expected - verify the exception message + assertEquals("Quick failure", e.cause?.message) + } + + assertEquals(3, actionCallCount.get()) + } + + // Helper methods + + // ...existing code... + + private fun createMockAuthTrigger(shouldSucceed: Boolean): AuthTrigger { + return object : AuthTrigger { + override fun triggerAuthBlocking(openMode: OpenMode): Boolean { + return shouldSucceed + } + } + } + + private fun createProtocolException(): CloudPluginException { + val protocolException = ProtocolException("401 Unauthorized") + return CloudPluginException(protocolException) + } +} diff --git a/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt b/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt index d937bc0c06..655694f528 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils.smb import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.utils.NetworkUtil @@ -38,7 +38,7 @@ import java.net.InetAddress * Base class for [SmbDeviceScannerObservable.DiscoverDeviceStrategy] tests. */ @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, VERSION_CODES.R]) +@Config(sdk = [O, P, VERSION_CODES.R]) abstract class AbstractSubnetDiscoverDevicesStrategyTests { /** * Post test cleanup. diff --git a/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt b/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt index e2538e9cf8..02e485249f 100644 --- a/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt +++ b/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt @@ -44,7 +44,7 @@ import java.util.concurrent.CountDownLatch @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P], + sdk = [Build.VERSION_CODES.O, Build.VERSION_CODES.P], ) class MultipartRarExtractorTest { private val callback = diff --git a/app/src/testPlayRelease/java/com/amaze/filemanager/utils/PackageInstallValidationTest.kt b/app/src/testPlayRelease/java/com/amaze/filemanager/utils/PackageInstallValidationTest.kt index cf91812023..2e67f47fc9 100644 --- a/app/src/testPlayRelease/java/com/amaze/filemanager/utils/PackageInstallValidationTest.kt +++ b/app/src/testPlayRelease/java/com/amaze/filemanager/utils/PackageInstallValidationTest.kt @@ -25,6 +25,7 @@ import android.content.Context import android.content.pm.PackageInfo import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.N +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.storage.StorageManager import androidx.lifecycle.Lifecycle @@ -64,7 +65,7 @@ import java.util.concurrent.TimeUnit @SuppressLint("SdCardPath") @RunWith(AndroidJUnit4::class) @Config( - sdk = [P], + sdk = [O, P], shadows = [ShadowPackageManager::class, ShadowMultiDex::class, ShadowTabHandler::class], ) class PackageInstallValidationTest { diff --git a/build.gradle b/build.gradle index 379e3c33b2..0ee4edc882 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ buildscript { plugins { id "com.diffplug.spotless" version "6.25.0" - id "com.google.devtools.ksp" version "1.9.25-1.0.20" apply false + id "com.google.devtools.ksp" version "2.1.20-2.0.1" apply false } allprojects { diff --git a/file_operations/build.gradle b/file_operations/build.gradle index 5400d64458..d8719104ca 100644 --- a/file_operations/build.gradle +++ b/file_operations/build.gradle @@ -122,7 +122,7 @@ dependencies { testImplementation libs.apache.sshd testImplementation libs.awaitility testImplementation libs.jsoup - kspTest libs.auto.service +// kspTest libs.auto.service androidTestImplementation libs.junit //tests the app logic androidTestImplementation libs.androidX.test.expresso diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.kt b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.kt index e95ede156f..6a4b95428a 100644 --- a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.kt +++ b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/CloudPluginException.kt @@ -17,8 +17,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +package com.amaze.filemanager.fileoperations.exceptions -package com.amaze.filemanager.fileoperations.exceptions; +/** Created by vishal on 18/4/17. */ +class CloudPluginException : Exception { + constructor() -/** Created by vishal on 18/4/17. */ -public class CloudPluginException extends Exception {} + constructor(message: String?) : super(message) + + constructor(message: String?, cause: Throwable?) : super(message, cause) + + constructor(cause: Throwable?) : super(cause) +} diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.kt b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.kt index 5b9d77253c..b9f48a8b45 100644 --- a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.kt +++ b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/ShellNotRunningException.kt @@ -17,12 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +package com.amaze.filemanager.fileoperations.exceptions -package com.amaze.filemanager.fileoperations.exceptions; - -/** Created by vishal on 24/12/16. Exception thrown when root is */ -public class ShellNotRunningException extends Exception { - public ShellNotRunningException() { - super("Shell stopped running!"); - } -} +/** Created by vishal on 24/12/16. Exception thrown when root is */ +class ShellNotRunningException : Exception("Shell stopped running!") diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.kt b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.kt index b6cfb7e035..13784b1611 100644 --- a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.kt +++ b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/exceptions/StreamNotFoundException.kt @@ -17,30 +17,24 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - -package com.amaze.filemanager.fileoperations.exceptions; +package com.amaze.filemanager.fileoperations.exceptions /** * Created by vishal on 21/1/17. * - *

Exception thrown when we can't get stream after trying any specific methods + * + * Exception thrown when we can't get stream after trying any specific methods */ -public class StreamNotFoundException extends Exception { - private static final String MESSAGE = "Can't get stream"; +class StreamNotFoundException : Exception { + constructor() : super(MESSAGE) - public StreamNotFoundException() { - super(MESSAGE); - } + constructor(message: String?) : super(message) - public StreamNotFoundException(String message) { - super(message); - } + constructor(message: String?, cause: Throwable?) : super(message, cause) - public StreamNotFoundException(String message, Throwable cause) { - super(message, cause); - } + constructor(cause: Throwable?) : super(MESSAGE, cause) - public StreamNotFoundException(Throwable cause) { - super(MESSAGE, cause); - } + companion object { + private const val MESSAGE = "Can't get stream" + } } diff --git a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java index c6d3bcee74..ca02f90435 100644 --- a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java +++ b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.fileoperations.filesystem.cloud; -import static android.os.Build.VERSION_CODES.KITKAT; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -50,7 +50,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {KITKAT, P}) + sdk = {O, P}) public class CloudStreamSourceTest { private CloudStreamSource cs; private String testFilePath; diff --git a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java index 9415dcf1f6..f34c10c321 100644 --- a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java +++ b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java @@ -20,6 +20,7 @@ package com.amaze.filemanager.fileoperations.filesystem.smbstreamer; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -50,7 +51,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class, ShadowSmbFile.class}, - sdk = {P}) + sdk = {O, P}) public class StreamSourceTest { private SmbFile file; private StreamSource ss; diff --git a/gradle.properties b/gradle.properties index e9994ab628..d1c3d6b7eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,3 +28,4 @@ org.gradle.parallel=true android.disableResourceValidation=true # for macs, omit for other operating systems # org.gradle.java.home=/Applications/Android Studio.app/Contents/jbr/Contents/Home +android.includeDependencyInfoInApks=false \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a8694356c1..349c7ea33b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,9 +2,9 @@ compileSdk = "34" jdk9Deps = "1.0" jdk9DepsVersion = "1.0" -minSdk = "21" +minSdk = "26" targetSdk = "35" -kotlin = "1.9.25" +kotlin = "2.1.20" ndk = "28.2.13676358" #r28c jacocoAndroid = "0.2.1" @@ -32,14 +32,17 @@ androidXPalette = "1.0.0" androidXCardView = "1.0.0" androidXConstraintLayout = "1.1.3" androidXBiometric = "1.1.0" +androidXSecurity = "1.0.0" +androidXBrowserCustomTabs = "1.5.0" androidXTest = "1.6.1" androidXTestRunner = "1.6.2" androidXTestExt = "1.2.1" androidXArchCoreTest = "2.2.0" androidXMultidex = "2.0.1" autoService = "1.1.1" -kotlinxCoroutineTest = "1.7.3" -kotlinStdlibJdk8 = "1.9.20" +kotlinxCoroutines = "1.10.2" +kotlinxCoroutineTest = "1.10.2" +kotlinStdlibJdk8 = "2.1.20" uiAutomator = "2.3.0" junit = "4.13.2" slf4j = "2.0.13" @@ -49,7 +52,6 @@ mockito = "4.11.0" mockitoInline = "4.11.0" mockitoKotlin = "4.1.0" androidBilling = "7.1.1" -cloudrailSiAndroid = "2.22.4" junrar = "7.4.0" vectordrawableAnimated = "1.2.0" xz = "1.9" @@ -75,6 +77,8 @@ mpAndroidChart = "v3.0.2" concurrentTrees = "2.6.1" aboutLibraries = "6.1.1" amazeTrashBin = "1.0.10" +retrofit = "2.9.0" +jackson = "2.15.2" rustAndroidGradle = "0.9.6" [libraries] @@ -100,6 +104,8 @@ androidX-palette = { module = "androidx.palette:palette-ktx", version.ref = "and androidX-preference = { module = "androidx.preference:preference-ktx", version.ref = "androidXPref" } androidX-vectordrawable-animated = { module = "androidx.vectordrawable:vectordrawable-animated", version.ref = "vectordrawableAnimated" } androidX-biometric = { module = "androidx.biometric:biometric", version.ref = "androidXBiometric" } +androidX-security = { module = "androidx.security:security-crypto", version.ref = "androidXSecurity" } +androidX-browser-customtabs = { module = "androidx.browser:browser", version.ref = "androidXBrowserCustomTabs" } androidX-test-core = { module = "androidx.test:core", version.ref = "androidXTest" } androidX-test-runner = { module = "androidx.test:runner", version.ref = "androidXTestRunner" } @@ -120,16 +126,18 @@ apache-ftpserver-core = { module = "org.apache.ftpserver:ftpserver-core", versio google-play-billing = { module = "com.android.billingclient:billing", version.ref = "androidBilling" } -cloudrail-si-android = { module = "com.cloudrail:cloudrail-si-android", version.ref = "cloudrailSiAndroid" } - eventbus = { module = "org.greenrobot:eventbus", version.ref = "eventbus" } concurrent-trees = { module = "com.github.npgall:concurrent-trees", version.ref = "concurrentTrees" } gson = { module = "com.google.code.gson:gson", version.ref = "gson" } jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlinStdlibJdk8" } -kotlin-coroutine-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutineTest" } +kotlin-coroutines-bom = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-bom", version.ref = "kotlinxCoroutines" } +kotlin-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } +kotlin-coroutines-rxjava2 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx2", version.ref = "kotlinxCoroutines" } +kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutineTest" } libsu-core = { module = "com.github.topjohnwu.libsu:core", version.ref = "libsu" } libsu-io = { module = "com.github.topjohnwu.libsu:io", version.ref = "libsu" } @@ -156,6 +164,7 @@ jcifs-ng = { module = "eu.agno3.jcifs:jcifs-ng", version.ref = "jcifs" } speedDial = { module = "com.leinardi.android:speed-dial", version.ref = "fabSpeedDial" } sshj = { module = "com.hierynomus:sshj", version.ref = "sshj" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okHttp" } +okhttp-loggingInterceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okHttp" } junit = { module = "junit:junit", version.ref = "junit" } awaitility = { module = "org.awaitility:awaitility", version.ref = "awaitility" } @@ -182,3 +191,7 @@ acra-core = { module = "ch.acra:acra-core", version.ref = "acraCore" } leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanaryAndroid" } amaze-trashBin = { module = "com.github.TeamAmaze:AmazeTrashBin", version.ref = "amazeTrashBin" } + +retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } +retrofit-jacksonConverter = { module = "com.squareup.retrofit2:converter-jackson", version.ref = "retrofit" } +jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" } \ No newline at end of file diff --git a/testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java b/testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java index c1f8919b50..6122ec648b 100644 --- a/testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java +++ b/testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.test; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.O; import static android.os.Build.VERSION_CODES.P; import static org.awaitility.Awaitility.await; import static org.junit.Assert.assertEquals; @@ -56,7 +56,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class, ShadowPasswordUtil.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {O, P, Build.VERSION_CODES.R}) public class ShadowPasswordUtilTest { @Before

f!Ls5@7D?*MBMH9poF}L4tq` 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 literal 0 HcmV?d00001 diff --git a/app/libs/com.openmobilehub.android.storage.core-2.1.1-alpha+thumbnail.aar b/app/libs/com.openmobilehub.android.storage.core-2.1.1-alpha+thumbnail.aar new file mode 100644 index 0000000000000000000000000000000000000000..c7a7c755982ee450960f75a7f97d30be58129098 GIT binary patch literal 63605 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